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}}