golang.org/x/build@v0.0.0-20240506185731-218518f32b70/internal/relui/templates/task_list.html (about) 1 <!-- 2 Copyright 2022 The Go Authors. All rights reserved. 3 Use of this source code is governed by a BSD-style 4 license that can be found in the LICENSE file. 5 --> 6 {{define "task_list"}} 7 {{$workflow := .Workflow}} 8 <table class="TaskList"> 9 <thead> 10 <tr class="TaskList-item TaskList-itemHeader"> 11 <th class="TaskList-itemHeaderCol TaskList-itemExpand"></th> 12 <th class="TaskList-itemHeaderCol TaskList-itemState">State</th> 13 <th class="TaskList-itemHeaderCol TaskList-itemName">Name</th> 14 <th class="TaskList-itemHeaderCol TaskList-itemStarted">Started</th> 15 <th class="TaskList-itemHeaderCol TaskList-itemUpdated">Updated</th> 16 <th class="TaskList-itemHeaderCol TaskList-itemResult">Result</th> 17 <th class="TaskList-itemHeaderCol TaskList-itemActions">Actions</th> 18 </tr> 19 </thead> 20 <tbody> 21 {{range .Tasks}} 22 {{- /*gotype: golang.org/x/build/internal/relui/db.TasksForWorkflowSortedRow*/ -}} 23 {{$resultDetail := unmarshalResultDetail .Result.String}} 24 <tr class="TaskList-item TaskList-itemSummary TaskList-expandableItem"> 25 <td class="TaskList-itemCol TaskList-itemExpand"> 26 <span class="TaskList-itemExpandClosed"> 27 <img 28 class="TaskList-itemExpandControl" 29 alt="unfold more" 30 src="{{baseLink "/static/images/chevron_right_black_24dp.svg"}}" /> 31 </span> 32 <span class="TaskList-ItemExpandOpened"> 33 <img 34 class="TaskList-itemExpandControl" 35 alt="unfold less" 36 src="{{baseLink "/static/images/expand_more_black_24dp.svg"}}" /> 37 </span> 38 </td> 39 <td class="TaskList-itemCol TaskList-itemState"> 40 {{if .Error.Valid}} 41 <img class="TaskList-itemStateIcon" alt="error" src="{{baseLink "/static/images/error_red_24dp.svg"}}" /> 42 {{else if .Finished}} 43 <img 44 class="TaskList-itemStateIcon" 45 alt="finished" 46 src="{{baseLink "/static/images/check_circle_green_24dp.svg"}}" /> 47 {{else if .Started}} 48 <img 49 class="TaskList-itemStateIcon" 50 alt="started" 51 src="{{baseLink "/static/images/pending_yellow_24dp.svg"}}" /> 52 {{else}} 53 <img 54 class="TaskList-itemStateIcon" 55 alt="pending" 56 src="{{baseLink "/static/images/pending_grey_24dp.svg"}}" /> 57 {{end}} 58 </td> 59 <td class="TaskList-itemCol TaskList-itemName"> 60 {{.Name}} 61 </td> 62 <td class="TaskList-itemCol TaskList-itemStarted"> 63 {{.CreatedAt.UTC.Format "Mon Jan _2 2006 15:04:05"}} 64 </td> 65 <td class="TaskList-itemCol TaskList-itemUpdated"> 66 {{.MostRecentUpdate.UTC.Format "Mon Jan _2 2006 15:04:05"}} 67 </td> 68 <td class="TaskList-itemCol TaskList-itemResult"> 69 {{if .ApprovedAt.Valid}} 70 Approved 71 {{else}} 72 {{$resultDetail.Kind}} 73 {{end}} 74 </td> 75 <td class="TaskList-itemCol TaskList-itemAction"> 76 {{if .Error.Valid}} 77 <div class="TaskList-retryTask"> 78 <form 79 action="{{baseLink (printf "/workflows/%s/tasks/%s/retry" $workflow.ID .Name)}}" 80 method="post"> 81 <input type="hidden" id="workflow.id" name="workflow.id" value="{{$workflow.ID}}" /> 82 <input 83 class="Button Button--small" 84 name="task.reset" 85 type="submit" 86 value="Retry" 87 onclick="return this.form.reportValidity() && confirm('This will retry the task.\n\nReady to proceed?')" /> 88 </form> 89 </div> 90 {{else if and (not .ApprovedAt.Valid) (.ReadyForApproval)}} 91 <div class="TaskList-approveTask"> 92 <form 93 action="{{baseLink (printf "/workflows/%s/tasks/%s/approve" $workflow.ID .Name)}}" 94 method="post"> 95 <input type="hidden" id="workflow.id" name="workflow.id" value="{{$workflow.ID}}" /> 96 <input 97 class="Button Button--small" 98 name="task.approve" 99 type="submit" 100 value="Approve" 101 onclick="return this.form.reportValidity() && confirm('This will mark the task approved and resume the workflow.\n\nReady to proceed?')" /> 102 </form> 103 </div> 104 {{end}} 105 </td> 106 </tr> 107 <tr class="TaskList-itemLogsRow"> 108 <td class="TaskList-itemLogs" colspan="5"> 109 {{if .Error.Valid}} 110 <div class="TaskList-itemLogLine TaskList-itemLogLineError"> 111 {{- .Error.Value -}} 112 </div> 113 {{end}} 114 {{if .ApprovedAt.Valid}} 115 <div class="TaskList-itemLogLine TaskList-itemLogLineApproved"> 116 {{- printf "Approved at: %s" (.ApprovedAt.Value.UTC.Format "2006/01/02 15:04:05") -}} 117 </div> 118 {{end}} 119 {{range $log := index $.TaskLogs .Name}} 120 <div class="TaskList-itemLogLine"> 121 {{- printf "%s %s" ($log.CreatedAt.UTC.Format "2006/01/02 15:04:05") $log.Body -}} 122 </div> 123 {{end}} 124 {{if and .Result.Valid (ne .Result.String "null")}} 125 <div class="TaskList-itemLogLine"> 126 {{- .Result.String -}} 127 </div> 128 {{end}} 129 </td> 130 <td class="TaskList-itemResultDetail" colspan="2"> 131 {{with $resultDetail}} 132 {{template "itemResult" $resultDetail}} 133 {{end}} 134 </td> 135 </tr> 136 {{end}} 137 </tbody> 138 </table> 139 {{end}} 140 141 {{define "itemResult"}} 142 {{- /*gotype: golang.org/x/build/internal/relui.resultDetail*/ -}} 143 {{if eq .Kind "Artifact"}} 144 <dl class="TaskList-itemResultDetailList"> 145 <dt class="TaskList-itemResultTerm"> 146 <div class="TaskList-itemResultTermContent"> 147 Name 148 </div> 149 </dt> 150 <dd class="TaskList-itemResultDefinition"> 151 {{with .Artifact.Target}} 152 {{.Name}} 153 {{else}} 154 {{.Artifact.Filename}} 155 {{end}} 156 </dd> 157 <dt class="TaskList-itemResultTerm"> 158 <div class="TaskList-itemResultTermContent"> 159 Filename 160 </div> 161 </dt> 162 <dd class="TaskList-itemResultDefinition"> 163 {{.Artifact.Filename}} 164 </dd> 165 <dt class="TaskList-itemResultTerm"> 166 <div class="TaskList-itemResultTermContent"> 167 Scratch 168 </div> 169 </dt> 170 <dd class="TaskList-itemResultDefinition"> 171 {{.Artifact.Scratch}} 172 </dd> 173 </dl> 174 {{else if eq .Kind "Outputs"}} 175 {{range $key, $value := .Outputs}} 176 <dt class="TaskList-itemResultTerm"> 177 <div class="TaskList-itemResultTermContent"> 178 {{$key}} 179 </div> 180 </dt> 181 <dd class="TaskList-itemResultDefinition TaskList-itemResultDefinition--nested"></dd> 182 {{template "itemResult" $value}} 183 {{end}} 184 {{else if eq .Kind "JSON"}} 185 {{range $key, $value := .JSON}} 186 <dt class="TaskList-itemResultTerm"> 187 <div class="TaskList-itemResultTermContent"> 188 {{$key}} 189 </div> 190 </dt> 191 <dd class="TaskList-itemResultDefinition"> 192 {{$value}} 193 </dd> 194 {{end}} 195 {{else if eq .Kind "String"}} 196 <dt class="TaskList-itemResultTerm"> 197 <div class="TaskList-itemResultTermContent"> 198 String 199 </div> 200 </dt> 201 <dd class="TaskList-itemResultDefinition TaskList-itemResultDefinition--string"> 202 <pre class="TaskList-preString">{{.String}}</pre> 203 </dd> 204 {{else if eq .Kind "Slice"}} 205 {{with .Slice}} 206 {{if eq (index . 0).Kind "Artifact"}} 207 <dt class="TaskList-itemResultTerm"> 208 <div class="TaskList-itemResultTermContent"> 209 Filenames 210 </div> 211 </dt> 212 <dd class="TaskList-itemResultDefinition"> 213 {{range $detail := .}} 214 {{with $detail.Artifact}} 215 <div class="TaskList-itemResultArtifact"> 216 <div class="TaskList-itemResultArtifactName"> 217 {{if .Filename}} 218 {{.Filename}} 219 {{else if .Target}} 220 {{.Target.Name}} 221 {{else}} 222 {{pathBase .Scratch}} 223 {{end}} 224 </div> 225 <div class="TaskList-itemResultArtifactSize">{{prettySize .Size}}</div> 226 </div> 227 {{end}} 228 {{end}} 229 </dd> 230 {{else}} 231 <dt class="TaskList-itemResultTerm TaskList-itemResultTerm--nested"> 232 <div class="TaskList-itemResultTermContent"> 233 Slice 234 </div> 235 </dt> 236 <dd class="TaskList-itemResultDefinition TaskList-itemResultDefinition--nested"></dd> 237 {{range $value := .}} 238 {{template "itemResult" $value}} 239 {{end}} 240 {{end}} 241 {{end}} 242 {{else if eq .Kind "Number"}} 243 {{.Number}} 244 {{else if eq .Kind "Boolean"}} 245 <dd class="TaskList-itemResultDefinition TaskList-itemResultDefinition--string"> 246 {{.Boolean}} 247 </dd> 248 {{else}} 249 {{with .}} 250 {{.Unknown}} 251 {{else}} 252 <dd class="TaskList-itemResultDefinition TaskList-itemResultDefinition--string"> 253 None 254 </dd> 255 {{end}} 256 {{end}} 257 {{end}}