diff --git a/apps/web/src/app/(pages)/(protected)/review-form/page.tsx b/apps/web/src/app/(pages)/(protected)/review-form/page.tsx index ae74180b..a1d304fe 100644 --- a/apps/web/src/app/(pages)/(protected)/review-form/page.tsx +++ b/apps/web/src/app/(pages)/(protected)/review-form/page.tsx @@ -295,7 +295,7 @@ export default function ReviewForm() {
On the job
-
+

diff --git a/apps/web/src/app/_components/combo-box.tsx b/apps/web/src/app/_components/combo-box.tsx index ca1a46a9..25a36c20 100644 --- a/apps/web/src/app/_components/combo-box.tsx +++ b/apps/web/src/app/_components/combo-box.tsx @@ -110,7 +110,7 @@ export default function ComboBox({
- + ({}); const inputRef = useRef(null); + const containerRef = useRef(null); + const portalDropdownRef = useRef(null); + + useEffect(() => { + if (!open) return; + + const handlePointerDown = (e: PointerEvent) => { + const target = e.target as Node; + if (containerRef.current?.contains(target)) return; + if (portalDropdownRef.current?.contains(target)) return; + setOpen(false); + setSearch(""); + }; + + document.addEventListener("pointerdown", handlePointerDown, true); + return () => + document.removeEventListener("pointerdown", handlePointerDown, true); + }, [open]); const filtered = useMemo(() => { if (!search) return options; @@ -69,7 +87,6 @@ export default function Autocomplete({ if (!open) return; updateDropdownPosition(); const originalOverflow = document.body.style.overflow; - document.body.style.overflow = "hidden"; const handleScrollOrResize = () => updateDropdownPosition(); window.addEventListener("scroll", handleScrollOrResize, true); @@ -105,7 +122,7 @@ export default function Autocomplete({ }; return ( -
+
{ + if (open) { + e.preventDefault(); + setOpen(false); + setSearch(""); + } else if (inputRef.current === document.activeElement) { + setOpen(true); + if (singleSelect && value.length === 1) setSearch(""); + } + }} readOnly={singleSelect && !open && value.length === 1} /> {search || value.length > 0 ? ( @@ -167,43 +194,35 @@ export default function Autocomplete({ !isInMenuContent && typeof document !== "undefined" && createPortal( - <> -
{ - setOpen(false); - setSearch(""); - }} - /> -
-
- {filtered.length === 0 ? ( -
- No results found. -
- ) : ( - filtered.map((option) => { - const isSelected = value.includes(option.value); - return ( - - ); - }) - )} -
+
+
+ {filtered.length === 0 ? ( +
+ No results found. +
+ ) : ( + filtered.map((option) => { + const isSelected = value.includes(option.value); + return ( + + ); + }) + )}
- , +
, document.body, )} {!open && value.length > 0 && !singleSelect && (