From 5b817f53c77bcca61eab0100ead56081b19b801f Mon Sep 17 00:00:00 2001 From: Ujjwaljain16 Date: Sun, 15 Feb 2026 00:57:41 +0530 Subject: [PATCH 1/2] fix(dashboard): ensure dropdown closes when opening modal to restore input keyboard navigation --- .../ModalTrigger/ModalTrigger.test.tsx | 42 +++++++++++++++++++ .../src/components/ModalTrigger/index.tsx | 6 +-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/superset-frontend/packages/superset-ui-core/src/components/ModalTrigger/ModalTrigger.test.tsx b/superset-frontend/packages/superset-ui-core/src/components/ModalTrigger/ModalTrigger.test.tsx index aa61ef85c4d6..1ce006f1304d 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/ModalTrigger/ModalTrigger.test.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/ModalTrigger/ModalTrigger.test.tsx @@ -74,3 +74,45 @@ test('should render a modal after click', async () => { await userEvent.click(screen.getByRole('button')); expect(screen.getByRole('dialog')).toBeInTheDocument(); }); + +test('trigger click should stopPropagation instead of preventDefault', async () => { + render(); + const trigger = screen.getByTestId('span-modal-trigger'); + + const clickEvent = new MouseEvent('click', { + bubbles: true, + cancelable: true, + }); + const stopSpy = jest.spyOn(clickEvent, 'stopPropagation'); + + trigger.dispatchEvent(clickEvent); + + expect(stopSpy).toHaveBeenCalled(); + // preventDefault should NOT be called — it blocks the parent + // dropdown menu from closing, leaving rc-menu's keyboard handler + // active and intercepting arrow/Home/End keys (#37948) + expect(clickEvent.defaultPrevented).toBe(false); +}); + +test('should not block arrow key default behavior inside modal input', async () => { + render( + Trigger} + modalBody={} + />, + ); + + await userEvent.click(screen.getByRole('button')); + expect(screen.getByRole('dialog')).toBeInTheDocument(); + + const input = screen.getByRole('textbox', { name: 'test-input' }); + + // Simulate pressing ArrowLeft — default should NOT be prevented + const arrowEvent = new KeyboardEvent('keydown', { + key: 'ArrowLeft', + bubbles: true, + cancelable: true, + }); + const wasPrevented = !input.dispatchEvent(arrowEvent); + expect(wasPrevented).toBe(false); +}); diff --git a/superset-frontend/packages/superset-ui-core/src/components/ModalTrigger/index.tsx b/superset-frontend/packages/superset-ui-core/src/components/ModalTrigger/index.tsx index 55339f451700..211656bcb536 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/ModalTrigger/index.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/ModalTrigger/index.tsx @@ -54,8 +54,8 @@ export const ModalTrigger = forwardRef( (props: ModalTriggerProps, ref: ModalTriggerRef | null) => { const [showModal, setShowModal] = useState(false); const { - beforeOpen = () => {}, - onExit = () => {}, + beforeOpen = () => { }, + onExit = () => { }, isButton = false, resizable = false, draggable = false, @@ -79,7 +79,7 @@ export const ModalTrigger = forwardRef( }; const open = (e: MouseEvent) => { - e.preventDefault(); + e.stopPropagation(); beforeOpen?.(); setShowModal(true); }; From e21eed09baaa473df6cc252c8952b3f8957ac13f Mon Sep 17 00:00:00 2001 From: Ujjwaljain16 Date: Sun, 15 Feb 2026 09:48:50 +0530 Subject: [PATCH 2/2] style(dashboard): fix pre-commit formatting issues in ModalTrigger/index.tsx --- .../superset-ui-core/src/components/ModalTrigger/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/superset-frontend/packages/superset-ui-core/src/components/ModalTrigger/index.tsx b/superset-frontend/packages/superset-ui-core/src/components/ModalTrigger/index.tsx index 211656bcb536..7a41fab696e4 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/ModalTrigger/index.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/ModalTrigger/index.tsx @@ -54,8 +54,8 @@ export const ModalTrigger = forwardRef( (props: ModalTriggerProps, ref: ModalTriggerRef | null) => { const [showModal, setShowModal] = useState(false); const { - beforeOpen = () => { }, - onExit = () => { }, + beforeOpen = () => {}, + onExit = () => {}, isButton = false, resizable = false, draggable = false,