From 647c549ec97a6df767514b3e2ae93388b1f3450c Mon Sep 17 00:00:00 2001 From: poignatov Date: Tue, 6 Jan 2026 14:31:00 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=20'=D0=91?= =?UTF-8?q?=D0=B5=D1=81=D0=BA=D0=BE=D0=BD=D0=B5=D1=87=D0=BD=D1=8B=D0=B5'?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=20=D1=81?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B8=D0=BE=D0=B4=D0=B8=D1=87=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8C=D1=8E=200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VERSION | 2 +- play-life-web/package.json | 2 +- play-life-web/src/components/TaskList.jsx | 68 ++++++++++++++++++++--- 3 files changed, 63 insertions(+), 9 deletions(-) diff --git a/VERSION b/VERSION index dedcc7d..10c2c0c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.9.1 +2.10.0 diff --git a/play-life-web/package.json b/play-life-web/package.json index 91f8794..2f763cd 100644 --- a/play-life-web/package.json +++ b/play-life-web/package.json @@ -1,6 +1,6 @@ { "name": "play-life-web", - "version": "2.9.0", + "version": "2.10.0", "type": "module", "scripts": { "dev": "vite", diff --git a/play-life-web/src/components/TaskList.jsx b/play-life-web/src/components/TaskList.jsx index 4d70f1b..b90f8b7 100644 --- a/play-life-web/src/components/TaskList.jsx +++ b/play-life-web/src/components/TaskList.jsx @@ -15,6 +15,15 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, onRefresh }) { const [selectedTaskForDetail, setSelectedTaskForDetail] = useState(null) const [isCompleting, setIsCompleting] = useState(false) const [expandedCompleted, setExpandedCompleted] = useState({}) + // Загружаем состояние раскрытия "Бесконечные" из localStorage (по умолчанию true) + const [expandedInfinite, setExpandedInfinite] = useState(() => { + try { + const saved = localStorage.getItem('taskList_expandedInfinite') + return saved ? JSON.parse(saved) : {} + } catch { + return {} + } + }) const [toast, setToast] = useState(null) // Для отслеживания изменений в списке задач (чтобы не перезагружать детали без необходимости) @@ -149,6 +158,22 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, onRefresh }) { })) } + const toggleInfiniteExpanded = (projectName) => { + setExpandedInfinite(prev => { + const newState = { + ...prev, + [projectName]: !prev[projectName] + } + // Сохраняем в localStorage + try { + localStorage.setItem('taskList_expandedInfinite', JSON.stringify(newState)) + } catch (err) { + console.error('Error saving expandedInfinite to localStorage:', err) + } + return newState + }) + } + // Получаем все проекты из наград задачи и подзадач const getTaskProjects = (task) => { const projects = new Set() @@ -256,9 +281,11 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, onRefresh }) { // Определяем, в какую группу попадает задача let isCompleted = false + let isInfinite = false - // Если у задачи период повторения = 0, она всегда в невыполненных + // Если у задачи период повторения = 0, она в бесконечных if (task.repetition_period && isZeroPeriod(task.repetition_period)) { + isInfinite = true isCompleted = false } else if (task.repetition_period) { // Если есть repetition_period (и он не 0), проверяем логику повторения @@ -297,11 +324,14 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, onRefresh }) { if (!groups[projectName]) { groups[projectName] = { notCompleted: [], - completed: [] + completed: [], + infinite: [] } } - if (isCompleted) { + if (isInfinite) { + groups[projectName].infinite.push(task) + } else if (isCompleted) { groups[projectName].completed.push(task) } else { groups[projectName].notCompleted.push(task) @@ -391,7 +421,12 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, onRefresh }) { {projectNames.map(projectName => { const group = groupedTasks[projectName] const hasCompleted = group.completed.length > 0 - const isExpanded = expandedCompleted[projectName] + const hasInfinite = group.infinite.length > 0 + const isCompletedExpanded = expandedCompleted[projectName] + // По умолчанию бесконечные раскрыты (true), если не сохранено иное + const isInfiniteExpanded = expandedInfinite[projectName] !== undefined + ? expandedInfinite[projectName] + : true return (
@@ -405,6 +440,25 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, onRefresh }) {
)} + {hasInfinite && ( +
+ + {isInfiniteExpanded && ( +
+ {group.infinite.map(renderTaskItem)} +
+ )} +
+ )} + {hasCompleted && (
- {isExpanded && ( + {isCompletedExpanded && (
{group.completed.map(renderTaskItem)}
@@ -424,7 +478,7 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, onRefresh }) {
)} - {group.notCompleted.length === 0 && !hasCompleted && ( + {group.notCompleted.length === 0 && !hasCompleted && !hasInfinite && (
Нет задач в этой группе
)}