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).
59 lines
2 KiB
Django/Jinja
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 %}
|