From 7d8ddd723a87372485c814485886b3e2edf5d42e Mon Sep 17 00:00:00 2001 From: oppiliappan Date: Thu, 16 Apr 2026 06:21:51 +0100 Subject: [PATCH] hats in issues interface Signed-off-by: oppiliappan --- appview/issues/issues.go | 34 ++++++++++++++----- appview/pages/funcmap.go | 2 ++ appview/pages/pages.go | 19 ++++++----- .../fragments/icons/shield-alert.html | 10 +++--- .../fragments/icons/shield-check.html | 8 ++--- .../templates/fragments/icons/shield.html | 5 +++ .../repo/issues/fragments/issueListing.html | 5 +-- .../pages/templates/repo/issues/issue.html | 3 +- .../pages/templates/repo/issues/issues.html | 8 ++++- .../templates/user/fragments/picLink.html | 22 +++++++++--- .../user/fragments/vouchTooltip.html | 25 ++++++++++++++ flake.lock | 4 +-- 12 files changed, 107 insertions(+), 38 deletions(-) create mode 100644 appview/pages/templates/fragments/icons/shield.html create mode 100644 appview/pages/templates/user/fragments/vouchTooltip.html diff --git a/appview/issues/issues.go b/appview/issues/issues.go index 4f74baf0..76e3f3e3 100644 --- a/appview/issues/issues.go +++ b/appview/issues/issues.go @@ -141,7 +141,7 @@ func (rp *Issues) RepoSingleIssue(w http.ResponseWriter, r *http.Request) { defs[l.AtUri().String()] = &l } - rp.pages.RepoSingleIssue(w, pages.RepoSingleIssueParams{ + err = rp.pages.RepoSingleIssue(w, pages.RepoSingleIssueParams{ LoggedInUser: user, RepoInfo: rp.repoResolver.GetRepoInfo(r, user), Issue: issue, @@ -152,6 +152,9 @@ func (rp *Issues) RepoSingleIssue(w http.ResponseWriter, r *http.Request) { LabelDefs: defs, VouchRelationships: vouchRelationships, }) + if err != nil { + l.Error("failed to render issue", "err", err) + } } func (rp *Issues) EditIssue(w http.ResponseWriter, r *http.Request) { @@ -988,15 +991,28 @@ func (rp *Issues) RepoIssues(w http.ResponseWriter, r *http.Request) { } } + vouchRelationships := make(map[string]*models.VouchRelationship) + if user != nil { + dids := make([]string, len(issues)) + for i, u := range issues { + dids[i] = u.Did + } + vouchRelationships, err = db.GetVouchRelationshipsBatch(rp.db, user.Did, dids) + if err != nil { + l.Error("failed to fetch vouch relationships", "err", err) + } + } + rp.pages.RepoIssues(w, pages.RepoIssuesParams{ - LoggedInUser: rp.oauth.GetMultiAccountUser(r), - RepoInfo: repoInfo, - Issues: issues, - IssueCount: totalIssues, - LabelDefs: defs, - FilterState: filterState, - FilterQuery: query.String(), - Page: page, + LoggedInUser: rp.oauth.GetMultiAccountUser(r), + RepoInfo: repoInfo, + Issues: issues, + IssueCount: totalIssues, + LabelDefs: defs, + FilterState: filterState, + FilterQuery: query.String(), + Page: page, + VouchRelationships: vouchRelationships, }) } diff --git a/appview/pages/funcmap.go b/appview/pages/funcmap.go index ca4985fc..73f6cbbb 100644 --- a/appview/pages/funcmap.go +++ b/appview/pages/funcmap.go @@ -24,6 +24,7 @@ import ( "github.com/alecthomas/chroma/v2/lexers" "github.com/alecthomas/chroma/v2/styles" "github.com/dustin/go-humanize" + "github.com/dustin/go-humanize/english" "github.com/go-enry/go-enry/v2" "github.com/yuin/goldmark" emoji "github.com/yuin/goldmark-emoji" @@ -186,6 +187,7 @@ func (p *Pages) funcMap() template.FuncMap { return s }, "commaFmt": humanize.Comma, + "plural": english.Plural, "relTimeFmt": humanize.Time, "shortRelTimeFmt": func(t time.Time) string { return humanize.CustomRelTime(t, time.Now(), "", "", []humanize.RelTimeMagnitude{ diff --git a/appview/pages/pages.go b/appview/pages/pages.go index 2bf40314..6d6e6585 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -1106,15 +1106,16 @@ func (p *Pages) RepoSiteSettings(w io.Writer, params RepoSiteSettingsParams) err } type RepoIssuesParams struct { - LoggedInUser *oauth.MultiAccountUser - RepoInfo repoinfo.RepoInfo - Active string - Issues []models.Issue - IssueCount int - LabelDefs map[string]*models.LabelDefinition - Page pagination.Page - FilterState string - FilterQuery string + LoggedInUser *oauth.MultiAccountUser + RepoInfo repoinfo.RepoInfo + Active string + Issues []models.Issue + IssueCount int + LabelDefs map[string]*models.LabelDefinition + Page pagination.Page + FilterState string + FilterQuery string + VouchRelationships map[string]*models.VouchRelationship } func (p *Pages) RepoIssues(w io.Writer, params RepoIssuesParams) error { diff --git a/appview/pages/templates/fragments/icons/shield-alert.html b/appview/pages/templates/fragments/icons/shield-alert.html index 7e3a3864..802e2a71 100644 --- a/appview/pages/templates/fragments/icons/shield-alert.html +++ b/appview/pages/templates/fragments/icons/shield-alert.html @@ -1,7 +1,7 @@ {{ define "fragments/icons/shield-alert" }} - - - - - + + + + + {{ end }} diff --git a/appview/pages/templates/fragments/icons/shield-check.html b/appview/pages/templates/fragments/icons/shield-check.html index b575192c..6d5bb983 100644 --- a/appview/pages/templates/fragments/icons/shield-check.html +++ b/appview/pages/templates/fragments/icons/shield-check.html @@ -1,6 +1,6 @@ {{ define "fragments/icons/shield-check" }} - - - - + + + + {{ end }} diff --git a/appview/pages/templates/fragments/icons/shield.html b/appview/pages/templates/fragments/icons/shield.html new file mode 100644 index 00000000..3f918ecb --- /dev/null +++ b/appview/pages/templates/fragments/icons/shield.html @@ -0,0 +1,5 @@ +{{ define "fragments/icons/shield" }} + + + +{{ end }} diff --git a/appview/pages/templates/repo/issues/fragments/issueListing.html b/appview/pages/templates/repo/issues/fragments/issueListing.html index 3d892b53..39fafb07 100644 --- a/appview/pages/templates/repo/issues/fragments/issueListing.html +++ b/appview/pages/templates/repo/issues/fragments/issueListing.html @@ -26,8 +26,9 @@ {{ $state }} - - {{ template "user/fragments/picHandleLink" .Did }} + + {{ template "user/fragments/picLink" (list .Did "size-6" (index $.VouchRelationships .Did)) }} + {{ resolve .Did }} diff --git a/appview/pages/templates/repo/issues/issue.html b/appview/pages/templates/repo/issues/issue.html index ce0e9215..9b317552 100644 --- a/appview/pages/templates/repo/issues/issue.html +++ b/appview/pages/templates/repo/issues/issue.html @@ -68,7 +68,8 @@ opened by - {{ template "user/fragments/picHandleLink" .Issue.Did }} + {{ template "user/fragments/picLink" (list .Issue.Did "size-6" (index .VouchRelationships .Issue.Did)) }} + {{ resolve .Issue.Did }} {{ if .Issue.Edited }} edited {{ template "repo/fragments/time" .Issue.Edited }} diff --git a/appview/pages/templates/repo/issues/issues.html b/appview/pages/templates/repo/issues/issues.html index ad9ea64e..3dbd89f0 100644 --- a/appview/pages/templates/repo/issues/issues.html +++ b/appview/pages/templates/repo/issues/issues.html @@ -65,7 +65,13 @@ {{ define "repoAfter" }}
- {{ template "repo/issues/fragments/issueListing" (dict "Issues" .Issues "RepoPrefix" .RepoInfo.FullName "LabelDefs" .LabelDefs) }} + {{ template "repo/issues/fragments/issueListing" + (dict + "Issues" .Issues + "RepoPrefix" .RepoInfo.FullName + "LabelDefs" .LabelDefs + "VouchRelationships" .VouchRelationships + ) }}
{{if gt .IssueCount .Page.Limit }} {{ template "fragments/pagination" (dict diff --git a/appview/pages/templates/user/fragments/picLink.html b/appview/pages/templates/user/fragments/picLink.html index ec447992..058a475e 100644 --- a/appview/pages/templates/user/fragments/picLink.html +++ b/appview/pages/templates/user/fragments/picLink.html @@ -4,12 +4,16 @@ {{ $handle := resolve $did }} {{ $isVouched := false }} {{ $isDenounced := false }} + {{ $isPartial := false }} + {{ $vouchRelation := false }} {{ if ge (len .) 3 }} - {{ $vouchRelation := index . 2 }} + {{ $vouchRelation = index . 2 }} {{ if $vouchRelation.IsDirectVouch }} {{ $isVouched = true }} {{ else if $vouchRelation.IsDirectDenounce }} {{ $isDenounced = true }} + {{ else if not $vouchRelation.IsEmpty }} + {{ $isPartial = true }} {{ end }} {{ end }} @@ -18,10 +22,18 @@ alt="" class="rounded-full border border-gray-300 dark:border-gray-700 {{ $classes }}" /> - {{ if $isVouched }} - {{ template "fragments/icons/shield-check" "size-4" }} - {{ else if $isDenounced }} - {{ template "fragments/icons/shield-alert" "size-4" }} + {{ if $vouchRelation }} + {{ if ne $did $vouchRelation.ViewerDid }} + + {{ if $isVouched }} + {{ template "fragments/icons/shield-check" "w-full h-full" }} + {{ else if $isDenounced }} + {{ template "fragments/icons/shield-alert" "w-full h-full" }} + {{ else if $isPartial }} + {{ template "fragments/icons/shield" "w-full h-full" }} + {{ end }} + + {{ end }} {{ end }} {{ end }} diff --git a/appview/pages/templates/user/fragments/vouchTooltip.html b/appview/pages/templates/user/fragments/vouchTooltip.html new file mode 100644 index 00000000..3056f380 --- /dev/null +++ b/appview/pages/templates/user/fragments/vouchTooltip.html @@ -0,0 +1,25 @@ +{{ define "user/fragments/vouchTooltip" }} + {{- $vr := . -}} + {{- if not $vr.IsEmpty -}} + {{- $networkPart := "" -}} + {{- if and (gt $vr.VouchStrength 0) (eq $vr.DenounceStrength 0) -}} + {{- $networkPart = printf "%s from your network vouched for this user" (plural $vr.VouchStrength "person" "people") -}} + {{- else if and (gt $vr.DenounceStrength 0) (eq $vr.VouchStrength 0) -}} + {{- $networkPart = printf "%s from your network denounced this user" (plural $vr.DenounceStrength "person" "people") -}} + {{- else if and (eq $vr.DenounceStrength 0) (eq $vr.VouchStrength 0) -}} + {{- $networkPart = "" -}} + {{- else -}} + {{- $networkPart = printf "%s and %s from your network" (plural $vr.VouchStrength "vouch" "vouches") (plural $vr.DenounceStrength "denounce" "") -}} + {{- end -}} + {{- $direct := $vr.GetDirectVouch -}} + {{- if $direct -}} + {{- if $direct.IsVouch -}} + You vouched for {{ resolve $vr.SubjectDid }} {{ relTimeFmt $direct.CreatedAt }}. {{ $networkPart }}. + {{- else -}} + You denounced {{ resolve $vr.SubjectDid }} {{ relTimeFmt $direct.CreatedAt }}. {{ $networkPart }}. + {{- end -}} + {{- else -}} + {{- $networkPart -}}. + {{- end -}} + {{- end -}} +{{ end }} diff --git a/flake.lock b/flake.lock index 6570b0b3..ea4a2361 100644 --- a/flake.lock +++ b/flake.lock @@ -120,11 +120,11 @@ "lastModified": 1731402384, "narHash": "sha256-OwUmrPfEehLDz0fl2ChYLK8FQM2p0G1+EMrGsYEq+6g=", "type": "tarball", - "url": "https://github.com/IBM/plex/releases/download/@ibm/plex-mono@1.1.0/ibm-plex-mono.zip" + "url": "https://github.com/IBM/plex/releases/download/@ibm%2Fplex-mono@1.1.0/ibm-plex-mono.zip" }, "original": { "type": "tarball", - "url": "https://github.com/IBM/plex/releases/download/@ibm/plex-mono@1.1.0/ibm-plex-mono.zip" + "url": "https://github.com/IBM/plex/releases/download/@ibm%2Fplex-mono@1.1.0/ibm-plex-mono.zip" } }, "indigo": { -- 2.51.2