feat: stack-oriented dashboard + View Backups (PR B) + revoked-node re-approval fix #10

Merged
james merged 1 commit from feat/stack-dashboard-and-revoke-fix into main 2026-07-28 17:04:34 +00:00
Owner

The UI half of the stack rework (PR B, on top of PR A #9), plus a fix for the revoke issue you hit.

Revoked-node re-approval (bug you found)

A revoked node had no way back — it wasn't in the pending list and its card had no Approve button, so it 401'd forever. Now: revoked nodes appear in the awaiting-approval section (awaiting_approval = pending + revoked) with a Re-approve action; Approve all covers both; the node grid shows only approved nodes. /api/nodes/pending/api/nodes/awaiting; Reject folded into the existing Remove (delete).

Dashboard — one row per compose stack

  • Collapses the per-container table into one line per stack (Docker Compose project).
  • Engine icons — one per distinct engine the stack uses (🐘 🐬 🧱 📦 …).
  • Backups — a ✓/✗/– pill per member container (each db, each volume). A ✗ is clickable and opens the recorded failure reason in a modal (uses PR A's error capture).
  • Run backs up every target in the stack.

View Backups — file-based, per stack

  • New /backups/stack/:stack page + GET /api/stacks/:stack/backups: resolves the stack's member containers + holding node from snapshots and lists every backup file (node mirror + main disk), each tagged with its node so download/restore/delete route correctly. Replaces the sparse per-container event-log view — so all 25 days show up.

Full suite green — 1126 examples. (New endpoint uses /api/stacks/:stack/backups to avoid colliding with the 4-segment /api/backups/:date/:filename route.)

🤖 Generated with Claude Code

The UI half of the stack rework (PR B, on top of PR A #9), **plus** a fix for the revoke issue you hit. ## Revoked-node re-approval (bug you found) A revoked node had no way back — it wasn't in the pending list and its card had no Approve button, so it 401'd forever. Now: revoked nodes appear in the **awaiting-approval** section (`awaiting_approval` = pending **+** revoked) with a **Re-approve** action; **Approve all** covers both; the node grid shows only *approved* nodes. `/api/nodes/pending` → `/api/nodes/awaiting`; Reject folded into the existing **Remove** (delete). ## Dashboard — one row per compose stack - Collapses the per-container table into **one line per stack** (Docker Compose project). - **Engine icons** — one per distinct engine the stack uses (🐘 🐬 🧱 📦 …). - **Backups** — a **✓/✗/– pill per member container** (each db, each volume). A ✗ is clickable and opens the recorded **failure reason** in a modal (uses PR A's error capture). - **Run** backs up every target in the stack. ## View Backups — file-based, per stack - New `/backups/stack/:stack` page + `GET /api/stacks/:stack/backups`: resolves the stack's member containers + holding node from snapshots and lists **every backup file** (node mirror + main disk), each tagged with its node so download/restore/delete route correctly. Replaces the sparse per-container event-log view — so all 25 days show up. Full suite green — **1126 examples**. (New endpoint uses `/api/stacks/:stack/backups` to avoid colliding with the 4-segment `/api/backups/:date/:filename` route.) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(ui): stack-oriented dashboard + View Backups; fix revoked-node re-approval
All checks were successful
Build, Push & Deploy / build-and-push (pull_request) Has been skipped
Build, Push & Deploy / deploy (Media) (pull_request) Has been skipped
Build, Push & Deploy / deploy (citadel) (pull_request) Has been skipped
Build, Push & Deploy / test (pull_request) Successful in 1m4s
c0e4b7144a
Dashboard (per node):
- Collapse the per-container table into one row per compose stack.
- Engine column → icons (one per distinct engine the stack uses).
- Backups column → a ✓/✗/– pill per member container (each db, each volume);
  a failed target is clickable and shows the recorded error in a modal.
- Run backs up all targets in the stack.

View Backups → file-based, per stack:
- New /backups/stack/:stack page + GET /api/stacks/:stack/backups: resolves the
  stack's member containers + holding node from snapshots and lists every backup
  file (node mirror / main disk), tagged with the node so download/restore/delete
  route correctly. Replaces the sparse per-container event-log view.

Fix: a revoked node had no re-authorize path. Revoked nodes now appear in the
approval section (renamed awaiting_approval, includes pending+revoked) with a
Re-approve action; the node grid shows approved nodes only; approve-all covers
both. Reject folded into the existing Remove (delete). Endpoint: /api/nodes/awaiting.

Full suite green (1126 examples).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
james merged commit dc43ac7dba into main 2026-07-28 17:04:34 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
james/baktainer!10
No description provided.