Backend (Mini-Backend 1-2h): - Migration 016: ai_prompts.graph_data JSONB column - workflow_executor: graph_data parameter support (backward-compatible) - prompt_executor: execute_workflow_prompt uses graph_data Frontend (Main effort 25-35h): - WorkflowCanvas: React Flow wrapper component - 5 Custom Nodes: Start, End, Analysis, Logic, Join - 4 Config Panels: QuestionAugmentation, LogicExpression, Fallback, Join - workflowValidation: Structural + logical validation - workflowSerializer: Canvas ↔ JSONB conversion - WorkflowEditorPage: Main orchestration (420 LOC) - Route: /workflow-editor/:id - CSS: workflowEditor.css (300 LOC) Architecture: - Option B: ai_prompts.type='workflow' (not separate table) - panels/ subdirectory for clean separation - WorkflowCanvas reusable component - User GUI identical (Workflows = Prompts) - Backward-compatible (type='pipeline' unchanged) Version: v0.9m → v0.9n (Phase 5 complete) Module: workflow 0.5.0 → 0.6.0 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
12 KiB
Phasenplan: Responsive UI (Desktop Sidebar + Mobile/PWA)
Gitea: #30 – Responsive UI
Spec:.claude/docs/functional/RESPONSIVE_UI.md
Breakpoint:<1024px= Mobile (Bottom-Nav, bestehendes Verhalten),≥1024px= Desktop (Sidebar 220px)
Letzte Plan-Aktualisierung: 2026-04-04
Fortschritt (kurz)
| Phase | Titel | Status | Datum / Notiz |
|---|---|---|---|
| P0 | Vorbereitung & Baseline | ☐ pending | |
| P1 | App-Shell: Sidebar + Breakpoint + gemeinsame Navigation | ☐ pending | |
| P2 | Globales Layout & Content-Bereich (CSS) | ☐ pending | |
| P3 | Dashboard (Desktop-Grid) | ☐ pending | |
| P4 | Verlauf (Tabs links / Content rechts) | ☐ pending | |
| P5 | Analyse (Prompts links / Ergebnis rechts) | ☐ pending | |
| P6 | Erfassung / Capture & Formularseiten | ☐ pending | |
| P7 | Admin & restliche Vollbreiten-Seiten | ☐ pending | |
| P8 | Abschluss, Regression, Spec-Pflege | ☐ pending |
Status-Legende: ☐ pending · ◐ in Arbeit · ☑ erledigt · ⏸ blockiert
Testumgebung (für alle Phasen)
| ID | Umgebung | Verwendung |
|---|---|---|
| T-H1 | Chromium Desktop, Fenster ≥1280px | Desktop-Layout, Sidebar |
| T-H2 | Chromium, DevTools 375×812 (o. ä.) | Mobile-Layout, Bottom-Nav |
| T-H3 | Chromium, Breite 1023px vs 1024px | Breakpoint-Grenze |
| T-H4 | iPhone (Safari), installierte PWA | Regression Mobile/PWA |
| T-H5 | optional: iPad quer (≥1024px) | Desktop-Sidebar auf Tablet quer |
Allgemein: Kein Pflicht-E2E-Framework im Repo; Abnahme primär manuell nach Checklisten unten. Optional später: Playwright-Smoke (viewport-Wechsel).
Phase P0 – Vorbereitung & Baseline
Ziel
Risikoarm starten: Ist-Stand dokumentieren, Spec bereinigen, keine funktionale UI-Änderung.
Aufgaben
- Bekannte Artefakte am Ende von
.claude/docs/functional/RESPONSIVE_UI.mdentfernen (ZeilenEOF/echo …), falls noch vorhanden. - Kurz notieren: aktuelle
app-shell/max-width:600pxinapp.cssist die Mobile-Baseline (siehe Code-Review).
Abnahmekriterien
- Spec-Datei endet mit den „Offenen Fragen“; keine Shell-Zeilenduplikate aus Fremdkopien.
- Plan-Datei (dieses Dokument) ist im Repo und verlinkt (optional in Gitea #30 kommentieren).
Tests (P0)
| Test | Schritt | Erwartung |
|---|---|---|
| P0-T1 | RESPONSIVE_UI.md öffnen |
Letzte sinnvolle Zeile ist Frage 4 oder Abschnittsende; kein echo/EOF |
| P0-T2 | npm run build im frontend/ |
Exit 0 |
Phase P1 – App-Shell: Sidebar + Breakpoint + gemeinsame Navigation
Ziel
Desktop: feste Sidebar 220px links gemäß Spec; Mobile: unverändert Bottom-Nav. Eine Navigationsdefinition (Routes/Labels/Icons) für beide Darstellungen. Öffentliche Auth-Routen (/register, /verify, …) nicht in Sidebar/Bottom-Nav einbinden (wie heute).
Aufgaben (technisch orientierend)
- Nav-Items aus
App.jsx(Nav-Komponente) in eine exportierbare Struktur (z. B.navItemsArray +admin-Eintrag nur beirole === 'admin'), von Desktop-Sidebar und MobileNavgemeinsam genutzt. - Neue Komponente z. B.
DesktopSidebar.jsx(oderAppSidebar.jsx): Logo/Branding, gleiche Links wie Bottom-Nav, unten Nutzerbereich (Avatar, Name/Tier laut Spec – Daten aususeProfile/useAuthwo möglich). AppShell: bei≥1024pxSidebar sichtbar, Bottom-Nav ausgeblendet; bei<1024pxumgekehrt.- Aktiver Route-State:
NavLink/activein Sidebar gleiche Semantik wie Bottom-Nav (endbei/beachten). - Kein
resize-Listener pflichtig; primär CSS (@media (min-width: 1024px)) für Sichtbarkeit; falls nötig nur für Edge-Cases.
Abnahmekriterien
- Unter 1024px: UI wirkt wie vor P1 (Bottom-Nav sichtbar, Sidebar unsichtbar); PWA-Start auf iPhone unverändert nutzbar.
- Ab 1024px: Sidebar sichtbar, fixed links, ~220px; Bottom-Nav nicht sichtbar.
- Admin-Link nur für Admins in beiden Navs.
- Abmelden erreichbar (Spec: im Sidebar-Footer; falls Mobile weiter nur im Header: ** dokumentieren als Abweichung** oder gleich ziehen).
Tests (P1)
| Test | Schritt | Erwartung |
|---|---|---|
| P1-T1 | T-H2: einloggen, alle 5 Haupt-Routen antippen | Bottom-Nav aktiv, kein Layout-Bruch |
| P1-T2 | T-H1: gleiche Routen | Nur Sidebar-Navigation sichtbar, korrekte Aktiv-Markierung |
| P1-T3 | T-H3: Breite 1023→1024 wechseln | Sidebar erscheint / Bottom verschwindet ohne Reload; kein „Flackern“-Loop |
| P1-T4 | T-H4: PWA | Login, Hauptflows kurz (Dashboard, Erfassung) – Bottom-Nav ok |
| P1-T5 | Admin-User T-H1 | Admin-Eintrag in Sidebar; Nicht-Admin ohne Admin |
Phase P2 – Globales Layout & Content-Bereich
Ziel
Desktop-Content rechts von der Sidebar: Spec margin-left 220px, Padding 24px 32px, max-width 1200px zentriert im verbleibenden Raum. Mobile: beibehaltene Abstände (16px, 80px bottom für Nav).
Aufgaben
app.css:.app-shellnicht mehr globalmax-width: 600pxfür Desktop; Mobile beibehalten oder per Media Query trennen..app-mainPadding/Bottom: Mobilecalc(nav + 16px); Desktop ohne Bottom-Nav-Padding (oder nur safe-area falls nötig).- Optional Desktop: Top-Header (
app-header) redundant mit Sidebar-Branding – vereinheitlichen (z. B. Header auf Desktop ausblenden oder auf kompakte Toolbar reduzieren), damit keine doppelte Logo-Zeile.
Abnahmekriterien
- Desktop: Content nutzt sichtbar mehr horizontalen Raum als heute (max 1200px Inhalt, zentriert).
- Mobile: kein zusätzliches horizontales Scrollen der Gesamtseite durch P1/P2.
- Keine Überlappung Sidebar/Content.
Tests (P2)
| Test | Schritt | Erwartung |
|---|---|---|
| P2-T1 | T-H1: lange Seite scrollen | Nur Main-Area scrollt; Sidebar bleibt sichtbar (fixed) |
| P2-T2 | T-H2 | Weiterhin nutzbarer unterer Rand für Bottom-Nav |
| P2-T3 | T-H1: sehr breiter Monitor | Content max ~1200px, optisch zentriert rechts von Sidebar |
Phase P3 – Dashboard (Desktop-Grid)
Ziel
Spec §5.1: Desktop mehrspaltige Karten (z. B. 4 Spalten für Kennzahlen-Zeile); Mobile Karten untereinander.
Aufgaben
Dashboard.jsx: Layout in CSS Grid o. ä. mit@media (min-width: 1024px)für 4-Spalten-Zeile(n) laut Wireframe; Mobile unveränderte Reihenfolge.- Charts/„volle Breite“-Blöcke unter den Karten laut Spec.
Abnahmekriterien
- Mobile Dashboard visuell vergleichbar zum Stand vor P3 (keine funktionalen Regressionen).
- Desktop: klar erkennbares Grid; keine übermäßigen Lücken bei typischer Viewport-Höhe.
Tests (P3)
| Test | Schritt | Erwartung |
|---|---|---|
| P3-T1 | T-H2 Dashboard | Karten untereinander, lesbar |
| P3-T2 | T-H1 Dashboard | Mehrspaltigkeit wie Spec; kein horizontaler Overflow |
| P3-T3 | Daten mit/ohne Werte | Keine Layout-Crashes (leere Zustände) |
Phase P4 – Verlauf (History.jsx)
Ziel
Spec §5.2: Desktop Tabs vertikal links, Chart/Tabelle rechts (volle restliche Breite); Mobile Tabs oben wie heute.
Aufgaben
- Tab-Steuerung refaktorieren oder per CSS ohne doppelte State-Logik.
- Desktop: flex/grid
240–280pxTab-Spalte + flex 1 Chart-Bereich (feinjustierbar).
Abnahmekriterien
- Alle bisherigen Verlauf-Tabs funktionieren (Gewicht, KF, Umfänge, … – wie im aktuellen Code).
- Mobile UX unverändert vom Nutzergefühl her (Tabs oben).
- Desktop: klar zwei Spalten; Chart nutzt rechte Fläche.
Tests (P4)
| Test | Schritt | Erwartung |
|---|---|---|
| P4-T1 | T-H2: Tab wechseln | Wie bisher |
| P4-T2 | T-H1: jeder Tab | Linke Liste + rechter Chart-Bereich sichtbar |
| P4-T3 | Langes Tab-Label / viele Tabs | Kein Layout-Bruch (Scroll in Tab-Spalte falls nötig) |
Phase P5 – Analyse (Analysis.jsx)
Ziel
Spec §5.3: Desktop Prompt-Liste links (~300px), Ergebnis rechts; Mobile untereinander.
Aufgaben
- Layout splitten; Pipeline/Prompt-Bereiche so umbauen, dass Lesbarkeit und Scroll-Verhalten stimmen.
Abnahmekriterien
- KI-Ausführung, Platzhalter-Tabelle, Experten-Modus: weiter bedienbar.
- Desktop: Ergebnisbereich hat deutlich mehr Breite als Mobile.
Tests (P5)
| Test | Schritt | Erwartung |
|---|---|---|
| P5-T1 | T-H2: Analyse ausführen | Flow wie bisher |
| P5-T2 | T-H1: langes Ergebnis | Rechte Spalte scrollbar, linke Prompt-Liste fix oder eigen-scroll |
| P5-T3 | Kleines Fenster knapp unter 1024px | Kein „mittendrin“ kaputtes Layout |
Phase P6 – Erfassung / Capture & Formularseiten
Ziel
Spec §5.4: Desktop Formulare zentriert, max-width ~600px im Content-Bereich; Mobile volle Breite wie heute.
Aufgaben
CaptureHubund relevante Seiten (WeightScreen, …) unter Desktop-Wrapper; wo sinnvoll gemeinsame Klasse.capture-form-desktopinapp.css.
Abnahmekriterien
- Mobile: keine Verschlechterung der Eingabe.
- Desktop: Formulare nicht „volle 1200px“, sondern lesbar begrenzt.
Tests (P6)
| Test | Schritt | Erwartung |
|---|---|---|
| P6-T1 | T-H2: Gewicht erfassen | Vollbreite ok |
| P6-T2 | T-H1: gleiche Seite | Schmale, zentrierte Spalte |
| P6-T3 | Capture-Hub Kacheln | Umbruch auf Desktop ordentlich |
Phase P7 – Admin & übrige Seiten
Ziel
Spec §5.5: Admin-Tabellen nutzen auf Desktop mehr Breite; Mobile weiterhin horizontales Scrollen wo nötig.
Aufgaben
Admin*Page.jsxund ähnliche Tabellen-Seiten: unnötigemax-width-Erbe von Mobile entfernen; nicht jede Admin-Seite einzeln zerstören – priorisiert häufig genutzte.
Abnahmekriterien
- Keine regressiven Auth-Schutz-Änderungen.
- Desktop: mehr sichtbare Spalten bei typischen Admin-Tabellen.
Tests (P7)
| Test | Schritt | Erwartung |
|---|---|---|
| P7-T1 | T-H1: z. B. Admin Training Types | Tabelle nutzt Breite; horizontales Scrollen nur bei Bedarf |
| P7-T2 | T-H2: gleiche Seite | Weiter bedienbar mit Scroll |
Phase P8 – Abschluss, Regression, Dokumentation
Ziel
Release-tauglich machen; Spec und Issue aktualisieren.
Aufgaben
- Alle Phasen P1–P7 in Fortschrittstabelle auf ☑ setzen.
- Vollständiger Regression-Pass (Routenliste aus
App.jsx). - Gitea #30: Abschlusskommentar mit Screenshots (optional) + Hinweis auf diesen Plan.
REVIEW_OPEN_ISSUES_2026-04-04.mdoder Nachfolger: #30 auf DONE setzen, wenn aus eurer Sicht erledigt.
Abnahmekriterien (Gesamt gem. #30 / Spec)
- Desktop ≥1024px: Sidebar links, Bottom-Nav aus.
- Mobile <1024px: Bottom-Nav unten, Sidebar aus.
- Aktive Route in beiden Navs korrekt.
- Dashboard / Verlauf / Analyse / Erfassung / Admin gemäß Spec umgesetzt.
- Resize ohne JavaScript-Zwang stabil (CSS-first).
- PWA iPhone weiterhin funktionsfähig (Kernflows).
Tests (P8 – Smoke-Checkliste)
| Route | T-H2 | T-H1 |
|---|---|---|
/ |
☐ | ☐ |
/capture |
☐ | ☐ |
/history |
☐ | ☐ |
/analysis |
☐ | ☐ |
/settings |
☐ | ☐ |
| 1× Admin (falls verfügbar) | ☐ | ☐ |
| T-H4 PWA kurz | ☐ | n/a |
Parallelität (Canvas / Workflow)
- Während P1–P2 möglichst keine parallelenden Änderungen an
App.jsx/ globalemapp.cssohne Absprache. - Neue Workflow-/Canvas-Routen: nur innerhalb von
<main>; Sidebar- und Breakpoint-Kontrakt einhalten (margin-left, keine zweite globale Spalte).
Planpflege
Änderungen an Phasen, Kriterien oder Status: dieses File anpassen und kurz „Letzte Plan-Aktualisierung“ oben datieren. Bei größeren Scope-Änderungen Gitea #30 kommentieren.