arborist-viz/arborist_viz/templates/dashboard.jinja2
russell@unturf.com 0cd96ab1d7
Initial commit: arborist VIZ — Merkle command center
Pyramid web app for inspecting arborist Merkle trees over sharded SQLite:
document roots, inclusion proofs, an interactive 3D Merkle lattice
(six.js / WebGL with graceful fallback), audit-chain linkage, and a live
SSE event stream.

Generated artifacts (env/, vendored static/six/ bundles, demo databases)
are gitignored and rebuilt via the Makefile (venv, six, init-db, serve).
2026-05-28 09:22:59 -04:00

59 lines
2 KiB
Django/Jinja

{% extends "base.jinja2" %}
{% block body %}
<div class="dash"
data-dashboard-id="{{ dashboard_id }}"
data-sse-url="{{ request.route_path('sse_audit_live') }}">
<aside class="dash-side">
<h2 class="dash-h2">Dashboards</h2>
<ul class="dash-list" id="dash-list">
<li><a href="/dashboard/default">Audit Operations</a></li>
<li><a href="/dashboard/graveyard">Claim Graveyard</a></li>
<li><a href="/dashboard/proof">Merkle Root Proof</a></li>
</ul>
<h2 class="dash-h2">
Roots <span class="muted">({{ shard_stats.docs if shard_stats else 0 }})</span>
</h2>
<ul class="dash-list dash-roots" id="dash-roots">
<li class="muted">loading…</li>
</ul>
<h2 class="dash-h2">Live stream</h2>
<div class="dash-stream" id="sse-status">
<span class="dot dot-off"></span>
<span class="lbl">disconnected</span>
</div>
<pre class="dash-events" id="sse-events" aria-live="polite"></pre>
</aside>
<section class="dash-grid" id="dash-grid">
<!-- Widgets render here. Loaded via /api/dashboards/{dashboard_id}. -->
<article class="widget widget-empty" data-widget-id="loading">
<header class="widget-head">
<span class="widget-title">loading dashboard…</span>
</header>
<div class="widget-body">
<p>Fetching <code>/api/dashboards/{{ dashboard_id }}</code></p>
</div>
</article>
</section>
</div>
{% endblock %}
{% block scripts %}
<script type="module">
import { mountDashboard } from "{{ request.static_url('arborist_viz:static/viz/dashboard.js') }}?v={{ request.static_version }}";
import { connectSSE } from "{{ request.static_url('arborist_viz:static/viz/sse-client.js') }}?v={{ request.static_version }}";
const root = document.querySelector(".dash");
const id = root.dataset.dashboardId;
const sseUrl = root.dataset.sseUrl;
mountDashboard(root, id);
connectSSE(sseUrl, {
statusEl: document.getElementById("sse-status"),
eventsEl: document.getElementById("sse-events"),
});
</script>
{% endblock %}