From ca4c6f98d8396036e5099a5e2c846c804a3c86c1 Mon Sep 17 00:00:00 2001 From: mhoennig Date: Thu, 27 Aug 2026 05:51:41 +0200 Subject: [PATCH] =?UTF-8?q?fix(men=C3=BC):=20mitgelieferte=20Dokumente=20s?= =?UTF-8?q?ind=20nicht=20mehr=20umbenennbar=20(D81-Nachtrag=203)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ihr Name ist Auslieferungsstand: Wiederherstellen stellt ihn mit her, der Neu-laden-Vergleich prüft ihn, und ein umbenanntes, aber unverändertes Beispiel bekäme weiter still neue Fassungen nachgezogen (das Nachziehen hängt an id + Text-Fingerabdruck, nicht am Namen). Kein Stift an mitgelieferten Zeilen; renameDoc() prüft es selbst. Löschen bleibt. Co-Authored-By: Claude Fable 5 --- docs/CHANGELOG.md | 1 + docs/DECISIONS.md | 31 +++++++++++++++++++++++++++++++ docs/examples/werkbaum.werkbaum | 3 ++- frontend/CLAUDE.md | 5 +++++ frontend/src/app.js | 18 ++++++++++++------ 5 files changed, 51 insertions(+), 7 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 0dc0b5a..cefd6b2 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -19,6 +19,7 @@ reverse. ## 2026-08-27 +- Shipped documents are no longer renamable — their name is part of the delivered state, and a renamed but unedited example would still silently receive new versions - Fix: sharing from an instance without its own backend (GitHub Pages) failed with HTTP 405 — the share button now probes the default address and asks for the server instead ## 2026-08-26 diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index 01485a0..880db2c 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -7053,3 +7053,34 @@ steht da, und Löschen fragt nach); Wiederherstellen wirkt nur noch über den `restoreDoc()` prüft das selbst (`d.id !== activeId` → nichts), statt sich auf den Aufrufer zu verlassen. Der D81-Haupttext oben beschreibt insoweit den Zwischenstand von einem Tag. + +**Nachtrag 3 — mitgelieferte Dokumente sind nicht mehr umbenennbar.** +Nutzer-Einwand samt Verdacht, das Umbenennen mache „Probleme beim Neuladen". +Die Prüfung ergab: Es bricht nichts — und genau das ist das Problem. Das +Nachziehen neuer Fassungen (D27) hängt an **id und Text-Fingerabdruck**, der +Name spielt keine Rolle: Ein umbenanntes, aber textlich unverändertes +Beispiel bekäme beim nächsten Laden weiter still die neue Fassung — ein +Dokument, das der Nutzer per Umbenennung gedanklich zu seinem gemacht hat, +tauschte ohne Vorwarnung den Inhalt. Dazu zwei Merkwürdigkeiten derselben +Wurzel: Bloßes Umbenennen aktivierte den Neu-laden-Knopf (der Vergleich +prüft Text UND Name), und Wiederherstellen setzte den Namen kommentarlos mit +zurück; und die Menü-Gruppe „Mitgeliefert" zeigte einen fremden Namen, denn +die Gruppierung läuft über die id. + +**Entschieden: kein Stift an mitgelieferten Zeilen**, und `renameDoc()` +prüft es selbst statt sich auf das ausgeblendete Symbol zu verlassen. Der +Name gehört bei mitgelieferten Dokumenten zum **Auslieferungsstand** — er +wird beim Wiederherstellen mitgestellt und beim Vergleich mitgeprüft; dann +darf er auch nicht separat editierbar sein. **Löschen bleibt** je Zeile: Das +ist eine andere Aussage („will ich nicht haben"), und das Nachziehen +respektiert sie längst (gelöscht bleibt gelöscht, D27). + +Das ist eine **bewusste Abkehr** von der D22/D27-Linie „Dokumentnamen sind +Nutzerdaten, eine Umbenennung bleibt stehen" — für genau diese zwei +Dokumente, deren Name eben keine Nutzerdaten ist, sondern Teil der +Auslieferung. Die Bestandsregeln (Adoption, Namensfix „Werkbank", Umbenennung +überlebt das Nachziehen) bleiben unangetastet: Wer früher umbenannt hat, +behält seinen Namen; nur das UI bietet es nicht mehr an. Wer das Beispiel +als Basis für einen eigenen Plan will, ändert den Text (dann stoppt das +Nachziehen ohnehin) oder legt ein eigenes Dokument an; ein „Duplizieren" im +Menü wäre die saubere Antwort darauf, ist aber ein eigenes Feature. diff --git a/docs/examples/werkbaum.werkbaum b/docs/examples/werkbaum.werkbaum index f721aca..659a0a7 100644 --- a/docs/examples/werkbaum.werkbaum +++ b/docs/examples/werkbaum.werkbaum @@ -532,7 +532,8 @@ #ed.docs.picker The app header reads "Werkbaum > name": the chip opens the menu, grouped by - kind (shipped, yours, sources), with rename and delete on each row. Restore + kind (shipped, yours, sources), with rename and delete on each row (shipped + ones keep their delivered name). Restore lives on the editor title bar's reload button instead, acting only on the open document. The menu scrolls as a whole instead of being cut off on small screens, and on the phone it is reachable from both panes. diff --git a/frontend/CLAUDE.md b/frontend/CLAUDE.md index 35d31aa..3cce4dd 100644 --- a/frontend/CLAUDE.md +++ b/frontend/CLAUDE.md @@ -158,6 +158,11 @@ verworfene Elemente. Quelle sind ES-Module unter `src/`; `index.html` ist der docurl.js, headless getestet) und trägt Umbenennen/Löschen als Symbole **je Zeile** — `renameDoc/deleteDoc` nehmen deshalb eine **id**, nicht das aktive Dokument, und Verwaltungs-Aktionen lassen das Menü offen. + **Mitgelieferte Dokumente sind nicht umbenennbar** (D81-Nachtrag 3): kein + Stift an ihrer Zeile, und `renameDoc()` prüft es selbst — ihr Name ist + Auslieferungsstand (Restore stellt ihn wieder her), und ein umbenanntes, + unverändertes Beispiel bekäme weiter still neue Fassungen (das Nachziehen + hängt an id + Text-Fingerabdruck, nicht am Namen). Wiederherstellen gibt es im Menü bewusst **nicht** (D81-Nachtrag 2): Es läuft über den Neu-laden-Knopf der Titelzeile und wirkt nur auf das geöffnete Dokument — `restoreDoc()` prüft das selbst. Die Editor-Titelzeile heißt wieder „Text-Editor" und trägt die diff --git a/frontend/src/app.js b/frontend/src/app.js index 268a6ed..60326c1 100644 --- a/frontend/src/app.js +++ b/frontend/src/app.js @@ -3577,11 +3577,14 @@ const IC_RENAME = '${esc(d.name)}${zusatz}` + `` + - iconBtn('rename', t('docRename'), IC_RENAME) + + (shippedStateOf(d.id) ? '' : iconBtn('rename', t('docRename'), IC_RENAME)) + iconBtn('delete', t('docDelete'), IC_DELETE, ' docdelbtn') + ``; } @@ -4089,6 +4092,9 @@ function finishNewDoc(){ } function renameDoc(id){ if(!docs.some(x => x.id === id)) return; + /* Mitgelieferte nicht (D81-Nachtrag 3): Ihr Name ist Auslieferungsstand. + Die Prüfung liegt hier, nicht nur am ausgeblendeten Stift. */ + if(shippedStateOf(id)) return; renamingId = id; /* Zeilen-Aktion (D81): jedes Dokument, nicht nur das aktive */ renameIsNew = false; renderDocMenu();