Dashboard zaehlt Einzelstuecke mit; Baum-Dropdown scrollbar

Auswertungen (by_category, expiry_split, stats) iterierten nur Lots. Gegenstaende
mit Menge-je-Lagerort liegen als Lots und tauchten auf – Einzelstuecke liegen
aber als Items und fehlten dadurch komplett (Dashboard zeigte z.B. nur die
Powerbank, nicht Kamera/Kabel). Neuer Helfer _bestand_beitraege deckt beide
Speicherformen ab: jedes Item zaehlt als ein Stueck ohne MHD. Regressionstest
ergaenzt; volle Suite gruen (120).

CategorySelect: Scrollen IM aufklappbaren Menue schloss es, weil jeder Scroll als
Seiten-Scroll gewertet wurde. Jetzt schliesst nur ein Scroll ausserhalb des
Menues; die lange Liste laesst sich scrollen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-26 12:09:25 +02:00
parent f35126cb7b
commit a70a99b387
3 changed files with 75 additions and 19 deletions

View File

@@ -45,18 +45,23 @@ export default function CategorySelect({
if (popRef.current?.contains(e.target)) return;
setOpen(false);
}
function onAway() { setOpen(false); }
function onScroll(e) {
// Scrollen IM Menü (die Liste ist scrollbar) darf es nicht schließen
// nur ein Scrollen der Seite dahinter, weil das fixierte Menü sonst
// verrutschen würde.
if (popRef.current && e.target instanceof Node && popRef.current.contains(e.target)) return;
setOpen(false);
}
function onResize() { setOpen(false); }
function onKey(e) { if (e.key === "Escape") setOpen(false); }
document.addEventListener("mousedown", onDoc);
// Beim Scrollen/Größenwechsel würde das fixierte Menü verrutschen lieber
// schließen.
window.addEventListener("scroll", onAway, true);
window.addEventListener("resize", onAway);
window.addEventListener("scroll", onScroll, true);
window.addEventListener("resize", onResize);
document.addEventListener("keydown", onKey);
return () => {
document.removeEventListener("mousedown", onDoc);
window.removeEventListener("scroll", onAway, true);
window.removeEventListener("resize", onAway);
window.removeEventListener("scroll", onScroll, true);
window.removeEventListener("resize", onResize);
document.removeEventListener("keydown", onKey);
};
}, [open]);