forked from tangled.org/core
this repo has no description

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
···
"tangled.org/core/appview/oauth"
"tangled.org/core/appview/oauth/client"
"tangled.org/core/appview/pages"
+
"tangled.org/core/consts"
"tangled.org/core/idresolver"
"tangled.org/core/rbac"
"tangled.org/core/tid"
+25 -27
appview/pages/templates/repo/settings/fragments/labelListing.html
···
{{ define "repo/settings/fragments/labelListing" }}
{{ $root := index . 0 }}
{{ $label := index . 1 }}
-
<div id="label-{{$label.Id}}" class="flex items-center justify-between p-2 pl-4">
-
<div class="flex flex-col gap-1 text-sm min-w-0 max-w-[80%]">
-
{{ template "labels/fragments/labelDef" $label }}
-
<div class="flex flex-wrap text items-center gap-1 text-gray-500 dark:text-gray-400">
+
<div class="flex flex-col gap-1 text-sm min-w-0 max-w-[80%]">
+
{{ template "labels/fragments/labelDef" $label }}
+
<div class="flex flex-wrap text items-center gap-1 text-gray-500 dark:text-gray-400">
+
{{ if $label.ValueType.IsNull }}
+
basic
+
{{ else }}
{{ $label.ValueType.Type }} type
-
{{ if $label.ValueType.IsEnumType }}
-
<span class="before:content-['·'] before:select-none"></span>
-
{{ join $label.ValueType.Enum ", " }}
-
{{ end }}
-
{{ if $label.ValueType.IsDidFormat }}
-
<span class="before:content-['·'] before:select-none"></span>
-
DID format
-
{{ end }}
-
</div>
+
{{ end }}
+
+
{{ if $label.ValueType.IsEnum }}
+
<span class="before:content-['·'] before:select-none"></span>
+
{{ join $label.ValueType.Enum ", " }}
+
{{ end }}
+
+
{{ if $label.ValueType.IsDidFormat }}
+
<span class="before:content-['·'] before:select-none"></span>
+
DID format
+
{{ end }}
+
+
{{ if $label.Multiple }}
+
<span class="before:content-['·'] before:select-none"></span>
+
multiple
+
{{ end }}
+
+
<span class="before:content-['·'] before:select-none"></span>
+
{{ join $label.Scope ", " }}
</div>
-
{{ if $root.RepoInfo.Roles.IsOwner }}
-
<button
-
class="btn text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300 gap-2 group"
-
title="Delete label"
-
hx-delete="/{{ $root.RepoInfo.FullName }}/settings/label"
-
hx-swap="none"
-
hx-vals='{"label-id": "{{ $label.Id }}"}'
-
hx-confirm="Are you sure you want to delete the label `{{ $label.Name }}`?"
-
>
-
{{ i "trash-2" "w-5 h-5" }}
-
<span class="hidden md:inline">delete</span>
-
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
-
</button>
-
{{ end }}
</div>
{{ end }}
+63 -9
appview/pages/templates/repo/settings/general.html
···
</div>
<div class="col-span-1 md:col-span-3 flex flex-col gap-6 p-2">
{{ template "branchSettings" . }}
-
{{ template "labelSettings" . }}
+
{{ template "defaultLabelSettings" . }}
+
{{ template "customLabelSettings" . }}
{{ template "deleteRepo" . }}
<div id="operation-error" class="text-red-500 dark:text-red-400"></div>
</div>
···
</div>
{{ end }}
-
{{ define "labelSettings" }}
+
{{ define "defaultLabelSettings" }}
+
<div class="flex flex-col gap-2">
+
<h2 class="text-sm pb-2 uppercase font-bold">Default Labels</h2>
+
<p class="text-gray-500 dark:text-gray-400">
+
Manage your issues and pulls by creating labels to categorize them. Only
+
repository owners may configure labels. You may choose to subscribe to
+
default labels, or create entirely custom labels.
+
</p>
+
<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">
+
{{ range .DefaultLabels }}
+
<div id="label-{{.Id}}" class="flex items-center justify-between p-2 pl-4">
+
{{ template "repo/settings/fragments/labelListing" (list $ .) }}
+
{{ $action := "subscribe" }}
+
{{ $icon := "plus" }}
+
{{ if mapContains $.SubscribedLabels .AtUri.String }}
+
{{ $action = "unsubscribe" }}
+
{{ $icon = "minus" }}
+
{{ end }}
+
<button
+
class="btn gap-2 group"
+
title="{{$action}} from label"
+
{{ if not $.RepoInfo.Roles.IsOwner }}disabled{{ end }}
+
hx-post="/{{ $.RepoInfo.FullName }}/settings/label/{{$action}}"
+
hx-swap="none"
+
hx-vals='{"label": "{{ .AtUri.String }}"}'>
+
{{ i $icon "size-4" }}
+
<span class="hidden md:inline">{{$action}}</span>
+
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
+
</button>
+
</div>
+
{{ else }}
+
<div class="flex items-center justify-center p-2 text-gray-500">
+
no labels added yet
+
</div>
+
{{ end }}
+
</div>
+
<div id="default-label-operation" class="error"></div>
+
</div>
+
{{ end }}
+
+
{{ define "customLabelSettings" }}
<div class="flex flex-col gap-2">
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 items-center">
<div class="col-span-1 md:col-span-2">
-
<h2 class="text-sm pb-2 uppercase font-bold">Labels</h2>
-
<p class="text-gray-500 dark:text-gray-400">
-
Manage your issues and pulls by creating labels to categorize them.
-
Only repository owners may configure labels.
-
</p>
+
<h2 class="text-sm pb-2 uppercase font-bold">Custom Labels</h2>
</div>
<div class="col-span-1 md:col-span-1 md:justify-self-end">
<button
+
title="Add custom label"
class="btn flex items-center gap-2"
popovertarget="add-labeldef-modal"
{{ if not .RepoInfo.Roles.IsOwner }}disabled{{ end }}
···
<div
id="add-labeldef-modal"
popover
-
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">
+
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">
{{ template "repo/settings/fragments/addLabelDefModal" . }}
</div>
</div>
</div>
<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">
{{ range .Labels }}
-
{{ template "repo/settings/fragments/labelListing" (list $ .) }}
+
<div id="label-{{.Id}}" class="flex items-center justify-between p-2 pl-4">
+
{{ template "repo/settings/fragments/labelListing" (list $ .) }}
+
{{ if $.RepoInfo.Roles.IsOwner }}
+
<button
+
class="btn text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300 gap-2 group"
+
title="Delete label"
+
hx-delete="/{{ $.RepoInfo.FullName }}/settings/label"
+
hx-swap="none"
+
hx-vals='{"label-id": "{{ .Id }}"}'
+
hx-confirm="Are you sure you want to delete the label `{{ .Name }}`?"
+
>
+
{{ i "trash-2" "w-5 h-5" }}
+
<span class="hidden md:inline">delete</span>
+
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
+
</button>
+
{{ end }}
+
</div>
{{ else }}
<div class="flex items-center justify-center p-2 text-gray-500">
no labels added yet
+4 -4
appview/repo/router.go
···
r.With(mw.RepoPermissionMiddleware("repo:settings")).Route("/settings", func(r chi.Router) {
r.Get("/", rp.RepoSettings)
r.With(mw.RepoPermissionMiddleware("repo:owner")).Post("/spindle", rp.EditSpindle)
-
r.With(mw.RepoPermissionMiddleware("repo:owner")).Put("/label", rp.AddLabel)
-
r.With(mw.RepoPermissionMiddleware("repo:owner")).Delete("/label", rp.DeleteLabel)
-
r.With(mw.RepoPermissionMiddleware("repo:owner")).Put("/label/subscribe", rp.SubscribeLabel)
-
r.With(mw.RepoPermissionMiddleware("repo:owner")).Delete("/label/subscribe", rp.UnsubscribeLabel)
+
r.With(mw.RepoPermissionMiddleware("repo:owner")).Put("/label", rp.AddLabelDef)
+
r.With(mw.RepoPermissionMiddleware("repo:owner")).Delete("/label", rp.DeleteLabelDef)
+
r.With(mw.RepoPermissionMiddleware("repo:owner")).Post("/label/subscribe", rp.SubscribeLabel)
+
r.With(mw.RepoPermissionMiddleware("repo:owner")).Post("/label/unsubscribe", rp.UnsubscribeLabel)
r.With(mw.RepoPermissionMiddleware("repo:invite")).Put("/collaborator", rp.AddCollaborator)
r.With(mw.RepoPermissionMiddleware("repo:delete")).Delete("/delete", rp.DeleteRepo)
r.Put("/branches/default", rp.SetDefaultBranch)
+9
consts/consts.go
···
+
package consts
+
+
const (
+
TangledDid = "did:plc:wshs7t2adsemcrrd4snkeqli"
+
IcyDid = "did:plc:hwevmowznbiukdf6uk5dwrrq"
+
+
DefaultSpindle = "spindle.tangled.sh"
+
DefaultKnot = "knot1.tangled.sh"
+
)