From 368f10bcdd49443fcd4af57352f86a587de98e4d Mon Sep 17 00:00:00 2001 From: poignatov Date: Thu, 5 Mar 2026 18:08:29 +0300 Subject: [PATCH] =?UTF-8?q?6.0.2:=20=D0=A3=D1=87=D1=91=D1=82=20pending-?= =?UTF-8?q?=D0=B1=D0=B0=D0=BB=D0=BB=D0=BE=D0=B2=20=D0=BD=D0=B0=20=D0=B6?= =?UTF-8?q?=D0=B5=D0=BB=D0=B0=D0=BD=D0=B8=D1=8F=D1=85,=20=D1=87=D1=91?= =?UTF-8?q?=D1=80=D0=BD=D1=8B=D0=B9=20=D1=82=D0=B5=D0=BA=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VERSION | 2 +- play-life-backend/main.go | 30 ++++++++++++-------- play-life-web/package.json | 2 +- play-life-web/src/App.jsx | 8 ++++-- play-life-web/src/components/CurrentWeek.css | 2 +- play-life-web/src/components/CurrentWeek.jsx | 18 ++++++++---- 6 files changed, 39 insertions(+), 23 deletions(-) diff --git a/VERSION b/VERSION index 5fe6072..9b9a244 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -6.0.1 +6.0.2 diff --git a/play-life-backend/main.go b/play-life-backend/main.go index 6e556f1..ebe0c65 100644 --- a/play-life-backend/main.go +++ b/play-life-backend/main.go @@ -162,12 +162,13 @@ type GroupsProgress struct { } type WeeklyStatsResponse struct { - Total *float64 `json:"total,omitempty"` - GroupProgress1 *float64 `json:"group_progress_1,omitempty"` - GroupProgress2 *float64 `json:"group_progress_2,omitempty"` - GroupProgress0 *float64 `json:"group_progress_0,omitempty"` - Projects []WeeklyProjectStats `json:"projects"` - Wishes []WishlistItem `json:"wishes,omitempty"` + Total *float64 `json:"total,omitempty"` + GroupProgress1 *float64 `json:"group_progress_1,omitempty"` + GroupProgress2 *float64 `json:"group_progress_2,omitempty"` + GroupProgress0 *float64 `json:"group_progress_0,omitempty"` + Projects []WeeklyProjectStats `json:"projects"` + Wishes []WishlistItem `json:"wishes,omitempty"` + PendingScoresByProject map[int]float64 `json:"pending_scores_by_project,omitempty"` } type MessagePostRequest struct { @@ -2966,13 +2967,18 @@ func (a *App) getWeeklyStatsHandler(w http.ResponseWriter, r *http.Request) { wishes = []WishlistItem{} } + pendingByProject := draftPendingScores + if pendingByProject == nil { + pendingByProject = make(map[int]float64) + } response := WeeklyStatsResponse{ - Total: total, - GroupProgress1: groupsProgress.Group1, - GroupProgress2: groupsProgress.Group2, - GroupProgress0: groupsProgress.Group0, - Projects: projects, - Wishes: wishes, + Total: total, + GroupProgress1: groupsProgress.Group1, + GroupProgress2: groupsProgress.Group2, + GroupProgress0: groupsProgress.Group0, + Projects: projects, + Wishes: wishes, + PendingScoresByProject: pendingByProject, } w.Header().Set("Content-Type", "application/json") diff --git a/play-life-web/package.json b/play-life-web/package.json index e22a332..436ece0 100644 --- a/play-life-web/package.json +++ b/play-life-web/package.json @@ -1,6 +1,6 @@ { "name": "play-life-web", - "version": "6.0.1", + "version": "6.0.2", "type": "module", "scripts": { "dev": "vite", diff --git a/play-life-web/src/App.jsx b/play-life-web/src/App.jsx index e33867f..9f68b40 100644 --- a/play-life-web/src/App.jsx +++ b/play-life-web/src/App.jsx @@ -427,16 +427,18 @@ function AppContent() { groupProgress0 = jsonData.group_progress_0 !== undefined ? jsonData.group_progress_0 : null } - // Получаем желания из ответа + // Получаем желания и pending-баллы по проектам из ответа const wishes = jsonData?.wishes || [] - + const pendingScoresByProject = jsonData?.pending_scores_by_project && typeof jsonData.pending_scores_by_project === 'object' ? jsonData.pending_scores_by_project : {} + setCurrentWeekData({ projects: Array.isArray(projects) ? projects : [], total: total, group_progress_1: groupProgress1, group_progress_2: groupProgress2, group_progress_0: groupProgress0, - wishes: wishes + wishes: wishes, + pending_scores_by_project: pendingScoresByProject }) } catch (err) { setCurrentWeekError(err.message) diff --git a/play-life-web/src/components/CurrentWeek.css b/play-life-web/src/components/CurrentWeek.css index b0ed811..3e7f7fa 100644 --- a/play-life-web/src/components/CurrentWeek.css +++ b/play-life-web/src/components/CurrentWeek.css @@ -271,7 +271,7 @@ justify-content: center; width: calc(100% - 8px); max-width: calc(100% - 8px); - color: #5b6b8a; + color: #000; /* font-size задаётся в JS по количеству цифр (auto-size) */ font-weight: 700; line-height: 1.2; diff --git a/play-life-web/src/components/CurrentWeek.jsx b/play-life-web/src/components/CurrentWeek.jsx index b8ac36c..d375230 100644 --- a/play-life-web/src/components/CurrentWeek.jsx +++ b/play-life-web/src/components/CurrentWeek.jsx @@ -96,7 +96,7 @@ function CircularProgressBar({ progress, size = 120, strokeWidth = 8, showCheckm } // Компонент мини-карточки желания для отображения внутри карточки проекта -function MiniWishCard({ wish, onClick }) { +function MiniWishCard({ wish, onClick, pendingScoresByProject = {} }) { const handleClick = (e) => { e.stopPropagation() if (onClick) { @@ -108,7 +108,9 @@ function MiniWishCard({ wish, onClick }) { const isPointsCondition = cond?.type === 'project_points' const required = cond?.required_points ?? 0 const current = cond?.current_points ?? 0 - const remaining = isPointsCondition ? Math.max(0, required - current) : 0 + const projectId = cond?.project_id + const pending = (projectId != null && pendingScoresByProject[projectId] != null) ? Number(pendingScoresByProject[projectId]) : 0 + const remaining = isPointsCondition ? (required - current - pending) : 0 const showUnlockPoints = remaining > 0 // Auto-size: уменьшаем шрифт при большом количестве цифр, чтобы текст влезал @@ -139,7 +141,7 @@ function MiniWishCard({ wish, onClick }) { } // Компонент карточки проекта с круглым прогрессбаром -function ProjectCard({ project, projectColor, onProjectClick, wishes = [], onWishClick }) { +function ProjectCard({ project, projectColor, onProjectClick, wishes = [], onWishClick, pendingScoresByProject = {} }) { const { project_name, total_score, min_goal_score, max_goal_score, priority, today_change } = project // Вычисляем прогресс по оригинальной логике из ProjectProgressBar @@ -274,6 +276,7 @@ function ProjectCard({ project, projectColor, onProjectClick, wishes = [], onWis key={wish.id} wish={wish} onClick={onWishClick} + pendingScoresByProject={pendingScoresByProject || {}} /> ))} @@ -284,7 +287,7 @@ function ProjectCard({ project, projectColor, onProjectClick, wishes = [], onWis } // Компонент группы проектов по приоритету -function PriorityGroup({ title, subtitle, projects, allProjects, onProjectClick, getWishesForProject, onWishClick }) { +function PriorityGroup({ title, subtitle, projects, allProjects, onProjectClick, getWishesForProject, onWishClick, pendingScoresByProject = {} }) { if (projects.length === 0) return null return ( @@ -312,6 +315,7 @@ function PriorityGroup({ title, subtitle, projects, allProjects, onProjectClick, onProjectClick={onProjectClick} wishes={projectWishes} onWishClick={onWishClick} + pendingScoresByProject={pendingScoresByProject} /> ) })} @@ -577,8 +581,9 @@ function CurrentWeek({ onProjectClick, data, loading, error, onRetry, allProject const [toastMessage, setToastMessage] = useState(null) const [selectedWishlistId, setSelectedWishlistId] = useState(null) - // Желания приходят вместе с данными проектов + // Желания и pending-баллы по проектам приходят вместе с данными const wishes = data?.wishes || [] + const pendingScoresByProject = data?.pending_scores_by_project && typeof data.pending_scores_by_project === 'object' ? data.pending_scores_by_project : {} // Функция для получения числового значения срока из текста const getWeeksValue = (weeksText) => { @@ -778,6 +783,7 @@ function CurrentWeek({ onProjectClick, data, loading, error, onRetry, allProject onProjectClick={onProjectClick} getWishesForProject={getWishesForProject} onWishClick={handleWishClick} + pendingScoresByProject={pendingScoresByProject} />