88d25d31ac
dayDelta truncated both instants to a UTC day. A task due at 02:00 Moscow time tonight read as due tomorrow, and one due at 23:00 last night read as due today, so the two classes that decide the whole order were assigned from the wrong calendar. Both sides are now truncated in now's location. Dated work also lost to age alone because the later-due score sat below the age cap, and the tail said "и ещё 3" with no noun and no Russian plural agreement. The page hardcoded time.Now, so none of this was testable from a fixed clock. It now takes an injectable clock, parses the due date in that clock's location, parses ids and weights with strconv instead of a hand-rolled scan, caps the resolved table and says so, shows who resolved each row, and reports a promotion as the confirmation it is. Found in review of #61.
89 lines
3.6 KiB
HTML
89 lines
3.6 KiB
HTML
{{template "shellTop" "tasks"}}
|
|
<h1>Tasks</h1>
|
|
{{if .Msg}}<div class="msg msg-ok">{{.Msg}}</div>{{end}}
|
|
{{if .Err}}<div class="msg msg-err">{{.Err}}</div>{{end}}
|
|
|
|
<section class=card>
|
|
<h2 class=card-title>add</h2>
|
|
<form method=post action=/tasks class=inline-form>
|
|
<input type=hidden name=action value=add>
|
|
<input type=text name=text placeholder="что нужно сделать" size=44 required>
|
|
<input type=date name=due title="due date (optional)">
|
|
<!-- weight 1 is skipped on purpose: the two rungs here are the two words she
|
|
recognises out loud ("важно", "срочно"), so the form and the spoken markers
|
|
mean the same thing. -->
|
|
<select name=weight title="importance (optional)">
|
|
<option value=0>normal</option>
|
|
<option value=2>важно</option>
|
|
<option value=3>срочно</option>
|
|
</select>
|
|
<button class=btn>add</button>
|
|
</form>
|
|
</section>
|
|
|
|
{{if .Candidates}}
|
|
<section class=card>
|
|
<h2 class=card-title>found, not confirmed <span class=badge>{{len .Candidates}}</span></h2>
|
|
<div class=hint>maven derived these from something she read. nothing counts as your work until you confirm it.</div>
|
|
<div class=scroll><table>
|
|
<tr><th>task</th><th>where from</th><th>due</th><th>captured</th><th></th><th></th></tr>
|
|
{{range .Candidates}}<tr>
|
|
<td class=text-max>{{.Text}}</td>
|
|
<td class=hint>{{.Source}}{{if .Evidence}} — {{.Evidence}}{{end}}</td>
|
|
<td>{{.Due}}</td>
|
|
<td class=muted>{{.Created}}</td>
|
|
<td><form method=post action=/tasks class=inline-form>
|
|
<input type=hidden name=id value="{{.ID}}">
|
|
<input type=hidden name=action value=confirm>
|
|
<button class=btn>confirm</button></form></td>
|
|
<td><form method=post action=/tasks class=inline-form>
|
|
<input type=hidden name=id value="{{.ID}}">
|
|
<input type=hidden name=action value=drop>
|
|
<button class="btn btn-muted">drop</button></form></td>
|
|
</tr>{{end}}</table></div>
|
|
</section>
|
|
{{end}}
|
|
|
|
<section class=card>
|
|
<h2 class=card-title>open <span class=badge>{{len .Open}}</span></h2>
|
|
<div class=hint>most pressing first — by the deadlines and the urgency you gave. nothing about a task is guessed; the only signal that is not yours is age, which lifts anything sitting here for weeks.</div>
|
|
{{if .Open}}<div class=scroll><table>
|
|
<tr><th>task</th><th>why</th><th>from</th><th>due</th><th>captured</th><th></th><th></th></tr>
|
|
{{range .Open}}<tr>
|
|
<td class=text-max>{{.Text}}</td>
|
|
<td class=hint>{{.Why}}</td>
|
|
<td class=hint>{{.Source}}</td>
|
|
<td>{{.Due}}</td>
|
|
<td class=muted>{{.Created}}</td>
|
|
<td><form method=post action=/tasks class=inline-form>
|
|
<input type=hidden name=id value="{{.ID}}">
|
|
<input type=hidden name=action value=done>
|
|
<button class=btn>done</button></form></td>
|
|
<td><form method=post action=/tasks class=inline-form>
|
|
<input type=hidden name=id value="{{.ID}}">
|
|
<input type=hidden name=action value=drop>
|
|
<button class="btn btn-muted">drop</button></form></td>
|
|
</tr>{{end}}</table></div>
|
|
{{else}}<div class=empty>
|
|
<svg class=icon width="20" height="20"><use href="/ethos-icons.svg#i-grid"/></svg>
|
|
<div>no open tasks</div>
|
|
<div class=hint>add one above, or tell maven "добавь в задачи …"</div>
|
|
</div>{{end}}
|
|
</section>
|
|
|
|
{{if .Resolved}}
|
|
<section class=card>
|
|
<h2 class=card-title>resolved <span class=badge>{{len .Resolved}}</span></h2>
|
|
<div class=scroll><table>
|
|
<tr><th>task</th><th>status</th><th>when</th><th>by</th></tr>
|
|
{{range .Resolved}}<tr>
|
|
<td class=text-max>{{.Text}}</td>
|
|
<td><span class="badge {{.Status}}">{{.Status}}</span></td>
|
|
<td class=muted>{{.Resolved}}</td>
|
|
<td class=hint>{{.ResolvedBy}}</td>
|
|
</tr>{{end}}</table></div>
|
|
{{if .ResolvedMore}}<div class=hint>only the {{len .Resolved}} most recent are shown.</div>{{end}}
|
|
</section>
|
|
{{end}}
|
|
{{template "shellBottom"}}
|