Codemenge eines Stapels beim Laden aus den Eintraegen ableiten statt uebernehmen

Ergaenzt src/session.js aus dem vorigen Commit: Da stack.codes jetzt aus
entry.codes abgeleitet wird statt angesammelt zu werden, muss loadSession
denselben Ansatz verfolgen (wie bereits bei stack.count) - sonst wuerde ein
gesicherter, zwischenzeitlich per Umsortieren/Entfernen bereinigter Stand beim
Wiederherstellen einen laengst nicht mehr zutreffenden Code zurueckbringen.
entry.codes ist wie stack.codes optional, ein Stand ohne dieses Feld gilt
weiterhin nicht als unstimmig (Abwaertsvertraeglichkeit bleibt erhalten).
This commit is contained in:
vchuser
2026-07-29 09:22:04 +02:00
parent f948620555
commit 266babc8bf
+23 -5
View File
@@ -48,12 +48,17 @@ function isUsableStack(stack) {
); );
} }
// entry.codes ist wie stack.codes optional: ein Stand aus einer Fassung vor
// dieser Erweiterung kennt das Feld nicht und gilt deshalb nicht als
// unstimmig (siehe isUsableStack). Ist es vorhanden, muss es eine Liste von
// Zeichenketten sein.
function isUsableEntry(entry) { function isUsableEntry(entry) {
return ( return (
isPlainObject(entry) isPlainObject(entry)
&& isPositiveInteger(entry.entryId) && isPositiveInteger(entry.entryId)
&& typeof entry.stackId === 'string' && typeof entry.stackId === 'string'
&& isPlainObject(entry.spec) && isPlainObject(entry.spec)
&& (entry.codes === undefined || isStringArray(entry.codes))
); );
} }
@@ -68,7 +73,14 @@ function isUsableEntry(entry) {
* Der gespeicherte Stapelzaehler (stack.count) wird nie uebernommen, sondern * Der gespeicherte Stapelzaehler (stack.count) wird nie uebernommen, sondern
* beim Laden stets aus der Zahl der ihm tatsaechlich zugeordneten Eintraege * beim Laden stets aus der Zahl der ihm tatsaechlich zugeordneten Eintraege
* neu berechnet - er dient in isUsableStack nur noch dazu, grob kaputten * neu berechnet - er dient in isUsableStack nur noch dazu, grob kaputten
* Inhalt schon an der Typprueung scheitern zu lassen. Zeigt ein Eintrag auf * Inhalt schon an der Typprueung scheitern zu lassen. Genauso wird die
* gespeicherte Codemenge eines Stapels (stack.codes) nie uebernommen, sondern
* aus den Codes seiner tatsaechlich zugeordneten Eintraege (entry.codes) neu
* zusammengesetzt - dieselbe Ableitung, die session.js nach jedem Umsortieren
* oder Entfernen eines Eintrags vornimmt (siehe recomputeStackCodes dort);
* ein zwischenzeitlich per Hand korrigierter, aber vor dieser Erweiterung
* gesicherter Stand wuerde sonst einen laengst nicht mehr zutreffenden Code
* am falschen Stapel wiederherstellen. Zeigt ein Eintrag auf
* eine Stapelkennung, die es nicht gibt, kommt eine Eintragsnummer oder eine * eine Stapelkennung, die es nicht gibt, kommt eine Eintragsnummer oder eine
* Stapelkennung mehrfach vor, oder ist nextEntryId nicht groesser als jede * Stapelkennung mehrfach vor, oder ist nextEntryId nicht groesser als jede
* vorhandene Eintragsnummer, ist der Inhalt in sich unstimmig und wird * vorhandene Eintragsnummer, ist der Inhalt in sich unstimmig und wird
@@ -96,10 +108,16 @@ export function loadSession(store) {
if (entryIds.some((entryId) => entryId >= parsed.nextEntryId)) return null; if (entryIds.some((entryId) => entryId >= parsed.nextEntryId)) return null;
for (const stack of parsed.stacks) { for (const stack of parsed.stacks) {
stack.count = parsed.entries.filter((entry) => entry.stackId === stack.id).length; const stackEntries = parsed.entries.filter((entry) => entry.stackId === stack.id);
// Ein Stand aus einer aelteren Fassung ohne stack.codes gilt als stack.count = stackEntries.length;
// Stapel ohne bekannte Codes, nicht als unstimmiger Zustand. // Codemenge aus den Eintraegen ableiten statt dem gesicherten Wert zu
if (!Array.isArray(stack.codes)) stack.codes = []; // vertrauen (siehe Kommentar oben). Ein Eintrag aus einer Fassung ohne
// entry.codes traegt keine Codes bei, gilt aber nicht als unstimmig.
const codes = new Set();
for (const entry of stackEntries) {
for (const code of entry.codes ?? []) codes.add(code);
}
stack.codes = [...codes];
} }
return parsed; return parsed;