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