fix: отображение блока процента выполнения даже при отсутствии проектов (v2.7.3)
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 6s

This commit is contained in:
Play Life Bot
2026-01-02 16:29:58 +03:00
parent bf539c6e91
commit 08c5422d35

View File

@@ -3,7 +3,7 @@ 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 : [])
const projectsData = data?.projects || (Array.isArray(data) ? data : []) || []
// Показываем loading только если данных нет и идет загрузка
if (loading && (!data || projectsData.length === 0)) {
@@ -59,16 +59,8 @@ function CurrentWeek({ onProjectClick, data, loading, error, onRetry, allProject
hasProgressData
})
if (!projectsData || projectsData.length === 0) {
return (
<div className="flex justify-center items-center py-16">
<div className="text-gray-500 text-lg">Нет данных для отображения</div>
</div>
)
}
// Получаем отсортированный список всех проектов для синхронизации цветов
const allProjects = getAllProjectsSorted(allProjectsData, projectsData)
const allProjects = getAllProjectsSorted(allProjectsData, projectsData || [])
const normalizePriority = (value) => {
if (value === null || value === undefined) return Infinity
@@ -77,7 +69,7 @@ function CurrentWeek({ onProjectClick, data, loading, error, onRetry, allProject
}
// Сортируем: сначала по priority (1, 2, ...; null в конце), затем по min_goal_score по убыванию
const sortedData = [...projectsData].sort((a, b) => {
const sortedData = (projectsData && projectsData.length > 0) ? [...projectsData].sort((a, b) => {
const priorityA = normalizePriority(a.priority)
const priorityB = normalizePriority(b.priority)
@@ -88,7 +80,7 @@ function CurrentWeek({ onProjectClick, data, loading, error, onRetry, allProject
const minGoalA = parseFloat(a.min_goal_score) || 0
const minGoalB = parseFloat(b.min_goal_score) || 0
return minGoalB - minGoalA
})
}) : []
return (
<div>
@@ -99,10 +91,12 @@ function CurrentWeek({ onProjectClick, data, loading, error, onRetry, allProject
<div className="flex-1">
<div className="text-sm sm:text-base text-gray-600 mb-1">Выполнение целей</div>
<div className="text-2xl sm:text-3xl lg:text-4xl font-bold bg-gradient-to-r from-indigo-600 to-purple-600 bg-clip-text text-transparent">
{hasProgressData ? `${overallProgress.toFixed(1)}%` : 'N/A'}
{hasProgressData && typeof overallProgress === 'number' && Number.isFinite(overallProgress)
? `${overallProgress.toFixed(1)}%`
: 'N/A'}
</div>
</div>
{hasProgressData && (
{hasProgressData && typeof overallProgress === 'number' && Number.isFinite(overallProgress) && (
<div className="w-12 h-12 sm:w-16 sm:h-16 relative flex-shrink-0">
<svg className="transform -rotate-90" viewBox="0 0 64 64">
<circle
@@ -121,7 +115,7 @@ function CurrentWeek({ onProjectClick, data, loading, error, onRetry, allProject
stroke="url(#gradient)"
strokeWidth="6"
fill="none"
strokeDasharray={`${Math.min(overallProgress / 100, 1) * 175.93} 175.93`}
strokeDasharray={`${Math.min(Math.max(overallProgress / 100, 0), 1) * 175.93} 175.93`}
strokeLinecap="round"
/>
{overallProgress >= 100 && (
@@ -178,15 +172,19 @@ function CurrentWeek({ onProjectClick, data, loading, error, onRetry, allProject
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-3">
{sortedData.map((project, index) => {
if (!project || !project.project_name) {
return null
}
const projectColor = getProjectColor(project.project_name, allProjects)
return (
<div key={index}>
<ProjectProgressBar
projectName={project.project_name}
totalScore={parseFloat(project.total_score)}
minGoalScore={parseFloat(project.min_goal_score)}
maxGoalScore={parseFloat(project.max_goal_score)}
totalScore={parseFloat(project.total_score) || 0}
minGoalScore={parseFloat(project.min_goal_score) || 0}
maxGoalScore={parseFloat(project.max_goal_score) || 0}
onProjectClick={onProjectClick}
projectColor={projectColor}
priority={project.priority}