import { Fragment } from 'react'; import { Card, CardBody, CardTitle, Divider, Flex, FlexItem, Gallery, Grid, GridItem, Stack, Icon } from '@patternfly/react-core'; import RhUiCheckCircleFillIcon from '@patternfly/react-icons/dist/js/icons/rh-ui-check-circle-fill-icon'; import RhUiErrorFillIcon from '@patternfly/react-icons/dist/js/icons/rh-ui-error-fill-icon'; import RhUiWarningFillIcon from '@patternfly/react-icons/dist/js/icons/rh-ui-warning-fill-icon'; import cssGridTemplateColumnsMin from '@patternfly/react-tokens/dist/esm/l_gallery_GridTemplateColumns_min'; interface ContentType { icon?: React.ReactNode; count?: number; status?: string; subtitle?: string; } interface CardData { [attribute: string]: { title: string; content: { icon: React.JSX.Element; count?: number; status?: string; subtitle?: string; }[]; layout: string; }[]; } const cardData: CardData = { iconOnly: [ { title: '5 Clusters', content: [ { icon: ( ) } ], layout: 'icon' }, { title: '15 Clusters', content: [ { icon: ( ) } ], layout: 'icon' }, { title: '3 Clusters', content: [ { icon: ( ) } ], layout: 'icon' } ], iconWithCount: [ { title: '10 Hosts', content: [ { icon: ( ), count: 2 }, { icon: ( ), count: 1 } ], layout: 'multiIcon' }, { title: '50 Hosts', content: [ { icon: ( ), count: 5 }, { icon: ( ), count: 12 } ], layout: 'multiIcon' }, { title: '12 Hosts', content: [ { icon: ( ), count: 3 }, { icon: ( ), count: 7 } ], layout: 'multiIcon' } ], withSubtitle: [ { title: '13 Hosts', content: [ { icon: ( ), status: '2 errors', subtitle: 'subtitle' }, { icon: ( ), status: '1 warning', subtitle: 'subtitle' } ], layout: 'withSubtitle' }, { title: '3 Hosts', content: [ { icon: ( ), status: '2 successes', subtitle: 'subtitle' }, { icon: ( ), status: '3 warnings', subtitle: 'subtitle' } ], layout: 'withSubtitle' }, { title: '50 Hosts', content: [ { icon: ( ), status: '7 warnings', subtitle: 'subtitle' }, { icon: ( ), status: '1 error', subtitle: 'subtitle' } ], layout: 'withSubtitle' } ] }; export const CardAggregateStatus: React.FunctionComponent = () => { const renderContent = (content: ContentType[], layout: string) => { if (layout === 'icon') { return content[0].icon; } if (layout === 'multiIcon') { return ( {content.map(({ icon, count }, index: number) => ( {icon} {count} {content.length > 1 && index === 0 && ( )} ))} ); } if (layout === 'withSubtitle') { return ( {content.map(({ icon, status, subtitle }, index: number) => ( {icon} {status} {subtitle} ))} ); } }; return ( {Object.keys(cardData).map((cardGroup, groupIndex) => { let galleryWidth: string = ''; let cardAlign: string; let titleAlign: string; if (cardGroup === 'withSubtitle') { galleryWidth = '260px'; cardAlign = ''; titleAlign = 'center'; } else { cardAlign = 'center'; } return ( {cardData[cardGroup].map(({ title, content, layout }, cardIndex: number) => ( {title} {renderContent(content, layout)} ))} ); })} ); };