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 (