fix: отображение блока процента выполнения даже при отсутствии проектов (v2.7.3)
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 6s
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 6s
This commit is contained in:
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user