0bcb96c442
web/handlers/reach.go: GET /reach (list), GET /reach/new (form),
GET /reach/{id} (detail), POST /reach (atomic Reach+Stash create
per D-071, redirect 302). Labels "Create a Reach" (not the banned
legacy word). G-027 validation (non-empty, <=128, no path separators,
no template syntax). 3 Reach templates extend base.html.
reach_test.go: httptest for all 4 routes + atomic create + 400/409
error paths + rendered-HTML lexicon check on BOTH 200 and error bodies
(G-026). handlers/server.go: clone-per-page template pattern (avoids
content-block collision across pages). Coverage 81.2% on web/handlers.
---ci---
project: oy
phase: 1
milestone: v0.6
status: execute
---/ci---
31 lines
1.1 KiB
HTML
31 lines
1.1 KiB
HTML
{{define "title"}}{{.Reach.ReachID}} — OpenYield{{end}}
|
|
|
|
{{define "content"}}
|
|
<section class="panel">
|
|
<h1>{{.Reach.ReachID}}</h1>
|
|
<table class="kv">
|
|
<tr><th>Reach ID</th><td>{{.Reach.ReachID}}</td></tr>
|
|
<tr><th>Holder ID</th><td>{{.Reach.HolderID}}</td></tr>
|
|
<tr><th>Public Key</th><td><code>{{.Reach.PublicKey}}</code></td></tr>
|
|
<tr><th>Created</th><td>{{.Reach.CreatedAt}}</td></tr>
|
|
<tr><th>Nomad</th><td>{{if .Reach.IsNomad}}yes{{else}}no{{end}}</td></tr>
|
|
<tr><th>Freeholder</th><td>{{if .Reach.IsFreeholder}}yes{{else}}no{{end}}</td></tr>
|
|
</table>
|
|
</section>
|
|
|
|
{{if .Stash.StashID}}
|
|
<section class="panel">
|
|
<h2>Stash</h2>
|
|
<table class="kv">
|
|
<tr><th>Stash ID</th><td>{{.Stash.StashID}}</td></tr>
|
|
<tr><th>Balance</th><td>{{.Stash.BalanceGrain}} Grain</td></tr>
|
|
<tr><th>Created</th><td>{{.Stash.CreatedAt}}</td></tr>
|
|
<tr><th>Last active</th><td>{{.Stash.LastActive}}</td></tr>
|
|
<tr><th>Still</th><td>{{if .Stash.IsStill}}paused{{else}}active{{end}}</td></tr>
|
|
</table>
|
|
<p><a href="/stash/{{.Stash.HolderID}}">View Stash dashboard</a></p>
|
|
</section>
|
|
{{end}}
|
|
|
|
<p><a href="/reach">Back to Reach list</a></p>
|
|
{{end}} |