diff --git a/pkg/models/task_collection_filter.go b/pkg/models/task_collection_filter.go index 0a3caa948..81bc0547d 100644 --- a/pkg/models/task_collection_filter.go +++ b/pkg/models/task_collection_filter.go @@ -27,6 +27,7 @@ const ( taskFilterComparatorGreateEquals taskFilterComparator = ">=" taskFilterComparatorLess taskFilterComparator = "<" taskFilterComparatorLessEquals taskFilterComparator = "<=" + taskFilterComparatorNotEquals taskFilterComparator = "!=" ) type taskFilter struct { @@ -47,7 +48,8 @@ func (tf *taskFilter) validate() (err error) { taskFilterComparatorGreater, taskFilterComparatorGreateEquals, taskFilterComparatorLess, - taskFilterComparatorLessEquals: + taskFilterComparatorLessEquals, + taskFilterComparatorNotEquals: return nil default: return ErrInvalidTaskFilterComparator{Comparator: tf.comparator} @@ -66,6 +68,8 @@ func getFilterComparatorFromString(comparator string) (taskFilterComparator, err return taskFilterComparatorLess, nil case "less_equals": return taskFilterComparatorLessEquals, nil + case "not_equals": + return taskFilterComparatorNotEquals, nil default: return taskFilterComparatorInvalid, ErrInvalidTaskFilterComparator{Comparator: taskFilterComparator(comparator)} } diff --git a/pkg/models/tasks.go b/pkg/models/tasks.go index 3f42f4935..d38991bc1 100644 --- a/pkg/models/tasks.go +++ b/pkg/models/tasks.go @@ -27,6 +27,7 @@ import ( "sort" "strconv" "time" + "xorm.io/builder" ) // Task represents an task in a todolist @@ -164,27 +165,32 @@ func getRawTasksForLists(lists []*List, opts *taskOptions) (taskMap map[int64]*T } } + var filters = make([]builder.Cond, 0, len(opts.filters)) + for _, f := range opts.filters { + switch f.comparator { + case taskFilterComparatorEquals: + filters = append(filters, &builder.Eq{f.field: f.value}) + case taskFilterComparatorNotEquals: + filters = append(filters, &builder.Neq{f.field: f.value}) + case taskFilterComparatorGreater: + filters = append(filters, &builder.Gt{f.field: f.value}) + case taskFilterComparatorGreateEquals: + filters = append(filters, &builder.Gte{f.field: f.value}) + case taskFilterComparatorLess: + filters = append(filters, &builder.Lt{f.field: f.value}) + case taskFilterComparatorLessEquals: + filters = append(filters, &builder.Lte{f.field: f.value}) + } + } + taskMap = make(map[int64]*Task) // Then return all tasks for that lists - if opts.startDate.Unix() != 0 || opts.endDate.Unix() != 0 { - - startDateUnix := time.Now().Unix() - if opts.startDate.Unix() != 0 { - startDateUnix = opts.startDate.Unix() - } - - endDateUnix := time.Now().Unix() - if opts.endDate.Unix() != 0 { - endDateUnix = opts.endDate.Unix() - } + if len(filters) > 0 { err := x.In("list_id", listIDs). Where("text LIKE ?", "%"+opts.search+"%"). - // TODO: Remove this in favour of filters - And("((due_date_unix BETWEEN ? AND ?) OR "+ - "(start_date_unix BETWEEN ? and ?) OR "+ - "(end_date_unix BETWEEN ? and ?))", startDateUnix, endDateUnix, startDateUnix, endDateUnix, startDateUnix, endDateUnix). + And(filters). OrderBy(orderby). Limit(getLimitFromPageIndex(opts.page, opts.perPage)). Find(&taskMap) @@ -194,9 +200,7 @@ func getRawTasksForLists(lists []*List, opts *taskOptions) (taskMap map[int64]*T totalItems, err = x.In("list_id", listIDs). Where("text LIKE ?", "%"+opts.search+"%"). - And("((due_date_unix BETWEEN ? AND ?) OR "+ - "(start_date_unix BETWEEN ? and ?) OR "+ - "(end_date_unix BETWEEN ? and ?))", startDateUnix, endDateUnix, startDateUnix, endDateUnix, startDateUnix, endDateUnix). + And(filters). Count(&Task{}) if err != nil { return nil, 0, 0, err