- internal/dashboard: classify items into overdue / due today / due this week /
no due date / messages; render the plain-text brief (FR-6, FR-7, FR-9).
- internal/store: ItemsForChild, ItemByID, DeleteItemByID, ScanSummaryForChild
and the stored-brief CRUD helpers (FR-10).
- internal/web: routes /?child=, /items/{id}, POST /items/{id}/delete,
POST /summaries/build, POST /summaries/{id}/delete, plus a per-child scan
banner (FR-12) and a phone-first server-rendered template.
- Calendar events are never "overdue": a past lesson is history, not work.
- cmd/school brief build|list; scripts/screenshot-phase5.mjs for phone evidence.
- Tests: bucket classification, stored-brief round-trip, and HTTP routes
including the NO SCAN / SCAN FAILED / healthy banner behaviour.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
82 lines
3.2 KiB
HTML
82 lines
3.2 KiB
HTML
{{define "item.html"}}<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<meta name="color-scheme" content="light dark">
|
|
<title>{{.Title}} — Compass / Teams</title>
|
|
<link rel="stylesheet" href="/static/tokens.css">
|
|
<link rel="stylesheet" href="/static/app.css">
|
|
<script src="/static/htmx.min.js" defer></script>
|
|
<script src="/static/theme.js" defer></script>
|
|
</head>
|
|
<body class="app">
|
|
<nav class="nav-bar">
|
|
<a class="nav-bar__brand" href="/">
|
|
<span class="nav-bar__mark" aria-hidden="true"></span>
|
|
Compass / Teams
|
|
</a>
|
|
<div class="nav-bar__right">
|
|
<button class="button-utility" type="button" data-theme-toggle>Dark</button>
|
|
<span class="nav-bar__user">{{.Username}}</span>
|
|
<form method="post" action="/logout" class="nav-bar__logout">
|
|
<input type="hidden" name="csrf" value="{{.CSRF}}">
|
|
<button class="button-utility" type="submit">Sign out</button>
|
|
</form>
|
|
</div>
|
|
</nav>
|
|
|
|
<main class="container">
|
|
<p class="breadcrumb"><a href="/?child={{.Child.ID}}">← {{.Child.Name}}</a></p>
|
|
|
|
<article class="detail">
|
|
<header class="detail__head">
|
|
<h1 class="heading-1">{{.Item.Title}}</h1>
|
|
<p class="detail__meta">
|
|
<span class="tag tag--type">{{.Item.TypeLabel}}</span>
|
|
{{if .Item.Subject}}<span>{{.Item.Subject}}</span>{{end}}
|
|
{{if .Item.Teacher}}<span>Teacher: {{.Item.Teacher}}</span>{{end}}
|
|
{{if .Item.DueLabel}}<span class="item__due">due {{.Item.DueLabel}}</span>{{end}}
|
|
{{if .Item.StatusLabel}}<span class="tag tag--status">{{.Item.StatusLabel}}</span>{{end}}
|
|
</p>
|
|
</header>
|
|
|
|
{{if .Item.BodyLines}}
|
|
<section class="detail__body">
|
|
{{range .Item.BodyLines}}<p>{{.}}</p>{{end}}
|
|
</section>
|
|
{{end}}
|
|
|
|
<dl class="detail__facts">
|
|
<dt>Child</dt><dd>{{.Child.Name}}</dd>
|
|
<dt>Source</dt><dd>{{.Item.Source}}{{if .Item.SourcePage}} · {{.Item.SourcePage}}{{end}}</dd>
|
|
{{if .Item.Importance}}<dt>Importance</dt><dd>{{.Item.Importance}}</dd>{{end}}
|
|
{{if .Item.ExternalRef}}<dt>Reference</dt><dd>{{.Item.ExternalRef}}</dd>{{end}}
|
|
{{if .Item.DueAt}}<dt>Due</dt><dd>{{.Item.DueLabel}}</dd>{{end}}
|
|
</dl>
|
|
|
|
<div class="detail__actions">
|
|
{{if .Item.URL}}<a class="button-primary" href="{{.Item.URL}}" rel="noreferrer noopener">Open in Compass</a>{{end}}
|
|
<form method="post" action="/items/{{.Item.ID}}/delete"
|
|
hx-post="/items/{{.Item.ID}}/delete" hx-confirm="Delete this item? It returns on the next scan if the school still lists it.">
|
|
<input type="hidden" name="csrf" value="{{.CSRF}}">
|
|
<button class="button-utility button-utility--danger" type="submit">Delete</button>
|
|
</form>
|
|
</div>
|
|
|
|
{{if not .Scan.OK}}
|
|
<p class="flash flash--error" role="alert">{{.Scan.Message}}</p>
|
|
{{end}}
|
|
</article>
|
|
</main>
|
|
|
|
<footer class="app-foot">
|
|
<span>Compass / Teams · {{.Version}} · {{.AppEnv}}</span>
|
|
<span class="app-foot__sep">·</span>
|
|
<span>up {{.ServerUp}}</span>
|
|
<span class="app-foot__sep">·</span>
|
|
<span>{{year}} Family Home Lab</span>
|
|
</footer>
|
|
</body>
|
|
</html>{{end}}
|