From 71f189c1d5bce1cfe781e784aec2412405ce9ed7 Mon Sep 17 00:00:00 2001
From: Jessica Tatham
Date: Mon, 25 Jan 2021 18:31:55 -0500
Subject: [PATCH 1/6] linter
---
src/molecules/Dropdown/index.tsx | 25 +++++++++++++++++++-----
storybook/stories/Dropdown.stories.tsx | 27 ++++++++++++++++++++++++--
2 files changed, 45 insertions(+), 7 deletions(-)
diff --git a/src/molecules/Dropdown/index.tsx b/src/molecules/Dropdown/index.tsx
index 5aad581b..ae0a1a16 100644
--- a/src/molecules/Dropdown/index.tsx
+++ b/src/molecules/Dropdown/index.tsx
@@ -1,4 +1,4 @@
-import React, { useState, useRef } from 'react';
+import React, { useState, useRef, useEffect } from 'react';
import styled, { css } from '../../lib/styledComponents';
import Popper, { PopperProps } from '../../atoms/Popper';
@@ -17,6 +17,7 @@ interface DropdownProps extends PopperProps {
disableScrollWhenOpen?: boolean;
'data-qaid'?: string;
id?: string;
+ updatedIsOpen?: boolean;
}
export const StyledMenu = styled(Menu)`
@@ -43,15 +44,25 @@ const Dropdown: React.SFC = ({
keepInViewPort,
size,
'data-qaid': qaId,
- id
+ id,
+ updatedIsOpen
}) => {
const [isOpen, setIsOpen] = useState(false);
+ const menuRef = useRef();
const ref = useRef();
+ useEffect(() => {
+ if (updatedIsOpen === true || updatedIsOpen === false) {
+ setIsOpen(updatedIsOpen);
+ }
+ }, [updatedIsOpen]);
+
useDisableScroll(isOpen, disableScrollWhenOpen);
- useOutsideClick(ref, () => {
- setIsOpen(false);
+ useOutsideClick(menuRef, () => {
+ if (isOpen) {
+ setIsOpen(false);
+ }
});
let width = '200px';
@@ -82,7 +93,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..0edb579d 100644
--- a/storybook/stories/Dropdown.stories.tsx
+++ b/storybook/stories/Dropdown.stories.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, { useState } from 'react';
import { storiesOf } from '@storybook/react';
import { withKnobs, boolean } from '@storybook/addon-knobs';
import {
@@ -77,4 +77,27 @@ storiesOf('Dropdown', module)
>
- ));
+ ))
+ .add('Controled set is open', () => {
+ const [isOpen, setIsOpen] = useState(false);
+ const updateOpen = () => {
+ setIsOpen(!isOpen);
+ }
+ return (
+ <>
+ Controlled Is Open
+ (
+ Dropdown
+ )}
+ updatedIsOpen={isOpen}
+ >
+
+ I am the contents of a dropdown without a flyout container
+
+
+ >
+ )
+ });
From 28cb03fe925b8604840a42df4a4c025c588fc62b Mon Sep 17 00:00:00 2001
From: Jessica Tatham
Date: Mon, 25 Jan 2021 19:14:33 -0500
Subject: [PATCH 2/6] update name of controlled param
---
src/molecules/Dropdown/index.tsx | 12 ++++++------
storybook/stories/Dropdown.stories.tsx | 16 +++++++---------
2 files changed, 13 insertions(+), 15 deletions(-)
diff --git a/src/molecules/Dropdown/index.tsx b/src/molecules/Dropdown/index.tsx
index ae0a1a16..92768b16 100644
--- a/src/molecules/Dropdown/index.tsx
+++ b/src/molecules/Dropdown/index.tsx
@@ -17,7 +17,7 @@ interface DropdownProps extends PopperProps {
disableScrollWhenOpen?: boolean;
'data-qaid'?: string;
id?: string;
- updatedIsOpen?: boolean;
+ controlledIsOpen?: boolean;
}
export const StyledMenu = styled(Menu)`
@@ -45,17 +45,17 @@ const Dropdown: React.SFC = ({
size,
'data-qaid': qaId,
id,
- updatedIsOpen
+ controlledIsOpen
}) => {
- const [isOpen, setIsOpen] = useState(false);
+ const [isOpen, setIsOpen] = useState(controlledIsOpen || false);
const menuRef = useRef();
const ref = useRef();
useEffect(() => {
- if (updatedIsOpen === true || updatedIsOpen === false) {
- setIsOpen(updatedIsOpen);
+ if (controlledIsOpen === true || controlledIsOpen === false) {
+ setIsOpen(controlledIsOpen);
}
- }, [updatedIsOpen]);
+ }, [controlledIsOpen]);
useDisableScroll(isOpen, disableScrollWhenOpen);
diff --git a/storybook/stories/Dropdown.stories.tsx b/storybook/stories/Dropdown.stories.tsx
index 0edb579d..069ec0e9 100644
--- a/storybook/stories/Dropdown.stories.tsx
+++ b/storybook/stories/Dropdown.stories.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import React from 'react';
import { storiesOf } from '@storybook/react';
import { withKnobs, boolean } from '@storybook/addon-knobs';
import {
@@ -79,10 +79,8 @@ storiesOf('Dropdown', module)
>
))
.add('Controled set is open', () => {
- const [isOpen, setIsOpen] = useState(false);
- const updateOpen = () => {
- setIsOpen(!isOpen);
- }
+ const controlledIsOpen = boolean('Controlled isOpen', false);
+
return (
<>
Controlled Is Open
@@ -90,13 +88,13 @@ storiesOf('Dropdown', module)
flyoutContainer={false}
offset={{ vertical: 50 }}
renderLabel={() => (
- Dropdown
+ Dropdown
)}
- updatedIsOpen={isOpen}
+ controlledIsOpen={controlledIsOpen}
>
- I am the contents of a dropdown without a flyout container
-
+ I am the contents of a dropdown that is controlled
+
>
)
From 29dfd7859fbed4c37adfa142e926289531b95274 Mon Sep 17 00:00:00 2001
From: Jessica Tatham
Date: Mon, 25 Jan 2021 19:27:57 -0500
Subject: [PATCH 3/6] linter
---
src/molecules/Dropdown/Dropdown.test.tsx | 12 +++++++++++-
.../Dropdown/__snapshots__/Dropdown.test.tsx.snap | 1 +
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/molecules/Dropdown/Dropdown.test.tsx b/src/molecules/Dropdown/Dropdown.test.tsx
index f1318722..2dd80237 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,
+ controlledIsOpen: boolean = false
+) =>
mountWithTheme(
<>
@@ -14,6 +18,7 @@ const setup = (flyoutContainer: boolean = true, offsetTop = 0) =>
flyoutContainer={flyoutContainer}
label="I am a dropdown"
offset={{ vertical: offsetTop }}
+ controlledIsOpen={controlledIsOpen}
>
Dropdown Content
@@ -63,6 +68,11 @@ describe('', () => {
expect(wrapper.find(StyledMenu)).toHaveLength(0);
});
+ it('renders the dropdown based on controlledIsOpen', () => {
+ const wrapper = setup(true, 0, true);
+ 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/__snapshots__/Dropdown.test.tsx.snap b/src/molecules/Dropdown/__snapshots__/Dropdown.test.tsx.snap
index 74770c9f..ef98ce73 100644
--- a/src/molecules/Dropdown/__snapshots__/Dropdown.test.tsx.snap
+++ b/src/molecules/Dropdown/__snapshots__/Dropdown.test.tsx.snap
@@ -176,6 +176,7 @@ exports[` renders correctly 1`] = `
Date: Mon, 25 Jan 2021 19:31:58 -0500
Subject: [PATCH 4/6] update documentation
---
src/molecules/Dropdown/README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/molecules/Dropdown/README.md b/src/molecules/Dropdown/README.md
index 90e3e309..20fcfc71 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
+| controlledIsOpen | `Boolean` | | Option prop to control whether the dropdown is open or closed
### Enum
From 9b2f7e670def656dc7ad4f4be5dc88cf8e8f54c7 Mon Sep 17 00:00:00 2001
From: Jessica Tatham
Date: Tue, 26 Jan 2021 12:19:24 -0500
Subject: [PATCH 5/6] linter
---
src/molecules/Dropdown/Dropdown.test.tsx | 9 +++--
src/molecules/Dropdown/README.md | 2 +-
.../__snapshots__/Dropdown.test.tsx.snap | 9 ++++-
src/molecules/Dropdown/index.tsx | 23 +++++------
storybook/stories/Dropdown.stories.tsx | 39 +++++++++----------
5 files changed, 45 insertions(+), 37 deletions(-)
diff --git a/src/molecules/Dropdown/Dropdown.test.tsx b/src/molecules/Dropdown/Dropdown.test.tsx
index 2dd80237..1c83eb5d 100644
--- a/src/molecules/Dropdown/Dropdown.test.tsx
+++ b/src/molecules/Dropdown/Dropdown.test.tsx
@@ -9,7 +9,7 @@ const OutsideDiv = () => ;
const setup = (
flyoutContainer: boolean = true,
offsetTop = 0,
- controlledIsOpen: boolean = false
+ keepOpenOnClick = false
) =>
mountWithTheme(
<>
@@ -18,7 +18,7 @@ const setup = (
flyoutContainer={flyoutContainer}
label="I am a dropdown"
offset={{ vertical: offsetTop }}
- controlledIsOpen={controlledIsOpen}
+ keepOpenOnClick={keepOpenOnClick}
>
Dropdown Content
@@ -68,8 +68,11 @@ describe('', () => {
expect(wrapper.find(StyledMenu)).toHaveLength(0);
});
- it('renders the dropdown based on controlledIsOpen', () => {
+ 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);
});
diff --git a/src/molecules/Dropdown/README.md b/src/molecules/Dropdown/README.md
index 20fcfc71..8ef8f3da 100644
--- a/src/molecules/Dropdown/README.md
+++ b/src/molecules/Dropdown/README.md
@@ -34,7 +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
-| controlledIsOpen | `Boolean` | | Option prop to control whether the dropdown is open or closed
+| 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 ef98ce73..a30bf00e 100644
--- a/src/molecules/Dropdown/__snapshots__/Dropdown.test.tsx.snap
+++ b/src/molecules/Dropdown/__snapshots__/Dropdown.test.tsx.snap
@@ -171,13 +171,16 @@ exports[` renders correctly 1`] = `
}
>
-
renders correctly 1`] = `
}
>
I am a dropdown
diff --git a/src/molecules/Dropdown/index.tsx b/src/molecules/Dropdown/index.tsx
index 92768b16..b38c4b10 100644
--- a/src/molecules/Dropdown/index.tsx
+++ b/src/molecules/Dropdown/index.tsx
@@ -1,4 +1,4 @@
-import React, { useState, useRef, useEffect } from 'react';
+import React, { useState, useRef } from 'react';
import styled, { css } from '../../lib/styledComponents';
import Popper, { PopperProps } from '../../atoms/Popper';
@@ -17,7 +17,7 @@ interface DropdownProps extends PopperProps {
disableScrollWhenOpen?: boolean;
'data-qaid'?: string;
id?: string;
- controlledIsOpen?: boolean;
+ keepOpenOnClick?: boolean;
}
export const StyledMenu = styled(Menu)`
@@ -45,21 +45,22 @@ const Dropdown: React.SFC
= ({
size,
'data-qaid': qaId,
id,
- controlledIsOpen
+ keepOpenOnClick = false
}) => {
- const [isOpen, setIsOpen] = useState(controlledIsOpen || false);
+ const [isOpen, setIsOpen] = useState(false);
const menuRef = useRef();
const ref = useRef();
- useEffect(() => {
- if (controlledIsOpen === true || controlledIsOpen === false) {
- setIsOpen(controlledIsOpen);
- }
- }, [controlledIsOpen]);
-
useDisableScroll(isOpen, disableScrollWhenOpen);
- useOutsideClick(menuRef, () => {
+ const getRef = (keepOpenOnClick: boolean) => {
+ if (keepOpenOnClick) {
+ return menuRef;
+ }
+ return ref;
+ };
+
+ useOutsideClick(getRef(keepOpenOnClick), () => {
if (isOpen) {
setIsOpen(false);
}
diff --git a/storybook/stories/Dropdown.stories.tsx b/storybook/stories/Dropdown.stories.tsx
index 069ec0e9..58603793 100644
--- a/storybook/stories/Dropdown.stories.tsx
+++ b/storybook/stories/Dropdown.stories.tsx
@@ -78,24 +78,23 @@ storiesOf('Dropdown', module)
>
))
- .add('Controled set is open', () => {
- const controlledIsOpen = boolean('Controlled isOpen', false);
-
+ .add('Do not close on click of dropdown', () => {
+ const keepOpenOnClick = boolean('keepOpenOnClick', true);
+
return (
- <>
- Controlled Is Open
- (
- Dropdown
- )}
- controlledIsOpen={controlledIsOpen}
- >
-
- I am the contents of a dropdown that is controlled
-
-
- >
- )
- });
+ <>
+ Do not close on click of dropdown
+ (
+ {isOpen ? 'Open' : 'Close'}
+ )}
+ keepOpenOnClick={keepOpenOnClick}
+ >
+
+ I am the contents of a dropdown that stays open on click.
+
+
+ >
+ )});
From dd3eb355d46f515e1b181782f8ad36d7d3a291cf Mon Sep 17 00:00:00 2001
From: Jessica Tatham
Date: Tue, 26 Jan 2021 12:22:59 -0500
Subject: [PATCH 6/6] reveert snapshots
---
.../Dropdown/__snapshots__/Dropdown.test.tsx.snap | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/src/molecules/Dropdown/__snapshots__/Dropdown.test.tsx.snap b/src/molecules/Dropdown/__snapshots__/Dropdown.test.tsx.snap
index a30bf00e..86308868 100644
--- a/src/molecules/Dropdown/__snapshots__/Dropdown.test.tsx.snap
+++ b/src/molecules/Dropdown/__snapshots__/Dropdown.test.tsx.snap
@@ -171,14 +171,11 @@ exports[` renders correctly 1`] = `
}
>
-
+
bla
renders correctly 1`] = `
}
>
I am a dropdown