diff --git a/src/molecules/Dropdown/Dropdown.test.tsx b/src/molecules/Dropdown/Dropdown.test.tsx index f1318722..1c83eb5d 100644 --- a/src/molecules/Dropdown/Dropdown.test.tsx +++ b/src/molecules/Dropdown/Dropdown.test.tsx @@ -6,7 +6,11 @@ import Trigger from './DropdownTrigger'; const OutsideDiv = () => ; -const setup = (flyoutContainer: boolean = true, offsetTop = 0) => +const setup = ( + flyoutContainer: boolean = true, + offsetTop = 0, + keepOpenOnClick = false +) => mountWithTheme( <> @@ -14,6 +18,7 @@ const setup = (flyoutContainer: boolean = true, offsetTop = 0) => flyoutContainer={flyoutContainer} label="I am a dropdown" offset={{ vertical: offsetTop }} + keepOpenOnClick={keepOpenOnClick} > Dropdown Content @@ -63,6 +68,14 @@ describe('', () => { expect(wrapper.find(StyledMenu)).toHaveLength(0); }); + it('does not close on click of dropdown menu', () => { + const wrapper = setup(true, 0, true); + wrapper.find(Trigger).simulate('click'); + expect(wrapper.find(StyledMenu)).toHaveLength(1); + wrapper.find(StyledMenu).simulate('click'); + expect(wrapper.find(StyledMenu)).toHaveLength(1); + }); + it.todo('closes the flyout when clicked outside'); it.todo('closes the flyout when keydown escape'); }); diff --git a/src/molecules/Dropdown/README.md b/src/molecules/Dropdown/README.md index 90e3e309..8ef8f3da 100644 --- a/src/molecules/Dropdown/README.md +++ b/src/molecules/Dropdown/README.md @@ -34,6 +34,7 @@ After adding the import you can use the Dropdown simply like this | keepInViewPort | `Boolean` | | Always keep the dropdown flyout within the viewport | data-qaid | `string` | | Optional prop for testing purposes | id | `string` | | Default HTML id prop to identify the element +| keepOpenOnClick | `Boolean` | | Opt into keeping the dropdown open on click ### Enum diff --git a/src/molecules/Dropdown/__snapshots__/Dropdown.test.tsx.snap b/src/molecules/Dropdown/__snapshots__/Dropdown.test.tsx.snap index 74770c9f..86308868 100644 --- a/src/molecules/Dropdown/__snapshots__/Dropdown.test.tsx.snap +++ b/src/molecules/Dropdown/__snapshots__/Dropdown.test.tsx.snap @@ -177,6 +177,7 @@ exports[` renders correctly 1`] = ` = ({ keepInViewPort, size, 'data-qaid': qaId, - id + id, + keepOpenOnClick = false }) => { const [isOpen, setIsOpen] = useState(false); + const menuRef = useRef(); const ref = useRef(); useDisableScroll(isOpen, disableScrollWhenOpen); - useOutsideClick(ref, () => { - setIsOpen(false); + const getRef = (keepOpenOnClick: boolean) => { + if (keepOpenOnClick) { + return menuRef; + } + return ref; + }; + + useOutsideClick(getRef(keepOpenOnClick), () => { + if (isOpen) { + setIsOpen(false); + } }); let width = '200px'; @@ -82,7 +94,11 @@ const Dropdown: React.SFC = ({ keepInViewPort={keepInViewPort} > {flyoutContainer ? ( - + {children} ) : ( diff --git a/storybook/stories/Dropdown.stories.tsx b/storybook/stories/Dropdown.stories.tsx index 4435aabd..58603793 100644 --- a/storybook/stories/Dropdown.stories.tsx +++ b/storybook/stories/Dropdown.stories.tsx @@ -77,4 +77,24 @@ storiesOf('Dropdown', module)

- )); + )) + .add('Do not close on click of dropdown', () => { + const keepOpenOnClick = boolean('keepOpenOnClick', true); + + return ( + <> +

Do not close on click of dropdown

+ ( + {isOpen ? 'Open' : 'Close'} + )} + keepOpenOnClick={keepOpenOnClick} + > +

+ I am the contents of a dropdown that stays open on click. +

+
+ + )});