4.8.0: Улучшен UI списка задач
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m4s

This commit is contained in:
poignatov
2026-02-02 19:38:36 +03:00
parent 3278eef2c5
commit a780b46175
4 changed files with 36 additions and 32 deletions

View File

@@ -1 +1 @@
4.7.3 4.8.0

View File

@@ -1,6 +1,6 @@
{ {
"name": "play-life-web", "name": "play-life-web",
"version": "4.7.3", "version": "4.8.0",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",

View File

@@ -1,6 +1,7 @@
.task-list { .task-list {
max-width: 42rem; /* max-w-2xl = 672px */ max-width: 42rem; /* max-w-2xl = 672px */
margin: 0 auto; margin: 0 auto;
padding-bottom: 6rem; /* Отступ для фиксированной кнопки добавления */
} }
.add-task-button { .add-task-button {
@@ -477,8 +478,15 @@
margin-bottom: 2rem; margin-bottom: 2rem;
} }
.project-group-no-tasks {
margin-bottom: 0.5rem;
}
.project-group-header { .project-group-header {
margin-bottom: 1rem; margin-bottom: 1rem;
display: flex;
align-items: center;
justify-content: space-between;
} }
.project-group-title { .project-group-title {
@@ -486,38 +494,31 @@
font-weight: 600; font-weight: 600;
color: #1f2937; color: #1f2937;
margin: 0; margin: 0;
padding-bottom: 0.5rem;
border-bottom: 2px solid #e5e7eb;
} }
.project-group-title-empty { .project-group-title-empty {
color: #9ca3af; color: #9ca3af;
} }
.completed-section { .completed-toggle-header {
margin-top: 1rem;
}
.completed-toggle {
width: 100%;
display: flex; display: flex;
align-items: center; align-items: center;
gap: 0.5rem; gap: 0.25rem;
padding: 0.75rem; padding: 0.25rem 0.5rem;
background: #f9fafb; background: #f9fafb;
border: 1px solid #e5e7eb; border: 1px solid #e5e7eb;
border-radius: 0.5rem; border-radius: 0.375rem;
cursor: pointer; cursor: pointer;
font-size: 0.875rem; font-size: 0.875rem;
font-weight: 500; font-weight: 500;
color: #6b7280; color: #6b7280;
transition: all 0.2s; transition: all 0.2s;
margin-bottom: 0.5rem;
} }
.completed-toggle:hover { .completed-toggle-header:hover {
background: #f3f4f6; background: #f3f4f6;
color: #1f2937; color: #1f2937;
border-color: #d1d5db;
} }
.completed-toggle-icon { .completed-toggle-icon {
@@ -525,6 +526,11 @@
transition: transform 0.2s; transition: transform 0.2s;
} }
.completed-toggle-count {
font-size: 0.875rem;
font-weight: 500;
}
.completed-tasks { .completed-tasks {
margin-top: 0.5rem; margin-top: 0.5rem;
} }

View File

@@ -774,9 +774,20 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, error, onRetry
const isCompletedExpanded = expandedCompleted[projectName] const isCompletedExpanded = expandedCompleted[projectName]
return ( return (
<div key={projectName} className="project-group"> <div key={projectName} className={`project-group ${!hasNotCompleted ? 'project-group-no-tasks' : ''}`}>
<div className="project-group-header"> <div className="project-group-header">
<h3 className={`project-group-title ${!hasNotCompleted ? 'project-group-title-empty' : ''}`}>{projectName}</h3> <h3 className={`project-group-title ${!hasNotCompleted ? 'project-group-title-empty' : ''}`}>{projectName}</h3>
{hasCompleted && (
<button
className="completed-toggle-header"
onClick={() => toggleCompletedExpanded(projectName)}
title={isCompletedExpanded ? 'Скрыть выполненные' : 'Показать выполненные'}
>
<span className="completed-toggle-icon">
{isCompletedExpanded ? '▼' : '▶'}
</span>
</button>
)}
</div> </div>
{/* Обычные задачи (включая бесконечные) */} {/* Обычные задачи (включая бесконечные) */}
@@ -787,22 +798,9 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, error, onRetry
)} )}
{/* Выполненные задачи */} {/* Выполненные задачи */}
{hasCompleted && ( {hasCompleted && isCompletedExpanded && (
<div className="completed-section"> <div className="task-group completed-tasks">
<button {group.completed.map(task => renderTaskItem(task, true))}
className="completed-toggle"
onClick={() => toggleCompletedExpanded(projectName)}
>
<span className="completed-toggle-icon">
{isCompletedExpanded ? '▼' : '▶'}
</span>
<span>Выполненные ({group.completed.length})</span>
</button>
{isCompletedExpanded && (
<div className="task-group completed-tasks">
{group.completed.map(task => renderTaskItem(task, true))}
</div>
)}
</div> </div>
)} )}