| import { TaskExecutorElapsed } from '@/interfaces/database/user-setting'; | |
| import { Divider, Flex } from 'antd'; | |
| import { max } from 'lodash'; | |
| import { | |
| Bar, | |
| BarChart, | |
| CartesianGrid, | |
| ResponsiveContainer, | |
| Tooltip, | |
| } from 'recharts'; | |
| import styles from './index.less'; | |
| interface IProps { | |
| data: TaskExecutorElapsed; | |
| } | |
| const getColor = (value: number) => { | |
| if (value > 120) { | |
| return 'red'; | |
| } else if (value <= 120 && value > 50) { | |
| return '#faad14'; | |
| } | |
| return '#52c41a'; | |
| }; | |
| const getMaxLength = (data: TaskExecutorElapsed) => { | |
| const lengths = Object.keys(data).reduce<number[]>((pre, cur) => { | |
| pre.push(data[cur].length); | |
| return pre; | |
| }, []); | |
| return max(lengths) ?? 0; | |
| }; | |
| const fillEmptyElementByMaxLength = (list: any[], maxLength: number) => { | |
| if (list.length === maxLength) { | |
| return list; | |
| } | |
| return list.concat( | |
| new Array(maxLength - list.length).fill({ | |
| value: 0, | |
| actualValue: 0, | |
| fill: getColor(0), | |
| }), | |
| ); | |
| }; | |
| const CustomTooltip = ({ active, payload }: any) => { | |
| if (active && payload && payload.length) { | |
| return ( | |
| <div className="custom-tooltip"> | |
| <p | |
| className={styles.taskBarTooltip} | |
| >{`${payload[0].payload.actualValue}`}</p> | |
| </div> | |
| ); | |
| } | |
| return null; | |
| }; | |
| const TaskBarChat = ({ data }: IProps) => { | |
| const maxLength = getMaxLength(data); | |
| return ( | |
| <Flex gap="middle" vertical> | |
| {Object.keys(data).map((key) => { | |
| const list = data[key].map((x) => ({ | |
| value: x > 120 ? 120 : x, | |
| actualValue: x, | |
| fill: getColor(x), | |
| })); | |
| const nextList = fillEmptyElementByMaxLength(list, maxLength); | |
| return ( | |
| <Flex key={key} className={styles.taskBar} vertical> | |
| <b className={styles.taskBarTitle}>ID: {key}</b> | |
| <ResponsiveContainer> | |
| <BarChart data={nextList} barSize={20}> | |
| <CartesianGrid strokeDasharray="3 3" /> | |
| <Tooltip content={<CustomTooltip></CustomTooltip>} /> | |
| <Bar dataKey="value" /> | |
| </BarChart> | |
| </ResponsiveContainer> | |
| <Divider></Divider> | |
| </Flex> | |
| ); | |
| })} | |
| </Flex> | |
| ); | |
| }; | |
| export default TaskBarChat; | |