Files
HKSingleParty/03_source/frontend/src/sections/overview/booking/booking-statistics.tsx
louiscklaw b7cd25b614 build ok,
2025-06-15 11:28:24 +08:00

87 lines
2.3 KiB
TypeScript

import type { CardProps } from '@mui/material/Card';
import Card from '@mui/material/Card';
import CardHeader from '@mui/material/CardHeader';
import { alpha as hexAlpha, useTheme } from '@mui/material/styles';
import { useCallback, useState } from 'react';
import type { ChartOptions } from 'src/components/chart';
import { Chart, ChartLegends, ChartSelect, useChart } from 'src/components/chart';
import { fShortenNumber } from 'src/utils/format-number';
// ----------------------------------------------------------------------
type Props = CardProps & {
title?: string;
subheader?: string;
chart: {
colors?: string[];
series: {
name: string;
categories: string[];
data: {
name: string;
data: number[];
}[];
}[];
options?: ChartOptions;
};
};
export function BookingStatistics({ title, subheader, chart, sx, ...other }: Props) {
const theme = useTheme();
const [selectedSeries, setSelectedSeries] = useState('Yearly');
const currentSeries = chart.series.find((i) => i.name === selectedSeries);
const chartColors = [theme.palette.primary.dark, hexAlpha(theme.palette.error.main, 0.48)];
const chartOptions = useChart({
colors: chartColors,
stroke: { width: 2, colors: ['transparent'] },
xaxis: { categories: currentSeries?.categories },
tooltip: { y: { formatter: (value: number) => `${value}` } },
...chart.options,
});
const handleChangeSeries = useCallback((newValue: string) => {
setSelectedSeries(newValue);
}, []);
return (
<Card sx={sx} {...other}>
<CardHeader
title={title}
subheader={subheader}
action={
<ChartSelect
options={chart.series.map((item) => item.name)}
value={selectedSeries}
onChange={handleChangeSeries}
/>
}
sx={{ mb: 3 }}
/>
<ChartLegends
colors={chartOptions?.colors}
labels={chart.series[0].data.map((item) => item.name)}
values={[fShortenNumber(6789), fShortenNumber(1234)]}
sx={{ px: 3, gap: 3 }}
/>
<Chart
type="bar"
series={currentSeries?.data}
options={chartOptions}
slotProps={{ loading: { p: 2.5 } }}
sx={{
pl: 1,
py: 2.5,
pr: 2.5,
height: 320,
}}
/>
</Card>
);
}