diff --git a/.gitea/workflows/build-and-push.yml b/.gitea/workflows/build-and-push.yml index 4f91875..0d30e3b 100644 --- a/.gitea/workflows/build-and-push.yml +++ b/.gitea/workflows/build-and-push.yml @@ -49,12 +49,21 @@ jobs: REGISTRY="dungeonsiege.synology.me/poignatov/play-life" VER="${{ steps.version_check.outputs.current }}" + echo "Building Docker image..." + echo "Registry: $REGISTRY" + echo "Tags: latest, $VER" + # Собираем один раз docker build -t $REGISTRY:latest -t $REGISTRY:$VER . # Пушим оба тега + echo "Pushing image to registry..." docker push $REGISTRY:latest docker push $REGISTRY:$VER + + echo "✅ Successfully pushed to registry:" + echo " - $REGISTRY:latest" + echo " - $REGISTRY:$VER" - name: Send Telegram notification (success) if: success() && steps.version_check.outputs.changed == 'true' @@ -63,10 +72,12 @@ jobs: to: ${{ secrets.TELEGRAM_TO }} token: ${{ secrets.TELEGRAM_TOKEN }} message: | - ✅ Сборка успешна! + ✅ Сборка и публикация успешны! Проект: play-life Версия: ${{ steps.version_check.outputs.current }} + Registry: dungeonsiege.synology.me/poignatov/play-life + Теги: latest, ${{ steps.version_check.outputs.current }} Ветка: ${{ github.ref_name }} Коммит: ${{ github.sha }} diff --git a/VERSION b/VERSION index 47b322c..4d9d11c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.4.1 +3.4.2 diff --git a/play-life-web/src/components/TaskList.jsx b/play-life-web/src/components/TaskList.jsx index 6059d02..8d3cf8d 100644 --- a/play-life-web/src/components/TaskList.jsx +++ b/play-life-web/src/components/TaskList.jsx @@ -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 }) { {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' })