diff --git a/packages/documentation-framework/components/sideNav/sideNav.js b/packages/documentation-framework/components/sideNav/sideNav.js index bf224878c7..01c2bdc244 100644 --- a/packages/documentation-framework/components/sideNav/sideNav.js +++ b/packages/documentation-framework/components/sideNav/sideNav.js @@ -4,14 +4,21 @@ import { Label, Nav, NavList, + NavGroup, NavExpandable, PageContextConsumer, capitalize, Flex, - FlexItem + FlexItem, + Divider } from '@patternfly/react-core'; import { css } from '@patternfly/react-styles'; import { Location } from '@reach/router'; + +const DIVIDER_STYLES = { + marginTop: 'var(--pf-t--global--spacer--md)', + marginBottom: 'var(--pf-t--global--spacer--md)' +}; import { makeSlug } from '../../helpers'; import globalBreakpointXl from '@patternfly/react-tokens/dist/esm/t_global_breakpoint_xl'; import { trackEvent } from '../../helpers'; @@ -163,20 +170,76 @@ export const SideNav = ({ groupedRoutes = {}, navItems = [] }) => { } }, []); + const processedItems = React.useMemo(() => { + const result = []; + let currentGroup = null; + let groupItems = []; + + for (let i = 0; i < navItems.length; i++) { + const item = navItems[i]; + + if (item.header) { + if (currentGroup) { + result.push({ type: 'group', title: currentGroup, items: groupItems }); + } + currentGroup = item.header; + groupItems = []; + } else if (item.divider) { + if (currentGroup) { + result.push({ type: 'group', title: currentGroup, items: groupItems }); + currentGroup = null; + groupItems = []; + } + result.push({ type: 'divider', key: item.divider }); + } else { + currentGroup ? groupItems.push(item) : result.push({ type: 'item', ...item }); + } + } + + if (currentGroup) { + result.push({ type: 'group', title: currentGroup, items: groupItems }); + } + + return result; + }, [navItems]); + return ( ); -}; +}; \ No newline at end of file