@@ -83,10 +115,14 @@ AccordionPanel.propTypes = {
children: PropTypes.node.isRequired,
id: PropTypes.string.isRequired,
renderPanelBody: PropTypes.func.isRequired,
+ defaultExpanded: PropTypes.bool,
+ disabled: PropTypes.bool,
};
AccordionPanel.defaultProps = {
className: 'panel',
+ defaultExpanded: false,
+ disabled: false,
};
AccordionPanel.Header = AccordionHeader;
@@ -94,7 +130,24 @@ AccordionPanel.Header = AccordionHeader;
/**
* Accordion
*/
-const Accordion = ({ className, children }) =>
{children}
;
+const Accordion = ({ className, children }) => {
+ const [activeId, setActiveId] = useState('');
+
+ const onToggle = useCallback((id) => {
+ setActiveId(id);
+ });
+
+ const context = {
+ activeId,
+ setActiveId,
+ onToggle,
+ };
+ return (
+
+ {children}
+
+ );
+};
Accordion.propTypes = {
className: PropTypes.string,
diff --git a/lib/components/molecules/Accordion/Accordion.stories.mdx b/lib/components/molecules/Accordion/Accordion.stories.mdx
index 000c0a547..08f1b5f52 100644
--- a/lib/components/molecules/Accordion/Accordion.stories.mdx
+++ b/lib/components/molecules/Accordion/Accordion.stories.mdx
@@ -1,7 +1,7 @@
import { Meta, Story, Preview, Props } from '@storybook/addon-docs/blocks';
import Para from '../../atoms/Para';
import Heading from '../../atoms/Heading';
-import Accordion, {AccordionVanilla} from '.';
+import Accordion, {AccordionVanilla,AccordionPanel} from '.';
@@ -27,7 +27,7 @@ import Accordion, {AccordionVanilla} from '.';
-
(
The purpose of lorem ipsum is to create a natural looking block of text (sentence,
@@ -51,3 +51,5 @@ import Accordion, {AccordionVanilla} from '.';
+#### Accordion Panel
+
diff --git a/lib/components/molecules/Accordion/Accordion.style.js b/lib/components/molecules/Accordion/Accordion.style.js
index 0d5b2d451..76409f3d8 100644
--- a/lib/components/molecules/Accordion/Accordion.style.js
+++ b/lib/components/molecules/Accordion/Accordion.style.js
@@ -9,6 +9,9 @@ export default css`
summary {
cursor: pointer;
padding: 20px 0;
+ &[disabled] {
+ cursor: not-allowed;
+ }
}
.accordion-panel-content {
display: none;
diff --git a/lib/components/molecules/Accordion/tests/Accordion.test.js b/lib/components/molecules/Accordion/tests/Accordion.test.js
index d1b943216..45a1979f3 100644
--- a/lib/components/molecules/Accordion/tests/Accordion.test.js
+++ b/lib/components/molecules/Accordion/tests/Accordion.test.js
@@ -8,7 +8,13 @@ describe('', () => {
beforeEach(() => {
AccordionComponent = mount(
-
+ test
}>
+
+
+ test 2
}>
+
+
+ test 2
}>
@@ -19,23 +25,38 @@ describe('', () => {
expect(AccordionComponent.exists()).toBe(true);
});
- test('should render ', () => {
- expect(AccordionComponent.find('div').length).toEqual(1);
- });
-
test('should render details', () => {
- expect(AccordionComponent.find('details').length).toEqual(1);
+ expect(AccordionComponent.find('details').length).toEqual(3);
});
test('should render summary', () => {
- expect(AccordionComponent.find('summary').length).toEqual(1);
+ expect(AccordionComponent.find('summary').length).toEqual(3);
+ });
+
+ test('should open the first panel by default', () => {
+ expect(AccordionComponent.find('summary').first().props()).toHaveProperty(
+ 'aria-expanded',
+ true
+ );
+ expect(AccordionComponent.find('summary').at(1).props()).toHaveProperty('aria-expanded', false);
});
test('panel opens on click of header', () => {
- AccordionComponent.find('summary').simulate('click');
- expect(AccordionComponent.find('summary').props()).toHaveProperty('aria-expanded', true);
+ AccordionComponent.find('summary').at(1).simulate('click');
+ expect(AccordionComponent.find('summary').first().props()).toHaveProperty(
+ 'aria-expanded',
+ false
+ );
+ expect(AccordionComponent.find('summary').at(1).props()).toHaveProperty('aria-expanded', true);
});
+ test('should not open the disabled panel', () => {
+ AccordionComponent.find('summary').last().simulate('click');
+ expect(AccordionComponent.find('summary').last().props()).toHaveProperty(
+ 'aria-expanded',
+ false
+ );
+ });
test('should render correctly', () => {
expect(AccordionComponent).toMatchSnapshot();
});
diff --git a/lib/components/molecules/Accordion/tests/__snapshots__/Accordion.test.js.snap b/lib/components/molecules/Accordion/tests/__snapshots__/Accordion.test.js.snap
index a6048452c..1f805adda 100644
--- a/lib/components/molecules/Accordion/tests/__snapshots__/Accordion.test.js.snap
+++ b/lib/components/molecules/Accordion/tests/__snapshots__/Accordion.test.js.snap
@@ -3,34 +3,141 @@
exports[` should render correctly 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+