diff --git a/src/js/state.js b/src/js/state.js index 55c4240..b1c46ce 100644 --- a/src/js/state.js +++ b/src/js/state.js @@ -66,6 +66,28 @@ async function saveTrash() { await Store.set('trash', trash); } +/** + * Legt einen Eintrag in den Papierkorb. Klont das Objekt (structuredClone), + * damit der trash-Eintrag nicht per Referenz an boards[] haengt und nach dem + * Restore-Loop konsistent bleibt. Setzt deletedAt. Erzwingt die harte Obergrenze + * TRASH_MAX_ENTRIES (Quota-Schutz, TRASH-04): bei Ueberlauf fallen die aeltesten + * Eintraege heraus. Speichern uebernimmt der Aufrufer (saveTrash()). + * @param {{ item: Object, type: 'bookmark'|'board', originBoardId: (string|null) }} entry + */ +function pushToTrash({ item, type, originBoardId }) { + trash.push({ + item: structuredClone(item), + type, + originBoardId: originBoardId ?? null, + deletedAt: Date.now() + }); + // Aelteste zuerst kappen, falls die Obergrenze ueberschritten ist. + if (trash.length > TRASH_MAX_ENTRIES) { + trash.sort((a, b) => a.deletedAt - b.deletedAt); + trash = trash.slice(trash.length - TRASH_MAX_ENTRIES); + } +} + // Page-seitiger Wrapper um das DOM-freie ensureInbox() aus quicksave-core.js. // ensureInbox() mutiert das globale boards-Array in-place; wir persistieren nur, // wenn die Inbox neu angelegt wurde, und geben das Inbox-Board-Objekt zurueck