Panel: Clobber-Schutz, Content-Editor, Archiv-Reveal/Guard, Rechtschreib-Sprache
- register_mcp_server schreibt .claude.json nur bei fehlendem/abweichendem Eintrag (claudes Live-State nicht unnötig ueberschreiben). - Content-Editor im Panel (Rohtext-Textarea): Cmd/Ctrl+Enter speichert via panel_set, Esc verwirft; eingehende Updates werden waehrend der Bearbeitung gepuffert (Button "geaendert"), Speichern gewinnt. - Archivieren zeigt die Datei danach im Dateimanager (reveal_path_cmd, cfg pro OS). Breadth-Guard: Archiv-Ordner darf kein Home-Vorfahre sein, muss absolut sein; expand_home loest bare ~ auf. - Rechtschreibpruefung: Default in settings.json (spellcheckLang "de"), pro Text per Selector ueberschreibbar.
This commit is contained in:
+16
-9
@@ -553,6 +553,9 @@ const view = initPanelView({
|
||||
modeBtn: document.getElementById("panel-mode")!,
|
||||
titleEl: panel.querySelector(".panel-title") as HTMLElement,
|
||||
editBtn: document.getElementById("panel-title-edit")!,
|
||||
editContentBtn: document.getElementById("panel-content-edit")!,
|
||||
langSelect: document.getElementById("panel-lang") as HTMLSelectElement,
|
||||
defaultLang: await invoke<string>("spellcheck_lang"),
|
||||
onCommit: (text) => invoke("panel_set", { project, text }),
|
||||
});
|
||||
|
||||
@@ -583,6 +586,11 @@ await listen("panel-attached", () => {
|
||||
detached = false;
|
||||
if (hasContent) showPanel();
|
||||
});
|
||||
// Abgelöstes Fenster geschlossen (per ✕ oder OS): angedocktes Panel bleibt
|
||||
// ausgeblendet, aber der nächste Entwurf darf es wieder einblenden.
|
||||
await listen("panel-window-closed", () => {
|
||||
detached = false;
|
||||
});
|
||||
|
||||
document
|
||||
.getElementById("panel-detach")!
|
||||
@@ -591,8 +599,11 @@ document.getElementById("panel-hide")!.addEventListener("click", hidePanel);
|
||||
|
||||
// Archivieren: konfigurierten Ordner nehmen, sonst per Dialog wählen (setzt ihn).
|
||||
const archiveBtn = document.getElementById("panel-archive")!;
|
||||
function flashBtn(btn: HTMLElement, cls: string) {
|
||||
btn.classList.add(cls);
|
||||
setTimeout(() => btn.classList.remove(cls), 1400);
|
||||
}
|
||||
archiveBtn.addEventListener("click", async () => {
|
||||
const orig = archiveBtn.textContent;
|
||||
try {
|
||||
const configured = await invoke<string | null>("panel_archive_dir_cmd", {
|
||||
project,
|
||||
@@ -604,17 +615,13 @@ archiveBtn.addEventListener("click", async () => {
|
||||
if (!chosen) return;
|
||||
dir = chosen as string;
|
||||
}
|
||||
await invoke<string>("panel_archive_cmd", { project, dir });
|
||||
archiveBtn.textContent = "Archiviert";
|
||||
archiveBtn.classList.add("copied");
|
||||
const path = await invoke<string>("panel_archive_cmd", { project, dir });
|
||||
flashBtn(archiveBtn, "copied");
|
||||
invoke("reveal_path_cmd", { path });
|
||||
} catch (e) {
|
||||
archiveBtn.textContent = "Fehler";
|
||||
flashBtn(archiveBtn, "error");
|
||||
invoke("term_log", { msg: `archive: ${e}` });
|
||||
}
|
||||
setTimeout(() => {
|
||||
archiveBtn.textContent = orig;
|
||||
archiveBtn.classList.remove("copied");
|
||||
}, 1400);
|
||||
});
|
||||
|
||||
// Splitter: Panelbreite ziehen.
|
||||
|
||||
Reference in New Issue
Block a user