Bump version to 3.4.2: improve date comparison in TaskList and enhance CI notifications
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 33s

This commit is contained in:
poignatov
2026-01-07 15:43:20 +03:00
parent 2f16876185
commit b1cfea22e6
3 changed files with 30 additions and 93 deletions

View File

@@ -315,54 +315,6 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, onRefresh }) {
return !isNaN(value) && value === 0
}
// Функция для парсинга PostgreSQL INTERVAL и добавления к дате
const addIntervalToDate = (date, intervalStr) => {
if (!intervalStr) return null
const result = new Date(date)
// Парсим строку интервала (формат: "1 day", "2 hours", "3 months", etc.)
const parts = intervalStr.trim().split(/\s+/)
if (parts.length < 2) return null
const value = parseInt(parts[0], 10)
if (isNaN(value)) return null
const unit = parts[1].toLowerCase()
switch (unit) {
case 'minute':
case 'minutes':
result.setMinutes(result.getMinutes() + value)
break
case 'hour':
case 'hours':
result.setHours(result.getHours() + value)
break
case 'day':
case 'days':
result.setDate(result.getDate() + value)
break
case 'week':
case 'weeks':
result.setDate(result.getDate() + value * 7)
break
case 'month':
case 'months':
result.setMonth(result.getMonth() + value)
break
case 'year':
case 'years':
result.setFullYear(result.getFullYear() + value)
break
default:
return null
}
return result
}
// Группируем задачи по проектам
const groupedTasks = useMemo(() => {
const today = new Date()
@@ -382,8 +334,7 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, onRefresh }) {
let isCompleted = false
let isInfinite = false
// Если next_show_at установлен, задача всегда в выполненных (если дата в будущем)
// даже если она бесконечная (next_show_at приоритетнее всего)
// Используем только next_show_at для группировки
if (task.next_show_at) {
const nextShowDate = new Date(task.next_show_at)
nextShowDate.setHours(0, 0, 0, 0)
@@ -393,41 +344,10 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, onRefresh }) {
// Если у задачи период повторения = 0 и нет next_show_at, она в бесконечных
isInfinite = true
isCompleted = false
} else if (task.repetition_period) {
// Если есть repetition_period (и он не 0), проверяем логику повторения
// Используем last_completed_at + period
let nextDueDate = null
if (task.last_completed_at) {
const lastCompleted = new Date(task.last_completed_at)
nextDueDate = addIntervalToDate(lastCompleted, task.repetition_period)
}
if (nextDueDate) {
// Округляем до начала дня
nextDueDate.setHours(0, 0, 0, 0)
// Если nextDueDate > today, то задача в выполненных
isCompleted = nextDueDate.getTime() > today.getTime()
} else {
// Если не удалось определить дату, используем старую логику
if (task.last_completed_at) {
const completedDate = new Date(task.last_completed_at)
completedDate.setHours(0, 0, 0, 0)
isCompleted = completedDate.getTime() === today.getTime()
} else {
isCompleted = false
}
}
} else {
// Если нет ни repetition_period, ни repetition_date, используем старую логику
if (task.last_completed_at) {
const completedDate = new Date(task.last_completed_at)
completedDate.setHours(0, 0, 0, 0)
isCompleted = completedDate.getTime() === today.getTime()
} else {
isCompleted = false
}
// Если нет next_show_at и период не 0, задача в обычных
isCompleted = false
isInfinite = false
}
projects.forEach(projectName => {
@@ -501,16 +421,22 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, onRefresh }) {
</div>
{task.next_show_at && (() => {
const showDate = new Date(task.next_show_at)
showDate.setHours(0, 0, 0, 0)
// Нормализуем дату: устанавливаем время в 00:00:00 в локальном времени
const showDateNormalized = new Date(showDate.getFullYear(), showDate.getMonth(), showDate.getDate())
const today = new Date()
today.setHours(0, 0, 0, 0)
const tomorrow = new Date(today)
tomorrow.setDate(tomorrow.getDate() + 1)
const todayNormalized = new Date(today.getFullYear(), today.getMonth(), today.getDate())
const tomorrowNormalized = new Date(todayNormalized)
tomorrowNormalized.setDate(tomorrowNormalized.getDate() + 1)
// Не показываем текст если дата равна сегодня
if (showDateNormalized.getTime() === todayNormalized.getTime()) {
return null
}
let dateText
if (showDate.getTime() === today.getTime()) {
dateText = 'Сегодня'
} else if (showDate.getTime() === tomorrow.getTime()) {
if (showDateNormalized.getTime() === tomorrowNormalized.getTime()) {
dateText = 'Завтра'
} else {
dateText = showDate.toLocaleDateString('ru-RU', { day: 'numeric', month: 'long', year: 'numeric' })