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 8 <header class="pb-4"> 9 <h1 class="text-2xl"> 10 {{ .Pull.Title }} 11 <span class="text-gray-500">#{{ .Pull.PullId }}</span> 12 </h1> 13 </header> 14 15 {{ $bgColor := "bg-gray-800" }} 16 {{ $icon := "ban" }} 17 {{ if eq .State "open" }} 18 {{ $bgColor = "bg-green-600" }} 19 {{ $icon = "circle-dot" }} 20 {{ else if eq .State "merged" }} 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">{{ .State }}</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="px-1 select-none before:content-['\00B7']"></span> 45 <time>{{ .Pull.Created | timeFmt }}</time> 46 </span> 47 </div> 48 49 {{ if .Pull.Body }} 50 <article id="body" class="mt-8 prose"> 51 {{ .Pull.Body | markdown }} 52 </article> 53 {{ end }} 54 </section> 55 56 <div class="flex flex-col justify-end mt-4"> 57 <details> 58 <summary 59 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" 60 > 61 <i data-lucide="code" class="w-4 h-4 mr-2"></i> 62 <span>patch</span> 63 </summary> 64 <div class="relative"> 65 <pre 66 id="patch-preview" 67 class="font-mono overflow-x-scroll bg-gray-50 p-4 rounded-b border border-gray-200 text-sm" 68 > 69 {{- .Pull.Patch -}} 70 </pre 71 > 72 <form 73 id="patch-form" 74 hx-patch="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/patch" 75 hx-swap="none" 76 > 77 <textarea 78 id="patch" 79 name="patch" 80 class="font-mono w-full h-full p-4 rounded-b border border-gray-200 text-sm hidden" 81 > 82{{- .Pull.Patch -}}</textarea 83 > 84 85 <div class="flex gap-2 justify-end mt-2"> 86 <button 87 id="edit-patch-btn" 88 type="button" 89 class="btn btn-sm" 90 onclick="togglePatchEdit(true)" 91 > 92 <i data-lucide="edit" class="w-4 h-4 mr-1"></i>Edit 93 </button> 94 <button 95 id="save-patch-btn" 96 type="submit" 97 class="btn btn-sm bg-green-500 hidden" 98 > 99 <i data-lucide="save" class="w-4 h-4 mr-1"></i>Save 100 </button> 101 <button 102 id="cancel-patch-btn" 103 type="button" 104 class="btn btn-sm bg-gray-300 hidden" 105 onclick="togglePatchEdit(false)" 106 > 107 Cancel 108 </button> 109 </div> 110 </form> 111 112 <div id="pull-error" class="error"></div> 113 <div id="pull-success" class="success"></div> 114 </div> 115 <script> 116 function togglePatchEdit(editMode) { 117 const preview = document.getElementById("patch-preview"); 118 const editor = document.getElementById("patch"); 119 const editBtn = document.getElementById("edit-patch-btn"); 120 const saveBtn = document.getElementById("save-patch-btn"); 121 const cancelBtn = 122 document.getElementById("cancel-patch-btn"); 123 124 if (editMode) { 125 preview.classList.add("hidden"); 126 editor.classList.remove("hidden"); 127 editBtn.classList.add("hidden"); 128 saveBtn.classList.remove("hidden"); 129 cancelBtn.classList.remove("hidden"); 130 } else { 131 preview.classList.remove("hidden"); 132 editor.classList.add("hidden"); 133 editBtn.classList.remove("hidden"); 134 saveBtn.classList.add("hidden"); 135 cancelBtn.classList.add("hidden"); 136 } 137 } 138 139 document 140 .getElementById("save-patch-btn") 141 .addEventListener("click", function () { 142 togglePatchEdit(false); 143 }); 144 </script> 145 </details> 146 </div> 147 148 {{ if .MergeCheck }} 149 <div class="mt-4" id="merge-check"> 150 <div 151 class="rounded-sm border p-4 {{ if .MergeCheck.IsConflicted }} 152 bg-red-50 border-red-200 153 {{ else }} 154 bg-green-50 border-green-200 155 {{ end }}" 156 > 157 <div 158 class="flex items-center gap-2 rounded-sm {{ if .MergeCheck.IsConflicted }} 159 text-red-500 160 {{ else }} 161 text-green-500 162 {{ end }}" 163 > 164 {{ if .MergeCheck.IsConflicted }} 165 <i data-lucide="alert-triangle" class="w-4 h-4"></i> 166 <span class="font-medium" 167 >merge conflicts detected</span 168 > 169 {{ else }} 170 <i data-lucide="check-circle" class="w-4 h-4"></i> 171 <span class="font-medium">ready to merge</span> 172 {{ end }} 173 </div> 174 175 {{ if .MergeCheck.IsConflicted }} 176 <div class="mt-2"> 177 <ul class="text-sm space-y-1"> 178 {{ range .MergeCheck.Conflicts }} 179 <li class="flex items-center"> 180 <i 181 data-lucide="file-warning" 182 class="w-3 h-3 mr-1.5 text-red-500" 183 ></i> 184 <span class="font-mono" 185 >{{ slice .Filename 0 (sub (len .Filename) 2) }}</span 186 > 187 </li> 188 {{ end }} 189 </ul> 190 </div> 191 {{ end }} 192 </div> 193 </div> 194 {{ end }} 195{{ end }} 196 197{{ define "repoAfter" }} 198 <section id="comments" class="mt-8 space-y-4 relative"> 199 {{ range $index, $comment := .Comments }} 200 <div 201 id="comment-{{ .CommentId }}" 202 class="rounded bg-white p-4 relative" 203 > 204 {{ if eq $index 0 }} 205 <div 206 class="absolute left-8 -top-8 w-px h-8 bg-gray-300" 207 ></div> 208 {{ else }} 209 <div 210 class="absolute left-8 -top-4 w-px h-4 bg-gray-300" 211 ></div> 212 {{ end }} 213 <div class="flex items-center gap-2 mb-2 text-gray-400"> 214 {{ $owner := index $.DidHandleMap .OwnerDid }} 215 <span class="text-sm"> 216 <a 217 href="/{{ $owner }}" 218 class="no-underline hover:underline" 219 >{{ $owner }}</a 220 > 221 </span> 222 <span 223 class="px-1 select-none before:content-['\00B7']" 224 ></span> 225 <a 226 href="#{{ .CommentId }}" 227 class="text-gray-500 text-sm hover:text-gray-500 hover:underline no-underline" 228 id="{{ .CommentId }}" 229 > 230 {{ .Created | timeFmt }} 231 </a> 232 </div> 233 <div class="prose"> 234 {{ .Body | markdown }} 235 </div> 236 </div> 237 {{ end }} 238 239 </section> 240 241 {{ if .LoggedInUser }} 242 <form 243 hx-post="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/comment" 244 class="mt-8" 245 > 246 <textarea 247 name="body" 248 class="w-full p-2 rounded border border-gray-200" 249 placeholder="Add to the discussion..." 250 ></textarea> 251 <button type="submit" class="btn mt-2">comment</button> 252 <div id="pull-comment"></div> 253 </form> 254 {{ end }} 255 256 {{ if eq .LoggedInUser.Did .Pull.OwnerDid }} 257 {{ $action := "close" }} 258 {{ $icon := "circle-x" }} 259 {{ $hoverColor := "red" }} 260 {{ if eq .State "closed" }} 261 {{ $action = "reopen" }} 262 {{ $icon = "circle-dot" }} 263 {{ $hoverColor = "green" }} 264 {{ end }} 265 <form 266 hx-post="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/{{ $action }}" 267 hx-swap="none" 268 class="mt-8" 269 > 270 <button type="submit" class="btn hover:bg-{{ $hoverColor }}-300"> 271 <i 272 data-lucide="{{ $icon }}" 273 class="w-4 h-4 mr-2 text-{{ $hoverColor }}-400" 274 ></i> 275 <span class="text-black">{{ $action }}</span> 276 </button> 277 </form> 278 {{ end }} 279{{ end }}