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