From 6aeb8878309de15182cdd2d14a1693e9e1bd53f7 Mon Sep 17 00:00:00 2001 From: mkelvers Date: Fri, 5 Jun 2026 16:32:21 +0200 Subject: [PATCH] refactor: scope dedupe to parent container --- static/dedupe.ts | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/static/dedupe.ts b/static/dedupe.ts index 942dad9..320f2b9 100644 --- a/static/dedupe.ts +++ b/static/dedupe.ts @@ -1,26 +1,41 @@ -const dedupe = (): void => { +const dedupeWithin = (root: ParentNode): void => { const seen = new Set(); - const elements = document.querySelectorAll("[data-id]"); + const elements = root.querySelectorAll(":scope > [data-id]"); elements.forEach((item) => { - const id = item.getAttribute("data-id"); + const id = item.dataset.id; if (!id) { return; } + if (seen.has(id)) { - item.remove(); // duplicate, remove it - } else { - seen.add(id); + item.remove(); + return; } + + seen.add(id); + }); +}; + +const dedupe = (): void => { + const containers = new Set(); + const elements = document.querySelectorAll("[data-id]"); + + elements.forEach((item) => { + if (item.parentElement) { + containers.add(item.parentElement); + } + }); + + containers.forEach((container) => { + dedupeWithin(container); }); }; -// run on DOM ready or immediately if already loaded if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", dedupe); } else { dedupe(); } -// also run on load as a fallback (e.g. htmx swaps) window.addEventListener("load", dedupe);