+7
-3
appview/db/issues.go
+7
-3
appview/db/issues.go
···
96
96
return ownerDid, err
97
97
}
98
98
99
-
func GetIssues(e Execer, repoAt syntax.ATURI) ([]Issue, error) {
99
+
func GetIssues(e Execer, repoAt syntax.ATURI, isOpen bool) ([]Issue, error) {
100
100
var issues []Issue
101
+
openValue := 0
102
+
if isOpen {
103
+
openValue = 1
104
+
}
101
105
102
106
rows, err := e.Query(
103
107
`select
···
113
117
left join
114
118
comments c on i.repo_at = c.repo_at and i.issue_id = c.issue_id
115
119
where
116
-
i.repo_at = ?
120
+
i.repo_at = ? and i.open = ?
117
121
group by
118
122
i.id, i.owner_did, i.issue_id, i.created, i.title, i.body, i.open
119
123
order by
120
124
i.created desc`,
121
-
repoAt)
125
+
repoAt, openValue)
122
126
if err != nil {
123
127
return nil, err
124
128
}
+2
appview/pages/pages.go
+2
appview/pages/pages.go
+11
-4
appview/pages/templates/repo/issues/issues.html
+11
-4
appview/pages/templates/repo/issues/issues.html
···
2
2
3
3
{{ define "repoContent" }}
4
4
<div class="flex justify-between items-center">
5
-
<div class="error" id="issues"></div>
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>
6
13
<a
7
14
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>
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>
11
17
<span>new issue</span>
12
18
</a>
13
19
</div>
20
+
<div class="error" id="issues"></div>
14
21
{{ end }}
15
22
16
23
{{ define "repoAfter" }}
+18
-5
appview/state/repo.go
+18
-5
appview/state/repo.go
···
887
887
}
888
888
889
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
+
890
902
user := s.auth.GetUser(r)
891
903
f, err := fullyResolvedRepo(r)
892
904
if err != nil {
···
894
906
return
895
907
}
896
908
897
-
issues, err := db.GetIssues(s.db, f.RepoAt)
909
+
issues, err := db.GetIssues(s.db, f.RepoAt, isOpen)
898
910
if err != nil {
899
911
log.Println("failed to get issues", err)
900
912
s.pages.Notice(w, "issues", "Failed to load issues. Try again later.")
···
916
928
}
917
929
918
930
s.pages.RepoIssues(w, pages.RepoIssuesParams{
919
-
LoggedInUser: s.auth.GetUser(r),
920
-
RepoInfo: f.RepoInfo(s, user),
921
-
Issues: issues,
922
-
DidHandleMap: didHandleMap,
931
+
LoggedInUser: s.auth.GetUser(r),
932
+
RepoInfo: f.RepoInfo(s, user),
933
+
Issues: issues,
934
+
DidHandleMap: didHandleMap,
935
+
FilteringByOpen: isOpen,
923
936
})
924
937
return
925
938
}