Refactor: +page.svelte (4.158 Z.) in Single-File-Komponenten zerlegen — Konvention: 1 Tab/Panel/Modal = 1 Datei #94

Closed
opened 2026-06-09 21:52:51 +00:00 by chinux · 3 comments
Owner

Ziel

frontend/src/routes/(app)/+page.svelte (4.158 Zeilen, 79 Funktionen, 6+ eingebettete Modals) entlang des bestehenden Tab-Musters zerlegen.

Konvention (gilt ab jetzt projektweit)

1 Tab / Panel / Modal = 1 .svelte-Datei. Keine Mehrzweck-Dateien. Grund: einfacherer Support (Fehler → genau eine Datei), einfacheres Deploy/Review (kleine, isolierte Diffs), weniger Merge-Konflikte bei mehreren Contributors. Das Muster existiert bereits und funktioniert: admin-node-tabs/ (11 Panels) und admin-vm-modal/tabs/ (16 Tabs).

Zerlegungs-Liste (aus dem Ist-Stand der Datei)

Neues Verzeichnis z. B. lib/components/dashboard/:

  • NodeCard.svelte — Card-Header (klickbare Zeile, :1510) + Live-Graphs (:1577)
  • NodeCardDetail.svelte — Expanded-Detail-Container (~:1597) mit:
    • KernelUpdateBanner.svelte (~:1600)
    • NodeUpdateStrip.svelte — Update-Strip + Bulk-Update-Einstieg (~:1608)
    • NodeTempCharts.svelte — Temperatur-Mini-Charts (~:1775)
  • Modals, je eigene Datei:
    • ProvisionModal.svelte (~:1350)
    • HostUpdateTerminalModal.svelte (~:2285)
    • NodeSettingsModal.svelte (~:2297)
    • NodeNotesModal.svelte (~:2348)
    • InstallInfoModal.svelte (~:2373)
    • BulkRunModal.svelte (openBulkRun/closeBulkRunModal/backgroundBulkRun, :51-82)
  • +page.svelte bleibt Orchestrierung: Daten laden, State halten, Komponenten verdrahten.

Vorgehen (kein Big-Bang!)

  • Modal fuer Modal / Block fuer Block extrahieren, Verhalten 1:1 (kein Redesign, kein Umstyling) — jede Extraktion ein eigener, kleiner Commit (revertierbar).
  • Props/Events sauber: Komponente bekommt Daten + Callbacks, kein Import von Page-State.
  • CSS der Bloecke mitwandern lassen (scoped), tote Styles in der Page danach entfernen.
  • Reihenfolge-Empfehlung: erst die 6 Modals (am leichtesten isolierbar), dann NodeCard/Detail.

Akzeptanz

  • Jedes Modal/Panel der Dashboard-Seite ist eine eigene .svelte-Datei.
  • +page.svelte < ~800 Zeilen (nur noch Orchestrierung).
  • Verhalten unveraendert (gleiche Funktionen, gleiche Optik).
  • Konvention "1 Tab/Panel/Modal = 1 Datei" in wiki/Development.md dokumentiert (Basis fuer spaeteres CONTRIBUTING.md).

Bezug

Projekt-Struktur-Review 09.06.2026; OSS-Readiness (Contributor-Einstiegshuerde, PR-Konfliktrate). Gleiches gilt perspektivisch fuer settings/+page.svelte (1.034 Z.) und NodeUpdatesPanel.svelte (1.167 Z.) — bei Bedarf Folge-Issues.

Branch

refactor/dashboard-page-split

## Ziel `frontend/src/routes/(app)/+page.svelte` (**4.158 Zeilen**, 79 Funktionen, 6+ eingebettete Modals) entlang des **bestehenden Tab-Musters** zerlegen. ## Konvention (gilt ab jetzt projektweit) **1 Tab / Panel / Modal = 1 `.svelte`-Datei.** Keine Mehrzweck-Dateien. Grund: einfacherer Support (Fehler → genau eine Datei), einfacheres Deploy/Review (kleine, isolierte Diffs), weniger Merge-Konflikte bei mehreren Contributors. Das Muster existiert bereits und funktioniert: `admin-node-tabs/` (11 Panels) und `admin-vm-modal/tabs/` (16 Tabs). ## Zerlegungs-Liste (aus dem Ist-Stand der Datei) Neues Verzeichnis z. B. `lib/components/dashboard/`: - **`NodeCard.svelte`** — Card-Header (klickbare Zeile, ~:1510) + Live-Graphs (~:1577) - **`NodeCardDetail.svelte`** — Expanded-Detail-Container (~:1597) mit: - **`KernelUpdateBanner.svelte`** (~:1600) - **`NodeUpdateStrip.svelte`** — Update-Strip + Bulk-Update-Einstieg (~:1608) - **`NodeTempCharts.svelte`** — Temperatur-Mini-Charts (~:1775) - Modals, je eigene Datei: - **`ProvisionModal.svelte`** (~:1350) - **`HostUpdateTerminalModal.svelte`** (~:2285) - **`NodeSettingsModal.svelte`** (~:2297) - **`NodeNotesModal.svelte`** (~:2348) - **`InstallInfoModal.svelte`** (~:2373) - **`BulkRunModal.svelte`** (openBulkRun/closeBulkRunModal/backgroundBulkRun, :51-82) - `+page.svelte` bleibt **Orchestrierung**: Daten laden, State halten, Komponenten verdrahten. ## Vorgehen (kein Big-Bang!) - **Modal fuer Modal / Block fuer Block** extrahieren, Verhalten **1:1** (kein Redesign, kein Umstyling) — jede Extraktion ein eigener, kleiner Commit (revertierbar). - Props/Events sauber: Komponente bekommt Daten + Callbacks, kein Import von Page-State. - CSS der Bloecke mitwandern lassen (scoped), tote Styles in der Page danach entfernen. - Reihenfolge-Empfehlung: erst die 6 Modals (am leichtesten isolierbar), dann NodeCard/Detail. ## Akzeptanz - Jedes Modal/Panel der Dashboard-Seite ist eine eigene `.svelte`-Datei. - `+page.svelte` < ~800 Zeilen (nur noch Orchestrierung). - Verhalten unveraendert (gleiche Funktionen, gleiche Optik). - Konvention "1 Tab/Panel/Modal = 1 Datei" in `wiki/Development.md` dokumentiert (Basis fuer spaeteres CONTRIBUTING.md). ## Bezug Projekt-Struktur-Review 09.06.2026; OSS-Readiness (Contributor-Einstiegshuerde, PR-Konfliktrate). Gleiches gilt perspektivisch fuer `settings/+page.svelte` (1.034 Z.) und `NodeUpdatesPanel.svelte` (1.167 Z.) — bei Bedarf Folge-Issues. ## Branch `refactor/dashboard-page-split`
Author
Owner

Zwischenstand (verifiziert @ HEAD, 22.06.2026)

cc hat bereits einen grossen Teil sauber umgesetzt — Stand dokumentieren, damit klar ist, wo es weitergeht (es gab keinen Issue-Kommentar / keinen #94-Commit, die Extraktion haengt an anderen Commits mit dran).

Erledigt — 12 Komponenten unter frontend/src/lib/components/dashboard/ extrahiert, importiert, im Markup verdrahtet:
ProvisionModal, NodeSettingsModal, NodeNotesModal, InstallInfoModal, HostUpdateLogModal, KernelCleanupModal, KernelUpdateBanner, NodeTempCharts, NodeUpdateStrip, QemuScanModal, VncModal, DeleteConfirmModal.
+page.svelte: 4.158 → 3.349 Zeilen. Sauber: Daten/Handler bleiben in der Page (Orchestrierung), Markup in den Komponenten.

Noch offen — NodeCard ist der dickste verbleibende Block

  • NodeCard.svelte extrahieren — Card-Container + Header (+page.svelte:1389 .node-card, :1432 .node-header mit Aktionen-Menue, Status, klickbares Expand). Live-Graphs des Headers mit rein.
  • NodeCardDetail.svelte extrahieren — der expandierte Detail-Bereich (ab ~:1520ff: Banner/Strip/Temp/Panels), nutzt die bereits extrahierten Kinder (KernelUpdateBanner, NodeUpdateStrip, NodeTempCharts, NodeUpdatesPanel).
  • Die {#each group.nodes as node}-Schleife (:1369) rendert dann nur noch <NodeCard ... />.
  • Ziel: +page.svelte < ~800 Zeilen (reine Orchestrierung: Daten laden, State, Verdrahtung).
  • Konvention "1 Tab/Panel/Modal = 1 Datei" in wiki/Development.md dokumentieren (steht noch aus).

WICHTIG — Abgrenzung zu #123 (Reihenfolge: #94 ZUERST, dann #123)

  • Die NodeCard-Bulk-DIREKTSTART-Logik (bulkRunByNode/bulkRunningByNode :849-922, bulkRunApi :19/74/103) hier nur mitverschieben in NodeCard/NodeCardDetail, NICHT umbauen/reparieren — das Vereinheitlichen macht #123.
  • NodeUpdateStrip so lassen, dass #123 dort die gemeinsame BulkUpdateMode-Komponente sauber einhaengen kann.

Regeln (wie gehabt)

  • Reines Verschieben, Verhalten + Optik 1:1, kein Redesign.
  • Props/Callbacks via $props — kein Page-State-Import, wo Props reichen.
  • Pro Commit ein Schritt, revertierbar, Message referenziert #94.
  • svelte-check nicht schlechter als vorher.

Abschluss

  • Kommentar mit Commit-Hashes + finaler Zeilenzahl von +page.svelte. Nicht automatisch schliessen (Maintainer-Review).
## Zwischenstand (verifiziert @ HEAD, 22.06.2026) cc hat bereits einen grossen Teil sauber umgesetzt — Stand dokumentieren, damit klar ist, wo es weitergeht (es gab keinen Issue-Kommentar / keinen `#94`-Commit, die Extraktion haengt an anderen Commits mit dran). **Erledigt — 12 Komponenten unter `frontend/src/lib/components/dashboard/` extrahiert, importiert, im Markup verdrahtet:** ProvisionModal, NodeSettingsModal, NodeNotesModal, InstallInfoModal, HostUpdateLogModal, KernelCleanupModal, KernelUpdateBanner, NodeTempCharts, NodeUpdateStrip, QemuScanModal, VncModal, DeleteConfirmModal. `+page.svelte`: **4.158 → 3.349 Zeilen**. Sauber: Daten/Handler bleiben in der Page (Orchestrierung), Markup in den Komponenten. ## Noch offen — NodeCard ist der dickste verbleibende Block - [ ] **NodeCard.svelte** extrahieren — Card-Container + Header (`+page.svelte:1389` `.node-card`, `:1432` `.node-header` mit Aktionen-Menue, Status, klickbares Expand). Live-Graphs des Headers mit rein. - [ ] **NodeCardDetail.svelte** extrahieren — der expandierte Detail-Bereich (ab ~:1520ff: Banner/Strip/Temp/Panels), nutzt die bereits extrahierten Kinder (KernelUpdateBanner, NodeUpdateStrip, NodeTempCharts, NodeUpdatesPanel). - [ ] Die `{#each group.nodes as node}`-Schleife (`:1369`) rendert dann nur noch `<NodeCard ... />`. - [ ] Ziel: `+page.svelte` < ~800 Zeilen (reine Orchestrierung: Daten laden, State, Verdrahtung). - [ ] Konvention "1 Tab/Panel/Modal = 1 Datei" in `wiki/Development.md` dokumentieren (steht noch aus). ## WICHTIG — Abgrenzung zu #123 (Reihenfolge: #94 ZUERST, dann #123) - Die NodeCard-Bulk-DIREKTSTART-Logik (`bulkRunByNode`/`bulkRunningByNode` :849-922, `bulkRunApi` :19/74/103) hier **nur mitverschieben** in NodeCard/NodeCardDetail, **NICHT umbauen/reparieren** — das Vereinheitlichen macht #123. - `NodeUpdateStrip` so lassen, dass #123 dort die gemeinsame `BulkUpdateMode`-Komponente sauber einhaengen kann. ## Regeln (wie gehabt) - Reines Verschieben, Verhalten + Optik 1:1, kein Redesign. - Props/Callbacks via `$props` — kein Page-State-Import, wo Props reichen. - Pro Commit ein Schritt, revertierbar, Message referenziert **#94**. - svelte-check nicht schlechter als vorher. ## Abschluss - Kommentar mit Commit-Hashes + finaler Zeilenzahl von `+page.svelte`. Nicht automatisch schliessen (Maintainer-Review).
Author
Owner

NodeCard-Extraktion erledigt (verbleibender Rest von #94).

Commits (auf main):

  • 572617d refactor(dashboard): extract NodeCardDetail (#94)
  • 29a215d refactor(dashboard): extract NodeCard (#94)
  • 48b7a4d refactor(dashboard): reduce loop to <NodeCard/>, drop dead styles/helpers (#94)

Neue Komponenten unter frontend/src/lib/components/dashboard/:

  • NodeCard.svelte (556 Z.) — Container + Header + Banner (PVE-Upgrade, Agent-Update) + Aktionen-Menü + InlineHostGraphs.
  • NodeCardDetail.svelte (876 Z.) — expandierter {#if isExp}-Bereich: Tabbar + alle Tab-Bodies (inkl. inline VMs/CTs-Tabelle und Info-Tab-Charts); hängt die bereits extrahierten Panels ein (KernelUpdateBanner, NodeUpdateStrip, NodeTempCharts, NodeUpdatesPanel, …).

Ergebnis:

  • {#each group.nodes} rendert jetzt nur noch <NodeCard … />.
  • +page.svelte: 3349 → 1809 Zeilen. Markup = reine Orchestrierung (~360 Z.); Rest = ~1207 Z. Action-Handler, die laut Vorgabe in +page.svelte bleiben und als Callbacks durchgereicht werden.
  • svelte-check: 3 Errors → 3 Errors (alle vorbestehend, fremde Dateien); Warnings 433 → 236 (toter CSS entfernt).
  • Bulk-Direktstart-Flow für #123 unverändert durchgereicht; NodeUpdateStrip wie zuvor verdrahtet.
  • Konvention „1 Tab/Panel/Modal = 1 Datei" in wiki/Development.md um NodeCard/NodeCardDetail ergänzt.

Bleibt offen für #123 (Bulk-Flow-Vereinheitlichung).

**NodeCard-Extraktion erledigt** (verbleibender Rest von #94). Commits (auf `main`): - `572617d` refactor(dashboard): extract NodeCardDetail (#94) - `29a215d` refactor(dashboard): extract NodeCard (#94) - `48b7a4d` refactor(dashboard): reduce loop to `<NodeCard/>`, drop dead styles/helpers (#94) Neue Komponenten unter `frontend/src/lib/components/dashboard/`: - `NodeCard.svelte` (556 Z.) — Container + Header + Banner (PVE-Upgrade, Agent-Update) + Aktionen-Menü + InlineHostGraphs. - `NodeCardDetail.svelte` (876 Z.) — expandierter `{#if isExp}`-Bereich: Tabbar + alle Tab-Bodies (inkl. inline VMs/CTs-Tabelle und Info-Tab-Charts); hängt die bereits extrahierten Panels ein (KernelUpdateBanner, NodeUpdateStrip, NodeTempCharts, NodeUpdatesPanel, …). Ergebnis: - `{#each group.nodes}` rendert jetzt nur noch `<NodeCard … />`. - `+page.svelte`: **3349 → 1809 Zeilen**. Markup = reine Orchestrierung (~360 Z.); Rest = ~1207 Z. Action-Handler, die laut Vorgabe in `+page.svelte` bleiben und als Callbacks durchgereicht werden. - `svelte-check`: 3 Errors → 3 Errors (alle vorbestehend, fremde Dateien); Warnings 433 → 236 (toter CSS entfernt). - Bulk-Direktstart-Flow für #123 unverändert durchgereicht; `NodeUpdateStrip` wie zuvor verdrahtet. - Konvention „1 Tab/Panel/Modal = 1 Datei" in `wiki/Development.md` um NodeCard/NodeCardDetail ergänzt. Bleibt offen für #123 (Bulk-Flow-Vereinheitlichung).
Author
Owner

Verifiziert @ 812b59f → erfüllt, wird geschlossen.

  • 14 Komponenten unter frontend/src/lib/components/dashboard/ (inkl. NodeCard.svelte + NodeCardDetail.svelte).
  • {#each group.nodes} (+page.svelte:1251) rendert nur noch <NodeCard/>.
  • +page.svelte: 4.158 → 1.706 Zeilen (Rest = Orchestrierung; Ziel <800 nicht ganz erreicht, aber der God-Component ist aufgelöst).
  • Konvention "1 Tab/Panel/Modal = 1 Datei" in wiki/Development.md dokumentiert (## Konventionen, Z.24).

Akzeptanzkriterien erfüllt.

**Verifiziert @ 812b59f → erfüllt, wird geschlossen.** - 14 Komponenten unter `frontend/src/lib/components/dashboard/` (inkl. **NodeCard.svelte + NodeCardDetail.svelte**). - `{#each group.nodes}` (+page.svelte:1251) rendert nur noch `<NodeCard/>`. - `+page.svelte`: **4.158 → 1.706 Zeilen** (Rest = Orchestrierung; Ziel <800 nicht ganz erreicht, aber der God-Component ist aufgelöst). - Konvention **"1 Tab/Panel/Modal = 1 Datei"** in `wiki/Development.md` dokumentiert (## Konventionen, Z.24). Akzeptanzkriterien erfüllt.
Sign in to join this conversation.
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
chinux/theProx#94
No description provided.