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.
+
+
+ >
+ )});