From 59a421c1765cb5c9d76d928b14b23c6b44d6efbd Mon Sep 17 00:00:00 2001 From: oppiliappan Date: Sun, 14 Sep 2025 08:07:58 +0000 Subject: [PATCH] appview/issues: display labels on issues Signed-off-by: oppiliappan --- appview/db/issues.go | 14 +++++++++++++- appview/issues/issues.go | 13 +++++++++++++ appview/pages/pages.go | 12 ++++++------ appview/pages/templates/repo/fragments/addLabelModal.html | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ appview/pages/templates/repo/issues/issue.html | 30 ++++++++++++++++++++++++++++-- 5 file(s) changed, 179 insertion(s)(+), 9 deletion(s)(-) diff --git a/appview/db/issues.go b/appview/db/issues.go --- a/appview/db/issues.go +++ b/appview/db/issues.go @@ -30,6 +30,7 @@ // optionally, populate this when querying for reverse mappings // like comment counts, parent repo etc. Comments []IssueComment + Labels LabelState Repo *Repo } @@ -371,15 +372,26 @@ // collect comments issueAts := slices.Collect(maps.Keys(issueMap)) + comments, err := GetIssueComments(e, FilterIn("issue_at", issueAts)) if err != nil { return nil, fmt.Errorf("failed to query comments: %w", err) } - for i := range comments { issueAt := comments[i].IssueAt if issue, ok := issueMap[issueAt]; ok { issue.Comments = append(issue.Comments, comments[i]) + } + } + + // collect allLabels for each issue + allLabels, err := GetLabels(e, FilterIn("subject", issueAts)) + if err != nil { + return nil, fmt.Errorf("failed to query labels: %w", err) + } + for issueAt, labels := range allLabels { + if issue, ok := issueMap[issueAt.String()]; ok { + issue.Labels = labels } } diff --git a/appview/issues/issues.go b/appview/issues/issues.go --- a/appview/issues/issues.go +++ b/appview/issues/issues.go @@ -92,6 +92,18 @@ userReactions = db.GetReactionStatusMap(rp.db, user.Did, issue.AtUri()) } + labelDefs, err := db.GetLabelDefinitions(rp.db, db.FilterIn("at_uri", f.Repo.Labels)) + if err != nil { + log.Println("failed to fetch labels", err) + rp.pages.Error503(w) + return + } + + defs := make(map[string]*db.LabelDefinition) + for _, l := range labelDefs { + defs[l.AtUri().String()] = &l + } + rp.pages.RepoSingleIssue(w, pages.RepoSingleIssueParams{ LoggedInUser: user, RepoInfo: f.RepoInfo(user), @@ -100,6 +112,7 @@ OrderedReactionKinds: db.OrderedReactionKinds, Reactions: reactionCountMap, UserReacted: userReactions, + LabelDefs: defs, }) } diff --git a/appview/pages/pages.go b/appview/pages/pages.go --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -897,12 +897,12 @@ } type RepoSingleIssueParams struct { - LoggedInUser *oauth.User - RepoInfo repoinfo.RepoInfo - Active string - Issue *db.Issue - CommentList []db.CommentListItem - IssueOwnerHandle string + LoggedInUser *oauth.User + RepoInfo repoinfo.RepoInfo + Active string + Issue *db.Issue + CommentList []db.CommentListItem + LabelDefs map[string]*db.LabelDefinition OrderedReactionKinds []db.ReactionKind Reactions map[db.ReactionKind]int diff --git a/appview/pages/templates/repo/fragments/addLabelModal.html b/appview/pages/templates/repo/fragments/addLabelModal.html new file mode 100644 --- /dev/null +++ b/appview/pages/templates/repo/fragments/addLabelModal.html @@ -0,0 +1,119 @@ +{{ define "repo/fragments/addLabelModal" }} + {{ $root := .root }} + {{ $subject := .subject }} + {{ $state := .state }} + {{ with $root }} +
+

Add, remove or update labels.

+ + + + +
+ {{ $id := 0 }} + {{ range $k, $valset := $state.Inner }} + {{ $d := index $root.LabelDefs $k }} + {{ range $v, $s := $valset }} +
+ + {{ template "valueTypeInput" (dict "valueType" $d.ValueType "value" $v "key" $k) }} + + {{ $id = add $id 1 }} +
+ {{ end }} + {{ end }} + + {{ range $k, $d := $root.LabelDefs }} + {{ if not ($state.ContainsLabel $k) }} +
+ + {{ template "valueTypeInput" (dict "valueType" $d.ValueType "value" "" "key" $k) }} + + {{ $id = add $id 1 }} +
+ {{ end }} + {{ end }} +
+ +
+ + +
+
+
+ {{ end }} +{{ end }} + +{{ define "valueTypeInput" }} + {{ $valueType := .valueType }} + {{ $value := .value }} + {{ $key := .key }} + + {{ if $valueType.IsEnumType }} + {{ template "enumTypeInput" $ }} + {{ else if $valueType.IsBool }} + {{ template "boolTypeInput" $ }} + {{ else if $valueType.IsInt }} + {{ template "intTypeInput" $ }} + {{ else if $valueType.IsString }} + {{ template "stringTypeInput" $ }} + {{ else if $valueType.IsNull }} + {{ template "nullTypeInput" $ }} + {{ end }} +{{ end }} + +{{ define "enumTypeInput" }} + {{ $valueType := .valueType }} + {{ $value := .value }} + +{{ end }} + +{{ define "boolTypeInput" }} + {{ $value := .value }} + +{{ end }} + +{{ define "intTypeInput" }} + {{ $value := .value }} + +{{ end }} + +{{ define "stringTypeInput" }} + {{ $value := .value }} + +{{ end }} + +{{ define "nullTypeInput" }} + +{{ end }} diff --git a/appview/pages/templates/repo/issues/issue.html b/appview/pages/templates/repo/issues/issue.html --- a/appview/pages/templates/repo/issues/issue.html +++ b/appview/pages/templates/repo/issues/issue.html @@ -15,7 +15,10 @@ {{ if .Issue.Body }}
{{ .Issue.Body | markdown }}
{{ end }} - {{ template "issueReactions" . }} +
+ {{ template "issueReactions" . }} + {{ template "issueLabels" . }} +
{{ end }} @@ -86,7 +89,7 @@ {{ end }} {{ define "issueReactions" }} -
+
{{ template "repo/fragments/reactionsPopUp" .OrderedReactionKinds }} {{ range $kind := .OrderedReactionKinds }} {{ @@ -98,6 +101,29 @@ "ThreadAt" $.Issue.AtUri) }} {{ end }} +
+{{ end }} + +{{ define "issueLabels" }} + {{ range $k, $valset := $.Issue.Labels.Inner }} + {{ $d := index $.LabelDefs $k }} + {{ range $v, $s := $valset }} + {{ template "labels/fragments/label" (dict "def" $d "val" $v) }} + {{ end }} + {{ end }} + + +
+ {{ template "repo/fragments/addLabelModal" (dict "root" $ "subject" $.Issue.AtUri.String "state" $.Issue.Labels) }}
{{ end }} -- tangled.sh