Skip to content

Commit

Permalink
feat: time to production chart (#6100)
Browse files Browse the repository at this point in the history
  • Loading branch information
kwasniew committed Feb 1, 2024
1 parent 99b8fa2 commit 4e3ab71
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 65 deletions.
12 changes: 12 additions & 0 deletions frontend/src/component/executiveDashboard/ExecutiveDashboard.tsx
Expand Up @@ -15,6 +15,7 @@ import { FlagStats } from './FlagStats/FlagStats';
import { Widget } from './Widget/Widget';
import { FlagsProjectChart } from './FlagsProjectChart/FlagsProjectChart';
import { ProjectHealthChart } from './ProjectHealthChart/ProjectHealthChart';
import { TimeToProductionChart } from './TimeToProductionChart/TimeToProductionChart';

const StyledGrid = styled(Box)(({ theme }) => ({
display: 'grid',
Expand Down Expand Up @@ -138,6 +139,17 @@ export const ExecutiveDashboard: VFC = () => {
}
/>
</Widget>
<Widget
title='Time to production'
order={7}
span={largeChartSpan}
>
<TimeToProductionChart
projectFlagTrends={
executiveDashboardData.projectFlagTrends
}
/>
</Widget>
</StyledGrid>
</>
);
Expand Down
Expand Up @@ -7,6 +7,7 @@ import {
} from 'openapi';
import { LineChart } from '../LineChart/LineChart';
import { getRandomColor } from '../executive-dashboard-utils';
import { useProjectChartData } from '../useProjectChartData';

interface IFlagsProjectChartProps {
projectFlagTrends: ExecutiveSummarySchema['projectFlagTrends'];
Expand All @@ -15,38 +16,7 @@ interface IFlagsProjectChartProps {
export const FlagsProjectChart: VFC<IFlagsProjectChartProps> = ({
projectFlagTrends,
}) => {
const theme = useTheme();
const data = useMemo(() => {
const groupedFlagTrends = projectFlagTrends.reduce<
Record<string, ExecutiveSummarySchemaProjectFlagTrendsItem[]>
>((groups, item) => {
if (!groups[item.project]) {
groups[item.project] = [];
}
groups[item.project].push(item);
return groups;
}, {});

const datasets = Object.entries(groupedFlagTrends).map(
([project, trends]) => {
const color = getRandomColor();
return {
label: project,
data: trends.map((item) => item.total),
borderColor: color,
backgroundColor: color,
fill: true,
};
},
);

const objectKeys = Object.keys(groupedFlagTrends);

return {
labels: groupedFlagTrends[objectKeys[0]].map((item) => item.date),
datasets,
};
}, [theme, projectFlagTrends]);
const data = useProjectChartData(projectFlagTrends, 'total');

return <LineChart data={data} />;
};
Expand Up @@ -7,6 +7,7 @@ import {
} from 'openapi';
import { LineChart } from '../LineChart/LineChart';
import { getRandomColor } from '../executive-dashboard-utils';
import { useProjectChartData } from '../useProjectChartData';

interface IFlagsProjectChartProps {
projectFlagTrends: ExecutiveSummarySchema['projectFlagTrends'];
Expand All @@ -15,39 +16,7 @@ interface IFlagsProjectChartProps {
export const ProjectHealthChart: VFC<IFlagsProjectChartProps> = ({
projectFlagTrends,
}) => {
const theme = useTheme();

const data = useMemo(() => {
const groupedFlagTrends = projectFlagTrends.reduce<
Record<string, ExecutiveSummarySchemaProjectFlagTrendsItem[]>
>((groups, item) => {
if (!groups[item.project]) {
groups[item.project] = [];
}
groups[item.project].push(item);
return groups;
}, {});

const datasets = Object.entries(groupedFlagTrends).map(
([project, trends]) => {
const color = getRandomColor();
return {
label: project,
data: trends.map((item) => item.health || 0),
borderColor: color,
backgroundColor: color,
fill: true,
};
},
);

const objectKeys = Object.keys(groupedFlagTrends);

return {
labels: groupedFlagTrends[objectKeys[0]].map((item) => item.date),
datasets,
};
}, [theme, projectFlagTrends]);
const data = useProjectChartData(projectFlagTrends, 'health');

return <LineChart data={data} />;
};
@@ -0,0 +1,22 @@
import { useMemo, type VFC } from 'react';
import 'chartjs-adapter-date-fns';
import { useTheme } from '@mui/material';
import {
ExecutiveSummarySchema,
ExecutiveSummarySchemaProjectFlagTrendsItem,
} from 'openapi';
import { LineChart } from '../LineChart/LineChart';
import { getRandomColor } from '../executive-dashboard-utils';
import { useProjectChartData } from '../useProjectChartData';

interface IFlagsProjectChartProps {
projectFlagTrends: ExecutiveSummarySchema['projectFlagTrends'];
}

export const TimeToProductionChart: VFC<IFlagsProjectChartProps> = ({
projectFlagTrends,
}) => {
const data = useProjectChartData(projectFlagTrends, 'timeToProduction');

return <LineChart data={data} />;
};
55 changes: 55 additions & 0 deletions frontend/src/component/executiveDashboard/useProjectChartData.ts
@@ -0,0 +1,55 @@
import { useMemo } from 'react';
import {
ExecutiveSummarySchema,
ExecutiveSummarySchemaProjectFlagTrendsItem,
} from '../../openapi';
import { getRandomColor } from './executive-dashboard-utils';
import { useTheme } from '@mui/material';

type ProjectFlagTrends = ExecutiveSummarySchema['projectFlagTrends'];

export const useProjectChartData = (
projectFlagTrends: ProjectFlagTrends,
field: 'timeToProduction' | 'total' | 'health',
) => {
const theme = useTheme();

const data = useMemo(() => {
const groupedFlagTrends = projectFlagTrends.reduce<
Record<string, ExecutiveSummarySchemaProjectFlagTrendsItem[]>
>((groups, item) => {
if (!groups[item.project]) {
groups[item.project] = [];
}
groups[item.project].push(item);
return groups;
}, {});

const datasets = Object.entries(groupedFlagTrends).map(
([project, trends]) => {
const color = getRandomColor();
return {
label: project,
data: trends.map((item) => {
return item[field] || 0;
}),
borderColor: color,
backgroundColor: color,
fill: true,
};
},
);

const objectKeys = Object.keys(groupedFlagTrends);

const firstElementTrends = groupedFlagTrends[objectKeys[0]] || [];
const firstElementsDates = firstElementTrends.map((item) => item.date);

return {
labels: firstElementsDates,
datasets,
};
}, [theme, projectFlagTrends]);

return data;
};

0 comments on commit 4e3ab71

Please sign in to comment.