import { Clock, Calendar, TrendingUp, Activity, Zap, User } from 'lucide-react' import { memo } from 'react' import type { CompactVariantBlockProps } from '../types' /** * Компактный вариант табеля - оптимизирован для мобильных устройств * * Особенности: * - Минималистичный дизайн * - Оптимизация для мобильных экранов * - Сводная информация в карточках * - Быстрые метрики и индикаторы * - Экономичное использование пространства */ export const CompactVariantBlock = memo(function CompactVariantBlock({ employee, calendarData, stats, utils, selectedMonth, selectedYear, }) { const monthName = utils.getMonthName(selectedMonth) // Группируем дни по неделям для компактного отображения const weeks: number[][] = [] const daysInMonth = utils.getDaysInMonth(selectedMonth, selectedYear) let currentWeek: number[] = [] for (let day = 1; day <= daysInMonth; day++) { currentWeek.push(day) if (currentWeek.length === 7 || day === daysInMonth) { weeks.push([...currentWeek]) currentWeek = [] } } const workingDays = calendarData.filter(d => d.hours > 0) const recentDays = workingDays.slice(-5) // Последние 5 рабочих дней const getStatusIcon = (status: string) => { switch (status) { case 'work': return '💼' case 'remote': return '🏠' case 'business': return '✈️' case 'vacation': return '🏖️' case 'sick': return '🤒' default: return '📅' } } const getEfficiencyColor = (efficiency: number | null) => { if (efficiency === null) return 'text-gray-400' if (efficiency >= 90) return 'text-green-400' if (efficiency >= 70) return 'text-yellow-400' if (efficiency >= 50) return 'text-orange-400' return 'text-red-400' } return (
{/* Шапка профиля */}

📱 {employee.name}

{employee.position}

{monthName} {selectedYear}
{stats.totalHours}ч
{/* Быстрые метрики */}
Время
{stats.totalHours}ч
{stats.workDays} дней
Эффективность
{stats.efficiency}%
{stats.completedTasks} задач
Переработки
{stats.overtime}ч
{stats.weekendWork} выходных
Среднее
{stats.averageHoursPerDay}ч
в день
{/* Мини-календарь */}
Обзор месяца
{weeks.map((week, weekIndex) => (
{week.map(day => { const dayData = calendarData.find(d => d.day === day) const totalHours = dayData ? dayData.hours + dayData.overtime : 0 let intensity = 0 if (totalHours > 0) { intensity = Math.min(totalHours / 10, 1) // Максимум 10 часов = 100% } return (
0 ? 'bg-blue-500 text-white' : 'bg-white/10 text-white/40' } `} style={dayData && totalHours > 0 ? { opacity: 0.3 + intensity * 0.7, backgroundColor: `rgba(59, 130, 246, ${0.3 + intensity * 0.7})`, } : {}} title={dayData ? `День ${day}: ${totalHours}ч` : `День ${day}`} > {day}
) })}
))}
{/* Последние активности */}
Последние дни
{recentDays.map((day, _index) => (
{getStatusIcon(day.status)}
День {day.day}
{day.tasks} задач
{utils.formatHours(day.hours + day.overtime)}
{day.efficiency}%
))}
{/* Краткая статистика */}
Итоги
Отработано дней: {stats.workDays}
Общее время: {stats.totalHours}ч
В среднем за день: {stats.averageHoursPerDay}ч
Переработки: {stats.overtime}ч
Эффективность: {stats.efficiency}%
Проекты: {stats.projects}
{/* Прогресс бар общий */}
Прогресс месяца
{stats.totalHours}ч 160ч
) }) CompactVariantBlock.displayName = 'CompactVariantBlock'