this repo has no description
1{{ define "title" }}
2 {{ .Pull.Title }} · pull #{{ .Pull.PullId }} · {{ .RepoInfo.FullName }}
3{{ end }}
4
5{{ define "repoContent" }}
6 <header class="pb-4">
7 <h1 class="text-2xl">
8 {{ .Pull.Title }}
9 <span class="text-gray-500">#{{ .Pull.PullId }}</span>
10 </h1>
11 </header>
12
13 {{ $bgColor := "bg-gray-800" }}
14 {{ $icon := "ban" }}
15
16 {{ if .Pull.State.IsOpen }}
17 {{ $bgColor = "bg-green-600" }}
18 {{ $icon = "git-pull-request" }}
19 {{ else if .Pull.State.IsMerged }}
20 {{ $bgColor = "bg-purple-600" }}
21 {{ $icon = "git-merge" }}
22 {{ end }}
23
24 <section>
25 <div class="flex items-center gap-2">
26 <div
27 id="state"
28 class="inline-flex items-center rounded px-3 py-1 {{ $bgColor }}"
29 >
30 <i
31 data-lucide="{{ $icon }}"
32 class="w-4 h-4 mr-1.5 text-white"
33 ></i>
34 <span class="text-white">{{ .Pull.State.String }}</span>
35 </div>
36 <span class="text-gray-500 text-sm">
37 opened by
38 {{ $owner := index $.DidHandleMap .Pull.OwnerDid }}
39 <a href="/{{ $owner }}" class="no-underline hover:underline"
40 >{{ $owner }}</a
41 >
42 <span class="select-none before:content-['\00B7']"></span>
43 <time>{{ .Pull.Created | timeFmt }}</time>
44 <span class="select-none before:content-['\00B7']"></span>
45 <span>targeting branch
46 <span class="text-xs rounded bg-gray-100 text-black font-mono px-2 mx-1/2 inline-flex items-center">
47 {{ .Pull.TargetBranch }}
48 </span>
49 </span>
50 </span>
51 </div>
52
53 {{ if .Pull.Body }}
54 <article id="body" class="mt-2 prose">
55 {{ .Pull.Body | markdown }}
56 </article>
57 {{ end }}
58 </section>
59
60{{ end }}
61
62{{ define "repoAfter" }}
63 <section id="submissions" class="mt-4">
64 <div class="flex flex-col gap-4">
65 {{ block "submissions" . }} {{ end }}
66 </div>
67 </section>
68
69 <div id="pull-close"></div>
70 <div id="pull-reopen"></div>
71{{ end }}
72
73{{ define "submissions" }}
74 {{ $lastIdx := sub (len .Pull.Submissions) 1 }}
75 {{ $targetBranch := .Pull.TargetBranch }}
76 {{ $repoName := .RepoInfo.FullName }}
77 {{ range $idx, $item := .Pull.Submissions }}
78 {{ $diff := $item.AsNiceDiff $targetBranch }}
79 {{ with $item }}
80 {{ $oneIndexedRound := add .RoundNumber 1 }}
81 <details {{ if eq $idx $lastIdx }}open{{ end }}>
82 <summary id="round-#{{ $oneIndexedRound }}" class="list-none cursor-pointer">
83 <div class="flex gap-2 items-center">
84 <div class="rounded bg-white drop-shadow-sm p-3">
85 #{{ $oneIndexedRound }}
86 </div>
87 <div class="rounded drop-shadow-sm bg-white p-3 text-gray-500">
88 <span>
89 {{ $owner := index $.DidHandleMap $.Pull.OwnerDid }}
90 submitted by <a href="/{{ $owner }}">{{ $owner }}</a>
91 <span class="select-none before:content-['\00B7']"></span>
92 <a class="text-gray-500 hover:text-gray-500" href="#round-#{{ $oneIndexedRound }}"><time>{{ .Created | timeFmt }}</time></a>
93 <span class="select-none before:content-['·']"></span>
94 {{ $s := "s" }}
95 {{ if eq (len .Comments) 1 }}
96 {{ $s = "" }}
97 {{ end }}
98 {{ len .Comments }} comment{{$s}}
99 <span class="before:content-['·']"></span>
100 <a href="/{{ $.RepoInfo.FullName }}/pulls/{{ $.Pull.PullId }}/round/{{.RoundNumber}}">view patch</a>
101 </span>
102 </div>
103 </div>
104 </summary>
105 <div class="pl-12 flex flex-col gap-2 mt-2 relative">
106 {{ range .Comments }}
107 <div id="comment-{{.ID}}" class="bg-white rounded drop-shadow-sm py-2 px-4 relative w-fit">
108 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300"></div>
109 <div class="text-sm text-gray-500">
110 {{ $owner := index $.DidHandleMap .OwnerDid }}
111 <a href="/{{$owner}}">{{$owner}}</a>
112 <span class="before:content-['·']"></span>
113 <a href="#comment-{{.ID}}"><time>{{ .Created | timeFmt }}</time></a>
114 </div>
115 <div class="prose">
116 {{ .Body }}
117 </div>
118 </div>
119 {{ end }}
120
121 {{ block "mergeStatus" $ }} {{ end }}
122
123 {{ if $.LoggedInUser }}
124 {{ block "actions" (list $ .ID) }} {{ end }}
125 {{ else }}
126 <div class="bg-white rounded drop-shadow-sm px-6 py-4 w-fit">
127 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300"></div>
128 <a href="/login" class="underline">login</a> to join the discussion
129 </div>
130 {{ end }}
131 </div>
132 </details>
133 {{ end }}
134 {{ end }}
135{{ end }}
136
137{{ define "mergeStatus" }}
138 {{ if .Pull.State.IsMerged }}
139 <div class="bg-purple-50 border border-purple-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
140 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300"></div>
141 <div class="flex items-center gap-2 text-purple-500">
142 <i data-lucide="git-merge" class="w-4 h-4"></i>
143 <span class="font-medium">pull request successfully merged</span
144 >
145 </div>
146 </div>
147 {{ else if and .MergeCheck .MergeCheck.IsConflicted }}
148 <div class="bg-red-50 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
149 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300"></div>
150 <div class="flex items-center gap-2 text-red-500">
151 <i data-lucide="alert-triangle" class="w-4 h-4"></i>
152 <span class="font-medium">merge conflicts detected</span>
153 <ul class="text-sm space-y-1">
154 {{ range .MergeCheck.Conflicts }}
155 {{ if .Filename }}
156 <li class="flex items-center">
157 <i
158 data-lucide="file-warning"
159 class="w-3 h-3 mr-1.5 text-red-500"
160 ></i>
161 <span class="font-mono">{{ slice .Filename 0 (sub (len .Filename) 2) }}</span>
162 </li>
163 {{ end }}
164 {{ end }}
165 </ul>
166 </div>
167 </div>
168 {{ else if .MergeCheck }}
169 <div class="bg-green-50 border border-green-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
170 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300"></div>
171 <div class="flex items-center gap-2 text-green-500">
172 <i data-lucide="check-circle" class="w-4 h-4"></i>
173 <span class="font-medium">no conflicts, ready to merge</span>
174 </div>
175 </div>
176 {{ end }}
177{{ end }}
178
179{{ define "actions" }}
180 {{ $rootObj := index . 0 }}
181 {{ $submissionId := index . 1 }}
182
183 {{ with $rootObj }}
184 {{ $isPushAllowed := .RepoInfo.Roles.IsPushAllowed }}
185 {{ $isMerged := .Pull.State.IsMerged }}
186 {{ $isClosed := .Pull.State.IsClosed }}
187 {{ $isOpen := .Pull.State.IsOpen }}
188 {{ $isConflicted := and .MergeCheck .MergeCheck.IsConflicted }}
189 {{ $isPullAuthor := and .LoggedInUser (eq .LoggedInUser.Did .Pull.OwnerDid) }}
190 <div class="relative w-fit">
191 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300"></div>
192 <div class="flex flex-wrap gap-2">
193 <button href="#" class="btn p-2 flex items-center gap-2 no-underline hover:no-underline">
194 <i data-lucide="message-square-plus" class="w-4 h-4"></i>
195 <span>comment</span>
196 </button>
197 {{ if and $isPushAllowed $isOpen }}
198 {{ $disabled := "" }}
199 {{ if $isConflicted }}
200 {{ $disabled = "disabled" }}
201 {{ end }}
202 <button href="#" class="btn p-2 flex items-center gap-2 no-underline hover:no-underline" {{ $disabled }}>
203 <i data-lucide="git-merge" class="w-4 h-4"></i>
204 <span>merge</span>
205 </button>
206 {{ end }}
207
208 {{ if and $isPullAuthor $isOpen }}
209 <button href="#" class="btn p-2 flex items-center gap-2 no-underline hover:no-underline">
210 <i data-lucide="rotate-ccw" class="w-4 h-4"></i>
211 <span>resubmit</span>
212 </button>
213 {{ end }}
214
215 {{ if and $isPullAuthor $isPushAllowed $isOpen }}
216 <button href="#" class="btn p-2 flex items-center gap-2 no-underline hover:no-underline">
217 <i data-lucide="ban" class="w-4 h-4"></i>
218 <span>close</span>
219 </button>
220 {{ end }}
221
222 {{ if and $isPullAuthor $isPushAllowed $isClosed }}
223 <button href="#" class="btn p-2 flex items-center gap-2 no-underline hover:no-underline">
224 <i data-lucide="circle-dot" class="w-4 h-4"></i>
225 <span>reopen</span>
226 </button>
227 {{ end }}
228 </div>
229 </div>
230 {{ end }}
231{{ end }}
232
233{{ define "newComment" }}
234 {{ $rootObj := index . 0 }}
235 {{ $submissionId := index . 1 }}
236
237 {{ with $rootObj }}
238 {{ if .LoggedInUser }}
239 <div class="bg-white rounded drop-shadow-sm py-2 px-4 relative w-full md:w-96">
240 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300"></div>
241 <div class="text-sm text-gray-500">
242 {{ index .DidHandleMap .LoggedInUser.Did }}
243 </div>
244 <form
245 hx-post="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/comment"
246 hx-swap="none">
247 <input type="hidden" name="submissionId" value="{{ $submissionId }}">
248 <textarea
249 name="body"
250 class="w-full border-0 h-8 focus:outline-none focus:ring-0 px-0 py-1"
251 placeholder="Add to the discussion..." /></textarea>
252 <div class="flex justify-end">
253 <button type="submit" class="btn text-sm mt-2">comment</button>
254 </div>
255 <div id="pull-comment"></div>
256 </form>
257 </div>
258 {{ else }}
259 <div class="bg-white rounded drop-shadow-sm px-6 py-4 text-sm w-fit">
260 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300"></div>
261 <a href="/login" class="underline">login</a> to join the discussion
262 </div>
263 {{ end }}
264 {{ end }}
265{{ end }}
266
267{{ define "alreadyMergedCard" }}
268 <div
269 id="merge-status-card"
270 class="rounded relative bg-purple-50 border border-purple-200 p-4">
271
272 <div class="flex items-center gap-2 text-purple-500">
273 <i data-lucide="git-merge" class="w-4 h-4"></i>
274 <span class="font-medium"
275 >pull request successfully merged</span
276 >
277 </div>
278
279 <div class="mt-2 text-sm text-gray-700">
280 <p>This pull request has been merged into the base branch.</p>
281 </div>
282 </div>
283{{ end }}
284
285{{ define "isConflictedCard" }}
286 <div
287 id="merge-status-card"
288 class="rounded relative border bg-red-50 border-red-200 p-4">
289
290 <div class="flex items-center gap-2 text-red-500">
291 <i data-lucide="alert-triangle" class="w-4 h-4"></i>
292 <span class="font-medium">merge conflicts detected</span>
293 </div>
294
295 <div class="mt-2">
296 <ul class="text-sm space-y-1">
297 {{ range .MergeCheck.Conflicts }}
298 <li class="flex items-center">
299 <i
300 data-lucide="file-warning"
301 class="w-3 h-3 mr-1.5 text-red-500"
302 ></i>
303 <span class="font-mono"
304 >{{ slice .Filename 0 (sub (len .Filename) 2) }}</span
305 >
306 </li>
307 {{ end }}
308 </ul>
309 </div>
310 <div class="mt-3 text-sm text-gray-700">
311 <p>
312 Please resolve these conflicts locally and update
313 the patch to continue with the merge.
314 </p>
315 </div>
316 </div>
317{{ end }}
318
319
320{{ define "noConflictsCard" }}
321 {{ $isPushAllowed := .RepoInfo.Roles.IsPushAllowed }}
322 {{ $isPullAuthor := and .LoggedInUser (eq .LoggedInUser.Did .Pull.OwnerDid) }}
323 <div
324 id="merge-status-card"
325 class="rounded relative border bg-green-50 border-green-200 p-4">
326
327 <div class="flex items-center gap-2 text-green-500">
328 <i data-lucide="check-circle" class="w-4 h-4"></i>
329 <span class="font-medium">ready to merge</span>
330 </div>
331
332 <div class="mt-2 text-sm text-gray-700">
333 No conflicts detected with the base branch. This
334 pull request can be merged safely.
335 </div>
336
337 <div class="flex items-center gap-2">
338 {{ if $isPushAllowed }}
339 <button
340 class="btn mt-4 flex items-center gap-2"
341 hx-post="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/merge"
342 hx-swap="none"
343 {{ if or .Pull.State.IsClosed .MergeCheck.IsConflicted }}
344 disabled
345 {{ end }}>
346 <i data-lucide="git-merge" class="w-4 h-4"></i>
347 <span>merge</span>
348 </button>
349 {{ end }}
350
351 {{ if and (or $isPullAuthor $isPushAllowed) (not .Pull.State.IsMerged) }}
352 {{ $action := "close" }}
353 {{ $icon := "circle-x" }}
354 {{ $hoverColor := "red" }}
355 {{ if .Pull.State.IsClosed }}
356 {{ $action = "reopen" }}
357 {{ $icon = "circle-dot" }}
358 {{ $hoverColor = "green" }}
359 {{ end }}
360 <button
361 hx-post="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/{{ $action }}"
362 hx-swap="none"
363 class="btn mt-4 flex items-center gap-2">
364 <i data-lucide="{{ $icon }}" class="w-4 h-4 text-{{ $hoverColor }}-400"></i>
365 <span class="text-black">{{ $action }}</span>
366 </button>
367 {{ end }}
368
369 <div id="pull-merge-error" class="error"></div>
370 <div id="pull-merge-success" class="success"></div>
371 </div>
372 </div>
373{{ end }}
374
375{{ define "resubmitCard" }}
376 <div
377 id="resubmit-pull-card"
378 class="rounded relative border bg-amber-50 border-amber-200 p-4">
379
380 <div class="flex items-center gap-2 text-amber-500">
381 <i data-lucide="edit" class="w-4 h-4"></i>
382 <span class="font-medium">resubmit your patch</span>
383 </div>
384
385 <div class="mt-2 text-sm text-gray-700">
386 You can update this patch to address any reviews.
387 This will begin a new round of reviews,
388 but you'll still be able to view your previous submissions and feedback.
389 </div>
390
391 <div class="mt-4 flex flex-col">
392 <form hx-post="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/resubmit" class="w-full" hx-swap="none">
393 <textarea
394 name="patch"
395 class="w-full p-2 mb-2 rounded border border-gray-200"
396 placeholder="Paste your updated patch here."
397 ></textarea>
398 <button
399 type="submit"
400 class="btn flex items-center gap-2"
401 {{ if or .Pull.State.IsClosed }}
402 disabled
403 {{ end }}>
404 <i data-lucide="refresh-ccw" class="w-4 h-4"></i>
405 <span>resubmit</span>
406 </button>
407 </form>
408
409 <div id="resubmit-error" class="error"></div>
410 <div id="resubmit-success" class="success"></div>
411 </div>
412 </div>
413{{ end }}