diff --git a/VERSION b/VERSION index 0062ac9..6b244dc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.0.0 +5.0.1 diff --git a/play-life-backend/main.go b/play-life-backend/main.go index a8dd052..21e0073 100644 --- a/play-life-backend/main.go +++ b/play-life-backend/main.go @@ -8708,129 +8708,31 @@ func (a *App) updateTaskHandler(w http.ResponseWriter, r *http.Request) { rewardPolicyValue = nil // NULL для задач, не связанных с желаниями } - // Получаем текущие значения repetition_period, repetition_date и next_show_at из БД - // для проверки, изменились ли поля повторения - var currentRepetitionPeriod sql.NullString - var currentRepetitionDate sql.NullString - var currentNextShowAt sql.NullTime - err = a.DB.QueryRow("SELECT repetition_period, repetition_date, next_show_at FROM tasks WHERE id = $1", taskID).Scan( - ¤tRepetitionPeriod, - ¤tRepetitionDate, - ¤tNextShowAt, - ) - if err != nil { - log.Printf("Error getting current repetition values: %v", err) - sendErrorWithCORS(w, fmt.Sprintf("Error getting task: %v", err), http.StatusInternalServerError) - return - } - - // Проверяем, изменились ли поля повторения - repetitionChanged := false - if repetitionPeriod.Valid { - // Новое значение есть - проверяем, отличается ли от текущего - if !currentRepetitionPeriod.Valid || currentRepetitionPeriod.String != repetitionPeriod.String { - repetitionChanged = true - } - // Также проверяем, что текущее repetition_date было не NULL (если было, значит изменился тип повторения) - if currentRepetitionDate.Valid { - repetitionChanged = true - } - } else if repetitionDate.Valid { - // Новое значение есть - проверяем, отличается ли от текущего - if !currentRepetitionDate.Valid || currentRepetitionDate.String != repetitionDate.String { - repetitionChanged = true - } - // Также проверяем, что текущее repetition_period было не NULL (если было, значит изменился тип повторения) - if currentRepetitionPeriod.Valid { - repetitionChanged = true - } - } else { - // Оба поля NULL - проверяем, были ли они NULL до этого - if currentRepetitionPeriod.Valid || currentRepetitionDate.Valid { - repetitionChanged = true - } - } - - // Используем условный SQL для обработки NULL значений + // Обновляем задачу без изменения next_show_at (он меняется только при завершении/откладывании) var updateSQL string var updateArgs []interface{} - // Получаем часовой пояс из переменной окружения (по умолчанию UTC) - timezoneStr := getEnv("TIMEZONE", "UTC") - loc, err := time.LoadLocation(timezoneStr) - if err != nil { - log.Printf("Warning: Invalid timezone '%s': %v. Using UTC instead.", timezoneStr, err) - loc = time.UTC - } - if repetitionPeriod.Valid { - // Для repetition_period выставляем сегодняшнюю дату только если поле изменилось - var nextShowAtValue interface{} - if repetitionChanged { - now := time.Now().In(loc) - nextShowAtValue = now - } else { - // Поле не изменилось - сохраняем текущее значение next_show_at - if currentNextShowAt.Valid { - nextShowAtValue = currentNextShowAt.Time - } else { - nextShowAtValue = nil - } - } updateSQL = ` UPDATE tasks - SET name = $1, reward_message = $2, progression_base = $3, repetition_period = $4::INTERVAL, repetition_date = NULL, next_show_at = $5, wishlist_id = $6, reward_policy = $7, group_name = $8 - WHERE id = $9 + SET name = $1, reward_message = $2, progression_base = $3, repetition_period = $4::INTERVAL, repetition_date = NULL, wishlist_id = $5, reward_policy = $6, group_name = $7 + WHERE id = $8 ` - updateArgs = []interface{}{strings.TrimSpace(req.Name), rewardMessage, progressionBase, repetitionPeriod.String, nextShowAtValue, newWishlistID, rewardPolicyValue, req.GroupName, taskID} + updateArgs = []interface{}{strings.TrimSpace(req.Name), rewardMessage, progressionBase, repetitionPeriod.String, newWishlistID, rewardPolicyValue, req.GroupName, taskID} } else if repetitionDate.Valid { - // Вычисляем next_show_at для задачи с repetition_date только если поле изменилось - var nextShowAtValue interface{} - if repetitionChanged { - nextShowAt := calculateNextShowAtFromRepetitionDate(repetitionDate.String, time.Now().In(loc)) - nextShowAtValue = nextShowAt - } else { - // Поле не изменилось - сохраняем текущее значение next_show_at - if currentNextShowAt.Valid { - nextShowAtValue = currentNextShowAt.Time - } else { - nextShowAtValue = nil - } - } - if nextShowAtValue != nil { - updateSQL = ` - UPDATE tasks - SET name = $1, reward_message = $2, progression_base = $3, repetition_period = NULL, repetition_date = $4, next_show_at = $5, wishlist_id = $6, reward_policy = $7, group_name = $8 - WHERE id = $9 - ` - updateArgs = []interface{}{strings.TrimSpace(req.Name), rewardMessage, progressionBase, repetitionDate.String, nextShowAtValue, newWishlistID, rewardPolicyValue, req.GroupName, taskID} - } else { - updateSQL = ` + updateSQL = ` UPDATE tasks SET name = $1, reward_message = $2, progression_base = $3, repetition_period = NULL, repetition_date = $4, wishlist_id = $5, reward_policy = $6, group_name = $7 WHERE id = $8 ` - updateArgs = []interface{}{strings.TrimSpace(req.Name), rewardMessage, progressionBase, repetitionDate.String, newWishlistID, rewardPolicyValue, req.GroupName, taskID} - } + updateArgs = []interface{}{strings.TrimSpace(req.Name), rewardMessage, progressionBase, repetitionDate.String, newWishlistID, rewardPolicyValue, req.GroupName, taskID} } else { - // Оба поля NULL - устанавливаем next_show_at в NULL только если поля повторения изменились - var nextShowAtValue interface{} - if repetitionChanged { - nextShowAtValue = nil - } else { - // Поля не изменились - сохраняем текущее значение next_show_at - if currentNextShowAt.Valid { - nextShowAtValue = currentNextShowAt.Time - } else { - nextShowAtValue = nil - } - } updateSQL = ` UPDATE tasks - SET name = $1, reward_message = $2, progression_base = $3, repetition_period = NULL, repetition_date = NULL, next_show_at = $4, wishlist_id = $5, reward_policy = $6, group_name = $7 - WHERE id = $8 + SET name = $1, reward_message = $2, progression_base = $3, repetition_period = NULL, repetition_date = NULL, wishlist_id = $4, reward_policy = $5, group_name = $6 + WHERE id = $7 ` - updateArgs = []interface{}{strings.TrimSpace(req.Name), rewardMessage, progressionBase, nextShowAtValue, newWishlistID, rewardPolicyValue, req.GroupName, taskID} + updateArgs = []interface{}{strings.TrimSpace(req.Name), rewardMessage, progressionBase, newWishlistID, rewardPolicyValue, req.GroupName, taskID} } _, err = tx.Exec(updateSQL, updateArgs...) diff --git a/play-life-backend/play-eng-backend b/play-life-backend/play-eng-backend index fbfc1ea..2521ee6 100755 Binary files a/play-life-backend/play-eng-backend and b/play-life-backend/play-eng-backend differ diff --git a/play-life-web/package.json b/play-life-web/package.json index cd68a04..1ceb17d 100644 --- a/play-life-web/package.json +++ b/play-life-web/package.json @@ -1,6 +1,6 @@ { "name": "play-life-web", - "version": "5.0.0", + "version": "5.0.1", "type": "module", "scripts": { "dev": "vite", diff --git a/play-life-web/src/components/TaskForm.jsx b/play-life-web/src/components/TaskForm.jsx index 7db3a63..1cad80a 100644 --- a/play-life-web/src/components/TaskForm.jsx +++ b/play-life-web/src/components/TaskForm.jsx @@ -95,6 +95,7 @@ function TaskForm({ onNavigate, taskId, wishlistId, isTest: isTestFromProps = fa setRepetitionMode('after') setRewards([]) setSubtasks([]) + setGroupName('') setError('') setLoadingTask(false) // Reset test-specific fields @@ -159,7 +160,8 @@ function TaskForm({ onNavigate, taskId, wishlistId, isTest: isTestFromProps = fa setName(data.task.name) setRewardMessage(data.task.reward_message || '') setProgressionBase(data.task.progression_base ? String(data.task.progression_base) : '') - + setGroupName(data.task.group_name ?? '') + // Проверяем, является ли задача бесконечной (оба поля = 0) const periodStr = data.task.repetition_period ? data.task.repetition_period.trim() : '' const dateStr = data.task.repetition_date ? data.task.repetition_date.trim() : '' @@ -368,13 +370,6 @@ function TaskForm({ onNavigate, taskId, wishlistId, isTest: isTestFromProps = fa } else { setRewardPolicy('personal') // Значение по умолчанию } - - // Загружаем группу - if (data.task.group_name) { - setGroupName(data.task.group_name) - } else { - setGroupName('') - } } else { setCurrentWishlistId(null) setWishlistInfo(null)