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 && (