forked from tangled.org/core
Monorepo for Tangled

appview: introduce default labels that can be subscribed to

Signed-off-by: oppiliappan <me@oppi.li>

oppi.li a8781322 ac6cb315

verified
Changed files
+102 -40
appview
oauth
handler
pages
templates
repo
settings
repo
consts
+1
appview/oauth/handler/handler.go
··· 24 24 "tangled.org/core/appview/oauth" 25 25 "tangled.org/core/appview/oauth/client" 26 26 "tangled.org/core/appview/pages" 27 + "tangled.org/core/consts" 27 28 "tangled.org/core/idresolver" 28 29 "tangled.org/core/rbac" 29 30 "tangled.org/core/tid"
+25 -27
appview/pages/templates/repo/settings/fragments/labelListing.html
··· 1 1 {{ define "repo/settings/fragments/labelListing" }} 2 2 {{ $root := index . 0 }} 3 3 {{ $label := index . 1 }} 4 - <div id="label-{{$label.Id}}" class="flex items-center justify-between p-2 pl-4"> 5 - <div class="flex flex-col gap-1 text-sm min-w-0 max-w-[80%]"> 6 - {{ template "labels/fragments/labelDef" $label }} 7 - <div class="flex flex-wrap text items-center gap-1 text-gray-500 dark:text-gray-400"> 4 + <div class="flex flex-col gap-1 text-sm min-w-0 max-w-[80%]"> 5 + {{ template "labels/fragments/labelDef" $label }} 6 + <div class="flex flex-wrap text items-center gap-1 text-gray-500 dark:text-gray-400"> 7 + {{ if $label.ValueType.IsNull }} 8 + basic 9 + {{ else }} 8 10 {{ $label.ValueType.Type }} type 9 - {{ if $label.ValueType.IsEnumType }} 10 - <span class="before:content-['·'] before:select-none"></span> 11 - {{ join $label.ValueType.Enum ", " }} 12 - {{ end }} 13 - {{ if $label.ValueType.IsDidFormat }} 14 - <span class="before:content-['·'] before:select-none"></span> 15 - DID format 16 - {{ end }} 17 - </div> 11 + {{ end }} 12 + 13 + {{ if $label.ValueType.IsEnum }} 14 + <span class="before:content-['·'] before:select-none"></span> 15 + {{ join $label.ValueType.Enum ", " }} 16 + {{ end }} 17 + 18 + {{ if $label.ValueType.IsDidFormat }} 19 + <span class="before:content-['·'] before:select-none"></span> 20 + DID format 21 + {{ end }} 22 + 23 + {{ if $label.Multiple }} 24 + <span class="before:content-['·'] before:select-none"></span> 25 + multiple 26 + {{ end }} 27 + 28 + <span class="before:content-['·'] before:select-none"></span> 29 + {{ join $label.Scope ", " }} 18 30 </div> 19 - {{ if $root.RepoInfo.Roles.IsOwner }} 20 - <button 21 - class="btn text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300 gap-2 group" 22 - title="Delete label" 23 - hx-delete="/{{ $root.RepoInfo.FullName }}/settings/label" 24 - hx-swap="none" 25 - hx-vals='{"label-id": "{{ $label.Id }}"}' 26 - hx-confirm="Are you sure you want to delete the label `{{ $label.Name }}`?" 27 - > 28 - {{ i "trash-2" "w-5 h-5" }} 29 - <span class="hidden md:inline">delete</span> 30 - {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }} 31 - </button> 32 - {{ end }} 33 31 </div> 34 32 {{ end }}
+63 -9
appview/pages/templates/repo/settings/general.html
··· 7 7 </div> 8 8 <div class="col-span-1 md:col-span-3 flex flex-col gap-6 p-2"> 9 9 {{ template "branchSettings" . }} 10 - {{ template "labelSettings" . }} 10 + {{ template "defaultLabelSettings" . }} 11 + {{ template "customLabelSettings" . }} 11 12 {{ template "deleteRepo" . }} 12 13 <div id="operation-error" class="text-red-500 dark:text-red-400"></div> 13 14 </div> ··· 43 44 </div> 44 45 {{ end }} 45 46 46 - {{ define "labelSettings" }} 47 + {{ define "defaultLabelSettings" }} 48 + <div class="flex flex-col gap-2"> 49 + <h2 class="text-sm pb-2 uppercase font-bold">Default Labels</h2> 50 + <p class="text-gray-500 dark:text-gray-400"> 51 + Manage your issues and pulls by creating labels to categorize them. Only 52 + repository owners may configure labels. You may choose to subscribe to 53 + default labels, or create entirely custom labels. 54 + </p> 55 + <div class="flex flex-col rounded border border-gray-200 dark:border-gray-700 divide-y divide-gray-200 dark:divide-gray-700 w-full"> 56 + {{ range .DefaultLabels }} 57 + <div id="label-{{.Id}}" class="flex items-center justify-between p-2 pl-4"> 58 + {{ template "repo/settings/fragments/labelListing" (list $ .) }} 59 + {{ $action := "subscribe" }} 60 + {{ $icon := "plus" }} 61 + {{ if mapContains $.SubscribedLabels .AtUri.String }} 62 + {{ $action = "unsubscribe" }} 63 + {{ $icon = "minus" }} 64 + {{ end }} 65 + <button 66 + class="btn gap-2 group" 67 + title="{{$action}} from label" 68 + {{ if not $.RepoInfo.Roles.IsOwner }}disabled{{ end }} 69 + hx-post="/{{ $.RepoInfo.FullName }}/settings/label/{{$action}}" 70 + hx-swap="none" 71 + hx-vals='{"label": "{{ .AtUri.String }}"}'> 72 + {{ i $icon "size-4" }} 73 + <span class="hidden md:inline">{{$action}}</span> 74 + {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }} 75 + </button> 76 + </div> 77 + {{ else }} 78 + <div class="flex items-center justify-center p-2 text-gray-500"> 79 + no labels added yet 80 + </div> 81 + {{ end }} 82 + </div> 83 + <div id="default-label-operation" class="error"></div> 84 + </div> 85 + {{ end }} 86 + 87 + {{ define "customLabelSettings" }} 47 88 <div class="flex flex-col gap-2"> 48 89 <div class="grid grid-cols-1 md:grid-cols-3 gap-4 items-center"> 49 90 <div class="col-span-1 md:col-span-2"> 50 - <h2 class="text-sm pb-2 uppercase font-bold">Labels</h2> 51 - <p class="text-gray-500 dark:text-gray-400"> 52 - Manage your issues and pulls by creating labels to categorize them. 53 - Only repository owners may configure labels. 54 - </p> 91 + <h2 class="text-sm pb-2 uppercase font-bold">Custom Labels</h2> 55 92 </div> 56 93 <div class="col-span-1 md:col-span-1 md:justify-self-end"> 57 94 <button 95 + title="Add custom label" 58 96 class="btn flex items-center gap-2" 59 97 popovertarget="add-labeldef-modal" 60 98 {{ if not .RepoInfo.Roles.IsOwner }}disabled{{ end }} ··· 65 103 <div 66 104 id="add-labeldef-modal" 67 105 popover 68 - class="bg-white w-full sm:w-[30rem] dark:bg-gray-800 p-6 rounded border border-gray-200 dark:border-gray-700 drop-shadow dark:text-white backdrop:bg-gray-400/50 dark:backdrop:bg-gray-800/50"> 106 + class="bg-white w-full sm:w-[30rem] dark:bg-gray-800 p-6 max-h-dvh overflow-y-auto rounded border border-gray-200 dark:border-gray-700 drop-shadow dark:text-white backdrop:bg-gray-400/50 dark:backdrop:bg-gray-800/50"> 69 107 {{ template "repo/settings/fragments/addLabelDefModal" . }} 70 108 </div> 71 109 </div> 72 110 </div> 73 111 <div class="flex flex-col rounded border border-gray-200 dark:border-gray-700 divide-y divide-gray-200 dark:divide-gray-700 w-full"> 74 112 {{ range .Labels }} 75 - {{ template "repo/settings/fragments/labelListing" (list $ .) }} 113 + <div id="label-{{.Id}}" class="flex items-center justify-between p-2 pl-4"> 114 + {{ template "repo/settings/fragments/labelListing" (list $ .) }} 115 + {{ if $.RepoInfo.Roles.IsOwner }} 116 + <button 117 + class="btn text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300 gap-2 group" 118 + title="Delete label" 119 + hx-delete="/{{ $.RepoInfo.FullName }}/settings/label" 120 + hx-swap="none" 121 + hx-vals='{"label-id": "{{ .Id }}"}' 122 + hx-confirm="Are you sure you want to delete the label `{{ .Name }}`?" 123 + > 124 + {{ i "trash-2" "w-5 h-5" }} 125 + <span class="hidden md:inline">delete</span> 126 + {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }} 127 + </button> 128 + {{ end }} 129 + </div> 76 130 {{ else }} 77 131 <div class="flex items-center justify-center p-2 text-gray-500"> 78 132 no labels added yet
+4 -4
appview/repo/router.go
··· 82 82 r.With(mw.RepoPermissionMiddleware("repo:settings")).Route("/settings", func(r chi.Router) { 83 83 r.Get("/", rp.RepoSettings) 84 84 r.With(mw.RepoPermissionMiddleware("repo:owner")).Post("/spindle", rp.EditSpindle) 85 - r.With(mw.RepoPermissionMiddleware("repo:owner")).Put("/label", rp.AddLabel) 86 - r.With(mw.RepoPermissionMiddleware("repo:owner")).Delete("/label", rp.DeleteLabel) 87 - r.With(mw.RepoPermissionMiddleware("repo:owner")).Put("/label/subscribe", rp.SubscribeLabel) 88 - r.With(mw.RepoPermissionMiddleware("repo:owner")).Delete("/label/subscribe", rp.UnsubscribeLabel) 85 + r.With(mw.RepoPermissionMiddleware("repo:owner")).Put("/label", rp.AddLabelDef) 86 + r.With(mw.RepoPermissionMiddleware("repo:owner")).Delete("/label", rp.DeleteLabelDef) 87 + r.With(mw.RepoPermissionMiddleware("repo:owner")).Post("/label/subscribe", rp.SubscribeLabel) 88 + r.With(mw.RepoPermissionMiddleware("repo:owner")).Post("/label/unsubscribe", rp.UnsubscribeLabel) 89 89 r.With(mw.RepoPermissionMiddleware("repo:invite")).Put("/collaborator", rp.AddCollaborator) 90 90 r.With(mw.RepoPermissionMiddleware("repo:delete")).Delete("/delete", rp.DeleteRepo) 91 91 r.Put("/branches/default", rp.SetDefaultBranch)
+9
consts/consts.go
··· 1 + package consts 2 + 3 + const ( 4 + TangledDid = "did:plc:wshs7t2adsemcrrd4snkeqli" 5 + IcyDid = "did:plc:hwevmowznbiukdf6uk5dwrrq" 6 + 7 + DefaultSpindle = "spindle.tangled.sh" 8 + DefaultKnot = "knot1.tangled.sh" 9 + )