1{{ define "repo/fragments/addLabelModal" }}
2 {{ $root := .root }}
3 {{ $subject := .subject }}
4 {{ $state := .state }}
5 {{ with $root }}
6 <form
7 hx-put="/{{ .RepoInfo.FullName }}/labels/perform"
8 hx-on::after-request="this.reset()"
9 hx-indicator="#spinner"
10 hx-swap="none"
11 class="flex flex-col gap-4"
12 >
13 <p class="text-gray-500 dark:text-gray-400">Add, remove or update labels.</p>
14
15 <input class="hidden" name="repo" value="{{ .RepoInfo.RepoAt.String }}">
16 <input class="hidden" name="subject" value="{{ $subject }}">
17
18 <div class="flex flex-col gap-2">
19 {{ $id := 0 }}
20 {{ range $k, $valset := $state.Inner }}
21 {{ $d := index $root.LabelDefs $k }}
22 {{ range $v, $s := $valset }}
23 {{ template "labelCheckbox" (dict "def" $d "key" $k "val" $v "id" $id "isChecked" true) }}
24 {{ $id = add $id 1 }}
25 {{ end }}
26 {{ end }}
27
28 {{ range $k, $d := $root.LabelDefs }}
29 {{ if not ($state.ContainsLabel $k) }}
30 {{ template "labelCheckbox" (dict "def" $d "key" $k "val" "" "id" $id "isChecked" false) }}
31 {{ $id = add $id 1 }}
32 {{ end }}
33 {{ else }}
34 <span>
35 No labels defined yet. You can define custom labels in <a class="underline" href="/{{ .RepoInfo.FullName }}/settings">settings</a>.
36 </span>
37 {{ end }}
38 </div>
39
40 <div class="flex gap-2 pt-2">
41 <button
42 type="button"
43 popovertarget="add-label-modal"
44 popovertargetaction="hide"
45 class="btn w-1/2 flex items-center gap-2 text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300"
46 >
47 {{ i "x" "size-4" }} cancel
48 </button>
49 <button type="submit" class="btn w-1/2 flex items-center">
50 <span class="inline-flex gap-2 items-center">{{ i "check" "size-4" }} save</span>
51 <span id="spinner" class="group">
52 {{ i "loader-circle" "ml-2 w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
53 </span>
54 </button>
55 </div>
56 <div id="add-label-error" class="text-red-500 dark:text-red-400"></div>
57 </form>
58 {{ end }}
59{{ end }}
60
61{{ define "labelCheckbox" }}
62 {{ $key := .key }}
63 {{ $val := .val }}
64 {{ $def := .def }}
65 {{ $id := .id }}
66 {{ $isChecked := .isChecked }}
67 <div class="grid grid-cols-[auto_1fr_50%] gap-2 items-center cursor-pointer">
68 <input type="checkbox" id="op-{{$id}}" name="op-{{$id}}" value="add" {{if $isChecked}}checked{{end}} class="peer">
69 <label for="op-{{$id}}" class="flex items-center gap-2 text-base">{{ template "labels/fragments/labelDef" $def }}</label>
70 <div class="w-full hidden peer-checked:block">{{ template "valueTypeInput" (dict "valueType" $def.ValueType "value" $val "key" $key) }}</div>
71 <input type="hidden" name="operand-key" value="{{ $key }}">
72 </div>
73{{ end }}
74
75{{ define "valueTypeInput" }}
76 {{ $valueType := .valueType }}
77 {{ $value := .value }}
78 {{ $key := .key }}
79
80 {{ if $valueType.IsEnumType }}
81 {{ template "enumTypeInput" $ }}
82 {{ else if $valueType.IsBool }}
83 {{ template "boolTypeInput" $ }}
84 {{ else if $valueType.IsInt }}
85 {{ template "intTypeInput" $ }}
86 {{ else if $valueType.IsString }}
87 {{ template "stringTypeInput" $ }}
88 {{ else if $valueType.IsNull }}
89 {{ template "nullTypeInput" $ }}
90 {{ end }}
91{{ end }}
92
93{{ define "enumTypeInput" }}
94 {{ $valueType := .valueType }}
95 {{ $value := .value }}
96 <select name="operand-val" class="w-full p-1 rounded border border-gray-300 bg-white dark:bg-gray-800 dark:text-white dark:border-gray-600">
97 {{ range $valueType.Enum }}
98 <option value="{{.}}" {{ if eq $value . }} selected {{ end }}>{{.}}</option>
99 {{ end }}
100 </select>
101{{ end }}
102
103{{ define "boolTypeInput" }}
104 {{ $value := .value }}
105 <select name="operand-val" class="w-full p-1 rounded border border-gray-300 bg-white dark:bg-gray-800 dark:text-white dark:border-gray-600">
106 <option value="true" {{ if $value }} selected {{ end }}>true</option>
107 <option value="false" {{ if not $value }} selected {{ end }}>false</option>
108 </select>
109{{ end }}
110
111{{ define "intTypeInput" }}
112 {{ $value := .value }}
113 <input class="p-1 w-full" type="number" name="operand-val" value="{{$value}}" max="100">
114{{ end }}
115
116{{ define "stringTypeInput" }}
117 {{ $valueType := .valueType }}
118 {{ $value := .value }}
119 {{ if $valueType.IsDidFormat }}
120 {{ $value = resolve .value }}
121 {{ end }}
122 <input class="p-1 w-full" type="text" name="operand-val" value="{{$value}}">
123{{ end }}
124
125{{ define "nullTypeInput" }}
126 <input class="p-1" type="hidden" name="operand-val" value="null">
127{{ end }}