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:
+23
-5
@@ -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) {
|
||||
return (
|
||||
isPlainObject(entry)
|
||||
&& isPositiveInteger(entry.entryId)
|
||||
&& typeof entry.stackId === 'string'
|
||||
&& 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
|
||||
* beim Laden stets aus der Zahl der ihm tatsaechlich zugeordneten Eintraege
|
||||
* 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
|
||||
* Stapelkennung mehrfach vor, oder ist nextEntryId nicht groesser als jede
|
||||
* 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;
|
||||
|
||||
for (const stack of parsed.stacks) {
|
||||
stack.count = parsed.entries.filter((entry) => entry.stackId === stack.id).length;
|
||||
// Ein Stand aus einer aelteren Fassung ohne stack.codes gilt als
|
||||
// Stapel ohne bekannte Codes, nicht als unstimmiger Zustand.
|
||||
if (!Array.isArray(stack.codes)) stack.codes = [];
|
||||
const stackEntries = parsed.entries.filter((entry) => entry.stackId === stack.id);
|
||||
stack.count = stackEntries.length;
|
||||
// Codemenge aus den Eintraegen ableiten statt dem gesicherten Wert zu
|
||||
// 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;
|
||||
|
||||
Reference in New Issue
Block a user