this repo has no description
1{{ define "title" }} 2 {{ .Pull.Title }} &middot; pull #{{ .Pull.PullId }} &middot; 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 }}