diff --git a/pkg/models/tasks.go b/pkg/models/tasks.go index 05b8d505f..3a0ff0538 100644 --- a/pkg/models/tasks.go +++ b/pkg/models/tasks.go @@ -787,9 +787,12 @@ func (t *Task) Update() (err error) { } // Check the bucket limit - if err := checkBucketLimit(s, t, bucket); err != nil { - _ = s.Rollback() - return err + // Only check the bucket limit if the task is being moved between buckets, allow reordering the task within a bucket + if t.BucketID != ot.BucketID { + if err := checkBucketLimit(s, t, bucket); err != nil { + _ = s.Rollback() + return err + } } // Update the labels diff --git a/pkg/models/tasks_test.go b/pkg/models/tasks_test.go index 80f8b1017..aaaaf937e 100644 --- a/pkg/models/tasks_test.go +++ b/pkg/models/tasks_test.go @@ -136,6 +136,19 @@ func TestTask_Update(t *testing.T) { assert.Error(t, err) assert.True(t, IsErrBucketLimitExceeded(err)) }) + t.Run("full bucket but not changing the bucket", func(t *testing.T) { + db.LoadAndAssertFixtures(t) + task := &Task{ + ID: 4, + Title: "test10000", + Description: "Lorem Ipsum Dolor", + Position: 10, + ListID: 1, + BucketID: 2, // Bucket 2 already has 3 tasks and a limit of 3 + } + err := task.Update() + assert.NoError(t, err) + }) } func TestTask_Delete(t *testing.T) {