From 98427f5d0ebb7704387099f7f7810a88ccc26be1 Mon Sep 17 00:00:00 2001 From: poignatov Date: Wed, 4 Mar 2026 15:11:11 +0300 Subject: [PATCH] =?UTF-8?q?5.10.1:=20=D0=9D=D0=B5=20=D1=81=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D1=81=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=B1=D1=8B=D1=81=D1=82=D1=80=D0=BE=D0=B9=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B3=D1=80=D0=B5=D1=81=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VERSION | 2 +- play-life-backend/main.go | 100 +++++++++++++--------- play-life-web/package.json | 2 +- play-life-web/src/components/TaskList.jsx | 4 +- 4 files changed, 64 insertions(+), 44 deletions(-) diff --git a/VERSION b/VERSION index 509b0b6..4e32c7b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.10.0 +5.10.1 diff --git a/play-life-backend/main.go b/play-life-backend/main.go index aef7415..f10e58d 100644 --- a/play-life-backend/main.go +++ b/play-life-backend/main.go @@ -435,8 +435,8 @@ type PostponeTaskRequest struct { type SaveDraftRequest struct { ProgressionValue *float64 `json:"progression_value,omitempty"` - ChildrenTaskIDs []int `json:"children_task_ids,omitempty"` // только checked подзадачи - AutoComplete bool `json:"auto_complete"` + ChildrenTaskIDs *[]int `json:"children_task_ids,omitempty"` // только checked подзадачи, nil = не менять + AutoComplete *bool `json:"auto_complete,omitempty"` // nil = не менять } type TaskDraft struct { @@ -9412,11 +9412,15 @@ func (a *App) saveTaskDraftHandler(w http.ResponseWriter, r *http.Request) { if err == sql.ErrNoRows { // Создаем новый драфт + autoComplete := false + if req.AutoComplete != nil { + autoComplete = *req.AutoComplete + } err = tx.QueryRow(` INSERT INTO task_drafts (task_id, user_id, progression_value, auto_complete, created_at, updated_at) VALUES ($1, $2, $3, $4, NOW(), NOW()) RETURNING id - `, taskID, userID, progressionValue, req.AutoComplete).Scan(&draftID) + `, taskID, userID, progressionValue, autoComplete).Scan(&draftID) if err != nil { log.Printf("Error creating draft: %v", err) @@ -9429,36 +9433,50 @@ func (a *App) saveTaskDraftHandler(w http.ResponseWriter, r *http.Request) { return } else { // Обновляем существующий драфт - // При обновлении очищаем auto_complete если параметр false - autoComplete := req.AutoComplete - _, err = tx.Exec(` - UPDATE task_drafts - SET progression_value = $1, auto_complete = $2, updated_at = NOW() - WHERE id = $3 - `, progressionValue, autoComplete, draftID) + // Обновляем только те поля, которые переданы + if req.ProgressionValue != nil || req.AutoComplete != nil { + if req.AutoComplete != nil { + // Обновляем оба поля + _, err = tx.Exec(` + UPDATE task_drafts + SET progression_value = COALESCE($1, progression_value), auto_complete = $2, updated_at = NOW() + WHERE id = $3 + `, progressionValue, *req.AutoComplete, draftID) + } else { + // Обновляем только progression_value + _, err = tx.Exec(` + UPDATE task_drafts + SET progression_value = $1, updated_at = NOW() + WHERE id = $2 + `, progressionValue, draftID) + } - if err != nil { - log.Printf("Error updating draft: %v", err) - sendErrorWithCORS(w, fmt.Sprintf("Error updating draft: %v", err), http.StatusInternalServerError) - return + if err != nil { + log.Printf("Error updating draft: %v", err) + sendErrorWithCORS(w, fmt.Sprintf("Error updating draft: %v", err), http.StatusInternalServerError) + return + } } - // Удаляем все старые записи подзадач - _, err = tx.Exec("DELETE FROM task_draft_subtasks WHERE task_draft_id = $1", draftID) - if err != nil { - log.Printf("Error deleting old draft subtasks: %v", err) - sendErrorWithCORS(w, fmt.Sprintf("Error deleting old draft subtasks: %v", err), http.StatusInternalServerError) - return + // Удаляем и обновляем записи подзадач только если они были переданы + if req.ChildrenTaskIDs != nil { + _, err = tx.Exec("DELETE FROM task_draft_subtasks WHERE task_draft_id = $1", draftID) + if err != nil { + log.Printf("Error deleting old draft subtasks: %v", err) + sendErrorWithCORS(w, fmt.Sprintf("Error deleting old draft subtasks: %v", err), http.StatusInternalServerError) + return + } } } // Вставляем новые записи подзадач (только checked подзадачи) - if len(req.ChildrenTaskIDs) > 0 { + if req.ChildrenTaskIDs != nil && len(*req.ChildrenTaskIDs) > 0 { + childrenIDs := *req.ChildrenTaskIDs // Проверяем, что все подзадачи принадлежат этой задаче - placeholders := make([]string, len(req.ChildrenTaskIDs)) - args := make([]interface{}, len(req.ChildrenTaskIDs)+1) + placeholders := make([]string, len(childrenIDs)) + args := make([]interface{}, len(childrenIDs)+1) args[0] = taskID - for i, id := range req.ChildrenTaskIDs { + for i, id := range childrenIDs { placeholders[i] = fmt.Sprintf("$%d", i+2) args[i+1] = id } @@ -9485,7 +9503,7 @@ func (a *App) saveTaskDraftHandler(w http.ResponseWriter, r *http.Request) { } // Вставляем только валидные подзадачи - for _, subtaskID := range req.ChildrenTaskIDs { + for _, subtaskID := range childrenIDs { if validSubtaskIDs[subtaskID] { _, err = tx.Exec(` INSERT INTO task_draft_subtasks (task_draft_id, subtask_id) @@ -10019,7 +10037,8 @@ func (a *App) completeTaskAtEndOfDayHandler(w http.ResponseWriter, r *http.Reque } // Устанавливаем auto_complete = true - req.AutoComplete = true + autoCompleteTrue := true + req.AutoComplete = &autoCompleteTrue // Используем ту же логику что и saveTaskDraftHandler // Начинаем транзакцию @@ -10046,7 +10065,7 @@ func (a *App) completeTaskAtEndOfDayHandler(w http.ResponseWriter, r *http.Reque INSERT INTO task_drafts (task_id, user_id, progression_value, auto_complete, created_at, updated_at) VALUES ($1, $2, $3, $4, NOW(), NOW()) RETURNING id - `, taskID, userID, progressionValue, req.AutoComplete).Scan(&draftID) + `, taskID, userID, progressionValue, *req.AutoComplete).Scan(&draftID) if err != nil { log.Printf("Error creating draft: %v", err) @@ -10063,7 +10082,7 @@ func (a *App) completeTaskAtEndOfDayHandler(w http.ResponseWriter, r *http.Reque UPDATE task_drafts SET progression_value = $1, auto_complete = $2, updated_at = NOW() WHERE id = $3 - `, progressionValue, req.AutoComplete, draftID) + `, progressionValue, *req.AutoComplete, draftID) if err != nil { log.Printf("Error updating draft: %v", err) @@ -10071,22 +10090,25 @@ func (a *App) completeTaskAtEndOfDayHandler(w http.ResponseWriter, r *http.Reque return } - // Удаляем все старые записи подзадач - _, err = tx.Exec("DELETE FROM task_draft_subtasks WHERE task_draft_id = $1", draftID) - if err != nil { - log.Printf("Error deleting old draft subtasks: %v", err) - sendErrorWithCORS(w, fmt.Sprintf("Error deleting old draft subtasks: %v", err), http.StatusInternalServerError) - return + // Удаляем все старые записи подзадач только если они были переданы + if req.ChildrenTaskIDs != nil { + _, err = tx.Exec("DELETE FROM task_draft_subtasks WHERE task_draft_id = $1", draftID) + if err != nil { + log.Printf("Error deleting old draft subtasks: %v", err) + sendErrorWithCORS(w, fmt.Sprintf("Error deleting old draft subtasks: %v", err), http.StatusInternalServerError) + return + } } } // Вставляем новые записи подзадач (только checked подзадачи) - if len(req.ChildrenTaskIDs) > 0 { + if req.ChildrenTaskIDs != nil && len(*req.ChildrenTaskIDs) > 0 { + childrenIDs := *req.ChildrenTaskIDs // Проверяем, что все подзадачи принадлежат этой задаче - placeholders := make([]string, len(req.ChildrenTaskIDs)) - args := make([]interface{}, len(req.ChildrenTaskIDs)+1) + placeholders := make([]string, len(childrenIDs)) + args := make([]interface{}, len(childrenIDs)+1) args[0] = taskID - for i, id := range req.ChildrenTaskIDs { + for i, id := range childrenIDs { placeholders[i] = fmt.Sprintf("$%d", i+2) args[i+1] = id } @@ -10113,7 +10135,7 @@ func (a *App) completeTaskAtEndOfDayHandler(w http.ResponseWriter, r *http.Reque } // Вставляем только валидные подзадачи - for _, subtaskID := range req.ChildrenTaskIDs { + for _, subtaskID := range childrenIDs { if validSubtaskIDs[subtaskID] { _, err = tx.Exec(` INSERT INTO task_draft_subtasks (task_draft_id, subtask_id) diff --git a/play-life-web/package.json b/play-life-web/package.json index 10db1d6..cb868cc 100644 --- a/play-life-web/package.json +++ b/play-life-web/package.json @@ -1,6 +1,6 @@ { "name": "play-life-web", - "version": "5.10.0", + "version": "5.10.1", "type": "module", "scripts": { "dev": "vite", diff --git a/play-life-web/src/components/TaskList.jsx b/play-life-web/src/components/TaskList.jsx index 0ef100a..5ad4988 100644 --- a/play-life-web/src/components/TaskList.jsx +++ b/play-life-web/src/components/TaskList.jsx @@ -566,9 +566,7 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, error, onRetry 'Content-Type': 'application/json', }, body: JSON.stringify({ - progression_value: newValue, - auto_complete: false, - children_task_ids: [] + progression_value: newValue }), })