forked from tangled.org/core
Monorepo for Tangled

allow filtering issues by status

Changed files
+38 -18
appview
db
pages
templates
repo
issues
state
+7 -3
appview/db/issues.go
··· 96 return ownerDid, err 97 } 98 99 - func GetIssues(e Execer, repoAt syntax.ATURI) ([]Issue, error) { 100 var issues []Issue 101 102 rows, err := e.Query( 103 `select ··· 113 left join 114 comments c on i.repo_at = c.repo_at and i.issue_id = c.issue_id 115 where 116 - i.repo_at = ? 117 group by 118 i.id, i.owner_did, i.issue_id, i.created, i.title, i.body, i.open 119 order by 120 i.created desc`, 121 - repoAt) 122 if err != nil { 123 return nil, err 124 }
··· 96 return ownerDid, err 97 } 98 99 + func GetIssues(e Execer, repoAt syntax.ATURI, isOpen bool) ([]Issue, error) { 100 var issues []Issue 101 + openValue := 0 102 + if isOpen { 103 + openValue = 1 104 + } 105 106 rows, err := e.Query( 107 `select ··· 117 left join 118 comments c on i.repo_at = c.repo_at and i.issue_id = c.issue_id 119 where 120 + i.repo_at = ? and i.open = ? 121 group by 122 i.id, i.owner_did, i.issue_id, i.created, i.title, i.body, i.open 123 order by 124 i.created desc`, 125 + repoAt, openValue) 126 if err != nil { 127 return nil, err 128 }
+2
appview/pages/pages.go
··· 459 Active string 460 Issues []db.Issue 461 DidHandleMap map[string]string 462 } 463 464 func (p *Pages) RepoIssues(w io.Writer, params RepoIssuesParams) error {
··· 459 Active string 460 Issues []db.Issue 461 DidHandleMap map[string]string 462 + 463 + FilteringByOpen bool 464 } 465 466 func (p *Pages) RepoIssues(w io.Writer, params RepoIssuesParams) error {
+11 -4
appview/pages/templates/repo/issues/issues.html
··· 2 3 {{ define "repoContent" }} 4 <div class="flex justify-between items-center"> 5 - <div class="error" id="issues"></div> 6 <a 7 href="/{{ .RepoInfo.FullName }}/issues/new" 8 - class="btn flex items-center gap-2 no-underline" 9 - > 10 - <i data-lucide="square-plus" class="w-5 h-5"></i> 11 <span>new issue</span> 12 </a> 13 </div> 14 {{ end }} 15 16 {{ define "repoAfter" }}
··· 2 3 {{ define "repoContent" }} 4 <div class="flex justify-between items-center"> 5 + <p> 6 + filtering 7 + <select class="font-bold border border-gray-200 rounded" onchange="window.location.href = '/{{ .RepoInfo.FullName }}/issues?state=' + this.value"> 8 + <option value="open" {{ if .FilteringByOpen }}selected{{ end }}>open</option> 9 + <option value="closed" {{ if not .FilteringByOpen }}selected{{ end }}>closed</option> 10 + </select> 11 + issues 12 + </p> 13 <a 14 href="/{{ .RepoInfo.FullName }}/issues/new" 15 + class="btn text-sm flex items-center gap-2 no-underline hover:no-underline"> 16 + <i data-lucide="plus" class="w-5 h-5"></i> 17 <span>new issue</span> 18 </a> 19 </div> 20 + <div class="error" id="issues"></div> 21 {{ end }} 22 23 {{ define "repoAfter" }}
+18 -5
appview/state/repo.go
··· 887 } 888 889 func (s *State) RepoIssues(w http.ResponseWriter, r *http.Request) { 890 user := s.auth.GetUser(r) 891 f, err := fullyResolvedRepo(r) 892 if err != nil { ··· 894 return 895 } 896 897 - issues, err := db.GetIssues(s.db, f.RepoAt) 898 if err != nil { 899 log.Println("failed to get issues", err) 900 s.pages.Notice(w, "issues", "Failed to load issues. Try again later.") ··· 916 } 917 918 s.pages.RepoIssues(w, pages.RepoIssuesParams{ 919 - LoggedInUser: s.auth.GetUser(r), 920 - RepoInfo: f.RepoInfo(s, user), 921 - Issues: issues, 922 - DidHandleMap: didHandleMap, 923 }) 924 return 925 }
··· 887 } 888 889 func (s *State) RepoIssues(w http.ResponseWriter, r *http.Request) { 890 + params := r.URL.Query() 891 + state := params.Get("state") 892 + isOpen := true 893 + switch state { 894 + case "open": 895 + isOpen = true 896 + case "closed": 897 + isOpen = false 898 + default: 899 + isOpen = true 900 + } 901 + 902 user := s.auth.GetUser(r) 903 f, err := fullyResolvedRepo(r) 904 if err != nil { ··· 906 return 907 } 908 909 + issues, err := db.GetIssues(s.db, f.RepoAt, isOpen) 910 if err != nil { 911 log.Println("failed to get issues", err) 912 s.pages.Notice(w, "issues", "Failed to load issues. Try again later.") ··· 928 } 929 930 s.pages.RepoIssues(w, pages.RepoIssuesParams{ 931 + LoggedInUser: s.auth.GetUser(r), 932 + RepoInfo: f.RepoInfo(s, user), 933 + Issues: issues, 934 + DidHandleMap: didHandleMap, 935 + FilteringByOpen: isOpen, 936 }) 937 return 938 }
-6
input.css
··· 96 "calt" 1, 97 "kern" 1; 98 } 99 - h1 { 100 - @apply text-2xl; 101 - @apply font-sans; 102 - @apply text-black; 103 - @apply py-4; 104 - } 105 106 ::selection { 107 @apply bg-yellow-400;
··· 96 "calt" 1, 97 "kern" 1; 98 } 99 100 ::selection { 101 @apply bg-yellow-400;