this repo has no description
1{{ define "title" }}
2 {{ .Pull.Title }} · pull #{{ .Pull.PullId }} ·
3 {{ .RepoInfo.FullName }}
4{{ end }}
5
6{{ define "repoContent" }}
7
8 <header class="pb-4">
9 <h1 class="text-2xl">
10 {{ .Pull.Title }}
11 <span class="text-gray-500">#{{ .Pull.PullId }}</span>
12 </h1>
13 </header>
14
15 {{ $bgColor := "bg-gray-800" }}
16 {{ $icon := "ban" }}
17 {{ if eq .State "open" }}
18 {{ $bgColor = "bg-green-600" }}
19 {{ $icon = "circle-dot" }}
20 {{ else if eq .State "merged" }}
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">{{ .State }}</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="px-1 select-none before:content-['\00B7']"></span>
45 <time>{{ .Pull.Created | timeFmt }}</time>
46 </span>
47 </div>
48
49 {{ if .Pull.Body }}
50 <article id="body" class="mt-8 prose">
51 {{ .Pull.Body | markdown }}
52 </article>
53 {{ end }}
54 </section>
55
56 <div class="flex flex-col justify-end mt-4">
57 <details>
58 <summary
59 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"
60 >
61 <i data-lucide="code" class="w-4 h-4 mr-2"></i>
62 <span>patch</span>
63 </summary>
64 <div class="relative">
65 <pre
66 id="patch-preview"
67 class="font-mono overflow-x-scroll bg-gray-50 p-4 rounded-b border border-gray-200 text-sm"
68 >
69 {{- .Pull.Patch -}}
70 </pre
71 >
72 <form
73 id="patch-form"
74 hx-patch="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/patch"
75 hx-swap="none"
76 >
77 <textarea
78 id="patch"
79 name="patch"
80 class="font-mono w-full h-full p-4 rounded-b border border-gray-200 text-sm hidden"
81 >
82{{- .Pull.Patch -}}</textarea
83 >
84
85 <div class="flex gap-2 justify-end mt-2">
86 <button
87 id="edit-patch-btn"
88 type="button"
89 class="btn btn-sm"
90 onclick="togglePatchEdit(true)"
91 >
92 <i data-lucide="edit" class="w-4 h-4 mr-1"></i>Edit
93 </button>
94 <button
95 id="save-patch-btn"
96 type="submit"
97 class="btn btn-sm bg-green-500 hidden"
98 >
99 <i data-lucide="save" class="w-4 h-4 mr-1"></i>Save
100 </button>
101 <button
102 id="cancel-patch-btn"
103 type="button"
104 class="btn btn-sm bg-gray-300 hidden"
105 onclick="togglePatchEdit(false)"
106 >
107 Cancel
108 </button>
109 </div>
110 </form>
111
112 <div id="pull-error" class="error"></div>
113 <div id="pull-success" class="success"></div>
114 </div>
115 <script>
116 function togglePatchEdit(editMode) {
117 const preview = document.getElementById("patch-preview");
118 const editor = document.getElementById("patch");
119 const editBtn = document.getElementById("edit-patch-btn");
120 const saveBtn = document.getElementById("save-patch-btn");
121 const cancelBtn =
122 document.getElementById("cancel-patch-btn");
123
124 if (editMode) {
125 preview.classList.add("hidden");
126 editor.classList.remove("hidden");
127 editBtn.classList.add("hidden");
128 saveBtn.classList.remove("hidden");
129 cancelBtn.classList.remove("hidden");
130 } else {
131 preview.classList.remove("hidden");
132 editor.classList.add("hidden");
133 editBtn.classList.remove("hidden");
134 saveBtn.classList.add("hidden");
135 cancelBtn.classList.add("hidden");
136 }
137 }
138
139 document
140 .getElementById("save-patch-btn")
141 .addEventListener("click", function () {
142 togglePatchEdit(false);
143 });
144 </script>
145 </details>
146 </div>
147
148 {{ if .MergeCheck }}
149 <div class="mt-4" id="merge-check">
150 <div
151 class="rounded-sm border p-4 {{ if .MergeCheck.IsConflicted }}
152 bg-red-50 border-red-200
153 {{ else }}
154 bg-green-50 border-green-200
155 {{ end }}"
156 >
157 <div
158 class="flex items-center gap-2 rounded-sm {{ if .MergeCheck.IsConflicted }}
159 text-red-500
160 {{ else }}
161 text-green-500
162 {{ end }}"
163 >
164 {{ if .MergeCheck.IsConflicted }}
165 <i data-lucide="alert-triangle" class="w-4 h-4"></i>
166 <span class="font-medium"
167 >merge conflicts detected</span
168 >
169 {{ else }}
170 <i data-lucide="check-circle" class="w-4 h-4"></i>
171 <span class="font-medium">ready to merge</span>
172 {{ end }}
173 </div>
174
175 {{ if .MergeCheck.IsConflicted }}
176 <div class="mt-2">
177 <ul class="text-sm space-y-1">
178 {{ range .MergeCheck.Conflicts }}
179 <li class="flex items-center">
180 <i
181 data-lucide="file-warning"
182 class="w-3 h-3 mr-1.5 text-red-500"
183 ></i>
184 <span class="font-mono"
185 >{{ slice .Filename 0 (sub (len .Filename) 2) }}</span
186 >
187 </li>
188 {{ end }}
189 </ul>
190 </div>
191 {{ end }}
192 </div>
193 </div>
194 {{ end }}
195{{ end }}
196
197{{ define "repoAfter" }}
198 <section id="comments" class="mt-8 space-y-4 relative">
199 {{ range $index, $comment := .Comments }}
200 <div
201 id="comment-{{ .CommentId }}"
202 class="rounded bg-white p-4 relative"
203 >
204 {{ if eq $index 0 }}
205 <div
206 class="absolute left-8 -top-8 w-px h-8 bg-gray-300"
207 ></div>
208 {{ else }}
209 <div
210 class="absolute left-8 -top-4 w-px h-4 bg-gray-300"
211 ></div>
212 {{ end }}
213 <div class="flex items-center gap-2 mb-2 text-gray-400">
214 {{ $owner := index $.DidHandleMap .OwnerDid }}
215 <span class="text-sm">
216 <a
217 href="/{{ $owner }}"
218 class="no-underline hover:underline"
219 >{{ $owner }}</a
220 >
221 </span>
222 <span
223 class="px-1 select-none before:content-['\00B7']"
224 ></span>
225 <a
226 href="#{{ .CommentId }}"
227 class="text-gray-500 text-sm hover:text-gray-500 hover:underline no-underline"
228 id="{{ .CommentId }}"
229 >
230 {{ .Created | timeFmt }}
231 </a>
232 </div>
233 <div class="prose">
234 {{ .Body | markdown }}
235 </div>
236 </div>
237 {{ end }}
238
239 </section>
240
241 {{ if .LoggedInUser }}
242 <form
243 hx-post="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/comment"
244 class="mt-8"
245 >
246 <textarea
247 name="body"
248 class="w-full p-2 rounded border border-gray-200"
249 placeholder="Add to the discussion..."
250 ></textarea>
251 <button type="submit" class="btn mt-2">comment</button>
252 <div id="pull-comment"></div>
253 </form>
254 {{ end }}
255
256 {{ if eq .LoggedInUser.Did .Pull.OwnerDid }}
257 {{ $action := "close" }}
258 {{ $icon := "circle-x" }}
259 {{ $hoverColor := "red" }}
260 {{ if eq .State "closed" }}
261 {{ $action = "reopen" }}
262 {{ $icon = "circle-dot" }}
263 {{ $hoverColor = "green" }}
264 {{ end }}
265 <form
266 hx-post="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/{{ $action }}"
267 hx-swap="none"
268 class="mt-8"
269 >
270 <button type="submit" class="btn hover:bg-{{ $hoverColor }}-300">
271 <i
272 data-lucide="{{ $icon }}"
273 class="w-4 h-4 mr-2 text-{{ $hoverColor }}-400"
274 ></i>
275 <span class="text-black">{{ $action }}</span>
276 </button>
277 </form>
278 {{ end }}
279{{ end }}