diff --git a/web/src/components/CategorySelect.jsx b/web/src/components/CategorySelect.jsx index 470f59b..425c3ec 100644 --- a/web/src/components/CategorySelect.jsx +++ b/web/src/components/CategorySelect.jsx @@ -75,7 +75,13 @@ export default function CategorySelect({ setOpen(false); }; const onKey = (e) => e.key === "Escape" && setOpen(false); - const onScrollResize = () => setOpen(false); + // Beim Scrollen der Seite wandert die Liste weg vom Knopf, deshalb zu. + // Scrollen INNERHALB der Liste ist aber genau das, was man tun will – + // capture=true fing das bisher mit ab und schloss sie sofort wieder. + const onScrollResize = (e) => { + if (e?.target && panelRef.current?.contains(e.target)) return; + setOpen(false); + }; document.addEventListener("mousedown", onDown); document.addEventListener("keydown", onKey); // capture=true: fängt auch das Scrollen innerhalb der Tabelle ab. diff --git a/web/src/components/Modal.jsx b/web/src/components/Modal.jsx index 3e62d6d..fe21e47 100644 --- a/web/src/components/Modal.jsx +++ b/web/src/components/Modal.jsx @@ -1,11 +1,22 @@ +import { useRef } from "react"; + import Icon from "./Icon"; // Einfacher, gestalteter Dialog (nutzt die modal-Klassen der Vorlage). export default function Modal({ title, onClose, children, footer, wide = false }) { + // Nur schliessen, wenn der Klick auch AUF dem Hintergrund begonnen hat. + // Markiert man Text in einem Feld und zieht dabei über den Rand hinaus, + // liegt das Mouseup auf dem Hintergrund; der Klick feuert dann auf dem + // gemeinsamen Elternelement und schloss den Dialog mitten im Markieren. + const startAussen = useRef(false); return (