Files
DigitalData.Hub/src/client/dd-hub-react/src/sections/overview/view/overview-analytics-view.tsx

213 lines
6.8 KiB
TypeScript

import { useMemo, useState, useEffect } from 'react';
import Grid from '@mui/material/Grid';
import Typography from '@mui/material/Typography';
import { DashboardContent } from 'src/layouts/dashboard';
import { _posts, _tasks, _traffic, _timeline } from 'src/_mock';
import { fetchFileStatsToday } from 'src/services/file-stats-service';
import { AnalyticsNews } from '../analytics-news';
import { AnalyticsTasks } from '../analytics-tasks';
import { AnalyticsCurrentVisits } from '../analytics-current-visits';
import { AnalyticsOrderTimeline } from '../analytics-order-timeline';
import { AnalyticsWebsiteVisits } from '../analytics-website-visits';
import { AnalyticsWidgetSummary } from '../analytics-widget-summary';
import { AnalyticsTrafficBySite } from '../analytics-traffic-by-site';
import { AnalyticsCurrentSubject } from '../analytics-current-subject';
import { AnalyticsConversionRates } from '../analytics-conversion-rates';
// ----------------------------------------------------------------------
export function OverviewAnalyticsView() {
const [fileStats, setFileStats] = useState({ filed: 0, edited: 0 });
const [loadingFiles, setLoadingFiles] = useState(true);
const visitCategories = useMemo(() => {
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 (
<DashboardContent maxWidth="xl">
<Typography variant="h4" sx={{ mb: { xs: 3, md: 5 } }}>
Hi, Welcome back 👋
</Typography>
<Grid container spacing={3}>
<Grid size={{ xs: 12, sm: 6, md: 3 }}>
<AnalyticsWidgetSummary
title="Dateien - Heute"
percent={0}
total={fileStats.filed + fileStats.edited}
icon={<img alt="Dateien" src="/assets/icons/glass/ic-glass-bag.svg" />}
details={[
{ label: 'Dateien abgelegt', value: fileStats.filed },
{ label: 'Dateien bearbeitet', value: fileStats.edited },
]}
loading={loadingFiles}
chart={{
categories: ['Heute'],
series: [fileStats.filed, fileStats.edited],
options: { stroke: { width: 2 } },
}}
/>
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 3 }}>
<AnalyticsWidgetSummary
title="New users"
percent={-0.1}
total={1352831}
color="secondary"
icon={<img alt="New users" src="/assets/icons/glass/ic-glass-users.svg" />}
chart={{
categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug'],
series: [56, 47, 40, 62, 73, 30, 23, 54],
}}
/>
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 3 }}>
<AnalyticsWidgetSummary
title="Purchase orders"
percent={2.8}
total={1723315}
color="warning"
icon={<img alt="Purchase orders" src="/assets/icons/glass/ic-glass-buy.svg" />}
chart={{
categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug'],
series: [40, 70, 50, 28, 70, 75, 7, 64],
}}
/>
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 3 }}>
<AnalyticsWidgetSummary
title="Messages"
percent={3.6}
total={234}
color="error"
icon={<img alt="Messages" src="/assets/icons/glass/ic-glass-message.svg" />}
chart={{
categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug'],
series: [56, 30, 23, 54, 47, 40, 62, 73],
}}
/>
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<AnalyticsCurrentVisits
title="Current visits"
chart={{
series: [
{ label: 'America', value: 3500 },
{ label: 'Asia', value: 2500 },
{ label: 'Europe', value: 1500 },
{ label: 'Africa', value: 500 },
],
}}
/>
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 8 }}>
<AnalyticsWebsiteVisits
title="Dateien verarbeitet"
subheader="(+43%) als letzte Woche"
chart={{
categories: visitCategories,
series: visitSeries,
options: {
tooltip: { y: { formatter: (value: number) => `${value} Dateien` } },
},
}}
/>
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 8 }}>
<AnalyticsConversionRates
title="Conversion rates"
subheader="(+43%) than last year"
chart={{
categories: ['Italy', 'Japan', 'China', 'Canada', 'France'],
series: [
{ name: '2022', data: [44, 55, 41, 64, 22] },
{ name: '2023', data: [53, 32, 33, 52, 13] },
],
}}
/>
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<AnalyticsCurrentSubject
title="Current subject"
chart={{
categories: ['English', 'History', 'Physics', 'Geography', 'Chinese', 'Math'],
series: [
{ name: 'Series 1', data: [80, 50, 30, 40, 100, 20] },
{ name: 'Series 2', data: [20, 30, 40, 80, 20, 80] },
{ name: 'Series 3', data: [44, 76, 78, 13, 43, 10] },
],
}}
/>
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 8 }}>
<AnalyticsNews title="News" list={_posts.slice(0, 5)} />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<AnalyticsOrderTimeline title="Order timeline" list={_timeline} />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 4 }}>
<AnalyticsTrafficBySite title="Traffic by site" list={_traffic} />
</Grid>
<Grid size={{ xs: 12, md: 6, lg: 8 }}>
<AnalyticsTasks title="Tasks" list={_tasks} />
</Grid>
</Grid>
</DashboardContent>
);
}