import ProjectProgressBar from './ProjectProgressBar' import LoadingError from './LoadingError' import { getAllProjectsSorted, getProjectColor } from '../utils/projectUtils' function CurrentWeek({ onProjectClick, data, loading, error, onRetry, allProjectsData, onNavigate }) { // Обрабатываем данные: может быть объект с projects и total, или просто массив const projectsData = data?.projects || (Array.isArray(data) ? data : []) || [] // Показываем loading только если данных нет и идет загрузка if (loading && (!data || projectsData.length === 0)) { return (
Загрузка...
) } if (error && (!data || projectsData.length === 0)) { return } // Процент выполнения берем только из данных API const overallProgress = (() => { // Проверяем различные возможные названия поля const rawValue = data?.total ?? data?.progress ?? data?.percentage ?? data?.completion ?? data?.goal_progress const parsedValue = rawValue === undefined || rawValue === null ? null : parseFloat(rawValue) if (Number.isFinite(parsedValue) && parsedValue >= 0) { return Math.max(0, parsedValue) // Убрали ограничение на 100, так как может быть больше } return null // null означает, что данные не пришли })() const hasProgressData = overallProgress !== null // Логирование для отладки console.log('CurrentWeek data:', { data, dataTotal: data?.total, dataProgress: data?.progress, dataPercentage: data?.percentage, overallProgress, hasProgressData }) // Получаем отсортированный список всех проектов для синхронизации цветов const allProjects = getAllProjectsSorted(allProjectsData, projectsData || []) const normalizePriority = (value) => { if (value === null || value === undefined) return Infinity const numeric = Number(value) return Number.isFinite(numeric) ? numeric : Infinity } // Сортируем: сначала по priority (1, 2, ...; null в конце), затем по min_goal_score по убыванию const sortedData = (projectsData && projectsData.length > 0) ? [...projectsData].sort((a, b) => { const priorityA = normalizePriority(a.priority) const priorityB = normalizePriority(b.priority) if (priorityA !== priorityB) { return priorityA - priorityB } const minGoalA = parseFloat(a.min_goal_score) || 0 const minGoalB = parseFloat(b.min_goal_score) || 0 return minGoalB - minGoalA }) : [] return (
{/* Информация об общем проценте выполнения целей */}
Выполнение целей
{hasProgressData && typeof overallProgress === 'number' && Number.isFinite(overallProgress) ? `${overallProgress.toFixed(1)}%` : 'N/A'}
{hasProgressData && typeof overallProgress === 'number' && Number.isFinite(overallProgress) && (
{overallProgress >= 100 && ( )}
)}
{onNavigate && (
)}
{sortedData.map((project, index) => { if (!project || !project.project_name) { return null } const projectColor = getProjectColor(project.project_name, allProjects) return (
) })}
) } export default CurrentWeek