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---
35 lines
1.0 KiB
HTML
35 lines
1.0 KiB
HTML
{{define "title"}}Reach — OpenYield{{end}}
|
|
|
|
{{define "content"}}
|
|
<section class="panel">
|
|
<h1>Reach</h1>
|
|
<p>A Reach is the mesh-native identity a Holder uses to act on the mesh
|
|
without a custodian, a gatekeeper, or a legacy financial position. A Nomad
|
|
is a Holder who has a Reach and a Stash and is on the way to earning the
|
|
four Freeholder signals.</p>
|
|
<p><a href="/reach/new" class="btn">Create a Reach</a></p>
|
|
</section>
|
|
|
|
<section class="panel">
|
|
<h2>Holders on the mesh</h2>
|
|
{{if .Reaches}}
|
|
<table>
|
|
<thead>
|
|
<tr><th>Reach ID</th><th>Holder ID</th><th>Nomad</th><th>Freeholder</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
{{range .Reaches}}
|
|
<tr>
|
|
<td><a href="/reach/{{.HolderID}}">{{.ReachID}}</a></td>
|
|
<td>{{.HolderID}}</td>
|
|
<td>{{if .IsNomad}}yes{{else}}no{{end}}</td>
|
|
<td>{{if .IsFreeholder}}yes{{else}}no{{end}}</td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
{{else}}
|
|
<p>No Reaches yet. <a href="/reach/new">Create a Reach</a> to begin.</p>
|
|
{{end}}
|
|
</section>
|
|
{{end}} |