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) {