From 530196ddf729199fa74c018bd009418fa58020e1 Mon Sep 17 00:00:00 2001 From: Jon Kazama Date: Sun, 14 Jun 2026 19:52:16 +0200 Subject: [PATCH] fix(trash): Import-Cap verdraengt keine lokalen Sole-Copies mehr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Beim Trash-Import sortierte combined.sort+slice(-N) rein nach deletedAt: brachte ein Backup neuere Eintraege mit, fielen aeltere LOKALE Eintraege aus dem Cap — und die sind die einzige Kopie der geloeschten Daten (Datenverlust). Jetzt haben lokale Eintraege Vorrang (alle behalten, sind bereits auf TRASH_MAX_ENTRIES gekappt), Importe fuellen nur den Rest mit den neuesten auf. --- src/js/data.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/js/data.js b/src/js/data.js index 8953bfc..9e5d82a 100644 --- a/src/js/data.js +++ b/src/js/data.js @@ -124,12 +124,18 @@ function initDataButtons() { })) .filter(e => e.item !== null); if (validTrash.length > 0) { - // Nach deletedAt aufsteigend sortieren, DANN die neuesten TRASH_MAX_ENTRIES behalten. - // Positionsbasiertes slice(-N) wuerde sonst frische lokale Eintraege verdraengen - // statt der aeltesten — Datenverlust, da ein Trash-Eintrag die einzige Kopie ist. - const combined = [...trash, ...validTrash]; - combined.sort((a, b) => a.deletedAt - b.deletedAt); - trash = combined.slice(-TRASH_MAX_ENTRIES); + // Lokale Eintraege sind die EINZIGE Kopie ihrer geloeschten Daten -> Vorrang. Importierte + // stammen aus einem Backup, das der Nutzer noch besitzt -> nachrangig. Daher: erst ALLE + // lokalen behalten (pushToTrash kappt sie bereits auf TRASH_MAX_ENTRIES), dann mit den + // NEUESTEN importierten bis zur Obergrenze auffuellen. Ein frischer Import verdraengt so + // keine aelteren lokalen Sole-Copies mehr (frueheres sort+slice(-N) konnte das, data-loss). + const room = Math.max(0, TRASH_MAX_ENTRIES - trash.length); + const keptImports = validTrash + .slice() + .sort((a, b) => b.deletedAt - a.deletedAt) // neueste Importe zuerst + .slice(0, room); + // Am Ende nach deletedAt aufsteigend fuer eine stabile Anzeige-Reihenfolge. + trash = [...trash, ...keptImports].sort((a, b) => a.deletedAt - b.deletedAt); await saveTrash(); } }