diff --git a/appview/pages/templates/labels/fragments/label.html b/appview/pages/templates/labels/fragments/label.html
index 386c5a73..3a6932a8 100644
--- 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
index ab9b759e..00000000
--- 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 }}
-
- {{ end }}
-{{ end }}
-
-{{ define "labelCheckbox" }}
- {{ $key := .key }}
- {{ $val := .val }}
- {{ $def := .def }}
- {{ $id := .id }}
- {{ $isChecked := .isChecked }}
-
-
-
-
{{ template "valueTypeInput" (dict "valueType" $def.ValueType "value" $val "key" $key) }}
-
-
-{{ 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
index 00000000..fea6a851
--- /dev/null
+++ b/appview/pages/templates/repo/fragments/editLabelPanel.html
@@ -0,0 +1,208 @@
+{{ define "repo/fragments/editLabelPanel" }}
+
+{{ 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" }}
+
+ {{ template "multipleInputField" (dict "def" . "value" "" "key" .AtUri.String) }}
+
+
+{{ 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
index 00000000..f475bdb8
--- /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
index 00000000..df9b4daa
--- /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
index 00000000..638fb11d
--- /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
index b6b6ff90..8f864069 100644
--- 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" }}
-