import React from 'react'; import { Menu, MenuContent, MenuList, MenuItem, Divider, DrilldownMenu, Breadcrumb, BreadcrumbItem, BreadcrumbHeading, MenuBreadcrumb, Checkbox, Dropdown, DropdownList, DropdownItem, MenuToggle, MenuToggleElement, Badge } from '@breakaway/preact-core'; import StorageDomainIcon from '@patternfly/react-icons/dist/esm/icons/storage-domain-icon'; import CodeBranchIcon from '@patternfly/react-icons/dist/esm/icons/code-branch-icon'; import LayerGroupIcon from '@patternfly/react-icons/dist/esm/icons/layer-group-icon'; import AngleLeftIcon from '@patternfly/react-icons/dist/esm/icons/angle-left-icon'; import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon'; import CaretDownIcon from '@patternfly/react-icons/dist/esm/icons/caret-down-icon'; export const MenuWithDrilldownBreadcrumbs: React.FunctionComponent = () => { const [menuDrilledIn, setMenuDrilledIn] = React.useState([]); const [drilldownPath, setDrilldownPath] = React.useState([]); const [menuHeights, setMenuHeights] = React.useState({}); const [activeMenu, setActiveMenu] = React.useState('breadcrumbs-rootMenu'); const [breadcrumb, setBreadcrumb] = React.useState(); const [withMaxMenuHeight, setWithMaxMenuHeight] = React.useState(false); const onToggle = (isOpen: boolean, key: string) => { switch (key) { case 'app': setBreadcrumb(appGroupingBreadcrumb(isOpen)); break; case 'label': setBreadcrumb(labelsBreadcrumb(isOpen)); break; case 'pause-app': setBreadcrumb(pauseRolloutsAppGrpBreadcrumb(isOpen)); break; case 'pause-label': setBreadcrumb(pauseRolloutsLabelsBreadcrumb(isOpen)); break; default: break; } }; const onToggleMaxMenuHeight = (checked: boolean) => { setWithMaxMenuHeight(checked); }; const drillOut = ( _event: React.KeyboardEvent | MouseEvent | React.MouseEvent, toMenuId: string, fromPathId: string, breadcrumb: JSX.Element | null ) => { setMenuDrilledIn((prevMenuDrilledIn) => { const indexOfMenuId = prevMenuDrilledIn.indexOf(toMenuId); return prevMenuDrilledIn.slice(0, indexOfMenuId); }); setDrilldownPath((prevDrilldownPath) => { const indexOfMenuIdPath = prevDrilldownPath.indexOf(fromPathId); return prevDrilldownPath.slice(0, indexOfMenuIdPath); }); setActiveMenu(toMenuId); setBreadcrumb(breadcrumb); }; const setHeight = (menuId: string, height: number) => { if (menuHeights[menuId] === undefined || (menuId !== 'breadcrumbs-rootMenu' && menuHeights[menuId] !== height)) { setMenuHeights({ ...menuHeights, [menuId]: height }); } }; const drillIn = ( _event: React.KeyboardEvent | React.MouseEvent, fromMenuId: string, toMenuId: string, pathId: string ) => { setMenuDrilledIn([...menuDrilledIn, fromMenuId]); setDrilldownPath([...drilldownPath, pathId]); setActiveMenu(toMenuId); }; const startRolloutBreadcrumb = ( drillOut(event, 'breadcrumbs-rootMenu', 'group:start_rollout', null)} > Root Start rollout ); const appGroupingBreadcrumb = (isOpen: boolean) => ( drillOut(event, 'breadcrumbs-rootMenu', 'group:start_rollout', null)} > Root onToggle(isOpen, 'app')} toggle={(toggleRef: React.Ref) => ( onToggle(true, 'app')} isExpanded={isOpen} variant="plain"> 1{' '} )} > } onClick={(event: any) => drillOut(event, 'breadcrumbs-drilldownMenuStart', 'group:app_grouping_start', startRolloutBreadcrumb) } > Start rollout Application Grouping ); const labelsBreadcrumb = (isOpen: boolean) => ( drillOut(event, 'breadcrumbs-rootMenu', 'group:start_rollout', null)} > Root onToggle(isOpen, 'label')} toggle={(toggleRef: React.Ref) => ( onToggle(true, 'label')} isExpanded={isOpen} variant="plain"> 1{' '} )} > } onClick={(event: any) => drillOut(event, 'breadcrumbs-drilldownMenuStart', 'group:labels_start', startRolloutBreadcrumb) } > Start rollout Labels ); const pauseRolloutsBreadcrumb = ( drillOut(event, 'breadcrumbs-rootMenu', 'group:pause_rollout', null)} > Root Pause rollouts ); const pauseRolloutsAppGrpBreadcrumb = (isOpen: boolean) => ( drillOut(event, 'breadcrumbs-rootMenu', 'group:pause_rollout', null)} > Root onToggle(isOpen, 'pause-app')} toggle={(toggleRef: React.Ref) => ( onToggle(true, 'pause-app')} isExpanded={isOpen} variant="plain"> 1{' '} )} > } onClick={(event: any) => drillOut(event, 'breadcrumbs-drilldownMenuPause', 'group:app_grouping', pauseRolloutsBreadcrumb) } > Pause rollouts Application Grouping ); const pauseRolloutsLabelsBreadcrumb = (isOpen: boolean) => ( drillOut(event, 'breadcrumbs-rootMenu', 'group:pause_rollout', null)} > Root onToggle(isOpen, 'pause-label')} toggle={(toggleRef: React.Ref) => ( onToggle(true, 'pause-label')} isExpanded={isOpen} variant="plain" > 1{' '} )} > } onClick={(event: any) => drillOut(event, 'breadcrumbs-drilldownMenuPause', 'group:labels', pauseRolloutsBreadcrumb) } > Pause rollouts Labels ); const addStorageBreadcrumb = ( drillOut(event, 'breadcrumbs-rootMenu', 'group:storage', null)} > Root Add storage ); return ( <> onToggleMaxMenuHeight(checked)} aria-label="Set max menu height checkbox" id="toggle-max-menu-height" name="toggle-max-menu-height" />
drillOut} onGetMenuHeight={setHeight} isScrollable={withMaxMenuHeight} > {breadcrumb && ( <> {breadcrumb} )} setBreadcrumb(startRolloutBreadcrumb)} drilldownMenu={ setBreadcrumb(appGroupingBreadcrumb(false))} drilldownMenu={ Group A (start rollout) Group B (start rollout) Group C (start rollout) Group D (start rollout) Group E (start rollout) Group F (start rollout) Group G (start rollout) } > Application grouping (start rollout) Count (start rollout) setBreadcrumb(labelsBreadcrumb(false))} drilldownMenu={ Label 1 (start rollout) Label 2 (start rollout) Label 3 (start rollout) } > Labels (start rollout) Annotations (start rollout) } > Start rollout setBreadcrumb(pauseRolloutsBreadcrumb)} drilldownMenu={ setBreadcrumb(pauseRolloutsAppGrpBreadcrumb(false))} drilldownMenu={ Group A (pause rollouts) Group B (pause rollouts) Group C (pause rollouts) } > Application grouping (pause rollouts) Count (pause rollouts) setBreadcrumb(pauseRolloutsLabelsBreadcrumb(false))} drilldownMenu={ Label 1 (pause rollouts) Label 2 (pause rollouts) Label 3 (pause rollouts) } > Labels (pause rollouts) Annotations (pause rollouts) } > Pause rollouts } direction="down" onClick={() => setBreadcrumb(addStorageBreadcrumb)} drilldownMenu={ } itemId="git"> From git } itemId="container"> Container image } itemId="docker"> Docker file } > Add storage Edit Delete deployment config ); };