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
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 33s
This commit is contained in:
@@ -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' })
|
||||
|
||||
Reference in New Issue
Block a user