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 (