import { groupArrayBy, isDefined, CompOpAggCharacteristics, ComponentOperation, Aggregation, RuleRisk, } from '@aws-c2a/models'; import { List, Paper } from '@material-ui/core'; import { makeStyles } from '@material-ui/core/styles'; import { Error as ErrorIcon, Warning as WarningIcon, Info as InfoIcon, } from '@material-ui/icons'; import React, { useContext, useState } from 'react'; import { AppContext } from '../../App'; import ChangesGroup from '../../reusable-components/ChangesGroup'; import CollapsableRow from '../../reusable-components/CollapsableRow'; const useStyles = makeStyles({ root: { height: '100%', maxHeight: '100%', display: 'flex', flexDirection: 'column', }, }); export default function ChangeTree(): JSX.Element { const classes = useStyles(); const [expanded, setExpanded] = useState(0); const { changeReport } = useContext(AppContext); const aggsPerRisk = groupArrayBy(changeReport.aggregations, (agg) => agg.characteristics.RISK); return ( } expanded={expanded === 0} stretchOnExpand onChange={(e, expand) => expand ? setExpanded(0) : setExpanded(-1)} title="High Risk Changes" content={ { renderAggs((aggsPerRisk.get(RuleRisk.High) ?? [{}])[0].subAggs ?? []) } } color="#EA9B9A" /> } expanded={expanded === 1} stretchOnExpand onChange={(e, expand) => expand ? setExpanded(1) : setExpanded(-1)} title="Unclassified Risk Changes" content={ { renderAggs((aggsPerRisk.get(RuleRisk.Unknown) ?? [{}])[0].subAggs ?? []) } } color="#F5E48E" /> } expanded={expanded === 2} stretchOnExpand onChange={(e, expand) => expand ? setExpanded(2) : setExpanded(-1)} title="Low Risk Changes" content={ { renderAggs((aggsPerRisk.get(RuleRisk.Low) ?? [{}])[0].subAggs ?? []) } } color="#C1DEEC" /> ); } function renderAggs(aggs: Aggregation[]): JSX.Element[] { return aggs.map((agg, i) => sg.characteristics[CompOpAggCharacteristics.OPERATION_TYPE]))] .filter(isDefined).join(', ') } />); }