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 dark:text-white">
8 {{ .Pull.Title }}
9 <span class="text-gray-500 dark:text-gray-400">#{{ .Pull.PullId }}</span>
10 </h1>
11 </header>
12
13 {{ $bgColor := "bg-gray-800 dark:bg-gray-700" }}
14 {{ $icon := "ban" }}
15
16 {{ if .Pull.State.IsOpen }}
17 {{ $bgColor = "bg-green-600 dark:bg-green-700" }}
18 {{ $icon = "git-pull-request" }}
19 {{ else if .Pull.State.IsMerged }}
20 {{ $bgColor = "bg-purple-600 dark:bg-purple-700" }}
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 dark:text-gray-400 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>
43 targeting
44 <span class="text-xs rounded bg-gray-100 dark:bg-gray-700 text-black dark:text-white font-mono px-2 mx-1/2 inline-flex items-center">
45 <a href="/{{ .RepoInfo.FullName }}/tree/{{ .Pull.TargetBranch }}" class="no-underline hover:underline">{{ .Pull.TargetBranch }}</a>
46 </span>
47 </span>
48 {{ if not .Pull.IsPatch }}
49 <span>from
50 {{ if not .Pull.IsSameRepoBranch }}
51 <a href="/{{ $owner }}/{{ .PullSourceRepo.Name }}" class="no-underline hover:underline">{{ $owner }}/{{ .PullSourceRepo.Name }}</a>
52 {{ end }}
53
54 {{ $fullRepo := .RepoInfo.FullName }}
55 {{ if not .Pull.IsSameRepoBranch }}
56 {{ $fullRepo = printf "%s/%s" $owner .PullSourceRepo.Name }}
57 {{ end }}
58 <span class="text-xs rounded bg-gray-100 dark:bg-gray-700 text-black dark:text-white font-mono px-2 mx-1/2 inline-flex items-center">
59 <a href="/{{ $fullRepo }}/tree/{{ .Pull.PullSource.Branch }}" class="no-underline hover:underline">{{ .Pull.PullSource.Branch }}</a>
60 </span>
61 </span>
62 {{ end }}
63 </span>
64 </div>
65
66 {{ if .Pull.Body }}
67 <article id="body" class="mt-2 prose dark:prose-invert">
68 {{ .Pull.Body | markdown }}
69 </article>
70 {{ end }}
71 </section>
72
73{{ end }}
74
75{{ define "repoAfter" }}
76 <section id="submissions" class="mt-4">
77 <div class="flex flex-col gap-4">
78 {{ block "submissions" . }} {{ end }}
79 </div>
80 </section>
81
82 <div id="pull-close"></div>
83 <div id="pull-reopen"></div>
84{{ end }}
85
86{{ define "submissions" }}
87 {{ $lastIdx := sub (len .Pull.Submissions) 1 }}
88 {{ $targetBranch := .Pull.TargetBranch }}
89 {{ $repoName := .RepoInfo.FullName }}
90 {{ range $idx, $item := .Pull.Submissions }}
91 {{ $diff := $item.AsNiceDiff $targetBranch }}
92 {{ with $item }}
93 <details {{ if eq $idx $lastIdx }}open{{ end }}>
94 <summary id="round-#{{ .RoundNumber }}" class="list-none cursor-pointer">
95 <div class="flex flex-wrap gap-2 items-center">
96 <!-- round number -->
97 <div class="rounded bg-white dark:bg-gray-800 drop-shadow-sm px-3 py-2 dark:text-white">
98 #{{ .RoundNumber }}
99 </div>
100 <!-- round summary -->
101 <div class="rounded drop-shadow-sm bg-white dark:bg-gray-800 p-2 text-gray-500 dark:text-gray-400">
102 <span>
103 {{ $owner := index $.DidHandleMap $.Pull.OwnerDid }}
104 {{ $re := "re" }}
105 {{ if eq .RoundNumber 0 }}
106 {{ $re = "" }}
107 {{ end }}
108 <span class="hidden md:inline">{{$re}}submitted</span>
109 by <a href="/{{ $owner }}">{{ $owner }}</a>
110 <span class="select-none before:content-['\00B7']"></span>
111 <a class="text-gray-500 dark:text-gray-400 hover:text-gray-500" href="#round-#{{ .RoundNumber }}"><time>{{ .Created | shortTimeFmt }}</time></a>
112 <span class="select-none before:content-['·']"></span>
113 {{ $s := "s" }}
114 {{ if eq (len .Comments) 1 }}
115 {{ $s = "" }}
116 {{ end }}
117 {{ len .Comments }} comment{{$s}}
118 </span>
119 </div>
120 <!-- view patch -->
121 <a class="btn flex items-center gap-2 no-underline hover:no-underline p-2"
122 hx-boost="true"
123 href="/{{ $.RepoInfo.FullName }}/pulls/{{ $.Pull.PullId }}/round/{{.RoundNumber}}">
124 {{ i "file-diff" "w-4 h-4" }} <span class="hidden md:inline">view patch</span>
125 </a>
126 </div>
127 </summary>
128 <div class="md:pl-12 flex flex-col gap-2 mt-2 relative">
129 {{ range .Comments }}
130 <div id="comment-{{.ID}}" class="bg-white dark:bg-gray-800 rounded drop-shadow-sm py-2 px-4 relative w-fit">
131 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300 dark:bg-gray-600"></div>
132 <div class="text-sm text-gray-500 dark:text-gray-400">
133 {{ $owner := index $.DidHandleMap .OwnerDid }}
134 <a href="/{{$owner}}">{{$owner}}</a>
135 <span class="before:content-['·']"></span>
136 <a class="text-gray-500 dark:text-gray-400 hover:text-gray-500 dark:hover:text-gray-300" href="#comment-{{.ID}}"><time>{{ .Created | shortTimeFmt }}</time></a>
137 </div>
138 <div class="prose dark:prose-invert">
139 {{ .Body | markdown }}
140 </div>
141 </div>
142 {{ end }}
143
144 {{ if eq $lastIdx .RoundNumber }}
145 {{ block "mergeStatus" $ }} {{ end }}
146 {{ block "resubmitStatus" $ }} {{ end }}
147 {{ end }}
148
149 {{ if $.LoggedInUser }}
150 {{ template "fragments/pullActions" (dict "LoggedInUser" $.LoggedInUser "Pull" $.Pull "RepoInfo" $.RepoInfo "RoundNumber" .RoundNumber "MergeCheck" $.MergeCheck "ResubmitCheck" $.ResubmitCheck) }}
151 {{ else }}
152 <div class="bg-white dark:bg-gray-800 rounded drop-shadow-sm px-6 py-4 w-fit dark:text-white">
153 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300 dark:bg-gray-600"></div>
154 <a href="/login" class="underline">login</a> to join the discussion
155 </div>
156 {{ end }}
157 </div>
158 </details>
159 <hr class="md:hidden"/>
160 {{ end }}
161 {{ end }}
162{{ end }}
163
164{{ define "mergeStatus" }}
165 {{ if .Pull.State.IsClosed }}
166 <div class="bg-gray-50 dark:bg-gray-700 border border-black dark:border-gray-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
167 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300 dark:bg-gray-600"></div>
168 <div class="flex items-center gap-2 text-black dark:text-white">
169 {{ i "ban" "w-4 h-4" }}
170 <span class="font-medium">closed without merging</span
171 >
172 </div>
173 </div>
174 {{ else if .Pull.State.IsMerged }}
175 <div class="bg-purple-50 dark:bg-purple-900 border border-purple-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
176 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300 dark:bg-gray-600"></div>
177 <div class="flex items-center gap-2 text-purple-500 dark:text-purple-300">
178 {{ i "git-merge" "w-4 h-4" }}
179 <span class="font-medium">pull request successfully merged</span
180 >
181 </div>
182 </div>
183 {{ else if and .MergeCheck .MergeCheck.Error }}
184 <div class="bg-red-50 dark:bg-red-900 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
185 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300 dark:bg-gray-600"></div>
186 <div class="flex items-center gap-2 text-red-500 dark:text-red-300">
187 {{ i "triangle-alert" "w-4 h-4" }}
188 <span class="font-medium">{{ .MergeCheck.Error }}</span>
189 </div>
190 </div>
191 {{ else if and .MergeCheck .MergeCheck.IsConflicted }}
192 <div class="bg-red-50 dark:bg-red-900 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
193 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300 dark:bg-gray-600"></div>
194 <div class="flex flex-col gap-2 text-red-500 dark:text-red-300">
195 <div class="flex items-center gap-2">
196 {{ i "triangle-alert" "w-4 h-4" }}
197 <span class="font-medium">merge conflicts detected</span>
198 </div>
199 <ul class="space-y-1">
200 {{ range .MergeCheck.Conflicts }}
201 {{ if .Filename }}
202 <li class="flex items-center">
203 {{ i "file-warning" "w-4 h-4 mr-1.5 text-red-500 dark:text-red-300" }}
204 <span class="font-mono">{{ slice .Filename 0 (sub (len .Filename) 2) }}</span>
205 </li>
206 {{ end }}
207 {{ end }}
208 </ul>
209 </div>
210 </div>
211 {{ else if .MergeCheck }}
212 <div class="bg-green-50 dark:bg-green-900 border border-green-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
213 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300 dark:bg-gray-600"></div>
214 <div class="flex items-center gap-2 text-green-500 dark:text-green-300">
215 {{ i "circle-check-big" "w-4 h-4" }}
216 <span class="font-medium">no conflicts, ready to merge</span>
217 </div>
218 </div>
219 {{ end }}
220{{ end }}
221
222{{ define "resubmitStatus" }}
223 {{ if .ResubmitCheck.Yes }}
224 <div class="bg-amber-50 dark:bg-amber-900 border border-amber-500 rounded drop-shadow-sm px-6 py-2 relative w-fit">
225 <div class="absolute left-8 -top-2 w-px h-2 bg-gray-300 dark:bg-gray-600"></div>
226 <div class="flex items-center gap-2 text-amber-500 dark:text-amber-300">
227 {{ i "triangle-alert" "w-4 h-4" }}
228 <span class="font-medium">this branch has been updated, consider resubmitting</span>
229 </div>
230 </div>
231 {{ end }}
232{{ end }}