From 895263f054ea36010d80f5e6458d678fd932e33a Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 21 Jun 2023 14:59:40 +0200 Subject: [PATCH] fix(filters): sorting tasks from filters Resolves https://community.vikunja.io/t/filter-table-view-not-sorting/1416 --- pkg/models/task_collection.go | 22 ++++++++++++------ pkg/models/task_collection_test.go | 36 ++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/pkg/models/task_collection.go b/pkg/models/task_collection.go index 5c2c038bcbe..de4b228b68f 100644 --- a/pkg/models/task_collection.go +++ b/pkg/models/task_collection.go @@ -149,13 +149,21 @@ func (tf *TaskCollection) ReadAll(s *xorm.Session, a web.Auth, search string, pa return nil, 0, 0, err } - sf.Filters.SortByArr = append(sf.Filters.SortByArr, tf.SortByArr...) - sf.Filters.SortBy = append(sf.Filters.SortBy, tf.SortBy...) - if len(sf.Filters.OrderBy) > len(sf.Filters.SortBy) { - sf.Filters.OrderBy = sf.Filters.OrderBy[:len(sf.Filters.SortBy)] - } - sf.Filters.OrderBy = append(sf.Filters.OrderBy, tf.OrderBy...) - sf.Filters.OrderByArr = tf.OrderByArr + // By prepending sort options before the saved ones from the filter, we make sure the supplied sort + // options via query take precedence over the rest. + + sortby := append(tf.SortBy, tf.SortByArr...) + sortby = append(sortby, sf.Filters.SortBy...) + sortby = append(sortby, sf.Filters.SortByArr...) + + orderby := append(tf.OrderBy, tf.OrderByArr...) + orderby = append(orderby, sf.Filters.OrderBy...) + orderby = append(orderby, sf.Filters.OrderByArr...) + + sf.Filters.SortBy = sortby + sf.Filters.SortByArr = nil + sf.Filters.OrderBy = orderby + sf.Filters.OrderByArr = nil return sf.getTaskCollection().ReadAll(s, a, search, page, perPage) } diff --git a/pkg/models/task_collection_test.go b/pkg/models/task_collection_test.go index 615115f2215..e89da00676a 100644 --- a/pkg/models/task_collection_test.go +++ b/pkg/models/task_collection_test.go @@ -1211,6 +1211,42 @@ func TestTaskCollection_ReadAll(t *testing.T) { task5, }, }, + { + name: "saved filter with sort order asc", + fields: fields{ + ProjectID: -2, + SortBy: []string{"title", "id"}, + OrderBy: []string{"asc", "asc"}, + }, + args: args{ + a: &user.User{ID: 1}, + }, + want: []*Task{ + task5, + task6, + task7, + task8, + task9, + }, + }, + { + name: "saved filter with sort by due date", + fields: fields{ + ProjectID: -2, + SortBy: []string{"due_date", "id"}, + OrderBy: []string{"asc", "asc"}, + }, + args: args{ + a: &user.User{ID: 1}, + }, + want: []*Task{ + task6, + task5, + task7, + task8, + task9, + }, + }, } for _, tt := range tests {