From 569b46b3ba3203473e7b60cc1bd687d3c26ab28a Mon Sep 17 00:00:00 2001 From: ugyballoons Date: Fri, 30 Jan 2026 16:13:46 +0000 Subject: [PATCH 1/2] Fix modal styling --- src/js/components/AdminPanels.tsx | 16 +++---- src/js/components/Detector.tsx | 4 +- src/js/components/Modal.tsx | 61 +++++++++++++++++++------ src/js/components/TableFilter.tsx | 1 - src/js/components/TableView.tsx | 10 ++-- src/js/components/componentTypes.ts | 4 ++ src/js/components/contexts/contexts.tsx | 2 + src/js/hooks/useModal.tsx | 12 +++-- src/sass/_modal.sass | 31 ++++++++----- src/sass/style.sass | 5 -- 10 files changed, 96 insertions(+), 50 deletions(-) diff --git a/src/js/components/AdminPanels.tsx b/src/js/components/AdminPanels.tsx index 6c0e9ec8..6ea22ed1 100644 --- a/src/js/components/AdminPanels.tsx +++ b/src/js/components/AdminPanels.tsx @@ -286,14 +286,14 @@ export function AdminSendRedisValue({ e.preventDefault() showModal( { handleSubmit(e) - showModal(null) + showModal(null, null) }} - onCancel={() => showModal(null)} - /> + onCancel={() => showModal(null, null)} + />, + title ) } @@ -419,14 +419,14 @@ export function AdminDangerPanel({ e.preventDefault() showModal( { clearRedis() - showModal(null) + showModal(null, null) }} - onCancel={() => showModal(null)} - /> + onCancel={() => showModal(null, null)} + />, + "Clear Redis" ) } diff --git a/src/js/components/Detector.tsx b/src/js/components/Detector.tsx index e152d498..326ef5dd 100644 --- a/src/js/components/Detector.tsx +++ b/src/js/components/Detector.tsx @@ -118,13 +118,13 @@ const ResetButton = ({ redisKey }: { redisKey: string }) => { const onClick = () => { showModal( { void handleReset() }} onCancel={closeModal} - /> + />, + "Confirm Reset" ) } diff --git a/src/js/components/Modal.tsx b/src/js/components/Modal.tsx index e310b050..988faae2 100644 --- a/src/js/components/Modal.tsx +++ b/src/js/components/Modal.tsx @@ -5,6 +5,7 @@ import { ConfirmationModalProps } from "./componentTypes" export const ModalProvider = ({ children }: { children: React.ReactNode }) => { const [modalContent, setModalContent] = useState(null) + const [modalHeader, setModalHeader] = useState(null) // Create or get modal-root element lazily const getModalRoot = () => { @@ -23,6 +24,7 @@ export const ModalProvider = ({ children }: { children: React.ReactNode }) => { const handleKeyDown = (event: KeyboardEvent) => { if (event.key === "Escape") { setModalContent(null) + setModalHeader(null) } } @@ -32,18 +34,51 @@ export const ModalProvider = ({ children }: { children: React.ReactNode }) => { } }, []) + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + const modalContentElement = document.querySelector( + ".modal-wrapper" + ) as HTMLElement + if ( + modalContentElement && + !modalContentElement.contains(event.target as Node) + ) { + setModalContent(null) + setModalHeader(null) + } + } + + if (modalContent) { + document.addEventListener("mousedown", handleClickOutside) + } else { + document.removeEventListener("mousedown", handleClickOutside) + } + + return () => { + document.removeEventListener("mousedown", handleClickOutside) + } + }, [modalContent]) + return ( - + {children} {modalContent && createPortal(
-
- - {modalContent} +
+
+ {modalHeader &&

{modalHeader}

} + +
+
{modalContent}
, getModalRoot() @@ -53,19 +88,17 @@ export const ModalProvider = ({ children }: { children: React.ReactNode }) => { } export const ConfirmationModal = ({ - title = "Confirmation", message = "Are you sure?", onConfirm = () => {}, onCancel = () => {}, }: ConfirmationModalProps) => { return ( -
-
-

{title}

-
+

{message}

- - +
+ + +
) } diff --git a/src/js/components/TableFilter.tsx b/src/js/components/TableFilter.tsx index 388aebb8..ba059d31 100644 --- a/src/js/components/TableFilter.tsx +++ b/src/js/components/TableFilter.tsx @@ -38,7 +38,6 @@ export function FilterDialog({ return ( <> -

filter on {column}

{!!filterOn.value && (

Currently filtering by: {filterOn.value}

diff --git a/src/js/components/TableView.tsx b/src/js/components/TableView.tsx index e6a0da61..3badca1a 100644 --- a/src/js/components/TableView.tsx +++ b/src/js/components/TableView.tsx @@ -288,6 +288,7 @@ function ChannelHeader({ const handleColumnClick = (event: React.MouseEvent, column: string) => { handleSortClick(event, column, setSortOn) if (!event.shiftKey) { + const header = `Filter on: ${column}` showModal( + />, + header ) } } @@ -437,9 +439,6 @@ function FoldoutCell({ seqNum, columnName, data }: TableFoldoutCellProps) { const handleClick = () => { const content = (
-
-

{`Seq Num: ${seqNum} - ${columnName}`}

-
{Object.entries(data).map( @@ -455,7 +454,8 @@ function FoldoutCell({ seqNum, columnName, data }: TableFoldoutCellProps) {
) - showModal(content) + const header = `Seq Num: ${seqNum} - ${columnName}` + showModal(content, header) } return (