Technische ID als Identität der Notizen; Pfad wird zur Eigenschaft

Bisher war der Dateipfad die Identität einer Notiz: Umbenennen brach
Verweise, und der Pfad tauchte in der Oberfläche auf (Tooltips, Menüpunkte
"Dateiname ändern"/"Ordnerpfad ändern"). Jede Notiz trägt jetzt eine
technische ID im Frontmatter (id: <uuid>), die nie wechselt; der
Systempfad ist nur noch eine Eigenschaft.

- ensure_ids ergänzt fehlende IDs beim Seitenaufbau (wie ensure_node_texts);
  frontmatter() schreibt sie bei jedem Anlegen als erste Zeile.
- Doc, WikiDocEntry, FolderNode und Suchtreffer führen die ID mit;
  resolve_id löst sie auf den aktuellen relpath auf.
- Commands sprechen IDs: archive_read/write/set_title/delete nehmen `id`,
  archive_create_doc/create_folder die ID des Elternknotens plus Namen,
  panel_archive_cmd den Zielknoten als ID.
- Frontend adressiert durchgehend über IDs: Auswahl, Klapp-Zustand,
  Verlauf des Zurück-Knopfs, Wikilink-Sprünge, Suchtreffer-Vormerkung und
  der Zielordner-Baum des Archiv-Dialogs.
- Der Pfad ist aus der Oberfläche verschwunden: die Menüpunkte zum
  Umbenennen von Datei und Ordner samt Commands (archive_rename,
  archive_move, archive_move_folder) sind entfallen — es gibt nur noch den
  Titel, Name und Titel können nicht mehr auseinanderlaufen.

Offen dadurch: Verschieben im Baum fehlt (ToDo: Drag & Drop).

Archiv-Dialog nebenbei überarbeitet: modales Popup im Design der
Archiv-Ansicht mit Abbrechen und zuverlässigem Escape, Zielordner über
einen einklappbaren Baum statt Pfadeingabe, zusätzlicher Knopf "Auf Platte
legen" (panel_save_as); Archivieren öffnet keinen Dateimanager mehr.
This commit is contained in:
marcus hinz
2026-07-26 17:53:19 +02:00
parent 9de58d43e8
commit 2251a1d45f
26 changed files with 984 additions and 403 deletions
+8 -11
View File
@@ -26,10 +26,9 @@ export const wikiTab: PanelTab = {
);
return initWikiView(container, {
autoStart: ctx.standalone,
readDoc: (relpath) => invoke("archive_read", { project: ctx.project, relpath }),
writeDoc: (relpath, text) =>
invoke("archive_write", { project: ctx.project, relpath, text }),
setTitle: (relpath, title) => run("archive_set_title", { relpath, title }),
readDoc: (id) => invoke("archive_read", { project: ctx.project, id }),
writeDoc: (id, text) => invoke("archive_write", { project: ctx.project, id, text }),
setTitle: (id, title) => run("archive_set_title", { id, title }),
openWiki: ctx.openWiki,
takePending: () => {
const p = pendingSelect;
@@ -37,11 +36,9 @@ export const wikiTab: PanelTab = {
return p;
},
actions: {
rename: (relpath, name) => run("archive_rename", { relpath, name }),
remove: (relpath) => run("archive_delete", { relpath }),
moveFolder: (folder, to) => run("archive_move_folder", { folder, to }),
createFolder: (folder) => run("archive_create_folder", { folder }),
createDoc: (folder, name) => run("archive_create_doc", { folder, name }),
remove: (id) => run("archive_delete", { id }),
createFolder: (parent, name) => run("archive_create_folder", { parent, name }),
createDoc: (parent, name) => run("archive_create_doc", { parent, name }),
},
});
},
@@ -67,8 +64,8 @@ export const searchTab: PanelTab = {
init: (container, ctx) =>
initSearchView(
container,
(_path, relpath) => {
pendingSelect = relpath;
(_path, _relpath, id) => {
pendingSelect = id;
ctx.openWiki("tag:");
},
(raw) => {