5.10.0: Капсула прогрессии в списке задач
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m21s
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m21s
This commit is contained in:
@@ -23,6 +23,7 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, error, onRetry
|
||||
const [isPostponing, setIsPostponing] = useState(false)
|
||||
const [toast, setToast] = useState(null)
|
||||
const [searchQuery, setSearchQuery] = useState('')
|
||||
const [savingProgressionTaskId, setSavingProgressionTaskId] = useState(null)
|
||||
// Режим группировки: 'project' (по проекту - по умолчанию) или 'group' (по группе)
|
||||
const [groupingMode, setGroupingMode] = useState(() => {
|
||||
// Восстанавливаем из localStorage, по умолчанию 'project'
|
||||
@@ -551,6 +552,45 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, error, onRetry
|
||||
}))
|
||||
}
|
||||
|
||||
const handleProgressionChange = async (task, delta) => {
|
||||
if (savingProgressionTaskId === task.id) return
|
||||
|
||||
const currentValue = task.draft_progression_value ?? 0
|
||||
const newValue = currentValue + delta
|
||||
|
||||
setSavingProgressionTaskId(task.id)
|
||||
try {
|
||||
const response = await authFetch(`${API_URL}/${task.id}/draft`, {
|
||||
method: 'PUT',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
progression_value: newValue,
|
||||
auto_complete: false,
|
||||
children_task_ids: []
|
||||
}),
|
||||
})
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error('Ошибка при сохранении прогрессии')
|
||||
}
|
||||
|
||||
setTasks(prevTasks =>
|
||||
prevTasks.map(t =>
|
||||
t.id === task.id
|
||||
? { ...t, draft_progression_value: newValue }
|
||||
: t
|
||||
)
|
||||
)
|
||||
} catch (err) {
|
||||
console.error('Error saving progression:', err)
|
||||
setToast({ message: err.message || 'Ошибка при сохранении прогрессии', type: 'error' })
|
||||
} finally {
|
||||
setSavingProgressionTaskId(null)
|
||||
}
|
||||
}
|
||||
|
||||
// Получаем все проекты из задачи (теперь они приходят в task.project_names)
|
||||
const getTaskProjects = (task) => {
|
||||
if (task.project_names && Array.isArray(task.project_names)) {
|
||||
@@ -888,21 +928,34 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, error, onRetry
|
||||
</svg>
|
||||
)}
|
||||
{hasProgression && (
|
||||
<svg
|
||||
className="task-progression-icon"
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
<span
|
||||
className={`task-progression-capsule ${savingProgressionTaskId === task.id ? 'task-progression-capsule--saving' : ''}`}
|
||||
onClick={(e) => {
|
||||
e.stopPropagation()
|
||||
if (savingProgressionTaskId !== task.id) {
|
||||
handleProgressionChange(task, task.progression_base)
|
||||
}
|
||||
}}
|
||||
title="Задача с прогрессией"
|
||||
>
|
||||
<polyline points="23 6 13.5 15.5 8.5 10.5 1 18"></polyline>
|
||||
<polyline points="17 6 23 6 23 12"></polyline>
|
||||
</svg>
|
||||
<svg
|
||||
className="task-progression-icon"
|
||||
width="14"
|
||||
height="14"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
>
|
||||
<polyline points="23 6 13.5 15.5 8.5 10.5 1 18"></polyline>
|
||||
<polyline points="17 6 23 6 23 12"></polyline>
|
||||
</svg>
|
||||
{task.draft_progression_value != null && (
|
||||
<span className="task-progression-value">{task.draft_progression_value}</span>
|
||||
)}
|
||||
</span>
|
||||
)}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user