This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

core / appview / pages / templates / repo / pulls / fragments / pullActions.html
14 kB 315 lines
1{{ define "repo/pulls/fragments/pullActions" }} 2 {{ $lastIdx := .Pull.LatestVersionNumber }} 3 {{ $roundNumber := .RoundNumber }} 4 {{ $loading := .Loading }} 5 6 {{ $isPushAllowed := .RepoInfo.Roles.IsPushAllowed }} 7 {{ $isMerged := .Pull.State.IsMerged }} 8 {{ $isClosed := .Pull.State.IsClosed }} 9 {{ $isOpen := .Pull.State.IsOpen }} 10 {{ $isConflicted := and .MergeCheck (or .MergeCheck.Error .MergeCheck.IsConflicted) }} 11 {{ $isPullAuthor := and .LoggedInUser (eq .LoggedInUser.Did .Pull.OwnerDid) }} 12 {{ $isLastRound := eq $roundNumber $lastIdx }} 13 {{ $isUpToDate := .ResubmitCheck.No }} 14 {{ $isForkBased := .Pull.IsForkBased }} 15 {{ $showRunCI := and (not $loading) $isPushAllowed $isOpen $isLastRound $isForkBased (not .HasPipeline) (ne .RepoInfo.Spindle "") }} 16 17 <div id="action-card-{{$roundNumber}}" class="{{ if .LoggedInUser }}relative p-2 flex flex-col gap-2{{ else }}hidden{{ end }}" 18 {{ if $loading }} 19 hx-get="/{{ .Pull.RepoDid }}/pulls/{{ .Pull.PullId }}/{{ $roundNumber }}/_/actions" 20 hx-trigger="load" 21 hx-swap="outerHTML" 22 hx-target="this" 23 {{ end }} 24 > 25 {{ if and (not $loading) $isLastRound }} 26 {{ template "resubmitStatus" . }} 27 {{ end }} 28 <input type="checkbox" id="comment-toggle-{{$roundNumber}}" class="peer/comment hidden"/> 29 <div class="hidden peer-checked/comment:flex flex-col gap-2"> 30 <form 31 class="w-full flex flex-wrap gap-2 group" 32 hx-post="/comment" 33 hx-trigger="submit, keydown[(ctrlKey || metaKey) && key=='Enter'] from:find textarea" 34 hx-target="#pull-comments-{{ .RoundNumber }}" 35 hx-swap="beforeend" 36 hx-disabled-elt="find button[type='submit']" 37 hx-on::after-request="if(event.target === this && event.detail.successful) htmx.ajax('GET', '/{{ .Pull.RepoDid }}/pulls/{{ .Pull.PullId }}/{{ .RoundNumber }}/_/actions', {target: '#action-card-{{ .RoundNumber }}', swap: 'outerHTML'})" 38 > 39 <input name="subject-uri" type="hidden" value="{{ .Pull.AtUri }}"> 40 <input name="subject-cid" type="hidden" value="{{ .Pull.Cid }}"> 41 <input name="pull-round-idx" type="hidden" value="{{ .RoundNumber }}"> 42 {{ template "fragments/markdownEditor" 43 (dict "Name" "body" 44 "BlobName" "blob" 45 "Rows" 8 46 "Required" true 47 "Placeholder" "Add to the discussion...") }} 48 <div class="flex flex-wrap items-stretch justify-end gap-2 text-gray-500 dark:text-gray-400 text-sm w-full"> 49 <label title="Toggle comment form" for="comment-toggle-{{$roundNumber}}" class="btn-flat text-red-500 dark:text-red-400 flex gap-2 items-center"> 50 {{ i "x" "size-4" }} 51 <span>Cancel</span> 52 </label> 53 <button 54 type="submit" 55 class="btn-create-flat flex items-center gap-2"> 56 {{ i "reply" "size-4 inline group-[.htmx-request]:hidden" }} 57 {{ i "loader-circle" "size-4 animate-spin hidden group-[.htmx-request]:inline" }} 58 Reply 59 </button> 60 </div> 61 <div id="comment-error-{{ .RoundNumber }}" class="error"></div> 62 </form> 63 </div> 64 <div id="actions-{{$roundNumber}}" hx-target="this" class="peer-checked/comment:hidden flex flex-wrap gap-2 relative" 65 {{ if $loading }} 66 hx-swap="outerHTML" 67 {{ end }} 68 > 69 {{ if .LoggedInUser }} 70 <label title="Toggle comment form" for="comment-toggle-{{$roundNumber}}" class="btn-flat"> 71 {{ i "message-square-plus" "size-4" }} 72 <span>Comment</span> 73 </label> 74 {{ end }} 75 {{ if and (not $loading) .BranchDeleteStatus }} 76 <button 77 hx-delete="/{{ resolve .BranchDeleteStatus.Repo.Did }}/{{ .BranchDeleteStatus.Repo.Slug }}/branches" 78 hx-vals='{"branch": "{{ .BranchDeleteStatus.Branch }}" }' 79 hx-swap="none" 80 class="btn-flat p-2 flex items-center gap-2 no-underline hover:no-underline group text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300"> 81 {{ i "git-branch" "w-4 h-4 inline group-[.htmx-request]:hidden" }} 82 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }} 83 Delete branch 84 </button> 85 {{ end }} 86 {{ if $showRunCI }} 87 {{ template "runCiModal" . }} 88 {{ end }} 89 {{ if and $isPushAllowed $isOpen $isLastRound }} 90 <button 91 hx-post="/{{ .RepoInfo.FullName }}/pulls/{{ .Pull.PullId }}/merge" 92 hx-swap="none" 93 hx-confirm="Are you sure you want to merge pull #{{ .Pull.PullId }} into the `{{ .Pull.TargetBranch }}` branch?" 94 class="btn-flat p-2 flex items-center gap-2 group" 95 {{ if or $loading $isConflicted }}disabled{{ end }} 96 > 97 {{ if $loading }} 98 {{ i "loader-circle" "w-4 h-4 animate-spin" }} 99 {{ else }} 100 {{ i "git-merge" "w-4 h-4 inline group-[.htmx-request]:hidden" }} 101 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }} 102 {{ end }} 103 Merge 104 </button> 105 {{ end }} 106 107 {{ if and $isPullAuthor $isOpen $isLastRound }} 108 <button id="resubmitBtn" 109 hx-post="/{{ .Pull.RepoDid }}/pulls/{{ .Pull.PullId }}/resubmit" 110 hx-swap="none" 111 112 hx-disabled-elt="#resubmitBtn" 113 class="btn-flat p-2 flex items-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed group" 114 115 {{ if $loading }} 116 title="Checking for updates…" 117 disabled 118 {{ else if $isUpToDate }} 119 title="Update this branch to resubmit this pull request" 120 disabled 121 {{ else }} 122 title="Resubmit this pull request" 123 {{ end }} 124 > 125 {{ if $loading }} 126 {{ i "loader-circle" "w-4 h-4 animate-spin" }} 127 {{ else }} 128 {{ i "rotate-ccw" "w-4 h-4 inline group-[.htmx-request]:hidden" }} 129 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }} 130 {{ end }} 131 Resubmit 132 </button> 133 {{ end }} 134 135 {{ if and (or $isPullAuthor $isPushAllowed) $isOpen $isLastRound }} 136 <button 137 hx-post="/{{ .Pull.RepoDid }}/pulls/{{ .Pull.PullId }}/close" 138 hx-swap="none" 139 class="btn-flat p-2 flex items-center gap-2 group"> 140 {{ i "ban" "w-4 h-4 inline group-[.htmx-request]:hidden" }} 141 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }} 142 Close 143 </button> 144 {{ end }} 145 146 {{ if and (or $isPullAuthor $isPushAllowed) $isClosed $isLastRound }} 147 <button 148 hx-post="/{{ .Pull.RepoDid }}/pulls/{{ .Pull.PullId }}/reopen" 149 hx-swap="none" 150 class="btn-flat p-2 flex items-center gap-2 group"> 151 {{ i "refresh-ccw-dot" "w-4 h-4 inline group-[.htmx-request]:hidden" }} 152 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }} 153 Reopen 154 </button> 155 {{ end }} 156 </div> 157 </div> 158 159 {{ if and (not $loading) $isLastRound }} 160 <div id="mergecheck-banner" hx-swap-oob="innerHTML"> 161 {{ if and $isOpen $isForkBased (not .HasPipeline) (ne .RepoInfo.Spindle "") }} 162 {{ template "workflowWarning" . }} 163 {{ end }} 164 {{ template "mergeCheck" . }} 165 </div> 166 {{ end }} 167{{ end }} 168 169{{ define "workflowWarning" }} 170 {{ if .WorkflowsChanged }} 171 <details class="group/ci"> 172 <summary class="flex items-center gap-2 cursor-pointer list-none"> 173 {{ i "triangle-alert" "w-4 h-4 text-amber-600 dark:text-amber-500" }} 174 <span class="font-medium text-amber-600 dark:text-amber-500">Workflow files changed</span> 175 <div class="text-sm text-gray-500 dark:text-gray-400"> 176 <span class="group-open/ci:hidden inline">Expand</span> 177 <span class="hidden group-open/ci:inline">Collapse</span> 178 </div> 179 </summary> 180 <ul class="space-y-1 mt-2 overflow-x-auto"> 181 {{ range .ChangedWorkflowFiles }} 182 <li class="flex items-center whitespace-nowrap"> 183 {{ i "file-warning" "inline-flex w-4 h-4 mr-1.5 text-amber-600 dark:text-amber-500 flex-shrink-0" }} 184 <span class="font-mono">{{ . }}</span> 185 </li> 186 {{ end }} 187 </ul> 188 </details> 189 {{ else }} 190 <div class="flex items-center gap-2 text-amber-600 dark:text-amber-500"> 191 {{ i "triangle-alert" "w-4 h-4" }} 192 <span class="font-medium">Workflow needs approval</span> 193 </div> 194 {{ end }} 195{{ end }} 196 197{{ define "runCiModal" }} 198 <button 199 class="btn-flat p-2 flex items-center gap-2 flex-shrink-0 group" 200 popovertarget="run-ci-{{ .Pull.PullId }}" 201 popovertargetaction="toggle" 202 > 203 {{ i "circle-play" "w-4 h-4 inline" }} 204 Run CI 205 </button> 206 207 <div 208 id="run-ci-{{ .Pull.PullId }}" 209 popover 210 class="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 dark:text-white backdrop:bg-gray-400/50 dark:backdrop:bg-gray-800/50 w-full md:w-96 p-4 rounded drop-shadow overflow-visible" 211 > 212 <form 213 hx-post="/{{ .Pull.RepoDid }}/pulls/{{ .Pull.PullId }}/trigger-ci?confirm=1" 214 hx-swap="none" 215 hx-indicator="#run-ci-spinner-{{ .Pull.PullId }}" 216 class="flex flex-col gap-2" 217 > 218 <label class="text-lg font-medium p-0">Run CI</label> 219 {{ if .WorkflowsChanged }} 220 <div class="flex items-center gap-2 text-amber-600 dark:text-amber-500"> 221 {{ i "triangle-alert" "size-4" }} 222 <span class="font-medium">Workflow files changed</span> 223 </div> 224 <ul class="space-y-1 overflow-x-auto pl-6"> 225 {{ range .ChangedWorkflowFiles }} 226 <li class="flex items-center whitespace-nowrap"> 227 {{ i "file-warning" "size-4 mr-1.5 text-amber-600 dark:text-amber-500 flex-shrink-0" }} 228 <span class="font-mono text-sm">{{ . }}</span> 229 </li> 230 {{ end }} 231 </ul> 232 <p class="text-sm text-gray-500 dark:text-gray-400">Workflow files changed in this round. Are you sure you want to run CI?</p> 233 {{ else }} 234 <div class="flex items-center gap-2 text-amber-600 dark:text-amber-500"> 235 {{ i "triangle-alert" "size-4" }} 236 <span class="font-medium">Workflow needs approval</span> 237 </div> 238 <p class="text-sm text-gray-500 dark:text-gray-400">This fork-based pull request needs approval to run CI. Are you sure?</p> 239 {{ end }} 240 <div class="flex gap-2 pt-2"> 241 <button 242 type="button" 243 popovertarget="run-ci-{{ .Pull.PullId }}" 244 popovertargetaction="hide" 245 class="btn w-1/2 flex items-center gap-2 text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300" 246 > 247 {{ i "x" "size-4" }} Cancel 248 </button> 249 <button type="submit" class="btn w-1/2 flex items-center"> 250 <span class="inline-flex gap-2 items-center">{{ i "shield-check" "size-4" }} Approve</span> 251 <span id="run-ci-spinner-{{ .Pull.PullId }}" class="group"> 252 {{ i "loader-circle" "ml-2 w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }} 253 </span> 254 </button> 255 </div> 256 <div id="pull-error" class="text-red-500 dark:text-red-400"></div> 257 </form> 258 </div> 259{{ end }} 260 261{{ define "mergeCheck" }} 262 {{ $isOpen := .Pull.State.IsOpen }} 263 {{ if and $isOpen .MergeCheck .MergeCheck.Error }} 264 <div class="flex items-center gap-2 text-red-600 dark:text-red-500"> 265 {{ i "triangle-alert" "w-4 h-4" }} 266 <span class="font-medium">{{ .MergeCheck.Error }}</span> 267 </div> 268 {{ else if and $isOpen .MergeCheck .MergeCheck.IsConflicted }} 269 <details class="group/conflict"> 270 <summary class="flex items-center justify-between cursor-pointer list-none"> 271 <div class="flex items-center gap-2 text-red-600 dark:text-red-500"> 272 {{ i "triangle-alert" "w-4 h-4" }} 273 <span class="font-medium">Merge conflicts detected</span> 274 <div class="text-sm text-gray-500 dark:text-gray-400"> 275 <span class="group-open/conflict:hidden inline">Expand</span> 276 <span class="hidden group-open/conflict:inline">Collapse</span> 277 </div> 278 </div> 279 </summary> 280 {{ if gt (len .MergeCheck.Conflicts) 0 }} 281 <ul class="space-y-1 mt-2 overflow-x-auto"> 282 {{ range .MergeCheck.Conflicts }} 283 {{ if .Filename }} 284 <li class="flex items-center whitespace-nowrap"> 285 {{ i "file-warning" "inline-flex w-4 h-4 mr-1.5 text-red-600 dark:text-red-500 flex-shrink-0" }} 286 <span class="font-mono">{{ .Filename }}</span> 287 </li> 288 {{ else if .Reason }} 289 <li class="flex items-center whitespace-nowrap"> 290 {{ i "file-warning" "w-4 h-4 mr-1.5 text-red-600 dark:text-red-500 " }} 291 <span>{{.Reason}}</span> 292 </li> 293 {{ end }} 294 {{ end }} 295 </ul> 296 {{ end }} 297 </details> 298 {{ else if and $isOpen .MergeCheck }} 299 <div class="flex items-center gap-2 text-green-600 dark:text-green-500"> 300 {{ i "check" "w-4 h-4" }} 301 <span class="font-medium">No conflicts, ready to merge</span> 302 </div> 303 {{ end }} 304{{ end }} 305 306{{ define "resubmitStatus" }} 307 {{ if .ResubmitCheck.Yes }} 308 <div class="bg-amber-50 dark:bg-amber-900 border border-amber-500 rounded shadow-sm px-6 py-2 relative"> 309 <div class="flex items-center gap-2 text-amber-500 dark:text-amber-300"> 310 {{ i "triangle-alert" "w-4 h-4" }} 311 <span class="font-medium">This branch has been updated, consider resubmitting</span> 312 </div> 313 </div> 314 {{ end }} 315{{ end }}