1{{ define "title" }}
2 {{ .Pull.Title }} · pull #{{ .Pull.PullId }} · {{ .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 flex-wrap gap-2 items-center">
81 <!-- round number -->
82 <div class="rounded bg-white drop-shadow-sm px-3 py-2">
83 #{{ $oneIndexedRound }}
84 </div>
85 <!-- round summary -->
86 <div class="rounded drop-shadow-sm bg-white p-2 text-gray-500">
87 <span>
88 {{ $owner := index $.DidHandleMap $.Pull.OwnerDid }}
89 {{ $re := "re" }}
90 {{ if eq .RoundNumber 0 }}
91 {{ $re = "" }}
92 {{ end }}
93 <span class="hidden md:inline">{{$re}}submitted</span>
94 by <a href="/{{ $owner }}">{{ $owner }}</a>
95 <span class="select-none before:content-['\00B7']"></span>
96 <a class="text-gray-500 hover:text-gray-500" href="#round-#{{ $oneIndexedRound }}"><time>{{ .Created | shortTimeFmt }}</time></a>
97 <span class="select-none before:content-['·']"></span>
98 {{ $s := "s" }}
99 {{ if eq (len .Comments) 1 }}
100 {{ $s = "" }}
101 {{ end }}
102 {{ len .Comments }} comment{{$s}}
103 </span>
104 </div>
105 <!-- view patch -->
106 <a class="btn flex items-center gap-2 no-underline hover:no-underline p-2"
107 hx-boost="true"
108 href="/{{ $.RepoInfo.FullName }}/pulls/{{ $.Pull.PullId }}/round/{{.RoundNumber}}">
109 {{ i "file-diff" "w-4 h-4" }} <span class="hidden md:inline">view patch</span>
110 </a>
111 </div>
112 </summary>
113 <div class="md:pl-12 flex flex-col gap-2 mt-2 relative">
114 {{ range .Comments }}
115 <div id="comment-{{.ID}}" class="bg-white rounded drop-shadow-sm py-2 px-4 relative w-fit">
116 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300"></div>
117 <div class="text-sm text-gray-500">
118 {{ $owner := index $.DidHandleMap .OwnerDid }}
119 <a href="/{{$owner}}">{{$owner}}</a>
120 <span class="before:content-['·']"></span>
121 <a class="text-gray-500 hover:text-gray-500" href="#comment-{{.ID}}"><time>{{ .Created | shortTimeFmt }}</time></a>
122 </div>
123 <div class="prose">
124 {{ .Body | markdown }}
125 </div>
126 </div>
127 {{ end }}
128
129 {{ if eq $lastIdx .RoundNumber }}
130 {{ block "mergeStatus" $ }} {{ end }}
131 {{ end }}
132
133 {{ if $.LoggedInUser }}
134 {{ template "fragments/pullActions" (dict "LoggedInUser" $.LoggedInUser "Pull" $.Pull "RepoInfo" $.RepoInfo "RoundNumber" .RoundNumber "MergeCheck" $.MergeCheck) }}
135 {{ else }}
136 <div class="bg-white rounded drop-shadow-sm px-6 py-4 w-fit">
137 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300"></div>
138 <a href="/login" class="underline">login</a> to join the discussion
139 </div>
140 {{ end }}
141 </div>
142 </details>
143 <hr class="md:hidden"/>
144 {{ end }}
145 {{ end }}
146{{ end }}
147
148{{ define "mergeStatus" }}
149 {{ if .Pull.State.IsClosed }}
150 <div class="bg-gray-50 border border-black rounded drop-shadow-sm px-6 py-2 relative w-fit">
151 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300"></div>
152 <div class="flex items-center gap-2 text-black">
153 {{ i "ban" "w-4 h-4" }}
154 <span class="font-medium">closed without merging</span
155 >
156 </div>
157 </div>
158 {{ else if .Pull.State.IsMerged }}
159 <div class="bg-purple-50 border border-purple-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
160 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300"></div>
161 <div class="flex items-center gap-2 text-purple-500">
162 {{ i "git-merge" "w-4 h-4" }}
163 <span class="font-medium">pull request successfully merged</span
164 >
165 </div>
166 </div>
167 {{ else if and .MergeCheck .MergeCheck.Error }}
168 <div class="bg-red-50 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
169 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300"></div>
170 <div class="flex items-center gap-2 text-red-500">
171 {{ i "triangle-alert" "w-4 h-4" }}
172 <span class="font-medium">{{ .MergeCheck.Error }}</span>
173 </div>
174 </div>
175 {{ else if and .MergeCheck .MergeCheck.IsConflicted }}
176 <div class="bg-red-50 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
177 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300"></div>
178 <div class="flex items-center gap-2 text-red-500">
179 {{ i "triangle-alert" "w-4 h-4" }}
180 <span class="font-medium">merge conflicts detected</span>
181 <ul class="text-sm space-y-1">
182 {{ range .MergeCheck.Conflicts }}
183 {{ if .Filename }}
184 <li class="flex items-center">
185 {{ i "file-warning" "w-3 h-3 mr-1.5 text-red-500" }}
186 <span class="font-mono">{{ slice .Filename 0 (sub (len .Filename) 2) }}</span>
187 </li>
188 {{ end }}
189 {{ end }}
190 </ul>
191 </div>
192 </div>
193 {{ else if .MergeCheck }}
194 <div class="bg-green-50 border border-green-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
195 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300"></div>
196 <div class="flex items-center gap-2 text-green-500">
197 {{ i "circle-check-big" "w-4 h-4" }}
198 <span class="font-medium">no conflicts, ready to merge</span>
199 </div>
200 </div>
201 {{ end }}
202{{ end }}