From 227f337476ef93ec30199e8811b336cde480f923 Mon Sep 17 00:00:00 2001 From: himsin Date: Mon, 11 May 2026 09:59:04 +0530 Subject: [PATCH 1/2] Fix view button dropdown not showing iin front. --- src/components/ViewSelector.tsx | 42 ++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/src/components/ViewSelector.tsx b/src/components/ViewSelector.tsx index e19c0d1..71f2d67 100644 --- a/src/components/ViewSelector.tsx +++ b/src/components/ViewSelector.tsx @@ -1,7 +1,7 @@ -import { useState, useRef, useCallback } from 'react' +import { useState, useRef, useCallback, useEffect } from 'react' +import { createPortal } from 'react-dom' import { Save, Trash2, Pencil, Check, X, Eye } from 'lucide-react' import type { CustomView, CustomViewsStorage } from '../types/views' -import { useClickOutside } from '../hooks/useClickOutside' interface ViewSelectorProps { views: CustomViewsStorage @@ -27,13 +27,22 @@ export function ViewSelector({ const [newName, setNewName] = useState('') const [editingId, setEditingId] = useState(null) const [editName, setEditName] = useState('') + const [pos, setPos] = useState<{ top: number; left: number } | null>(null) const ref = useRef(null) + const buttonRef = useRef(null) + const dropdownRef = useRef(null) const closeDropdown = useCallback(() => { setOpen(false) setSaveAsMode(false) setEditingId(null) }, []) - useClickOutside(ref, closeDropdown) + + useEffect(() => { + if (open && buttonRef.current) { + const rect = buttonRef.current.getBoundingClientRect() + setPos({ top: rect.bottom, left: rect.left }) + } + }, [open]) const activeView = views.activeViewId ? views.views.find((v) => v.id === views.activeViewId) : null @@ -64,6 +73,7 @@ export function ViewSelector({ return (
)} - {open && ( -
+ {open && pos && createPortal( + <> +
+
)}
+ , + document.body, )}
) } + From 42ea3705f6df712d8a3b72c894d80219a3279414 Mon Sep 17 00:00:00 2001 From: himsin Date: Wed, 13 May 2026 18:10:33 +0530 Subject: [PATCH 2/2] Replaced useEffect with a handleToggle() function that computes position on click. --- src/components/ViewSelector.tsx | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/components/ViewSelector.tsx b/src/components/ViewSelector.tsx index 71f2d67..65afe7b 100644 --- a/src/components/ViewSelector.tsx +++ b/src/components/ViewSelector.tsx @@ -1,4 +1,4 @@ -import { useState, useRef, useCallback, useEffect } from 'react' +import { useState, useRef, useCallback } from 'react' import { createPortal } from 'react-dom' import { Save, Trash2, Pencil, Check, X, Eye } from 'lucide-react' import type { CustomView, CustomViewsStorage } from '../types/views' @@ -27,22 +27,20 @@ export function ViewSelector({ const [newName, setNewName] = useState('') const [editingId, setEditingId] = useState(null) const [editName, setEditName] = useState('') - const [pos, setPos] = useState<{ top: number; left: number } | null>(null) - const ref = useRef(null) + const [pos, setPos] = useState<{ top: number; right: number } | null>(null) const buttonRef = useRef(null) - const dropdownRef = useRef(null) const closeDropdown = useCallback(() => { setOpen(false) setSaveAsMode(false) setEditingId(null) }, []) - useEffect(() => { - if (open && buttonRef.current) { - const rect = buttonRef.current.getBoundingClientRect() - setPos({ top: rect.bottom, left: rect.left }) - } - }, [open]) + function handleToggle() { + if (open) { setOpen(false); return } + const rect = buttonRef.current?.getBoundingClientRect() + if (rect) setPos({ top: rect.bottom, right: window.innerWidth - rect.right }) + setOpen(true) + } const activeView = views.activeViewId ? views.views.find((v) => v.id === views.activeViewId) : null @@ -71,10 +69,10 @@ export function ViewSelector({ const displayName = activeView?.name ?? 'View' return ( -
+