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