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 }) {
|
function CurrentWeek({ onProjectClick, data, loading, error, onRetry, allProjectsData, onNavigate }) {
|
||||||
// Обрабатываем данные: может быть объект с projects и total, или просто массив
|
// Обрабатываем данные: может быть объект с projects и total, или просто массив
|
||||||
const projectsData = data?.projects || (Array.isArray(data) ? data : [])
|
const projectsData = data?.projects || (Array.isArray(data) ? data : []) || []
|
||||||
|
|
||||||
// Показываем loading только если данных нет и идет загрузка
|
// Показываем loading только если данных нет и идет загрузка
|
||||||
if (loading && (!data || projectsData.length === 0)) {
|
if (loading && (!data || projectsData.length === 0)) {
|
||||||
@@ -59,16 +59,8 @@ function CurrentWeek({ onProjectClick, data, loading, error, onRetry, allProject
|
|||||||
hasProgressData
|
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) => {
|
const normalizePriority = (value) => {
|
||||||
if (value === null || value === undefined) return Infinity
|
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 по убыванию
|
// Сортируем: сначала по 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 priorityA = normalizePriority(a.priority)
|
||||||
const priorityB = normalizePriority(b.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 minGoalA = parseFloat(a.min_goal_score) || 0
|
||||||
const minGoalB = parseFloat(b.min_goal_score) || 0
|
const minGoalB = parseFloat(b.min_goal_score) || 0
|
||||||
return minGoalB - minGoalA
|
return minGoalB - minGoalA
|
||||||
})
|
}) : []
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
@@ -99,10 +91,12 @@ function CurrentWeek({ onProjectClick, data, loading, error, onRetry, allProject
|
|||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<div className="text-sm sm:text-base text-gray-600 mb-1">Выполнение целей</div>
|
<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">
|
<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>
|
||||||
</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">
|
<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">
|
<svg className="transform -rotate-90" viewBox="0 0 64 64">
|
||||||
<circle
|
<circle
|
||||||
@@ -121,7 +115,7 @@ function CurrentWeek({ onProjectClick, data, loading, error, onRetry, allProject
|
|||||||
stroke="url(#gradient)"
|
stroke="url(#gradient)"
|
||||||
strokeWidth="6"
|
strokeWidth="6"
|
||||||
fill="none"
|
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"
|
strokeLinecap="round"
|
||||||
/>
|
/>
|
||||||
{overallProgress >= 100 && (
|
{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">
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-3">
|
||||||
{sortedData.map((project, index) => {
|
{sortedData.map((project, index) => {
|
||||||
|
if (!project || !project.project_name) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
const projectColor = getProjectColor(project.project_name, allProjects)
|
const projectColor = getProjectColor(project.project_name, allProjects)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div key={index}>
|
<div key={index}>
|
||||||
<ProjectProgressBar
|
<ProjectProgressBar
|
||||||
projectName={project.project_name}
|
projectName={project.project_name}
|
||||||
totalScore={parseFloat(project.total_score)}
|
totalScore={parseFloat(project.total_score) || 0}
|
||||||
minGoalScore={parseFloat(project.min_goal_score)}
|
minGoalScore={parseFloat(project.min_goal_score) || 0}
|
||||||
maxGoalScore={parseFloat(project.max_goal_score)}
|
maxGoalScore={parseFloat(project.max_goal_score) || 0}
|
||||||
onProjectClick={onProjectClick}
|
onProjectClick={onProjectClick}
|
||||||
projectColor={projectColor}
|
projectColor={projectColor}
|
||||||
priority={project.priority}
|
priority={project.priority}
|
||||||
|
|||||||
Reference in New Issue
Block a user