dashboard-v2 PR 2: frontend SPA + serve integration
Build with clawstor cache / Cargo build (clawstor-cached) (pull_request) Successful in 16s
Build with clawstor cache / Cargo build (clawstor-cached) (pull_request) Successful in 16s
React 19 + Vite + Tailwind + wouter (tiny router, no external
state library). Consumes the /api/v2/* endpoints shipped in PR 1.
Serves under /v2/* so the legacy dashboard at / stays live.
Pages:
* CommandCenter (/) — fleet strip + this-node stat tiles
* NodeDetail (/nodes/:name) — per-node deep dive
* StorageBrowser (/storage/{blobs,tags,refs,snapshots}) — tables
with prefix filter
* RefTrackingPage (/refs/tracking) — grouped by repo
Backend changes:
* claw-store serve grows --v2-static-dir <path>
* build_app split into build_app_with_v2 for the extra static
mount
* /v2/* falls through to index.html so wouter client routing works
New systemd unit: clawstor-dashboard.service. Points at both
static dirs; installs on any node.
dashboard/ (legacy) untouched. dashboard-v2/ built to
target/dashboard-v2/dist for deploy.
Deploy sequence per node:
1. cp target/release/claw-store ~/clawstor-deploy/
2. rsync dashboard-v2/dist/ ~/clawstor-deploy/dashboard-v2/
3. cp deploy/systemd/clawstor-dashboard.service ~/.config/systemd/user/
4. systemctl --user daemon-reload && enable --now clawstor-dashboard.service
Cross-node fan-out for /api/v2/node/:name/status is PR 3.
Action POSTs (scrub/gc/snapshot/pin) are PR 4.
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
||||
export function StatTile({ label, value, hint, color = 'idle' }) {
|
||||
const ring = {
|
||||
ok: 'ring-emerald-500/40',
|
||||
warn: 'ring-amber-500/40',
|
||||
err: 'ring-red-500/40',
|
||||
idle: 'ring-slate-700',
|
||||
}[color];
|
||||
return (_jsxs("div", { className: [
|
||||
'rounded-lg border border-slate-800 bg-slate-900/60 p-4',
|
||||
'ring-1',
|
||||
ring,
|
||||
].join(' '), children: [_jsx("div", { className: "text-xs uppercase tracking-wider text-slate-500", children: label }), _jsx("div", { className: "mt-1 text-2xl font-semibold text-slate-100 font-mono", children: value }), hint && _jsx("div", { className: "mt-1 text-xs text-slate-500", children: hint })] }));
|
||||
}
|
||||
Reference in New Issue
Block a user