From a2bb2f2307f405a6562c72b49624dd7997dc153e Mon Sep 17 00:00:00 2001 From: Christian Vidal Wolf Date: Sat, 25 Apr 2026 09:14:25 +0200 Subject: [PATCH] fix: improve filter popover positioning and reliability across all views --- src/components/ArticleDetails.tsx | 2 ++ src/components/ColumnFilterPopover.tsx | 42 ++++++++++++++++---------- src/components/DimensionsView.tsx | 4 +++ src/components/MatrixView.tsx | 2 ++ src/components/MissingDataView.tsx | 2 ++ src/components/PricingView.tsx | 21 ++++++++++--- src/components/ProductDescriptions.tsx | 2 ++ 7 files changed, 54 insertions(+), 21 deletions(-) diff --git a/src/components/ArticleDetails.tsx b/src/components/ArticleDetails.tsx index 5b085cf..1c49f3a 100644 --- a/src/components/ArticleDetails.tsx +++ b/src/components/ArticleDetails.tsx @@ -265,6 +265,7 @@ export function ArticleDetails({ data, onEdit, rowStatuses }: ArticleDetailsProp )} {openFilter === 'line' && ( setLineFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} @@ -479,6 +481,7 @@ export function DimensionsView({ data, headers, onEdit, onSaveRow, onCaptureStat
{openFilter === 'class' && ( setClassFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} diff --git a/src/components/MatrixView.tsx b/src/components/MatrixView.tsx index ff45c1d..6d08f64 100644 --- a/src/components/MatrixView.tsx +++ b/src/components/MatrixView.tsx @@ -255,6 +255,7 @@ export function MatrixView({ data, headers, rowStatuses }: MatrixViewProps) { )} {openFilter === col && ( setColumnFilters(prev => { diff --git a/src/components/PricingView.tsx b/src/components/PricingView.tsx index 5e2e81e..ac4d7a0 100644 --- a/src/components/PricingView.tsx +++ b/src/components/PricingView.tsx @@ -2067,16 +2067,27 @@ function TextFilterPopover({ value, onChange, onClose, triggerId }: { }) { const [position, setPosition] = useState({ top: 0, left: 0 }); - useEffect(() => { + const updatePosition = useCallback(() => { const trigger = document.getElementById(triggerId); if (trigger) { const rect = trigger.getBoundingClientRect(); setPosition({ top: rect.bottom + window.scrollY + 4, - left: Math.min(rect.left + window.scrollX, window.innerWidth - 300) + left: Math.min(rect.left + window.scrollX, window.innerWidth + window.scrollX - 300) }); } }, [triggerId]); + + useEffect(() => { + updatePosition(); + window.addEventListener('scroll', updatePosition, true); + window.addEventListener('resize', updatePosition); + return () => { + window.removeEventListener('scroll', updatePosition, true); + window.removeEventListener('resize', updatePosition); + }; + }, [updatePosition]); + const addTerm = () => { if (value.terms.length < 5) { onChange({ ...value, terms: [...value.terms, ''] }); @@ -2101,10 +2112,10 @@ function TextFilterPopover({ value, onChange, onClose, triggerId }: { return createPortal(
e.stopPropagation()} > diff --git a/src/components/ProductDescriptions.tsx b/src/components/ProductDescriptions.tsx index 04a738b..d22096d 100644 --- a/src/components/ProductDescriptions.tsx +++ b/src/components/ProductDescriptions.tsx @@ -326,6 +326,7 @@ export function ProductDescriptions({ data, headers, asinColumnIndex, onEdit, ro )}