1
0

fix(tasks): use correct filter query when filtering

This commit is contained in:
kolaente 2024-03-11 16:39:27 +01:00
parent a66e26678e
commit e097721817
No known key found for this signature in database
GPG Key ID: F40E70337AB24C9B
7 changed files with 52 additions and 112 deletions

View File

@ -350,26 +350,6 @@ const isNewTaskCommand = computed(() => (
const taskSearchTimeout = ref<ReturnType<typeof setTimeout> | null>(null) const taskSearchTimeout = ref<ReturnType<typeof setTimeout> | null>(null)
type Filter = { by: string, value: string | number, comparator: string }
function filtersToParams(filters: Filter[]) {
const filter_by: Filter['by'][] = []
const filter_value: Filter['value'][] = []
const filter_comparator: Filter['comparator'][] = []
filters.forEach(({by, value, comparator}) => {
filter_by.push(by)
filter_value.push(value)
filter_comparator.push(comparator)
})
return {
filter_by,
filter_value,
filter_comparator,
}
}
function searchTasks() { function searchTasks() {
if ( if (
searchMode.value !== SEARCH_MODE.ALL && searchMode.value !== SEARCH_MODE.ALL &&
@ -391,40 +371,27 @@ function searchTasks() {
const {text, project: projectName, labels} = parsedQuery.value const {text, project: projectName, labels} = parsedQuery.value
const filters: Filter[] = [] let filter = ''
// FIXME: improve types
function addFilter(
by: Filter['by'],
value: Filter['value'],
comparator: Filter['comparator'],
) {
filters.push({
by,
value,
comparator,
})
}
if (projectName !== null) { if (projectName !== null) {
const project = projectStore.findProjectByExactname(projectName) const project = projectStore.findProjectByExactname(projectName)
console.log({project}) console.log({project})
if (project !== null) { if (project !== null) {
addFilter('project_id', project.id, 'equals') filter += ' project = ' + project.id
} }
} }
if (labels.length > 0) { if (labels.length > 0) {
const labelIds = labelStore.getLabelsByExactTitles(labels).map((l) => l.id) const labelIds = labelStore.getLabelsByExactTitles(labels).map((l) => l.id)
if (labelIds.length > 0) { if (labelIds.length > 0) {
addFilter('labels', labelIds.join(), 'in') filter += 'labels in ' + labelIds.join(', ')
} }
} }
const params = { const params = {
s: text, s: text,
sort_by: 'done', sort_by: 'done',
...filtersToParams(filters), filter,
} }
taskSearchTimeout.value = setTimeout(async () => { taskSearchTimeout.value = setTimeout(async () => {

View File

@ -2,7 +2,7 @@ import {ref, shallowReactive, watch, computed, type ComputedGetter} from 'vue'
import {useRoute} from 'vue-router' import {useRoute} from 'vue-router'
import {useRouteQuery} from '@vueuse/router' import {useRouteQuery} from '@vueuse/router'
import TaskCollectionService, {getDefaultTaskFilterParams} from '@/services/taskCollection' import TaskCollectionService, {getDefaultTaskFilterParams, type TaskFilterParams} from '@/services/taskCollection'
import type {ITask} from '@/modelTypes/ITask' import type {ITask} from '@/modelTypes/ITask'
import {error} from '@/message' import {error} from '@/message'
import type {IProject} from '@/modelTypes/IProject' import type {IProject} from '@/modelTypes/IProject'
@ -58,7 +58,7 @@ export function useTaskList(projectIdGetter: ComputedGetter<IProject['id']>, sor
const projectId = computed(() => projectIdGetter()) const projectId = computed(() => projectIdGetter())
const params = ref({...getDefaultTaskFilterParams()}) const params = ref<TaskFilterParams>({...getDefaultTaskFilterParams()})
const search = ref('') const search = ref('')
const page = useRouteQuery('page', '1', { transform: Number }) const page = useRouteQuery('page', '1', { transform: Number })

View File

@ -4,12 +4,13 @@ import TaskModel from '@/models/task'
import type {ITask} from '@/modelTypes/ITask' import type {ITask} from '@/modelTypes/ITask'
export interface TaskFilterParams { export interface TaskFilterParams {
sort_by: ('start_date' | 'done' | 'id' | 'position')[], sort_by: ('start_date' | 'done' | 'id' | 'position' | 'kanban_position')[],
order_by: ('asc' | 'desc')[], order_by: ('asc' | 'desc')[],
filter: string, filter: string,
filter_include_nulls: boolean, filter_include_nulls: boolean,
filter_timezone: string, filter_timezone?: string,
s: string, s: string,
per_page?: number,
} }
export function getDefaultTaskFilterParams(): TaskFilterParams { export function getDefaultTaskFilterParams(): TaskFilterParams {

View File

@ -1,5 +1,5 @@
import {computed, readonly, ref} from 'vue' import {computed, readonly, ref} from 'vue'
import {defineStore, acceptHMRUpdate} from 'pinia' import {acceptHMRUpdate, defineStore} from 'pinia'
import {klona} from 'klona/lite' import {klona} from 'klona/lite'
import {findById, findIndexById} from '@/helpers/utils' import {findById, findIndexById} from '@/helpers/utils'
@ -270,28 +270,10 @@ export const useKanbanStore = defineStore('kanban', () => {
const params: TaskFilterParams = JSON.parse(JSON.stringify(ps)) const params: TaskFilterParams = JSON.parse(JSON.stringify(ps))
params.sort_by = 'kanban_position' params.sort_by = ['kanban_position']
params.order_by = 'asc' params.order_by = ['asc']
params.filter = `${params.filter === '' ? '' : params.filter + ' && '}bucket_id = ${bucketId}`
let hasBucketFilter = false
for (const f in params.filter_by) {
if (params.filter_by[f] === 'bucket_id') {
hasBucketFilter = true
if (params.filter_value[f] !== bucketId) {
params.filter_value[f] = bucketId
}
break
}
}
if (!hasBucketFilter) {
params.filter_by = [...(params.filter_by ?? []), 'bucket_id']
params.filter_value = [...(params.filter_value ?? []), bucketId]
params.filter_comparator = [...(params.filter_comparator ?? []), 'equals']
}
params.filter_timezone = authStore.settings.timezone params.filter_timezone = authStore.settings.timezone
params.per_page = TASKS_PER_BUCKET params.per_page = TASKS_PER_BUCKET
const taskService = new TaskCollectionService() const taskService = new TaskCollectionService()

View File

@ -126,7 +126,7 @@ export const useTaskStore = defineStore('task', () => {
async function loadTasks(params: TaskFilterParams, projectId: IProject['id'] | null = null) { async function loadTasks(params: TaskFilterParams, projectId: IProject['id'] | null = null) {
if (params.filter_timezone === '') { if (!params.filter_timezone || params.filter_timezone === '') {
params.filter_timezone = authStore.settings.timezone params.filter_timezone = authStore.settings.timezone
} }

View File

@ -333,9 +333,7 @@ const {
const tasks: Ref<ITask[]> = taskList.tasks const tasks: Ref<ITask[]> = taskList.tasks
Object.assign(params.value, { Object.assign(params.value, {
filter_by: [], filter: '',
filter_value: [],
filter_comparator: [],
}) })
// FIXME: by doing this we can have multiple sort orders // FIXME: by doing this we can have multiple sort orders

View File

@ -182,29 +182,21 @@ async function loadPendingTasks(from: string, to: string) {
return return
} }
const params = { const params: TaskFilterParams = {
sortBy: ['due_date', 'id'], sort_by: ['due_date', 'id'],
orderBy: ['asc', 'desc'], order_by: ['asc', 'desc'],
filterTimezone: authStore.settings.timezone, filter: 'done = false',
filterBy: ['done'], filter_include_nulls: showNulls,
filterValue: ['false'],
filterComparator: ['equals'],
filterConcat: 'and',
filterIncludeNulls: showNulls,
} }
if (!showAll.value) { if (!showAll.value) {
params.filterBy.push('due_date') params.filter += ` && due_date < '${to}'`
params.filterValue.push(to)
params.filterComparator.push('less')
// NOTE: Ideally we could also show tasks with a start or end date in the specified range, but the api // NOTE: Ideally we could also show tasks with a start or end date in the specified range, but the api
// is not capable (yet) of combining multiple filters with 'and' and 'or'. // is not capable (yet) of combining multiple filters with 'and' and 'or'.
if (!showOverdue) { if (!showOverdue) {
params.filterBy.push('due_date') params.filter += ` && due_date > '${from}'`
params.filterValue.push(from)
params.filterComparator.push('greater')
} }
} }