import { memo, useEffect } from 'react' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { CompactVariantBlock } from './blocks/CompactVariantBlock' import { CosmicVariantBlock } from './blocks/CosmicVariantBlock' import { CustomVariantBlock } from './blocks/CustomVariantBlock' import { GalaxyVariantBlock } from './blocks/GalaxyVariantBlock' import { InteractiveVariantBlock } from './blocks/InteractiveVariantBlock' import { MultiEmployeeVariantBlock } from './blocks/MultiEmployeeVariantBlock' import { useEmployeeManagement } from './hooks/useEmployeeManagement' import { useTimesheetState } from './hooks/useTimesheetState' import { useTimesheetStats } from './hooks/useTimesheetStats' import { useTimesheetUtils } from './hooks/useTimesheetUtils' import type { TimesheetDemoProps, CalendarDay } from './types' /** * Демо-компонент табеля учета времени с модульной архитектурой * * Особенности модульной архитектуры: * - 6 различных вариантов отображения в отдельных блоках * - Переиспользуемые хуки для управления состоянием * - Типизированные пропсы для каждого блока * - React.memo для оптимизации производительности * - Централизованное управление состоянием через кастомные хуки */ export const TimesheetDemo = memo(function TimesheetDemo({ initialVariant = 'galaxy', initialEmployee = 'employee1', showVariantSelector = true, }) { // Хуки для управления состоянием const timesheetState = useTimesheetState() const { employees, selectedEmployee, generateEmployeeCalendarData } = useEmployeeManagement() const { stats } = useTimesheetStats(timesheetState.calendarData, selectedEmployee) const utils = useTimesheetUtils() // Обработчик обновления дня для интерактивного варианта const handleUpdateDay = (day: number, data: CalendarDay) => { const updatedData = timesheetState.calendarData.map(d => d.day === day ? data : d, ) timesheetState.setCalendarData(updatedData) } // Генерация статистики для всех сотрудников для мульти-варианта const employeeStats = employees.reduce((acc, employee) => { const calendarData = generateEmployeeCalendarData( employee.id, timesheetState.selectedMonth, timesheetState.selectedYear, ) const { calculateStats } = useTimesheetStats([], employee) const stats = calculateStats(calendarData, employee) acc[employee.id] = stats return acc }, {} as Record) // Инициализация начальных значений useEffect(() => { timesheetState.setSelectedVariant(initialVariant) timesheetState.setSelectedEmployee(initialEmployee) }, [initialVariant, initialEmployee, timesheetState]) // Генерация календарных данных при изменении сотрудника или месяца useEffect(() => { const calendarData = generateEmployeeCalendarData( timesheetState.selectedEmployee, timesheetState.selectedMonth, timesheetState.selectedYear, ) timesheetState.setCalendarData(calendarData) timesheetState.setEditableCalendarData([...calendarData]) }, [ timesheetState.selectedEmployee, timesheetState.selectedMonth, timesheetState.selectedYear, generateEmployeeCalendarData, timesheetState, ]) return (
{/* Заголовок */}

Табель учета рабочего времени

Демонстрация различных вариантов отображения и взаимодействия

{/* Селектор вариантов */} {showVariantSelector && (
)} {/* Блоки вариантов отображения */}
{timesheetState.selectedVariant === 'galaxy' && selectedEmployee && ( )} {timesheetState.selectedVariant === 'cosmic' && selectedEmployee && ( )} {timesheetState.selectedVariant === 'custom' && selectedEmployee && ( )} {timesheetState.selectedVariant === 'compact' && selectedEmployee && ( )} {timesheetState.selectedVariant === 'interactive' && selectedEmployee && ( )} {timesheetState.selectedVariant === 'multi-employee' && ( )}
{/* Отладочная информация */}
Выбранный вариант: {timesheetState.selectedVariant}
Сотрудник: {timesheetState.selectedEmployee}
Период: {utils.getMonthName(timesheetState.selectedMonth)} {timesheetState.selectedYear}
Календарных данных: {timesheetState.calendarData.length} дней
Статистика: {stats.totalHours}ч / {stats.workDays} рабочих дней / {stats.efficiency}% эффективность
) }) TimesheetDemo.displayName = 'TimesheetDemo'