Skip to content

Commit 9a28433

Browse files
authored
Merge pull request #226 from dlabaj/accordion
Accordion update for section support.
2 parents ef2662f + a55da77 commit 9a28433

File tree

6 files changed

+124
-0
lines changed

6 files changed

+124
-0
lines changed

packages/dev/src/quickstarts-data/yaml/openshift-tabbed-copy.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ spec:
3535
```{{copy}}
3636
3737
2. In the main navigation menu, click **Add.**
38+
39+
[This can be an accordion input, followed by another]{{accordion "testing with more text"}}
40+
[This can be an accordion input, followed by another]{{accordion "testing with more some other text"}}
3841
3942
3. Using the project dropdown menu, select the project you would like to
4043
deploy the image in.
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import * as React from 'react';
2+
import {
3+
Accordion,
4+
AccordionItem,
5+
AccordionToggle,
6+
AccordionContent,
7+
} from '@patternfly/react-core';
8+
import { renderToStaticMarkup } from 'react-dom/server';
9+
import { removeTemplateWhitespace } from './utils';
10+
import { ACCORDION_MARKDOWN_BUTTON_ID, ACCORDION_MARKDOWN_CONTENT_ID } from './const';
11+
import './showdown-extension.scss';
12+
13+
const useAccordionShowdownExtension = () => {
14+
return React.useMemo(
15+
() => ({
16+
type: 'lang',
17+
regex: /\[(.+)]{{(accordion) ("(.*?)")}}/g,
18+
replace: (
19+
_text: string,
20+
accordionContent: string,
21+
_command: string,
22+
accordionHeading: string,
23+
): string => {
24+
const accordionId = new String(accordionHeading).replace(/\s/g, '-');
25+
26+
return removeTemplateWhitespace(
27+
renderToStaticMarkup(
28+
<Accordion asDefinitionList>
29+
<AccordionItem>
30+
<AccordionToggle
31+
isExpanded={false}
32+
id={`${ACCORDION_MARKDOWN_BUTTON_ID}-${accordionId}`}
33+
>
34+
{accordionHeading}
35+
</AccordionToggle>
36+
<AccordionContent
37+
id={`${ACCORDION_MARKDOWN_CONTENT_ID}-${accordionId}`}
38+
isHidden={!false}
39+
>
40+
{accordionContent}
41+
</AccordionContent>
42+
</AccordionItem>
43+
</Accordion>,
44+
),
45+
);
46+
},
47+
}),
48+
[],
49+
);
50+
};
51+
52+
export default useAccordionShowdownExtension;
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import * as React from 'react';
2+
import { useEventListener } from '../../hooks';
3+
import { ACCORDION_MARKDOWN_BUTTON_ID, ACCORDION_MARKDOWN_CONTENT_ID } from './const';
4+
5+
type AccordionShowdownComponentProps = {
6+
buttonElement: HTMLElement;
7+
contentElement: HTMLElement;
8+
};
9+
10+
const AccordionShowdownHandler: React.FC<AccordionShowdownComponentProps> = ({
11+
buttonElement,
12+
contentElement,
13+
}) => {
14+
const [expanded, setExpanded] = React.useState<boolean>(false);
15+
16+
const handleClick = () => {
17+
const expandedModifier = 'pf-m-expanded';
18+
19+
buttonElement.className = `pf-c-accordion__toggle ${!expanded ? expandedModifier : ''}`;
20+
contentElement.hidden = expanded;
21+
contentElement.className = `pf-c-accordion__expanded-content ${
22+
!expanded ? expandedModifier : ''
23+
}`;
24+
setExpanded(!expanded);
25+
};
26+
27+
useEventListener(buttonElement, 'click', handleClick);
28+
29+
return <></>;
30+
};
31+
32+
type accordionRenderExtensionProps = {
33+
docContext: HTMLDocument;
34+
};
35+
36+
const AccordionRenderExtension: React.FC<accordionRenderExtensionProps> = ({ docContext }) => {
37+
const buttonElements = docContext.querySelectorAll(`[id ^= ${ACCORDION_MARKDOWN_BUTTON_ID}]`);
38+
const contentElements = docContext.querySelectorAll(`[id ^= ${ACCORDION_MARKDOWN_CONTENT_ID}]`);
39+
40+
return buttonElements.length > 0 ? (
41+
<>
42+
{Array.from(buttonElements).map((elm) => {
43+
const content = Array.from(contentElements).find((elm2) => {
44+
const elmId = elm.id.split(ACCORDION_MARKDOWN_BUTTON_ID)[1];
45+
const elm2Id = elm2.id.split(ACCORDION_MARKDOWN_CONTENT_ID)[1];
46+
return elmId === elm2Id;
47+
});
48+
return (
49+
<AccordionShowdownHandler
50+
key={elm.id.split(ACCORDION_MARKDOWN_BUTTON_ID)[1]}
51+
buttonElement={elm as HTMLElement}
52+
contentElement={content as HTMLElement}
53+
/>
54+
);
55+
})}
56+
</>
57+
) : null;
58+
};
59+
60+
export default AccordionRenderExtension;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
export const MARKDOWN_COPY_BUTTON_ID = 'data-copy-for';
22
export const MARKDOWN_EXECUTE_BUTTON_ID = 'data-execute-for';
33
export const MARKDOWN_SNIPPET_ID = 'data-snippet-id';
4+
export const ACCORDION_MARKDOWN_BUTTON_ID = `accordion-markdown-button-id`;
5+
export const ACCORDION_MARKDOWN_CONTENT_ID = `accordion-markdown-content-id`;

packages/module/src/ConsoleShared/src/components/markdown-extensions/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,5 @@ export { default as useInlineCopyClipboardShowdownExtension } from './inline-cli
33
export { default as useMultilineCopyClipboardShowdownExtension } from './multiline-clipboard-extension';
44
export { default as useAdmonitionShowdownExtension } from './admonition-extension';
55
export { default as useCodeShowdownExtension } from './code-extension';
6+
export { default as useAccordionShowdownExtension } from './accordion-extension';
7+
export { default as AccordionRenderExtension } from './accordion-render-extension';

packages/module/src/QuickStartMarkdownView.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import * as React from 'react';
22
import { SyncMarkdownView } from '@console/internal/components/markdown-view';
33
import {
4+
AccordionRenderExtension,
45
MarkdownCopyClipboard,
56
MarkdownHighlightExtension,
67
useInlineCopyClipboardShowdownExtension,
78
useMultilineCopyClipboardShowdownExtension,
89
useAdmonitionShowdownExtension,
910
useCodeShowdownExtension,
11+
useAccordionShowdownExtension,
1012
} from '@console/shared';
1113
import { HIGHLIGHT_REGEXP } from '@console/shared/src/components/markdown-highlight-extension/highlight-consts';
1214
import { QuickStartContext, QuickStartContextValues } from './utils/quick-start-context';
@@ -29,6 +31,7 @@ const QuickStartMarkdownView: React.FC<QuickStartMarkdownViewProps> = ({
2931
const multilineCopyClipboardShowdownExtension = useMultilineCopyClipboardShowdownExtension();
3032
const admonitionShowdownExtension = useAdmonitionShowdownExtension();
3133
const codeShowdownExtension = useCodeShowdownExtension();
34+
const accordionShowdownExtension = useAccordionShowdownExtension();
3235
return (
3336
<SyncMarkdownView
3437
inline
@@ -57,10 +60,12 @@ const QuickStartMarkdownView: React.FC<QuickStartMarkdownViewProps> = ({
5760
multilineCopyClipboardShowdownExtension,
5861
admonitionShowdownExtension,
5962
codeShowdownExtension,
63+
accordionShowdownExtension,
6064
...(markdown ? markdown.extensions : []),
6165
]}
6266
renderExtension={(docContext, rootSelector) => (
6367
<>
68+
<AccordionRenderExtension docContext={docContext} />
6469
<MarkdownHighlightExtension docContext={docContext} rootSelector={rootSelector} />
6570
<MarkdownCopyClipboard docContext={docContext} rootSelector={rootSelector} />
6671
{markdown &&

0 commit comments

Comments
 (0)