Workspace: anlegen, wiederfinden, oeffnen #1
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Destination
Eine Spec, mit der sich das Workspace-Thema am Stück bauen lässt: einen Workspace anlegen, einen bekannten wiederfinden und öffnen — bis zu dem Punkt, an dem der geöffnete Workspace seine Notizen als Baum in der
files-barzeigt. Desktop-only.Notes
Domain: DioNotes — lokale Markdown-Notizen-App, Dioxus 0.7, Desktop (
dx serve --platform desktop).Planen, nicht bauen. Jedes Ticket liefert eine Entscheidung, keine Implementierung. Wenn eine Session den Drang verspürt, einfach loszucoden, ist das das Signal, dass die Map zu Ende ist.
Skills pro Session:
/grillingund/domain-modeling;/researchfür AFK-Recherche.Rahmenentscheidungen aus dem Charting — stehen fest, solange die Destination nicht neu gezogen wird:
.md-Dateien darin. Kein Container-Format, keine Datenbank..dionotes/-Marker macht einen Ordner zum Workspace. Ohne Marker ist es kein Workspace.files-barzeigt einen aufklappbaren Baum, nicht eine flache Liste.Decisions so far
rfd 0.17.2steckt überdioxus-desktopbereits im Abhängigkeitsgraph. Zwei Wege:input { r#type: "file", directory: true }plusFileData::path()ganz ohne neue Dependency, oderrfd::AsyncFileDialogfür einen programmatisch geöffneten Dialog. Async ist Pflicht (sync friert den Event-Loop ein), Abbruch liefertNone, Windows läuft ohne Feature-Flag. Langfassung: Branchresearch/ordner-dialog.%LOCALAPPDATA%\DioNotes\config\(Local statt Roaming, weil absolute Workspace-Pfade maschinenspezifisch sind). Linux:$XDG_STATE_HOME, nicht~/.config— die XDG-Spec führt „recently used files" wörtlich als State. Ein Ausdruck deckt alle drei Plattformen:state_dir().unwrap_or_else(|| config_local_dir()), ohne#[cfg]. Das Verzeichnis muss die App selbst anlegen. Dioxus hat keine eigene Abstraktion —Config::with_data_directoryist das WebView-Profil, nicht die App-Konfiguration. Langfassung: Branchresearch/config-ablageort.dirs(nichtdirectories), App-Verzeichnis überall kleingeschriebendionotes. Die Workspace-Liste (.../dionotes/workspaces.ron) enthält nur Pfade; ihre Reihenfolge ist die Sortierung, kein Anzeigename, kein Zeitstempel, keine Schema-Version — beschädigt wird sie verworfen. Der Marker (.dionotes/workspace.ron) enthält heute genauschema_version: 1, keincreated_at, keine Vorratsfelder — beschädigt wird der Workspace nicht geöffnet und der Marker nicht neu angelegt, weil das später den Passwortschutz aushebeln würde.#[nest("/workspace")]. Der heutige Zwei-Router-Aufbau ist nie gelaufen und hätte beim ersten Umschalten den Editor-Router mit einer URL konfrontiert, die er nicht kennt (/ws_open). Der offene Workspace lebt alsSignal<Option<Workspace>>mitstruct Workspace { root: PathBuf }im Context-Provider — Props scheiden aus, weil sich durch einOutletkeine durchreichen lassen.workspace_selected: Signal<bool>entfällt ersatzlos. Bei fehlendem Workspace schickt ein Guard imEditorShell-Layout zurück zum Selector. „Workspace wechseln" braucht keinen Platzhalter. Später durch #8 präzisiert: Der Selector wurde auf eine Route reduziert,SELECTOR_TABSentfällt.TreeNode { File | Folder }mit einer einzigenFile-Variante für alle Dateitypen; Aufbau überstd::fs::read_dirmit eigener Rekursion. Eingesammelt wird alles außer Namen mit führendem.(Dateien und Ordner, womit.dionotes/und.git/ohne Ausnahmeliste wegfallen) und außer Symlinks. Leere Ordner werden angezeigt, sortiert wird Ordner-vor-Dateien und alphabetisch ohne Beachtung der Groß-/Kleinschreibung. Der Aufklapp-Zustand liegt alsSignal<HashSet<PathBuf>>neben dem Baum, damit ein Refresh ihn nicht mitreißt, und wird nicht persistiert. Der Baum ist abgeleiteter Zustand und gehört nicht instruct Workspace.SELECTOR_TABSentfällt ersatzlos. Prototyp: Branchprototype/selector-ui.Not yet specified
path.exists()sekundenlang blockieren — ausgerechnet im Selector, den jeder Start zuerst zeigt. Dass die Prüfung nebenläufig laufen muss, steht fest; wie das in Dioxus 0.7 sauber aussieht (use_resourcepro Eintrag oder eine gemeinsame Aufgabe), ist noch nicht scharf..md-Dateien unverschlüsselt daneben liegen. Eigener Effort, der spätestens mit dem Passwortschutz auf den Tisch muss; Schlüsselableitung, Verschlüsselung im Ruhezustand und der Umgang mit dem geöffneten Editor hängen daran.Out of scope
Die Map ist erfüllt
Alle sieben Tickets sind geschlossen; es steht keine Entscheidung mehr aus, bevor gebaut werden kann. Die Begründungen liegen jeweils im Ticket, die Kurzfassungen oben unter Decisions so far.
Vorgeschlagene Bau-Reihenfolge
workspace_selected: Signal<bool>durchSignal<Option<Workspace>>im Context ersetzen. Fasst als Einziges bestehenden Code an; alles Weitere baut darauf auf.dirs, RON,workspaces.ron. Ohne Oberfläche prüfbar.prototype/selector-uizeigt Aufbau und Zustände.Was offen bleibt — und nicht hierher gehört
Die Punkte unter Not yet specified sind bewusst nicht Teil dieser Map. Zwei davon sind eigene Vorhaben, sobald sie anstehen:
Wer daran weiterarbeitet, beginnt mit einer neuen Map, nicht mit dieser.