From 2d3b99c959187408ca0a034b63e9a5199e6a5664 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 10 Aug 2025 20:06:05 +0300 Subject: [PATCH] fix(react/dialogs): restore focus after modal is dismissed --- apps/client/src/widgets/react/Modal.tsx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/apps/client/src/widgets/react/Modal.tsx b/apps/client/src/widgets/react/Modal.tsx index cfb883172..362d3ab38 100644 --- a/apps/client/src/widgets/react/Modal.tsx +++ b/apps/client/src/widgets/react/Modal.tsx @@ -69,6 +69,7 @@ export default function Modal({ children, className, size, title, header, footer const modalInstanceRef = useRef(); const formRef = _formRef ?? useRef(null); const parentWidget = useContext(ParentComponent); + const elementToFocus = useRef(); if (onShown || onHidden) { useEffect(() => { @@ -79,16 +80,17 @@ export default function Modal({ children, className, size, title, header, footer if (onShown) { modalElement.addEventListener("shown.bs.modal", onShown); } - if (onHidden) { - modalElement.addEventListener("hidden.bs.modal", onHidden); - } + modalElement.addEventListener("hidden.bs.modal", () => { + onHidden(); + if (elementToFocus.current && "focus" in elementToFocus.current) { + (elementToFocus.current as HTMLElement).focus(); + } + }); return () => { if (onShown) { modalElement.removeEventListener("shown.bs.modal", onShown); } - if (onHidden) { - modalElement.removeEventListener("hidden.bs.modal", onHidden); - } + modalElement.removeEventListener("hidden.bs.modal", onHidden); }; }, [ ]); } @@ -98,6 +100,7 @@ export default function Modal({ children, className, size, title, header, footer return; } if (show) { + elementToFocus.current = document.activeElement; openDialog(parentWidget.$widget, !stackable).then(($widget) => { modalInstanceRef.current = BootstrapModal.getOrCreateInstance($widget[0]); })