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={
}
+ 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 };
+}