4.8.9: Сортировка задач по completed и next_show_at
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m29s
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m29s
This commit is contained in:
@@ -6644,8 +6644,16 @@ func (a *App) getTasksHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
LEFT JOIN task_drafts td ON td.task_id = t.id AND td.user_id = $1
|
LEFT JOIN task_drafts td ON td.task_id = t.id AND td.user_id = $1
|
||||||
WHERE t.user_id = $1 AND t.parent_task_id IS NULL AND t.deleted = FALSE
|
WHERE t.user_id = $1 AND t.parent_task_id IS NULL AND t.deleted = FALSE
|
||||||
ORDER BY
|
ORDER BY
|
||||||
|
-- Сначала разделяем на невыполненные (0) и выполненные (1)
|
||||||
CASE WHEN t.last_completed_at IS NULL OR t.last_completed_at::date < CURRENT_DATE THEN 0 ELSE 1 END,
|
CASE WHEN t.last_completed_at IS NULL OR t.last_completed_at::date < CURRENT_DATE THEN 0 ELSE 1 END,
|
||||||
t.name
|
-- Для невыполненных: сортируем по completed DESC (больше завершений выше), затем по id ASC (раньше добавленные выше)
|
||||||
|
CASE WHEN t.last_completed_at IS NULL OR t.last_completed_at::date < CURRENT_DATE THEN -t.completed ELSE 0 END,
|
||||||
|
CASE WHEN t.last_completed_at IS NULL OR t.last_completed_at::date < CURRENT_DATE THEN t.id ELSE 0 END,
|
||||||
|
-- Для выполненных: сортируем по next_show_at ASC (ранние в начале), NULL значения в начале через COALESCE
|
||||||
|
CASE WHEN t.last_completed_at IS NOT NULL AND t.last_completed_at::date >= CURRENT_DATE
|
||||||
|
THEN COALESCE(t.next_show_at, '1970-01-01'::timestamp with time zone)
|
||||||
|
ELSE '1970-01-01'::timestamp with time zone
|
||||||
|
END
|
||||||
`
|
`
|
||||||
|
|
||||||
rows, err := a.DB.Query(query, userID)
|
rows, err := a.DB.Query(query, userID)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "play-life-web",
|
"name": "play-life-web",
|
||||||
"version": "4.8.8",
|
"version": "4.8.9",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -493,6 +493,46 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, error, onRetry
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Сортируем задачи внутри каждой группы проекта
|
||||||
|
Object.keys(groups).forEach(projectName => {
|
||||||
|
const group = groups[projectName]
|
||||||
|
|
||||||
|
// Сортируем невыполненные задачи: по completed DESC (больше завершений выше), затем по id ASC (раньше добавленные выше)
|
||||||
|
group.notCompleted.sort((a, b) => {
|
||||||
|
if (b.completed !== a.completed) {
|
||||||
|
return b.completed - a.completed // DESC
|
||||||
|
}
|
||||||
|
return a.id - b.id // ASC
|
||||||
|
})
|
||||||
|
|
||||||
|
// Сортируем выполненные задачи: бесконечные первыми, затем по next_show_at ASC (ранние в начале), NULL в начале
|
||||||
|
group.completed.sort((a, b) => {
|
||||||
|
// Проверяем, является ли задача бесконечной
|
||||||
|
const hasZeroPeriodA = a.repetition_period && isZeroPeriod(a.repetition_period)
|
||||||
|
const hasZeroDateA = a.repetition_date && isZeroDate(a.repetition_date)
|
||||||
|
const isInfiniteA = (hasZeroPeriodA && hasZeroDateA) || (hasZeroPeriodA && !a.repetition_date)
|
||||||
|
|
||||||
|
const hasZeroPeriodB = b.repetition_period && isZeroPeriod(b.repetition_period)
|
||||||
|
const hasZeroDateB = b.repetition_date && isZeroDate(b.repetition_date)
|
||||||
|
const isInfiniteB = (hasZeroPeriodB && hasZeroDateB) || (hasZeroPeriodB && !b.repetition_date)
|
||||||
|
|
||||||
|
// Бесконечные задачи идут первыми
|
||||||
|
if (isInfiniteA && !isInfiniteB) return -1
|
||||||
|
if (!isInfiniteA && isInfiniteB) return 1
|
||||||
|
if (isInfiniteA && isInfiniteB) return 0
|
||||||
|
|
||||||
|
// Для остальных: NULL значения идут первыми
|
||||||
|
if (!a.next_show_at && !b.next_show_at) return 0
|
||||||
|
if (!a.next_show_at) return -1
|
||||||
|
if (!b.next_show_at) return 1
|
||||||
|
|
||||||
|
// Сравниваем даты
|
||||||
|
const dateA = new Date(a.next_show_at).getTime()
|
||||||
|
const dateB = new Date(b.next_show_at).getTime()
|
||||||
|
return dateA - dateB // ASC
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
return groups
|
return groups
|
||||||
}, [tasks])
|
}, [tasks])
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user