From a01bde914a0e83acf52e3fe797f0281782665a90 Mon Sep 17 00:00:00 2001 From: OlgunR Date: Wed, 10 Dec 2025 15:00:55 +0100 Subject: [PATCH] feat(overview): add file statistics fetching and display in analytics view --- .../charts/analytics-widget-summary.tsx | 21 +++++ .../overview/analytics-widget-summary.tsx | 21 +++++ .../overview/view/overview-analytics-view.tsx | 82 ++++++++++++++++--- .../src/services/file-stats-service.ts | 19 +++++ 4 files changed, 130 insertions(+), 13 deletions(-) create mode 100644 src/client/dd-hub-react/src/services/file-stats-service.ts diff --git a/src/client/dd-hub-react/src/sections/charts/analytics-widget-summary.tsx b/src/client/dd-hub-react/src/sections/charts/analytics-widget-summary.tsx index efecd09..80f099e 100644 --- a/src/client/dd-hub-react/src/sections/charts/analytics-widget-summary.tsx +++ b/src/client/dd-hub-react/src/sections/charts/analytics-widget-summary.tsx @@ -22,6 +22,8 @@ type Props = CardProps & { percent: number; color?: PaletteColorKey; icon: React.ReactNode; + details?: { label: string; value: number }[]; + loading?: boolean; chart: { series: number[]; categories: string[]; @@ -37,6 +39,8 @@ export function AnalyticsWidgetSummary({ chart, percent, color = 'primary', + details, + loading = false, ...other }: Props) { const theme = useTheme(); @@ -114,6 +118,23 @@ export function AnalyticsWidgetSummary({ {title} {fShortenNumber(total)} + + {details?.length ? ( + + {details.map((item) => ( + + {item.label} + + {loading ? '…' : fShortenNumber(item.value)} + + + ))} + + ) : null} {title} {fShortenNumber(total)} + + {details?.length ? ( + + {details.map((item) => ( + + {item.label} + + {loading ? '…' : fShortenNumber(item.value)} + + + ))} + + ) : null} { + const days = ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']; + const today = new Date(); + + const labels = Array.from({ length: 7 }, (_, idx) => { + const d = new Date(today); + d.setDate(today.getDate() - (6 - idx)); + const dayIdx = d.getDay(); + return days[dayIdx]; + }); + + labels[labels.length - 1] = 'Heute'; + return labels; + }, []); + + const baselineFiled = [43, 33, 22, 37, 67, 68]; + const baselineEdited = [51, 70, 47, 67, 40, 37]; + + const visitSeries = [ + { + name: 'Dateien abgelegt', + data: [...baselineFiled, fileStats.filed], + }, + { + name: 'Dateien bearbeitet', + data: [...baselineEdited, fileStats.edited], + }, + ]; + + useEffect(() => { + let active = true; + + fetchFileStatsToday() + .then((data) => { + if (active) setFileStats(data); + }) + .finally(() => { + if (active) setLoadingFiles(false); + }); + + return () => { + active = false; + }; + }, []); + return ( @@ -26,13 +76,19 @@ export function OverviewAnalyticsView() { } + title="Dateien - Heute" + percent={0} + total={fileStats.filed + fileStats.edited} + icon={Dateien} + details={[ + { label: 'Dateien abgelegt', value: fileStats.filed }, + { label: 'Dateien bearbeitet', value: fileStats.edited }, + ]} + loading={loadingFiles} chart={{ - categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug'], - series: [22, 8, 35, 50, 82, 84, 77, 12], + categories: ['Heute'], + series: [fileStats.filed, fileStats.edited], + options: { stroke: { width: 2 } }, }} /> @@ -95,14 +151,14 @@ export function OverviewAnalyticsView() { `${value} Dateien` } }, + }, }} /> diff --git a/src/client/dd-hub-react/src/services/file-stats-service.ts b/src/client/dd-hub-react/src/services/file-stats-service.ts new file mode 100644 index 0000000..08a27ff --- /dev/null +++ b/src/client/dd-hub-react/src/services/file-stats-service.ts @@ -0,0 +1,19 @@ +export type FileStatsToday = { + filed: number; + edited: number; +}; + +export async function fetchFilesAbgelegtToday(): Promise { + // Mock placeholder: returns number of files placed today + return Promise.resolve(5); +} + +export async function fetchFilesBearbeitetToday(): Promise { + // Mock placeholder: returns number of files edited today + return Promise.resolve(20); +} + +export async function fetchFileStatsToday(): Promise { + const [filed, edited] = await Promise.all([fetchFilesAbgelegtToday(), fetchFilesBearbeitetToday()]); + return { filed, edited }; +}