This repository has no description
1{{ define "repo/pulls/fragments/pullActions" }}
2 {{ $lastIdx := .Pull.LatestVersionNumber }}
3 {{ $roundNumber := .RoundNumber }}
4 {{ $loading := .Loading }}
5
6 {{ $isPushAllowed := .RepoInfo.Roles.IsPushAllowed }}
7 {{ $isMerged := .Pull.State.IsMerged }}
8 {{ $isClosed := .Pull.State.IsClosed }}
9 {{ $isOpen := .Pull.State.IsOpen }}
10 {{ $isConflicted := and .MergeCheck (or .MergeCheck.Error .MergeCheck.IsConflicted) }}
11 {{ $isPullAuthor := and .LoggedInUser (eq .LoggedInUser.Did .Pull.OwnerDid) }}
12 {{ $isLastRound := eq $roundNumber $lastIdx }}
13 {{ $isUpToDate := .ResubmitCheck.No }}
14 {{ $isForkBased := .Pull.IsForkBased }}
15 {{ $showRunCI := and (not $loading) $isPushAllowed $isOpen $isLastRound $isForkBased (not .HasPipeline) (ne .RepoInfo.Spindle "") }}
16
17 <div id="action-card-{{$roundNumber}}" class="{{ if .LoggedInUser }}relative p-2 flex flex-col gap-2{{ else }}hidden{{ end }}"
18 {{ if $loading }}
19 hx-get="/{{ .Pull.RepoDid }}/pulls/{{ .Pull.PullId }}/{{ $roundNumber }}/_/actions"
20 hx-trigger="load"
21 hx-swap="outerHTML"
22 hx-target="this"
23 {{ end }}
24 >
25 {{ if and (not $loading) $isLastRound }}
26 {{ template "resubmitStatus" . }}
27 {{ end }}
28 <input type="checkbox" id="comment-toggle-{{$roundNumber}}" class="peer/comment hidden"/>
29 <div class="hidden peer-checked/comment:flex flex-col gap-2">
30 <form
31 class="w-full flex flex-wrap gap-2 group"
32 hx-post="/comment"
33 hx-trigger="submit, keydown[(ctrlKey || metaKey) && key=='Enter'] from:find textarea"
34 hx-target="#pull-comments-{{ .RoundNumber }}"
35 hx-swap="beforeend"
36 hx-disabled-elt="find button[type='submit']"
37 hx-on::after-request="if(event.target === this && event.detail.successful) htmx.ajax('GET', '/{{ .Pull.RepoDid }}/pulls/{{ .Pull.PullId }}/{{ .RoundNumber }}/_/actions', {target: '#action-card-{{ .RoundNumber }}', swap: 'outerHTML'})"
38 >
39 <input name="subject-uri" type="hidden" value="{{ .Pull.AtUri }}">
40 <input name="subject-cid" type="hidden" value="{{ .Pull.Cid }}">
41 <input name="pull-round-idx" type="hidden" value="{{ .RoundNumber }}">
42 {{ template "fragments/markdownEditor"
43 (dict "Name" "body"
44 "BlobName" "blob"
45 "Rows" 8
46 "Required" true
47 "Placeholder" "Add to the discussion...") }}
48 <div class="flex flex-wrap items-stretch justify-end gap-2 text-gray-500 dark:text-gray-400 text-sm w-full">
49 <label title="Toggle comment form" for="comment-toggle-{{$roundNumber}}" class="btn-flat text-red-500 dark:text-red-400 flex gap-2 items-center">
50 {{ i "x" "size-4" }}
51 <span>Cancel</span>
52 </label>
53 <button
54 type="submit"
55 class="btn-create-flat flex items-center gap-2">
56 {{ i "reply" "size-4 inline group-[.htmx-request]:hidden" }}
57 {{ i "loader-circle" "size-4 animate-spin hidden group-[.htmx-request]:inline" }}
58 Reply
59 </button>
60 </div>
61 <div id="comment-error-{{ .RoundNumber }}" class="error"></div>
62 </form>
63 </div>
64 <div id="actions-{{$roundNumber}}" hx-target="this" class="peer-checked/comment:hidden flex flex-wrap gap-2 relative"
65 {{ if $loading }}
66 hx-swap="outerHTML"
67 {{ end }}
68 >
69 {{ if .LoggedInUser }}
70 <label title="Toggle comment form" for="comment-toggle-{{$roundNumber}}" class="btn-flat">
71 {{ i "message-square-plus" "size-4" }}
72 <span>Comment</span>
73 </label>
74 {{ end }}
75 {{ if and (not $loading) .BranchDeleteStatus }}
76 <button
77 hx-delete="/{{ resolve .BranchDeleteStatus.Repo.Did }}/{{ .BranchDeleteStatus.Repo.Slug }}/branches"
78 hx-vals='{"branch": "{{ .BranchDeleteStatus.Branch }}" }'
79 hx-swap="none"
80 class="btn-flat p-2 flex items-center gap-2 no-underline hover:no-underline group text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300">
81 {{ i "git-branch" "w-4 h-4 inline group-[.htmx-request]:hidden" }}
82 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
83 Delete branch
84 </button>
85 {{ end }}
86 {{ if $showRunCI }}
87 {{ template "runCiModal" . }}
88 {{ end }}
89 {{ if and $isPushAllowed $isOpen $isLastRound }}
90 <button
91 hx-post="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/merge"
92 hx-swap="none"
93 hx-confirm="Are you sure you want to merge pull #{{ .Pull.PullId }} into the `{{ .Pull.TargetBranch }}` branch?"
94 class="btn-flat p-2 flex items-center gap-2 group"
95 {{ if or $loading $isConflicted }}disabled{{ end }}
96 >
97 {{ if $loading }}
98 {{ i "loader-circle" "w-4 h-4 animate-spin" }}
99 {{ else }}
100 {{ i "git-merge" "w-4 h-4 inline group-[.htmx-request]:hidden" }}
101 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
102 {{ end }}
103 Merge
104 </button>
105 {{ end }}
106
107 {{ if and $isPullAuthor $isOpen $isLastRound }}
108 <button id="resubmitBtn"
109 hx-post="/{{ .Pull.RepoDid }}/pulls/{{ .Pull.PullId }}/resubmit"
110 hx-swap="none"
111
112 hx-disabled-elt="#resubmitBtn"
113 class="btn-flat p-2 flex items-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed group"
114
115 {{ if $loading }}
116 title="Checking for updates…"
117 disabled
118 {{ else if $isUpToDate }}
119 title="Update this branch to resubmit this pull request"
120 disabled
121 {{ else }}
122 title="Resubmit this pull request"
123 {{ end }}
124 >
125 {{ if $loading }}
126 {{ i "loader-circle" "w-4 h-4 animate-spin" }}
127 {{ else }}
128 {{ i "rotate-ccw" "w-4 h-4 inline group-[.htmx-request]:hidden" }}
129 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
130 {{ end }}
131 Resubmit
132 </button>
133 {{ end }}
134
135 {{ if and (or $isPullAuthor $isPushAllowed) $isOpen $isLastRound }}
136 <button
137 hx-post="/{{ .Pull.RepoDid }}/pulls/{{ .Pull.PullId }}/close"
138 hx-swap="none"
139 class="btn-flat p-2 flex items-center gap-2 group">
140 {{ i "ban" "w-4 h-4 inline group-[.htmx-request]:hidden" }}
141 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
142 Close
143 </button>
144 {{ end }}
145
146 {{ if and (or $isPullAuthor $isPushAllowed) $isClosed $isLastRound }}
147 <button
148 hx-post="/{{ .Pull.RepoDid }}/pulls/{{ .Pull.PullId }}/reopen"
149 hx-swap="none"
150 class="btn-flat p-2 flex items-center gap-2 group">
151 {{ i "refresh-ccw-dot" "w-4 h-4 inline group-[.htmx-request]:hidden" }}
152 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
153 Reopen
154 </button>
155 {{ end }}
156 </div>
157 </div>
158
159 {{ if and (not $loading) $isLastRound }}
160 <div id="mergecheck-banner" hx-swap-oob="innerHTML">
161 {{ if and $isOpen $isForkBased (not .HasPipeline) (ne .RepoInfo.Spindle "") }}
162 {{ template "workflowWarning" . }}
163 {{ end }}
164 {{ template "mergeCheck" . }}
165 </div>
166 {{ end }}
167{{ end }}
168
169{{ define "workflowWarning" }}
170 {{ if .WorkflowsChanged }}
171 <details class="group/ci">
172 <summary class="flex items-center gap-2 cursor-pointer list-none">
173 {{ i "triangle-alert" "w-4 h-4 text-amber-600 dark:text-amber-500" }}
174 <span class="font-medium text-amber-600 dark:text-amber-500">Workflow files changed</span>
175 <div class="text-sm text-gray-500 dark:text-gray-400">
176 <span class="group-open/ci:hidden inline">Expand</span>
177 <span class="hidden group-open/ci:inline">Collapse</span>
178 </div>
179 </summary>
180 <ul class="space-y-1 mt-2 overflow-x-auto">
181 {{ range .ChangedWorkflowFiles }}
182 <li class="flex items-center whitespace-nowrap">
183 {{ i "file-warning" "inline-flex w-4 h-4 mr-1.5 text-amber-600 dark:text-amber-500 flex-shrink-0" }}
184 <span class="font-mono">{{ . }}</span>
185 </li>
186 {{ end }}
187 </ul>
188 </details>
189 {{ else }}
190 <div class="flex items-center gap-2 text-amber-600 dark:text-amber-500">
191 {{ i "triangle-alert" "w-4 h-4" }}
192 <span class="font-medium">Workflow needs approval</span>
193 </div>
194 {{ end }}
195{{ end }}
196
197{{ define "runCiModal" }}
198 <button
199 class="btn-flat p-2 flex items-center gap-2 flex-shrink-0 group"
200 popovertarget="run-ci-{{ .Pull.PullId }}"
201 popovertargetaction="toggle"
202 >
203 {{ i "circle-play" "w-4 h-4 inline" }}
204 Run CI
205 </button>
206
207 <div
208 id="run-ci-{{ .Pull.PullId }}"
209 popover
210 class="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 dark:text-white backdrop:bg-gray-400/50 dark:backdrop:bg-gray-800/50 w-full md:w-96 p-4 rounded drop-shadow overflow-visible"
211 >
212 <form
213 hx-post="/{{ .Pull.RepoDid }}/pulls/{{ .Pull.PullId }}/trigger-ci?confirm=1"
214 hx-swap="none"
215 hx-indicator="#run-ci-spinner-{{ .Pull.PullId }}"
216 class="flex flex-col gap-2"
217 >
218 <label class="text-lg font-medium p-0">Run CI</label>
219 {{ if .WorkflowsChanged }}
220 <div class="flex items-center gap-2 text-amber-600 dark:text-amber-500">
221 {{ i "triangle-alert" "size-4" }}
222 <span class="font-medium">Workflow files changed</span>
223 </div>
224 <ul class="space-y-1 overflow-x-auto pl-6">
225 {{ range .ChangedWorkflowFiles }}
226 <li class="flex items-center whitespace-nowrap">
227 {{ i "file-warning" "size-4 mr-1.5 text-amber-600 dark:text-amber-500 flex-shrink-0" }}
228 <span class="font-mono text-sm">{{ . }}</span>
229 </li>
230 {{ end }}
231 </ul>
232 <p class="text-sm text-gray-500 dark:text-gray-400">Workflow files changed in this round. Are you sure you want to run CI?</p>
233 {{ else }}
234 <div class="flex items-center gap-2 text-amber-600 dark:text-amber-500">
235 {{ i "triangle-alert" "size-4" }}
236 <span class="font-medium">Workflow needs approval</span>
237 </div>
238 <p class="text-sm text-gray-500 dark:text-gray-400">This fork-based pull request needs approval to run CI. Are you sure?</p>
239 {{ end }}
240 <div class="flex gap-2 pt-2">
241 <button
242 type="button"
243 popovertarget="run-ci-{{ .Pull.PullId }}"
244 popovertargetaction="hide"
245 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"
246 >
247 {{ i "x" "size-4" }} Cancel
248 </button>
249 <button type="submit" class="btn w-1/2 flex items-center">
250 <span class="inline-flex gap-2 items-center">{{ i "shield-check" "size-4" }} Approve</span>
251 <span id="run-ci-spinner-{{ .Pull.PullId }}" class="group">
252 {{ i "loader-circle" "ml-2 w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
253 </span>
254 </button>
255 </div>
256 <div id="pull-error" class="text-red-500 dark:text-red-400"></div>
257 </form>
258 </div>
259{{ end }}
260
261{{ define "mergeCheck" }}
262 {{ $isOpen := .Pull.State.IsOpen }}
263 {{ if and $isOpen .MergeCheck .MergeCheck.Error }}
264 <div class="flex items-center gap-2 text-red-600 dark:text-red-500">
265 {{ i "triangle-alert" "w-4 h-4" }}
266 <span class="font-medium">{{ .MergeCheck.Error }}</span>
267 </div>
268 {{ else if and $isOpen .MergeCheck .MergeCheck.IsConflicted }}
269 <details class="group/conflict">
270 <summary class="flex items-center justify-between cursor-pointer list-none">
271 <div class="flex items-center gap-2 text-red-600 dark:text-red-500">
272 {{ i "triangle-alert" "w-4 h-4" }}
273 <span class="font-medium">Merge conflicts detected</span>
274 <div class="text-sm text-gray-500 dark:text-gray-400">
275 <span class="group-open/conflict:hidden inline">Expand</span>
276 <span class="hidden group-open/conflict:inline">Collapse</span>
277 </div>
278 </div>
279 </summary>
280 {{ if gt (len .MergeCheck.Conflicts) 0 }}
281 <ul class="space-y-1 mt-2 overflow-x-auto">
282 {{ range .MergeCheck.Conflicts }}
283 {{ if .Filename }}
284 <li class="flex items-center whitespace-nowrap">
285 {{ i "file-warning" "inline-flex w-4 h-4 mr-1.5 text-red-600 dark:text-red-500 flex-shrink-0" }}
286 <span class="font-mono">{{ .Filename }}</span>
287 </li>
288 {{ else if .Reason }}
289 <li class="flex items-center whitespace-nowrap">
290 {{ i "file-warning" "w-4 h-4 mr-1.5 text-red-600 dark:text-red-500 " }}
291 <span>{{.Reason}}</span>
292 </li>
293 {{ end }}
294 {{ end }}
295 </ul>
296 {{ end }}
297 </details>
298 {{ else if and $isOpen .MergeCheck }}
299 <div class="flex items-center gap-2 text-green-600 dark:text-green-500">
300 {{ i "check" "w-4 h-4" }}
301 <span class="font-medium">No conflicts, ready to merge</span>
302 </div>
303 {{ end }}
304{{ end }}
305
306{{ define "resubmitStatus" }}
307 {{ if .ResubmitCheck.Yes }}
308 <div class="bg-amber-50 dark:bg-amber-900 border border-amber-500 rounded shadow-sm px-6 py-2 relative">
309 <div class="flex items-center gap-2 text-amber-500 dark:text-amber-300">
310 {{ i "triangle-alert" "w-4 h-4" }}
311 <span class="font-medium">This branch has been updated, consider resubmitting</span>
312 </div>
313 </div>
314 {{ end }}
315{{ end }}