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..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 @@ -79,7 +79,7 @@ export const ModalTrigger = forwardRef( }; const open = (e: MouseEvent) => { - e.preventDefault(); + e.stopPropagation(); beforeOpen?.(); setShowModal(true); };