forked from tangled.org/core
Monorepo for Tangled — https://tangled.org

allow filtering issues by status

Changed files
+38 -18
appview
db
pages
templates
repo
issues
state
+7 -3
appview/db/issues.go
···
return ownerDid, err
}
-
func GetIssues(e Execer, repoAt syntax.ATURI) ([]Issue, error) {
+
func GetIssues(e Execer, repoAt syntax.ATURI, isOpen bool) ([]Issue, error) {
var issues []Issue
+
openValue := 0
+
if isOpen {
+
openValue = 1
+
}
rows, err := e.Query(
`select
···
left join
comments c on i.repo_at = c.repo_at and i.issue_id = c.issue_id
where
-
i.repo_at = ?
+
i.repo_at = ? and i.open = ?
group by
i.id, i.owner_did, i.issue_id, i.created, i.title, i.body, i.open
order by
i.created desc`,
-
repoAt)
+
repoAt, openValue)
if err != nil {
return nil, err
}
+2
appview/pages/pages.go
···
Active string
Issues []db.Issue
DidHandleMap map[string]string
+
+
FilteringByOpen bool
}
func (p *Pages) RepoIssues(w io.Writer, params RepoIssuesParams) error {
+11 -4
appview/pages/templates/repo/issues/issues.html
···
{{ define "repoContent" }}
<div class="flex justify-between items-center">
-
<div class="error" id="issues"></div>
+
<p>
+
filtering
+
<select class="font-bold border border-gray-200 rounded" onchange="window.location.href = '/{{ .RepoInfo.FullName }}/issues?state=' + this.value">
+
<option value="open" {{ if .FilteringByOpen }}selected{{ end }}>open</option>
+
<option value="closed" {{ if not .FilteringByOpen }}selected{{ end }}>closed</option>
+
</select>
+
issues
+
</p>
<a
href="/{{ .RepoInfo.FullName }}/issues/new"
-
class="btn flex items-center gap-2 no-underline"
-
>
-
<i data-lucide="square-plus" class="w-5 h-5"></i>
+
class="btn text-sm flex items-center gap-2 no-underline hover:no-underline">
+
<i data-lucide="plus" class="w-5 h-5"></i>
<span>new issue</span>
</a>
</div>
+
<div class="error" id="issues"></div>
{{ end }}
{{ define "repoAfter" }}
+18 -5
appview/state/repo.go
···
}
func (s *State) RepoIssues(w http.ResponseWriter, r *http.Request) {
+
params := r.URL.Query()
+
state := params.Get("state")
+
isOpen := true
+
switch state {
+
case "open":
+
isOpen = true
+
case "closed":
+
isOpen = false
+
default:
+
isOpen = true
+
}
+
user := s.auth.GetUser(r)
f, err := fullyResolvedRepo(r)
if err != nil {
···
return
}
-
issues, err := db.GetIssues(s.db, f.RepoAt)
+
issues, err := db.GetIssues(s.db, f.RepoAt, isOpen)
if err != nil {
log.Println("failed to get issues", err)
s.pages.Notice(w, "issues", "Failed to load issues. Try again later.")
···
}
s.pages.RepoIssues(w, pages.RepoIssuesParams{
-
LoggedInUser: s.auth.GetUser(r),
-
RepoInfo: f.RepoInfo(s, user),
-
Issues: issues,
-
DidHandleMap: didHandleMap,
+
LoggedInUser: s.auth.GetUser(r),
+
RepoInfo: f.RepoInfo(s, user),
+
Issues: issues,
+
DidHandleMap: didHandleMap,
+
FilteringByOpen: isOpen,
})
return
}
-6
input.css
···
"calt" 1,
"kern" 1;
}
-
h1 {
-
@apply text-2xl;
-
@apply font-sans;
-
@apply text-black;
-
@apply py-4;
-
}
::selection {
@apply bg-yellow-400;