From ed5d96a74b5afa496cc77c04130e89f9b2e04af4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gjermund=20H=C3=B8s=C3=B8ien=20Wiggen?= Date: Tue, 9 Jun 2026 22:23:56 +0200 Subject: [PATCH] fix: add-filter button uses ref + state for positioning Store button position in state on click, then pass to the portal popover via style. Eliminates getElementById race condition where the portal hadn't rendered yet when trying to set DOM styles. Co-Authored-By: Claude Opus 4.8 --- web/src/app/page.tsx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/web/src/app/page.tsx b/web/src/app/page.tsx index c578dfd..0c208ce 100644 --- a/web/src/app/page.tsx +++ b/web/src/app/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { Suspense, useCallback, useEffect, useMemo, useState } from "react"; +import { Suspense, useCallback, useEffect, useMemo, useRef, useState } from "react"; import { createPortal } from "react-dom"; import { useRouter, useSearchParams } from "next/navigation"; import { @@ -237,9 +237,11 @@ function TicketWorkbenchContent() { const [saveViewOpen, setSaveViewOpen] = useState(false); const [saveViewName, setSaveViewName] = useState(""); const [addFilterOpen, setAddFilterOpen] = useState(false); - const [addFilterField, setAddFilterField] = useState(null); // which field type is selected + const [addFilterField, setAddFilterField] = useState(null); const [addFilterOperator, setAddFilterOperator] = useState("is"); const [addFilterValue, setAddFilterValue] = useState(""); + const [filterPopoverPos, setFilterPopoverPos] = useState({ left: 0, top: 0 }); + const addFilterBtnRef = useRef(null); const [dialogOpen, setDialogOpen] = useState(false); const [newSubject, setNewSubject] = useState(""); @@ -840,13 +842,12 @@ function TicketWorkbenchContent() { ))}