1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-08-13 13:48:59 +02:00

feat: basic flag creation chart

This commit is contained in:
sjaanus 2025-07-24 14:26:40 +03:00
parent 9b375dc9b5
commit 05ead3a562
No known key found for this signature in database
GPG Key ID: 20E007C0248BA7FF

View File

@ -0,0 +1,121 @@
import 'chartjs-adapter-date-fns';
import { type FC, useMemo } from 'react';
import type { InstanceInsightsSchema } from 'openapi';
import { useProjectChartData } from 'component/insights/hooks/useProjectChartData';
import {
fillGradientPrimary,
LineChart,
NotEnoughData,
} from 'component/insights/components/LineChart/LineChart';
import { useTheme } from '@mui/material';
import type { GroupedDataByProject } from 'component/insights/hooks/useGroupedProjectTrends';
import { usePlaceholderData } from 'component/insights/hooks/usePlaceholderData';
interface ICreationArchiveChartProps {
creationArchiveTrends: GroupedDataByProject<
InstanceInsightsSchema['creationArchiveTrends']
>;
isAggregate?: boolean;
isLoading?: boolean;
}
type WeekData = {
archivedFlags: number;
totalCreatedFlags: number;
createdFlags: Record<string, number>;
week: string;
date?: string;
};
export const CreationArchiveChart: FC<ICreationArchiveChartProps> = ({
creationArchiveTrends,
isAggregate,
isLoading,
}) => {
const creationArchiveData = useProjectChartData(creationArchiveTrends);
const theme = useTheme();
const placeholderData = usePlaceholderData();
const aggregateHealthData = useMemo(() => {
const labels: string[] = Array.from(
new Set(
creationArchiveData.datasets.flatMap((d) =>
d.data.map((item) => item.week),
),
),
);
const weeks: WeekData[] = labels
.map((label) => {
return creationArchiveData.datasets
.map((d) => d.data.find((item) => item.week === label))
.reduce(
(acc: WeekData, item: WeekData) => {
if (item) {
acc.archivedFlags += item.archivedFlags || 0;
const createdFlagsSum = item.createdFlags
? Object.values(item.createdFlags).reduce(
(sum: number, count: number) =>
sum + count,
0,
)
: 0;
acc.totalCreatedFlags += createdFlagsSum;
}
if (!acc.date) {
acc.date = item?.date;
}
return acc;
},
{
archivedFlags: 0,
totalCreatedFlags: 0,
week: label,
} as WeekData,
);
})
.sort((a, b) => (a.week > b.week ? 1 : -1));
return {
datasets: [
{
label: 'Number of created flags',
data: weeks,
borderColor: theme.palette.primary.light,
backgroundColor: fillGradientPrimary,
fill: true,
order: 3,
},
],
};
}, [creationArchiveData, theme]);
const aggregateOrProjectData = isAggregate
? aggregateHealthData
: creationArchiveData;
const notEnoughData = useMemo(
() =>
!isLoading &&
!creationArchiveData.datasets.some((d) => d.data.length > 1),
[creationArchiveData, isLoading],
);
const data =
notEnoughData || isLoading ? placeholderData : aggregateOrProjectData;
return (
<LineChart
key={isAggregate ? 'aggregate' : 'project'}
data={data}
overrideOptions={
notEnoughData
? {}
: {
parsing: {
yAxisKey: 'totalCreatedFlags',
xAxisKey: 'date',
},
}
}
cover={notEnoughData ? <NotEnoughData /> : isLoading}
/>
);
};