<!--
Copyright 2024 The Go Authors. All rights reserved.
Use of this source code is governed by a BSD-style
license that can be found in the LICENSE file.
-->
<!doctype html>
<html>
  <head>
    <title>Oscar Action Log</title>
    <link rel="stylesheet" href="static/style.css"/>
    <link rel="stylesheet" href="static/actionlog.css"/>
    <script>
      // Toggle the hidden state of a row containing the action.
      // Also change the button label accordingly..
      function toggleAction(event) {
        let row = document.getElementById(event.target.dataset.rowid);
        row.hidden = !row.hidden;
        // event.target is the button.
        event.target.value = row.hidden? 'Show': 'Hide';
      }
    </script>
  </head>
  <body>
    <h1>Action Log Viewer</h1>

    <form id="form" action="/actionlog" method="GET">
		<table>
		  <tr>
		    <td>
              {{- /* Resist the temptation to factor out the endpoint controls into
                     a single template. That will require that id values are substituted
                     in, which causes safehtml to complain that they aren't safe identifiers.
                     It ends up being more complicated than it's worth.
              */ -}}
              <fieldset>
                <legend>Start</legend>
                <div>
                  <input type="radio" name="start" id="start-fixed" value="fixed"
                    {{if eq .Start.Radio "fixed"}}checked{{end}}/>
                  <label for="start-fixed">Beginning</label>
                </div>
                <div>
                  <input type="radio" name="start" id="start-dur" value="dur"
                    {{if eq .Start.Radio "dur"}}checked{{end}}/>
                  <input type="text" id="start-dur" size="4" name="start-dur-num" value="{{.Start.DurNum}}" autofocus/>
                    <select name="start-dur-unit">
                      {{template "dur-unit" .Start.DurUnit}}
                    </select>
                  <label for="start-dur">before end</label>
                </div>
                <div>
                  <input type="radio" name="start" id="start-date" value="date"
                    {{if eq .Start.Radio "date"}}checked{{end}}/>
                  <label for="start-date">From</label>
                  <input type="datetime-local" name="start-date" value="{{.Start.Date}}"/>
                </div>
              </fieldset>
            </td>

		    <td>
              <fieldset>
                <legend>End</legend>
                <div>
                  <input type="radio" name="end" id="end-fixed" value="fixed"
                    {{if eq .End.Radio "fixed"}}checked{{end}}/>
                  <label for="end-fixed">End</label>
                </div>
                <div>
                  <input type="radio" name="end" id="end-dur" value="dur"
                    {{if eq .End.Radio "dur"}}checked{{end}}/>
                    <input type="text" id="end-dur" size="4" name="end-dur-num" value="1" autofocus/>
                    <select name="end-dur-unit">
                      {{template "dur-unit" .End.DurUnit}}
                    </select>
                  <label for="end-dur">after start</label>
                </div>
                <div>
                  <input type="radio" name="end" id="end-date" value="date"
                    {{if eq .End.Radio "date"}}checked{{end}}/>
                  <label for="end-date">To</label>
                  <input type="datetime-local" name="end-date" value="{{.End.Date}}"ga/>
                </div>
              </fieldset>
            </td>

            <td> <input type="submit" value="Display"/> </td>
		  </tr>
        </table>
    </form>

    {{if .StartTime}}
      <h2>Action Log from {{.StartTime}} to {{.EndTime}}</h2>

      {{with .Entries}}
      <table>
        <thead>
          <tr>
            <th>Created</th>
            <th>Kind</th>
            <th>Key</th>
            <th>Action</th>
            <th>Done</th>
            <th>Result</th>
            <th>Error</th>
          </tr>
        </thead>
        {{range $i, $e := .}}
          <tr>
            <td>{{$e.Created | fmttime}}</td>
            <td>{{$e.Kind}}</td>
            <td>{{$e.Key | fmtkey}}</td>
            <td>
              {{- /* clicking the button shows/hides the action on the following row */ -}}
              <input type="button" value="Show"
                     data-rowid="id-action-{{$i}}"
                     onclick="toggleAction(event)"/>
            </td>
            <td>{{$e.Done | fmttime}}</td>
            <td>{{$e.Result | fmtval}}</td>
            <td>{{$e.Error}}</td>
          </tr>
          <tr id="{{(print "action-" $i) | safeid}}" hidden="true">
            <td colspan="7">{{$e.Action | fmtval}}</td>
          </tr>
        {{end}}
        </table>
      {{else}}
        No entries.
      {{end}}
    {{end}}
   </body>
</html>

{{define "dur-unit"}}
  <option value="minutes"{{if eq . "minutes"}} selected{{end}}>minutes</option>
  <option value="hours"{{if eq . "hours"}} selected{{end}}>hours</option>
  <option value="days"{{if eq . "days"}} selected{{end}}>days</option>
  <option value="weeks"{{if eq . "weeks"}} selected{{end}}>weeks</option>
{{end}}
