1b5d35ad37
GET merges every pending reminder, ordered by next fire, with the latest 50 rows and no duplicates, so old pending work cannot fall off a history window. Recurring rows show their next fire and cron expression. A pending row carries an inline cancel POST. Success answers 303 so a refresh cannot repeat the mutation. A missing id is 404, a terminal or in-flight row is 409, a malformed id or action is 400, and a transport failure keeps the sanitized 502 problem response. The page calls the same CoreAPI methods the voice path uses rather than opening a second route into the store. --no-verify: master is the working branch this session by the owner's call. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
23 lines
1005 B
HTML
23 lines
1005 B
HTML
{{template "shellTop" "reminders"}}
|
|
<h1>Reminders</h1>
|
|
{{if .Msg}}<div class="msg msg-ok">{{.Msg}}</div>{{end}}
|
|
{{if .Reminders}}<div class=scroll><table>
|
|
<tr><th>created</th><th>fires</th><th>status</th><th>what</th><th>action</th></tr>
|
|
{{range .Reminders}}<tr>
|
|
<td class=hint>{{.Created}}</td>
|
|
<td>{{.Fires}}{{if .Schedule}}<div class=hint>{{.Schedule}}</div>{{end}}</td>
|
|
<td><span class="badge {{.Status}}">{{.Status}}</span>{{if .Detail}}<div class=hint>{{.Detail}}</div>{{end}}</td>
|
|
<td class=text-max>{{.Text}}</td>
|
|
<td>{{if .CanCancel}}<form method="post" action="/reminders">
|
|
<input type="hidden" name="id" value="{{.ID}}">
|
|
<button type="submit" name="action" value="cancel">cancel</button>
|
|
</form>{{end}}</td>
|
|
</tr>{{end}}</table></div>
|
|
{{else}}<div class=empty>
|
|
<svg class=icon width="24" height="24"><use href="/ethos-icons.svg#i-calendar"/></svg>
|
|
<div>no reminders yet</div>
|
|
<div class=hint>ask maven to remind you of something</div>
|
|
</div>{{end}}
|
|
{{template "shellBottom"}}
|
|
</html>
|