From d0cc53d6d768cf1800e03c8fa69bf4f42b23f724 Mon Sep 17 00:00:00 2001 From: oppiliappan Date: Tue, 16 Sep 2025 13:46:02 +0000 Subject: [PATCH] appview: improve label editing workflow Signed-off-by: oppiliappan --- appview/repo/router.go | 6 ++++++ appview/reporesolver/resolver.go | 1 + appview/pages/templates/labels/fragments/label.html | 23 +++++++++++++++++++++-- appview/pages/templates/repo/fragments/addLabelModal.html | 127 ------------------------------------------------------------------------------------------------------------------------------- appview/pages/templates/repo/fragments/editLabelPanel.html | 208 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ appview/pages/templates/repo/fragments/labelPanel.html | 43 +++++++++++++++++++++++++++++++++++++++++++ appview/pages/templates/repo/fragments/labelSectionHeader.html | 16 ++++++++++++++++ appview/pages/templates/repo/fragments/labelSectionHeaderText.html | 3 +++ appview/pages/templates/repo/settings/fragments/addLabelDefModal.html | 236 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------- 9 file(s) changed, 442 insertion(s)(+), 221 deletion(s)(-) diff --git a/appview/repo/router.go b/appview/repo/router.go --- a/appview/repo/router.go +++ b/appview/repo/router.go @@ -64,6 +64,12 @@ r.Get("/*", rp.RepoCompare) }) + // label panel in issues/pulls/discussions/tasks + r.Route("/label", func(r chi.Router) { + r.Get("/", rp.LabelPanel) + r.Get("/edit", rp.EditLabelPanel) + }) + // settings routes, needs auth r.Group(func(r chi.Router) { r.Use(middleware.AuthMiddleware(rp.oauth)) diff --git a/appview/reporesolver/resolver.go b/appview/reporesolver/resolver.go --- a/appview/reporesolver/resolver.go +++ b/appview/reporesolver/resolver.go @@ -184,6 +184,7 @@ OwnerDid: f.OwnerDid(), OwnerHandle: f.OwnerHandle(), Name: f.Name, + Rkey: f.Repo.Rkey, RepoAt: repoAt, Description: f.Description, IsStarred: isStarred, diff --git a/appview/pages/templates/labels/fragments/label.html b/appview/pages/templates/labels/fragments/label.html --- a/appview/pages/templates/labels/fragments/label.html +++ b/appview/pages/templates/labels/fragments/label.html @@ -1,9 +1,28 @@ {{ define "labels/fragments/label" }} {{ $d := .def }} {{ $v := .val }} + {{ $withPrefix := .withPrefix }} {{ template "repo/fragments/colorBall" (dict "color" $d.GetColor) }} - {{ $d.Name }}{{ if not $d.ValueType.IsNull }}/{{ template "labelVal" (dict "def" $d "val" $v) }}{{ end }} + + {{ $lhs := printf "%s" $d.Name }} + {{ $rhs := "" }} + + {{ if not $d.ValueType.IsNull }} + {{ if $d.ValueType.IsDidFormat }} + {{ $v = resolve $v }} + {{ end }} + + {{ if not $withPrefix }} + {{ $lhs = "" }} + {{ else }} + {{ $lhs = printf "%s/" $d.Name }} + {{ end }} + + {{ $rhs = printf "%s" $v }} + {{ end }} + + {{ printf "%s%s" $lhs $rhs }} {{ end }} @@ -13,7 +32,7 @@ {{ $v := .val }} {{ if $d.ValueType.IsDidFormat }} - {{ resolve $v }} + {{ resolve $v }} {{ else }} {{ $v }} {{ end }} diff --git a/appview/pages/templates/repo/fragments/addLabelModal.html b/appview/pages/templates/repo/fragments/addLabelModal.html deleted file mode 100644 --- a/appview/pages/templates/repo/fragments/addLabelModal.html +++ /dev/null @@ -1,127 +0,0 @@ -{{ 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 "labelCheckbox" (dict "def" $d "key" $k "val" $v "id" $id "isChecked" true) }} - {{ $id = add $id 1 }} - {{ end }} - {{ end }} - - {{ range $k, $d := $root.LabelDefs }} - {{ if not ($state.ContainsLabel $k) }} - {{ template "labelCheckbox" (dict "def" $d "key" $k "val" "" "id" $id "isChecked" false) }} - {{ $id = add $id 1 }} - {{ end }} - {{ else }} - - No labels defined yet. You can define custom labels in settings. - - {{ end }} -
- -
- - -
-
-
- {{ end }} -{{ end }} - -{{ define "labelCheckbox" }} - {{ $key := .key }} - {{ $val := .val }} - {{ $def := .def }} - {{ $id := .id }} - {{ $isChecked := .isChecked }} -
- - - - -
-{{ 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" }} - {{ $valueType := .valueType }} - {{ $value := .value }} - {{ if $valueType.IsDidFormat }} - {{ $value = resolve .value }} - {{ end }} - -{{ end }} - -{{ define "nullTypeInput" }} - -{{ end }} diff --git a/appview/pages/templates/repo/fragments/editLabelPanel.html b/appview/pages/templates/repo/fragments/editLabelPanel.html new file mode 100644 --- /dev/null +++ b/appview/pages/templates/repo/fragments/editLabelPanel.html @@ -0,0 +1,208 @@ +{{ define "repo/fragments/editLabelPanel" }} +
+ + + {{ template "editBasicLabels" . }} + {{ template "editKvLabels" . }} + {{ template "editLabelPanelActions" . }} +
+
+{{ end }} + +{{ define "editBasicLabels" }} + {{ $defs := .Defs }} + {{ $subject := .Subject }} + {{ $state := .State }} + {{ $labelStyle := "flex items-center gap-2 rounded py-1 px-2 border border-gray-200 dark:border-gray-700 text-sm bg-white dark:bg-gray-800 text-black dark:text-white" }} +
+ {{ template "repo/fragments/labelSectionHeaderText" "Labels" }} + +
+ {{ range $k, $d := $defs }} + {{ $isChecked := $state.ContainsLabel $k }} + {{ if $d.ValueType.IsNull }} + {{ $fieldName := $d.AtUri }} + + {{ end }} + {{ else }} +

+ No labels defined yet. You can choose default labels or define custom + labels in settings. +

+ {{ end }} +
+
+{{ end }} + +{{ define "editKvLabels" }} + {{ $defs := .Defs }} + {{ $subject := .Subject }} + {{ $state := .State }} + {{ $labelStyle := "font-normal normal-case flex items-center gap-2 p-0" }} + + {{ range $k, $d := $defs }} + {{ if (not $d.ValueType.IsNull) }} + {{ $fieldName := $d.AtUri }} + {{ $valset := $state.GetValSet $k }} +
+ {{ template "repo/fragments/labelSectionHeaderText" $d.Name }} + {{ if (and $d.Multiple $d.ValueType.IsEnum) }} + + {{ range $variant := $d.ValueType.Enum }} + + {{ end }} + {{ else if $d.Multiple }} + + {{ range $v, $s := $valset }} + {{ template "multipleInputField" (dict "def" $d "value" $v "key" $k) }} + {{ else }} + {{ template "multipleInputField" (dict "def" $d "value" "" "key" $k) }} + {{ end }} + {{ template "addFieldButton" $d }} + {{ else if $d.ValueType.IsEnum }} + + {{ $isUsed := $state.ContainsLabel $k }} + {{ range $variant := $d.ValueType.Enum }} + + {{ end }} + + {{ else }} + + {{ range $v, $s := $valset }} + {{ template "valueTypeInput" (dict "def" $d "value" $v "key" $k) }} + {{ else }} + {{ template "valueTypeInput" (dict "def" $d "value" "" "key" $k) }} + {{ end }} + {{ end }} +
+ {{ end }} + {{ end }} +{{ end }} + +{{ define "multipleInputField" }} +
+ {{ template "valueTypeInput" . }} + {{ template "removeFieldButton" }} +
+{{ end }} + +{{ define "addFieldButton" }} + + +{{ end }} + +{{ define "removeFieldButton" }} + +{{ end }} + +{{ define "valueTypeInput" }} + {{ $def := .def }} + {{ $valueType := $def.ValueType }} + {{ $value := .value }} + {{ $key := .key }} + + {{ 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 "boolTypeInput" }} + {{ $def := .def }} + {{ $fieldName := $def.AtUri }} + {{ $value := .value }} + {{ $labelStyle = "font-normal normal-case flex items-center gap-2" }} +
+ + + +
+{{ end }} + +{{ define "intTypeInput" }} + {{ $def := .def }} + {{ $fieldName := $def.AtUri }} + {{ $value := .value }} + +{{ end }} + +{{ define "stringTypeInput" }} + {{ $def := .def }} + {{ $fieldName := $def.AtUri }} + {{ $valueType := $def.ValueType }} + {{ $value := .value }} + {{ if $valueType.IsDidFormat }} + {{ $value = trimPrefix (resolve .value) "@" }} + {{ end }} + +{{ end }} + +{{ define "nullTypeInput" }} + {{ $def := .def }} + {{ $fieldName := $def.AtUri }} + +{{ end }} + +{{ define "editLabelPanelActions" }} +
+ + + +
+{{ end }} diff --git a/appview/pages/templates/repo/fragments/labelPanel.html b/appview/pages/templates/repo/fragments/labelPanel.html new file mode 100644 --- /dev/null +++ b/appview/pages/templates/repo/fragments/labelPanel.html @@ -0,0 +1,43 @@ +{{ define "repo/fragments/labelPanel" }} +
+ {{ template "basicLabels" . }} + {{ template "kvLabels" . }} +
+{{ end }} + +{{ define "basicLabels" }} +
+ {{ template "repo/fragments/labelSectionHeader" (dict "Name" "Labels" "RepoInfo" .RepoInfo "Subject" .Subject) }} + + {{ $hasLabel := false }} +
+ {{ range $k, $d := .Defs }} + {{ if (and $d.ValueType.IsNull ($.State.ContainsLabel $k)) }} + {{ $hasLabel = true }} + {{ template "labels/fragments/label" (dict "def" $d "val" "") }} + {{ end }} + {{ end }} + + {{ if not $hasLabel }} +

None yet.

+ {{ end }} +
+
+{{ end }} + +{{ define "kvLabels" }} + {{ range $k, $d := .Defs }} + {{ if (not $d.ValueType.IsNull) }} +
+ {{ template "repo/fragments/labelSectionHeader" (dict "Name" $d.Name "RepoInfo" $.RepoInfo "Subject" $.Subject) }} +
+ {{ range $v, $s := $.State.GetValSet $d.AtUri.String }} + {{ template "labels/fragments/label" (dict "def" $d "val" $v "withPrefix" false) }} + {{ else }} +

None yet.

+ {{ end }} +
+
+ {{ end }} + {{ end }} +{{ end }} diff --git a/appview/pages/templates/repo/fragments/labelSectionHeader.html b/appview/pages/templates/repo/fragments/labelSectionHeader.html new file mode 100644 --- /dev/null +++ b/appview/pages/templates/repo/fragments/labelSectionHeader.html @@ -0,0 +1,16 @@ +{{ define "repo/fragments/labelSectionHeader" }} + +
+ {{ template "repo/fragments/labelSectionHeaderText" .Name }} + {{ if (or .RepoInfo.Roles.IsOwner .RepoInfo.Roles.IsCollaborator) }} + + {{ i "pencil" "size-3" }} + + {{ end }} +
+{{ end }} diff --git a/appview/pages/templates/repo/fragments/labelSectionHeaderText.html b/appview/pages/templates/repo/fragments/labelSectionHeaderText.html new file mode 100644 --- /dev/null +++ b/appview/pages/templates/repo/fragments/labelSectionHeaderText.html @@ -0,0 +1,3 @@ +{{ define "repo/fragments/labelSectionHeaderText" }} + {{ . }} +{{ end }} diff --git a/appview/pages/templates/repo/settings/fragments/addLabelDefModal.html b/appview/pages/templates/repo/settings/fragments/addLabelDefModal.html --- a/appview/pages/templates/repo/settings/fragments/addLabelDefModal.html +++ b/appview/pages/templates/repo/settings/fragments/addLabelDefModal.html @@ -1,56 +1,86 @@ {{ define "repo/settings/fragments/addLabelDefModal" }} -
-

Labels can have a name and a value. Set the value type to "none" to create a simple label.

+
+ + + + {{ $base := "py-2 text-sm font-normal normal-case block hover:no-underline text-center cursor-pointer bg-gray-100 dark:bg-gray-800 shadow-inner border border-gray-200 dark:border-gray-700" }} + + + + + + + + + +
+
+{{ end }} + +{{ define "basicLabelDef" }} + + +

These labels can have a name and a color.

+ + {{ template "nameInput" . }} + {{ template "scopeInput" . }} + {{ template "colorInput" . }} + +
+ {{ template "cancelButton" . }} + {{ template "submitButton" . }} +
+
+{{ end }} + +{{ define "kvLabelDef" }} +
+ +

+ These labels are more detailed, they can have a key and an associated + value. You may define additional constraints on label values. +

+ + {{ template "nameInput" . }} + {{ template "valueInput" . }} + {{ template "multipleInput" . }} + {{ template "scopeInput" . }} + {{ template "colorInput" . }} + +
+ {{ template "cancelButton" . }} + {{ template "submitButton" . }} +
+
+{{ end }} + +{{ define "nameInput" }}
+{{ end }} - -
- - - -
- - -
- - -
- - +{{ define "colorInput" }}
@@ -63,51 +93,73 @@ {{ end }}
- - -
- - - Allow multiple values - -
- -
- - -
-
- - - {{ end }} + +{{ define "scopeInput" }} +
+ + + +
+{{ end }} + +{{ define "valueInput" }} +
+ + +
+ +
+ + +

+ Enter comma-separated list of permitted values, or leave empty to allow any value. +

+
+ +
+ + +
+{{ end }} + +{{ define "multipleInput" }} +
+ + Allow multiple values +
+{{ end }} + +{{ define "cancelButton" }} + +{{ end }} + +{{ define "submitButton" }} + +{{ end }} + -- tangled.sh