import { invoke } from "@tauri-apps/api/core"; import { initSearchView } from "../search-view"; import { initWikiView } from "../wiki-view"; import type { PanelTab } from "./index"; /// Suchtreffer-Sprung ins Archiv: der Treffer merkt den relpath vor, lädt die /// Übersicht neu (wiki-update wechselt den Tab), und die Archiv-Ansicht holt /// die Vormerkung beim nächsten set() ab. let pendingSelect: string | null = null; export const wikiTab: PanelTab = { mode: "wiki", module: "archive", buffer: "wiki", popupOnly: true, labelKey: "panel.tabWiki", titleKey: "panel.tabWikiTitle", // Dokument-/Ordner-Operationen laufen als Commands; der neue Stand kommt // über den Wiki-Puffer (wiki-update) zurück, Fehler als Toast. Der // Notiz-Inhalt kommt pro Auswahl über archive_read; Bearbeiten lädt wie // bisher in den Dokument-Tab. init: (container, ctx) => { const run = (cmd: string, args: Record) => void invoke(cmd, { project: ctx.project, ...args }).catch((e) => ctx.toast(String(e)), ); // Anlegen liefert die ID der neuen Notiz zurück. const create = (cmd: string, args: Record) => invoke(cmd, { project: ctx.project, ...args }).catch((e) => { ctx.toast(String(e)); throw e; }); return initWikiView(container, { autoStart: ctx.standalone, 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; pendingSelect = null; return p; }, actions: { remove: (id) => run("archive_delete", { id }), createFolder: (parent, name) => run("archive_create_folder", { parent, name }), createDoc: (parent, name) => create("archive_create_doc", { parent, name }), createHtml: (parent, name) => create("archive_create_html", { parent, name }), }, }); }, // Beim Aktivieren die Übersicht frisch laden: das Anlegen eines Dokuments // öffnet den Dokument-Tab, ohne den Wiki-Puffer anzufassen — und auch // direkt archivierte oder von Hand abgelegte Dateien erscheinen so. // Die Fenstergröße setzt allein open_panel_window beim Öffnen des Popups. onActivate: (_view, ctx) => ctx.openWiki("tag:"), }; export const searchTab: PanelTab = { mode: "search", module: "archive", buffer: "search", popupOnly: true, labelKey: "panel.tabSearch", titleKey: "panel.tabSearchTitle", // Trenner: Archiv-Fenster-Tabs (Archiv, Suche) links, Session-Tabs rechts. sepAfter: true, // Treffer-Klick öffnet die Notiz im Archiv-Tab: relpath vormerken, die // Übersicht frisch laden — das wiki-update wechselt den Tab und die // Ansicht wählt die vorgemerkte Notiz aus. init: (container, ctx) => initSearchView( container, (_path, _relpath, id) => { pendingSelect = id; ctx.openWiki("tag:"); }, (raw) => { // `#tag`-Tokens filtern aufs Schlagwort, der Rest ist die Volltext-Query. const words = raw.split(/\s+/).filter(Boolean); const tag = words.find((w) => w.startsWith("#"))?.slice(1) ?? null; const query = words.filter((w) => !w.startsWith("#")).join(" "); void invoke("search_run", { project: ctx.project, query, tag }).catch((e) => ctx.toast(`Suche fehlgeschlagen: ${e}`), ); }, ), };