Skip to content

Commit 538c4c6

Browse files
authored
Fix/3043 accordion summary not working (#3529)
* creating cumb accordion component * Refactor Accordion to use app-components pattern - Created AccordionItem component in app-components for reusability - Updated layout Accordion to use new app-component architecture - Refactored LayoutSetSummaryAccordion to use app-components only - Fixed nested Details structure bug in LayoutSetSummaryAccordion - All existing tests continue to pass
1 parent 8bfcdb3 commit 538c4c6

File tree

5 files changed

+80
-66
lines changed

5 files changed

+80
-66
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
@media print {
2+
.accordion h2 > button {
3+
display: unset !important;
4+
}
5+
6+
.accordion {
7+
break-inside: avoid;
8+
}
9+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import React from 'react';
2+
3+
import { Details } from '@digdir/designsystemet-react';
4+
import cn from 'classnames';
5+
6+
import classes from 'src/app-components/Accordion/AccordionItem.module.css';
7+
8+
interface AccordionProps {
9+
title: React.ReactNode;
10+
children: React.ReactNode;
11+
className?: string;
12+
open?: boolean;
13+
defaultOpen?: boolean;
14+
onToggle?: (isOpen: boolean) => void;
15+
}
16+
17+
export const AccordionItem = ({
18+
title,
19+
children,
20+
className,
21+
open,
22+
defaultOpen = false,
23+
onToggle,
24+
}: AccordionProps): React.JSX.Element => {
25+
const [isOpen, setOpen] = React.useState(defaultOpen);
26+
27+
const isControlled = open !== undefined;
28+
const currentOpen = isControlled ? open : isOpen;
29+
30+
const handleToggle = () => {
31+
const newOpen = !currentOpen;
32+
if (!isControlled) {
33+
setOpen(newOpen);
34+
}
35+
onToggle?.(newOpen);
36+
};
37+
38+
return (
39+
<Details
40+
open={currentOpen}
41+
onToggle={handleToggle}
42+
className={cn(className, classes.accordion)}
43+
>
44+
<Details.Summary>{title}</Details.Summary>
45+
<Details.Content>{children}</Details.Content>
46+
</Details>
47+
);
48+
};

src/layout/Accordion/Accordion.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import React from 'react';
22

33
import { Card } from '@digdir/designsystemet-react';
44

5+
import { AccordionItem as AccordionComponent } from 'src/app-components/Accordion/AccordionItem';
56
import { Flex } from 'src/app-components/Flex/Flex';
67
import { useLanguage } from 'src/features/language/useLanguage';
78
import classes from 'src/layout/Accordion/Accordion.module.css';
8-
import { AccordionItem as AltinnAcordionItem } from 'src/layout/Accordion/AccordionItem';
99
import { useIsInAccordionGroup } from 'src/layout/AccordionGroup/AccordionGroupContext';
1010
import { ComponentStructureWrapper } from 'src/layout/ComponentStructureWrapper';
1111
import { GenericComponent } from 'src/layout/GenericComponent';
@@ -21,11 +21,11 @@ export const Accordion = ({ baseComponentId }: PropsFromGenericComponent<'Accord
2121

2222
const title = langAsString(textResourceBindings?.title ?? '');
2323

24-
const AccordionItem = ({ className }: { className?: string }) => (
25-
<AltinnAcordionItem
24+
const AccordionContent = ({ className }: { className?: string }) => (
25+
<AccordionComponent
2626
title={title}
2727
className={className}
28-
open={openByDefault}
28+
defaultOpen={Boolean(openByDefault)}
2929
>
3030
<Flex
3131
item
@@ -40,16 +40,16 @@ export const Accordion = ({ baseComponentId }: PropsFromGenericComponent<'Accord
4040
/>
4141
))}
4242
</Flex>
43-
</AltinnAcordionItem>
43+
</AccordionComponent>
4444
);
4545

4646
return (
4747
<ComponentStructureWrapper baseComponentId={baseComponentId}>
4848
{renderAsAccordionItem ? (
49-
<AccordionItem className={classes.container} />
49+
<AccordionContent className={classes.container} />
5050
) : (
5151
<Card data-color='neutral'>
52-
<AccordionItem className={classes.container} />
52+
<AccordionContent className={classes.container} />
5353
</Card>
5454
)}
5555
</ComponentStructureWrapper>

src/layout/Accordion/AccordionItem.tsx

Lines changed: 0 additions & 31 deletions
This file was deleted.
Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import React from 'react';
22

3-
import { Details, Label } from '@digdir/designsystemet-react';
4-
3+
import { AccordionItem } from 'src/app-components/Accordion/AccordionItem';
54
import { Flex } from 'src/app-components/Flex/Flex';
65
import { Lang } from 'src/features/language/Lang';
76
import classes from 'src/layout/Summary2/CommonSummaryComponents/LayoutSetSummaryAccordion.module.css';
@@ -14,35 +13,24 @@ type LayoutSetAccordionSummaryProps = {
1413

1514
export function LayoutSetSummaryAccordion({ filteredPages }: LayoutSetAccordionSummaryProps) {
1615
return filteredPages.map((layoutId: string) => (
17-
<Details
16+
<AccordionItem
1817
key={layoutId}
1918
defaultOpen={true}
20-
color='neutral'
2119
className={classes.summaryItem}
20+
title={<Lang id={layoutId} />}
2221
>
23-
<Details>
24-
<Details.Summary>
25-
<Label asChild>
26-
<span>
27-
<Lang id={layoutId} />
28-
</span>
29-
</Label>
30-
</Details.Summary>
31-
<Details.Content>
32-
<Flex
33-
container
34-
spacing={6}
35-
alignItems='flex-start'
36-
>
37-
<EmptyChildrenBoundary>
38-
<PageSummary
39-
pageId={layoutId}
40-
key={layoutId}
41-
/>
42-
</EmptyChildrenBoundary>
43-
</Flex>
44-
</Details.Content>
45-
</Details>
46-
</Details>
22+
<Flex
23+
container
24+
spacing={6}
25+
alignItems='flex-start'
26+
>
27+
<EmptyChildrenBoundary>
28+
<PageSummary
29+
pageId={layoutId}
30+
key={layoutId}
31+
/>
32+
</EmptyChildrenBoundary>
33+
</Flex>
34+
</AccordionItem>
4735
));
4836
}

0 commit comments

Comments
 (0)