From f45fbab945ca8bf6226400af829ab473ebf44a25 Mon Sep 17 00:00:00 2001 From: Wild Karl-Heinz Date: Tue, 8 Sep 2026 23:19:42 +0200 Subject: [PATCH] =?UTF-8?q?Interaktives=20Abh=C3=A4ngigkeiten-Panel=20(Vor?= =?UTF-8?q?g=C3=A4nger/Nachfolger,=20andockbar)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rechtsklick auf eine Zelle → "🕾 AbhĂ€ngigkeiten anzeigen" öffnet ein an der rechten Seite angedocktes Panel (wie das Einstellungen-Panel links) mit den direkten VorgĂ€ngern (was die Zelle liest) und Nachfolgern (was sie liest), auch ĂŒber Tabellen-/Blattgrenzen hinweg. Ein Klick auf einen Eintrag navigiert wirklich dorthin: wĂ€hlt die echte Zelle im Dokument aus, wechselt bei Bedarf das Blatt-Tab, und das Panel zentriert sich neu — Blatt-Tabs, Canvas, Formel- und Statusleiste bleiben dabei die ganze Zeit sichtbar und bedienbar (kein Vollbild-Dialog). Jeder Eintrag zeigt immer den Blattnamen, nie nur implizit. ZirkelbezĂŒge werden rot markiert. Neu in der Engine: Workbook.graphPrecedents/graphDependents, dĂŒnne öffentliche Wrapper um den bereits vorhandenen DependencyGraph. Im Store: cellGraphSelf/cellGraphNeighbors (Anreicherung fĂŒr die Anzeige) sowie openDependencyGraph/closeDependencyGraph (dokumentweiter UI-State, ruft intern das bestehende selectCell auf). 424 Tests (Engine-/Store-Ebene vollstĂ€ndig abgedeckt), vue-tsc/eslint/build sauber. Das Panel selbst nur live per Playwright verifiziert (kein Komponenten-Test-Setup vorhanden, in README dokumentiert). Co-Authored-By: Claude Sonnet 5 --- README.md | 52 +++++ src/App.vue | 2 + src/components/DependencyGraphView.vue | 305 +++++++++++++++++++++++++ src/components/SheetCanvas.vue | 10 +- src/components/TableGrid.vue | 13 ++ src/engine/README.md | 10 + src/engine/__tests__/workbook.spec.ts | 65 ++++++ src/engine/index.ts | 1 + src/engine/workbook.ts | 16 ++ src/store/__tests__/document.spec.ts | 139 +++++++++++ src/store/document.ts | 79 ++++++- src/store/types.ts | 23 ++ 12 files changed, 712 insertions(+), 3 deletions(-) create mode 100644 src/components/DependencyGraphView.vue diff --git a/README.md b/README.md index fba9513..2687f76 100644 --- a/README.md +++ b/README.md @@ -411,6 +411,40 @@ mitgezogen: Tabelle liegt. - **Undo/Redo-fĂ€hig** wie jede andere Änderung. +### AbhĂ€ngigkeiten erkunden (🕾) + +Rechtsklick auf eine Zelle → **„🕾 AbhĂ€ngigkeiten anzeigen"** öffnet ein +andockbares Panel rechts (wie das Einstellungen-Panel links) — **kein** +Vollbild-Dialog, damit Blatt-Tabs, Statusleiste und Canvas die ganze Zeit +sichtbar und bedienbar bleiben: der Blattbezug geht beim Erkunden nie +verloren. Zeigt fĂŒr die Zelle: + +- **VorgĂ€nger** — jede Zelle, die ihre Formel direkt liest (bei einem + Bereich wie `SUM(B2:E2)` jede einzelne Zelle darin). +- **Nachfolger** — jede Zelle, die *diese* Zelle direkt liest, auch ĂŒber + Tabellen-/Blattgrenzen hinweg. +- Jeder Eintrag zeigt **Blatt · Tabelle!Zelle** (Blattname **immer**, nicht + nur bei Mehrdeutigkeit) sowie den aktuellen Wert. + +**Ein Klick auf einen Eintrag navigiert wirklich dorthin** — nicht nur +innerhalb des Panels: Er wĂ€hlt die echte Zelle im Dokument aus, wechselt bei +Bedarf das Blatt-Tab, und das Panel zentriert sich neu auf sie. Formelleiste, +Statusleiste und die Tabellen selbst zeigen danach exakt dieselbe Zelle, die +im Panel zentriert ist — das Erkunden des Formel-Netzwerks *ist* Navigieren, +keine isolierte Nebenansicht. **„← ZurĂŒck"** geht die so besuchten Zellen +rĂŒckwĂ€rts durch (auch das mit echter Navigation, nicht nur Panel-intern). + +Ein Zirkelbezug (`#CIRC`) wird rot markiert (⚠), sowohl als Zentrum als auch +als VorgĂ€nger/Nachfolger-Eintrag — die Kante existiert im AbhĂ€ngigkeitsgraphen +unabhĂ€ngig davon, dass sie bei der Neuberechnung ĂŒbersprungen wird (s. +„Fehlermodell" unten). + +**Bewusst ohne**: kein automatisches Scrollen der Zieltabelle zur +navigierten Zelle, falls sie außerhalb des sichtbaren Ausschnitts liegt +(bei einer „Feste GrĂ¶ĂŸe"-Tabelle mit vielen Zeilen); keine Gruppierung +vieler VorgĂ€nger/Nachfolger zu einem Bereichs-Eintrag (`Umsatz!B2:B100` +erscheint als 99 einzelne Zeilen, nicht als ein zusammengefasster Eintrag). + ### Zell-Formatierung Auswahl (Zelle, Bereich, Mehrfachauswahl, ganze Zeile/Spalte ĂŒber den Kopf) → im @@ -972,6 +1006,16 @@ Grundrechenarten: `Übersicht!B2 = =SUM(Umsatz!B2:E2)`, `D2 = =B2-C2`, Bereich, `$`-Sperren bleiben wirkungslos (anders als beim Kopieren), unverĂ€nderte Referenzen bleiben byte-identisch, Undo/Redo, Schutz gegen Löschen der letzten verbleibenden Zeile/Spalte. +- **AbhĂ€ngigkeiten erkunden** (`graphPrecedents`/`graphDependents` in + `workbook.spec.ts`, `cellGraphSelf`/`cellGraphNeighbors`/ + `openDependencyGraph`/`closeDependencyGraph` in `document.spec.ts`) — + exakte VorgĂ€nger/Nachfolger-Kanten, Auflösung ĂŒber Tabellen-/Blattgrenzen, + bleibt korrekt fĂŒr eine Zelle auf einem Zirkelbezug, aktualisiert sich + nach einer Neuzuordnung der Formel, `openDependencyGraph` löst wirklich + `selectCell` aus (inkl. Blatt-Tab-Wechsel), `closeDependencyGraph` rĂŒhrt + die Auswahl nicht an. Das Panel selbst (`DependencyGraphView.vue`) ist + nur live per Playwright verifiziert, kein Komponenten-Test-Setup + vorhanden (s. „Bekannte Grenzen"). - **„Mit Schleife"-Code** — Parser-Ebene (`parseFunctionBlock`): ein `FOR...DO...END` mit mehreren Anweisungen, mehrere unabhĂ€ngige Schleifen nacheinander, `IF...THEN...END` und `IF...THEN...ELSE...END`, `IF` @@ -1043,6 +1087,14 @@ Grundrechenarten: `Übersicht!B2 = =SUM(Umsatz!B2:E2)`, `D2 = =B2-C2`, Komponenten-Test-Setup (z. B. Vue Test Utils), nur Engine-/Store-Tests. Nur live per Playwright verifiziert (Wachsen, Schrumpfen mit Inhaltsschutz, deutliches Überschreiten der bestehenden GrĂ¶ĂŸe). +- **AbhĂ€ngigkeiten-Panel** (`DependencyGraphView.vue`) bewusst ohne: Gruppierung + vieler VorgĂ€nger/Nachfolger zu einem Bereichs-Eintrag (jede Zelle einzeln, + ungeachtet der Anzahl), automatisches Scrollen der Zieltabelle zur + navigierten Zelle. Wie bei der Tabellen-GrĂ¶ĂŸenĂ€nderung oben: rein + UI-seitig, nur live per Playwright verifiziert, kein Komponenten-Test-Setup + vorhanden — die zugrundeliegenden Store-/Engine-Funktionen + (`graphPrecedents`/`graphDependents`/`cellGraphNeighbors`/ + `openDependencyGraph`) sind es aber (s. „Tests" oben). - **Objekt-BezĂŒge beim AnhĂ€ngen.** Beim JSON-*AnhĂ€ngen* zweier Dokumente werden nur Blatt-/Objekt-IDs neu vergeben, nicht Tabellennamen. Kollidiert ein angehĂ€ngter Tabellenname mit einem bestehenden, gewinnt bei der Auflösung der diff --git a/src/App.vue b/src/App.vue index af62a9c..9e2949e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -6,6 +6,7 @@ import SheetCanvas from './components/SheetCanvas.vue'; import SheetTabs from './components/SheetTabs.vue'; import StatusBar from './components/StatusBar.vue'; import SettingsPanel from './components/SettingsPanel.vue'; +import DependencyGraphView from './components/DependencyGraphView.vue'; import { useToasts } from './composables/useToasts'; import { useDocument } from './store/document'; @@ -48,6 +49,7 @@ onBeforeUnmount(() => window.removeEventListener('keydown', onGlobalKeydown));
+
diff --git a/src/components/DependencyGraphView.vue b/src/components/DependencyGraphView.vue new file mode 100644 index 0000000..7960b7d --- /dev/null +++ b/src/components/DependencyGraphView.vue @@ -0,0 +1,305 @@ + + + + + diff --git a/src/components/SheetCanvas.vue b/src/components/SheetCanvas.vue index 92292df..5dec28f 100644 --- a/src/components/SheetCanvas.vue +++ b/src/components/SheetCanvas.vue @@ -74,7 +74,7 @@ function selectObj(id: string) {