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 $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 }}