mirror of
https://github.com/documenso/documenso.git
synced 2026-07-25 17:35:05 +10:00
feat: fetch data for charts
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
// Define interfaces for the data structure
|
||||
type RepoStats = {
|
||||
stars: number;
|
||||
forks: number;
|
||||
mergedPRs: number;
|
||||
openIssues: number;
|
||||
};
|
||||
|
||||
type DataEntry = {
|
||||
[key: string]: RepoStats;
|
||||
};
|
||||
|
||||
type TransformedData = {
|
||||
labels: string[];
|
||||
datasets: {
|
||||
label: string;
|
||||
data: number[];
|
||||
}[];
|
||||
};
|
||||
|
||||
type MonthNames = {
|
||||
[key: string]: string;
|
||||
};
|
||||
|
||||
type MetricKey = keyof RepoStats;
|
||||
|
||||
const FRIENDLY_METRIC_NAMES: { [key in MetricKey]: string } = {
|
||||
stars: 'Stars',
|
||||
forks: 'Forks',
|
||||
mergedPRs: 'Merged PRs',
|
||||
openIssues: 'Open Issues',
|
||||
};
|
||||
|
||||
export function transformRepoStats(data: DataEntry, metric: MetricKey): TransformedData {
|
||||
const sortedEntries = Object.entries(data).sort(([dateA], [dateB]) => {
|
||||
const [yearA, monthA] = dateA.split('-').map(Number);
|
||||
const [yearB, monthB] = dateB.split('-').map(Number);
|
||||
return new Date(yearA, monthA - 1).getTime() - new Date(yearB, monthB - 1).getTime();
|
||||
});
|
||||
|
||||
const monthNames: MonthNames = {
|
||||
'1': 'Jan',
|
||||
'2': 'Feb',
|
||||
'3': 'Mar',
|
||||
'4': 'Apr',
|
||||
'5': 'May',
|
||||
'6': 'Jun',
|
||||
'7': 'Jul',
|
||||
'8': 'Aug',
|
||||
'9': 'Sep',
|
||||
'10': 'Oct',
|
||||
'11': 'Nov',
|
||||
'12': 'Dec',
|
||||
};
|
||||
|
||||
const labels = sortedEntries.map(([date]) => {
|
||||
const [year, month] = date.split('-');
|
||||
const monthIndex = parseInt(month);
|
||||
return `${monthNames[monthIndex.toString()]} ${year}`;
|
||||
});
|
||||
|
||||
return {
|
||||
labels,
|
||||
datasets: [
|
||||
{
|
||||
label: `Total ${FRIENDLY_METRIC_NAMES[metric]}`,
|
||||
data: sortedEntries.map(([_, stats]) => stats[metric]),
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user