From f8fb9d7407ca1cc6b3c0dd075fb2c5d279b71aac Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 17 Jul 2024 12:57:38 +0200 Subject: [PATCH] fix(filters): add tasks to filter buckets when updating the filter --- pkg/models/project_view.go | 53 ++++++++++++++------------ pkg/models/saved_filters.go | 75 ++++++++++++++++++++++++++++++++++++- 2 files changed, 102 insertions(+), 26 deletions(-) diff --git a/pkg/models/project_view.go b/pkg/models/project_view.go index cd108bddb..28e7d7d70 100644 --- a/pkg/models/project_view.go +++ b/pkg/models/project_view.go @@ -280,37 +280,42 @@ func createProjectView(s *xorm.Session, p *ProjectView, a web.Auth, createBacklo } // Move all tasks into the new bucket when the project already has tasks - c := &TaskCollection{ - ProjectID: p.ProjectID, - } - ts, _, _, err := c.ReadAll(s, a, "", 0, -1) + err = addTasksToView(s, a, p, b) if err != nil { - return err - } - tasks := ts.([]*Task) - - if len(tasks) == 0 { - return nil - } - - taskBuckets := []*TaskBucket{} - for _, task := range tasks { - taskBuckets = append(taskBuckets, &TaskBucket{ - TaskID: task.ID, - BucketID: b.ID, - ProjectViewID: p.ID, - }) - } - - _, err = s.Insert(&taskBuckets) - if err != nil { - return err + return } } return RecalculateTaskPositions(s, p, a) } +func addTasksToView(s *xorm.Session, a web.Auth, pv *ProjectView, b *Bucket) (err error) { + c := &TaskCollection{ + ProjectID: pv.ProjectID, + } + ts, _, _, err := c.ReadAll(s, a, "", 0, -1) + if err != nil { + return err + } + tasks := ts.([]*Task) + + if len(tasks) == 0 { + return nil + } + + taskBuckets := []*TaskBucket{} + for _, task := range tasks { + taskBuckets = append(taskBuckets, &TaskBucket{ + TaskID: task.ID, + BucketID: b.ID, + ProjectViewID: pv.ID, + }) + } + + _, err = s.Insert(&taskBuckets) + return err +} + // Update is the handler to update a project view // @Summary Updates a project view // @Description Updates a project view. diff --git a/pkg/models/saved_filters.go b/pkg/models/saved_filters.go index f3ef5af30..d55105afb 100644 --- a/pkg/models/saved_filters.go +++ b/pkg/models/saved_filters.go @@ -18,12 +18,12 @@ package models import ( "time" - "xorm.io/builder" "code.vikunja.io/api/pkg/log" "code.vikunja.io/api/pkg/user" "code.vikunja.io/web" + "xorm.io/builder" "xorm.io/xorm" ) @@ -195,7 +195,78 @@ func (sf *SavedFilter) Update(s *xorm.Session, _ web.Auth) error { "is_favorite", ). Update(sf) - return err + if err != nil { + return err + } + + // Add all tasks which are not already in a bucket to the default bucket + kanbanFilterViews := []*ProjectView{} + err = s.Where("project_id = ? and view_kind = ? and bucket_configuration_mode = ?", getProjectIDFromSavedFilterID(sf.ID), ProjectViewKindKanban, BucketConfigurationModeManual). + Find(&kanbanFilterViews) + if err != nil || len(kanbanFilterViews) == 0 { + return err + } + + parsedFilters, err := getTaskFiltersFromFilterString(sf.Filters.Filter, sf.Filters.FilterTimezone) + if err != nil { + return err + } + + filterCond, err := convertFiltersToDBFilterCond(parsedFilters, sf.Filters.FilterIncludeNulls) + if err != nil { + return err + } + + taskBuckets := []*TaskBucket{} + taskPositions := []*TaskPosition{} + + for _, view := range kanbanFilterViews { + // Fetch all tasks in the filter but not in task_bucket + // select * from tasks where id not in (select task_id from task_buckets where project_view_id = ?) and FILTER_COND + tasksToAdd := []*Task{} + err = s.Where(builder.And( + builder.NotIn("id", + builder. + Select("task_id"). + From("task_buckets"). + Where(builder.Eq{"project_view_id": view.ID})), + filterCond, + )). + Find(&tasksToAdd) + if err != nil { + return err + } + + bucketID, err := getDefaultBucketID(s, view) + if err != nil { + return err + } + + for _, task := range tasksToAdd { + taskBuckets = append(taskBuckets, &TaskBucket{ + TaskID: task.ID, + BucketID: bucketID, + ProjectViewID: view.ID, + }) + + taskPositions = append(taskPositions, &TaskPosition{ + TaskID: task.ID, + ProjectViewID: view.ID, + Position: 0, + }) + } + } + + _, err = s.Insert(taskBuckets) + if err != nil { + return err + } + _, err = s.Insert(taskPositions) + if err != nil { + return err + } + + return nil } // Delete removes a saved filter