2026-05-12 17:58:39 +00:00

100 lines
3.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React from 'react';
import BaseButton from '../BaseButton';
import BaseIcon from '../BaseIcon';
import * as icons from '@mdi/js';
import { useAppDispatch, useAppSelector } from '../../stores/hooks';
import { fetchWidgets, removeWidget } from '../../stores/roles/rolesSlice';
import { WidgetChartType, WidgetType } from "./models/widget.model";
import { BarChart } from "./components/BarChart";
import { PieChart } from "./components/PieChart";
import { AreaChart } from "./components/AreaChart";
import { LineChart } from "./components/LineChart";
export const SmartWidget = ({ widget, userId, admin, roleId }) => {
const dispatch = useAppDispatch();
const corners = useAppSelector((state) => state.style.corners);
const cardsStyle = useAppSelector((state) => state.style.cardsStyle);
const deleteWidget = async () => {
await dispatch(
removeWidget({ id: userId, widgetId: widget.widget_id, roleId }),
);
await dispatch(fetchWidgets(roleId));
};
return (
<div
className={`${
corners !== 'rounded-full' ? corners : 'rounded-3xl'
} dark:bg-dark-900 dark:border-dark-700 p-6 ${cardsStyle} ${
widget.widget_type === 'chart'
? 'col-span-2'
: 'lg:col-span-1 col-span-2'
}`}
>
<div className='flex justify-between flex-col h-full'>
<div className='flex justify-between items-center'>
<div className='text-lg leading-tight text-gray-500 dark:text-dark-600 line-clamp-2'>
{widget.label}
</div>
{admin && (
<BaseButton
icon={icons.mdiClose}
color='whiteDark'
roundedFull
onClick={deleteWidget}
/>
)}
</div>
<div className='flex justify-center items-center h-full'>
<div
className={`${
widget.widget_type === WidgetType.chart ? 'w-5/6 justify-center' : ''
} items-center flex flex-grow justify-center`}
>
{widget.value ? (
widget.widget_type === WidgetType.chart ? (
widget.chart_type === WidgetChartType.bar ? (
<BarChart widget={widget}/>
) : widget.chart_type === WidgetChartType.line ? (
<LineChart widget={widget}/>
) : widget.chart_type === WidgetChartType.pie ? (
<PieChart widget={widget}/>
) : widget.chart_type === WidgetChartType.area ? (
<AreaChart widget={widget}/>
) : widget.chart_type === WidgetChartType.funnel ? (
<AreaChart widget={widget}/>
) : null
) : (
<div className='text-3xl leading-tight font-semibold truncate'>
{widget.value}
</div>
)
) : (
<div className='text-center text-red-400'>
Что-то пошло не так. Попробуйте ещё раз или измените запрос.
</div>
)}
</div>
{widget.type === WidgetType.scalar && widget.mdiIcon && (
<div className='flex justify-end w-1/4'>
<BaseIcon
className='text-blue-500 flex-shrink-0'
w='w-16'
h='h-16'
size={48}
fill={widget.color}
path={icons[widget.mdiIcon]}
/>
</div>
)}
</div>
</div>
</div>
);
};