feat: total values in statistics page

This commit is contained in:
2024-11-21 15:40:55 +04:00
parent 8c2cef6f48
commit c81ee2fdb8
3 changed files with 80 additions and 25 deletions

View File

@@ -4,6 +4,8 @@ import PageBlock from "../../../../../../components/PageBlock/PageBlock.tsx";
import { useProfitChart } from "./hooks/useProfitChart.tsx"; import { useProfitChart } from "./hooks/useProfitChart.tsx";
import { Skeleton, Stack } from "@mantine/core"; import { Skeleton, Stack } from "@mantine/core";
import { ProfitChartFiltersModal } from "../../modals/ProfitChartFiltersModal.tsx"; import { ProfitChartFiltersModal } from "../../modals/ProfitChartFiltersModal.tsx";
import { Total } from "../Total/Total.tsx";
import styles from "../../../../ui/StatisticsPage.module.css";
export const ProfitChart = () => { export const ProfitChart = () => {
@@ -26,7 +28,9 @@ export const ProfitChart = () => {
const units = ["₽", "шт"]; const units = ["₽", "шт"];
return ( return (
<PageBlock style={{ flex: 3, minWidth: "600px", padding: "25px" }}> <div className={styles["profit-chart-container"]}>
<Total profitData={profitData} />
<PageBlock style={{ padding: "25px" }}>
<ProfitChartFiltersModal <ProfitChartFiltersModal
form={form} form={form}
/> />
@@ -37,7 +41,7 @@ export const ProfitChart = () => {
<AreaChart <AreaChart
my={"sm"} my={"sm"}
w={"98%"} w={"98%"}
h={"39vh"} h={"34vh"}
data={profitData} data={profitData}
dataKey="date" dataKey="date"
unit={units[idx]} unit={units[idx]}
@@ -51,5 +55,6 @@ export const ProfitChart = () => {
</Stack> </Stack>
</Skeleton> </Skeleton>
</PageBlock> </PageBlock>
</div>
); );
}; };

View File

@@ -0,0 +1,40 @@
import { Center, Divider, Group, Text } from "@mantine/core";
import { ProfitChartDataItem } from "../../../../../../client";
import PageBlock from "../../../../../../components/PageBlock/PageBlock.tsx";
type Props = {
profitData: ProfitChartDataItem[];
};
export const Total = ({ profitData }: Props) => {
const totalProfit = profitData.reduce(
(sum, dataItem) => dataItem.profit + sum,
0,
);
const totalRevenue = profitData.reduce(
(sum, dataItem) => dataItem.revenue + sum,
0,
);
const totalCount = profitData.reduce(
(sum, dataItem) => dataItem.dealsCount + sum,
0,
);
return (
<PageBlock style={{ padding: "25px", height: "7vh", flexGrow: 0 }}>
<Group gap={2} justify={"space-between"}>
<Center w={"30%"}>
<Text>Прибыль: {new Intl.NumberFormat("ru-RU").format(totalProfit)} </Text>
</Center>
<Divider size={"md"} orientation="vertical" />
<Center w={"30%"}>
<Text>Выручка: {new Intl.NumberFormat("ru-RU").format(totalRevenue)} </Text>
</Center>
<Divider size={"md"} orientation="vertical" />
<Center w={"30%"}>
<Text>Сделок: {new Intl.NumberFormat("ru-RU").format(totalCount)} шт</Text>
</Center>
</Group>
</PageBlock>
);
};

View File

@@ -13,6 +13,16 @@
flex-wrap: wrap; flex-wrap: wrap;
} }
.profit-chart-container {
display: flex;
flex-direction: column;
gap: rem(10);
height: 96vh;
flex-wrap: nowrap;
flex: 3;
min-width: 600px;
}
.top-panel { .top-panel {
padding: rem(5); padding: rem(5);
gap: rem(10); gap: rem(10);