docs+frontend: Gemeinsam arbeiten in Roadmap und Werkbaum-Plan
- docs/ROADMAP.md: neuer Abschnitt „Gemeinsam an einem Diagramm arbeiten" in drei Stufen — Lesen teilen (?sourceUrl=, vorhanden), asynchron über Git (heute schon möglich, weil der Plan Text ist: git diff/blame sind lesbar; Ausbau = Backend committet jede Änderung), live tippen (Transport ist der kleinere Teil, das Zusammenführen gleichzeitiger Änderungen der eigentliche; Text-CRDT passt wegen D14 ohne eigene Merge-Logik). Notiert auch, warum Git direkt aus dem Browser kein Live-Sync ist (Sync auf Zuruf, CORS-Proxy nötig, Konfliktmarker mitten in der Notation) und was vor einer Entscheidung offen ist (erste Laufzeit-Abhängigkeit, Commit-Granularität, Rechte). - docs/examples/example-werkbaum.werkbaum: passender Zweig „Working together on one plan" (94 Knoten, parst ohne Warnung). Dabei aufgefallen: Das mitgelieferte Dokument wurde nur EINMAL angelegt — die Ergänzung hätte niemanden erreicht, der die Seite schon geöffnet hatte. `werkbaum-seeded` hält deshalb statt '1' den Fingerabdruck (FNV-1a) der ausgelieferten Fassung; bei neuer Fassung wird der Text nachgezogen, aber nur wenn der Nutzer ihn nicht bearbeitet hat. Gelöscht bleibt gelöscht. `resetToDefaults()` setzt den Merker mit. Verifiziert im Browser, vier Fälle: alte unveränderte Fassung wird nachgezogen (98 Zeilen, neuer Zweig da); selbst geänderter Text bleibt unangetastet; gelöschtes Dokument kehrt nicht zurück; frischer Zustand zeigt die neue Fassung (89 sichtbare Knoten, keine Warnung). Vitest 37/37. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
e160015fc7
commit
68abdc6625
+28
-10
@@ -1340,18 +1340,33 @@ function persistDocs(){
|
||||
if(d) localStorage.setItem(LS_SRC, d.text); /* Spiegel für Fallback/Migration */
|
||||
}catch(_){}
|
||||
}
|
||||
/* „Werkbank" (D27) genau EINMAL anlegen — auch für Bestandsnutzer, die schon
|
||||
eine Dokumentenliste haben. Der Merker `LS_SEEDED` sorgt dafür, dass ein
|
||||
bewusst gelöschtes Dokument nicht bei jedem Laden zurückkehrt; ein späterer
|
||||
Ausbau kann dort eine Versionsnummer statt '1' ablegen. */
|
||||
/* Kurzer, stabiler Fingerabdruck (FNV-1a) — dient nur dem Vergleich „ist das
|
||||
noch der ausgelieferte Text?"; keine kryptografische Anforderung. */
|
||||
function fingerprint(s){
|
||||
let h = 0x811c9dc5;
|
||||
for(let i = 0; i < s.length; i++){ h ^= s.charCodeAt(i); h = Math.imul(h, 0x01000193); }
|
||||
return (h >>> 0).toString(36);
|
||||
}
|
||||
|
||||
/* Mitgeliefertes Dokument „Werkbaum" (D27) anlegen bzw. nachziehen. In
|
||||
`LS_SEEDED` steht der Fingerabdruck der zuletzt ausgelieferten Fassung:
|
||||
- kein Merker -> Dokument einmalig anlegen (auch für Bestandsnutzer);
|
||||
- neue Fassung -> Text nur ersetzen, wenn der Nutzer ihn NICHT geändert hat
|
||||
(sein Fingerabdruck also noch dem gemerkten entspricht);
|
||||
- gelöscht -> bleibt gelöscht (der Merker verhindert die Wiederkehr).
|
||||
Der Altwert '1' aus der ersten Fassung sagt nichts über den Textstand, dort
|
||||
wird bewusst nichts angefasst — nur der Merker wird ersetzt. */
|
||||
function seedShippedDocs(){
|
||||
let seeded = null;
|
||||
try{ seeded = localStorage.getItem(LS_SEEDED); }catch(_){}
|
||||
if(seeded) return;
|
||||
if(!docs.some(d => d.id === WERKBAUM_ID)){
|
||||
docs.push({ id: WERKBAUM_ID, name: WERKBAUM_NAME, text: WERKBAUM_DOC });
|
||||
const fp = fingerprint(WERKBAUM_DOC);
|
||||
let seen = null;
|
||||
try{ seen = localStorage.getItem(LS_SEEDED); }catch(_){}
|
||||
const doc = docs.find(d => d.id === WERKBAUM_ID);
|
||||
if(!seen){
|
||||
if(!doc) docs.push({ id: WERKBAUM_ID, name: WERKBAUM_NAME, text: WERKBAUM_DOC });
|
||||
} else if(seen !== '1' && seen !== fp && doc && fingerprint(doc.text) === seen){
|
||||
doc.text = WERKBAUM_DOC;
|
||||
}
|
||||
try{ localStorage.setItem(LS_SEEDED, '1'); }catch(_){}
|
||||
try{ localStorage.setItem(LS_SEEDED, fp); }catch(_){}
|
||||
}
|
||||
|
||||
/* Aus dem localStorage laden; bei fehlender Dokumentenliste den bestehenden
|
||||
@@ -2065,6 +2080,9 @@ function resetToDefaults(){
|
||||
};
|
||||
reseed(EXAMPLE_ID, EXAMPLE_NAME, INITIAL, true);
|
||||
reseed(WERKBAUM_ID, WERKBAUM_NAME, WERKBAUM_DOC, false);
|
||||
/* Merker auf den jetzt ausgelieferten Stand setzen (D27) — sonst hielte ein
|
||||
Altwert die spätere Nachzieh-Logik davon ab, den Text je zu aktualisieren. */
|
||||
try{ localStorage.setItem(LS_SEEDED, fingerprint(WERKBAUM_DOC)); }catch(_){}
|
||||
activeId = EXAMPLE_ID;
|
||||
persistDocs();
|
||||
logUpdate('🔄 Mitgelieferte Dokumente und Einstellungen zurückgesetzt');
|
||||
|
||||
Reference in New Issue
Block a user