From 3ca4913fcb6dc287adec552dd62024a3b63f477a Mon Sep 17 00:00:00 2001 From: Weijie Zhao Date: Mon, 2 Mar 2026 16:14:38 +0800 Subject: [PATCH] fix: use MinPositionSpacing threshold in calculateNewPositionForTask (#2320) calculateNewPositionForTask only checked for lowestPosition == 0 before triggering a full position recalculation. Extremely small position values (e.g. 3.16e-285) passed this check, causing new tasks to get meaningless positions via the index * 2^16 fallback, breaking sort order. Use the same < MinPositionSpacing threshold that createPositionsForTasksInView and the position update handler already use. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- pkg/models/task_position.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/models/task_position.go b/pkg/models/task_position.go index 0f4d9c0bb..9465f2d4a 100644 --- a/pkg/models/task_position.go +++ b/pkg/models/task_position.go @@ -303,7 +303,8 @@ func recalculateTaskPositionsForRepair(s *xorm.Session, view *ProjectView) error } func calculateNewPositionForTask(s *xorm.Session, a web.Auth, t *Task, view *ProjectView) (*TaskPosition, error) { - if t.Position == 0 { + position := t.Position + if position == 0 { lowestPosition := &TaskPosition{} exists, err := s.Where("project_view_id = ?", view.ID). OrderBy("position asc"). @@ -312,7 +313,7 @@ func calculateNewPositionForTask(s *xorm.Session, a web.Auth, t *Task, view *Pro return nil, err } if exists { - if lowestPosition.Position == 0 { + if lowestPosition.Position < MinPositionSpacing { err = RecalculateTaskPositions(s, view, a) if err != nil { return nil, err @@ -327,14 +328,14 @@ func calculateNewPositionForTask(s *xorm.Session, a web.Auth, t *Task, view *Pro } } - t.Position = lowestPosition.Position / 2 + position = lowestPosition.Position / 2 } } return &TaskPosition{ TaskID: t.ID, ProjectViewID: view.ID, - Position: calculateDefaultPosition(t.Index, t.Position), + Position: calculateDefaultPosition(t.Index, position), }, nil }