1
0

feat(filters): pass timezone down when filtering with relative date math

Resolves https://community.vikunja.io/t/my-vikunja-instance-creates-tasks-with-due-date-time-of-9am-for-tasks-with-the-word-today-word-in-it/2105/8
This commit is contained in:
kolaente
2024-03-11 16:13:42 +01:00
parent 6fc3d1e98f
commit a66e26678e
10 changed files with 65 additions and 19 deletions

View File

@ -6,6 +6,7 @@ import TaskCollectionService, {getDefaultTaskFilterParams} from '@/services/task
import type {ITask} from '@/modelTypes/ITask'
import {error} from '@/message'
import type {IProject} from '@/modelTypes/IProject'
import {useAuthStore} from '@/stores/auth'
export type Order = 'asc' | 'desc' | 'none'
@ -81,11 +82,16 @@ export function useTaskList(projectIdGetter: ComputedGetter<IProject['id']>, sor
page.value = 1
},
)
const authStore = useAuthStore()
const getAllTasksParams = computed(() => {
return [
{projectId: projectId.value},
allParams.value,
{
...allParams.value,
filter_timezone: authStore.settings.timezone,
},
page.value,
]
})

View File

@ -8,6 +8,7 @@ export interface TaskFilterParams {
order_by: ('asc' | 'desc')[],
filter: string,
filter_include_nulls: boolean,
filter_timezone: string,
s: string,
}
@ -17,6 +18,7 @@ export function getDefaultTaskFilterParams(): TaskFilterParams {
order_by: ['asc', 'desc'],
filter: '',
filter_include_nulls: false,
filter_timezone: '',
s: '',
}
}

View File

@ -7,13 +7,14 @@ import {i18n} from '@/i18n'
import {success} from '@/message'
import BucketService from '@/services/bucket'
import TaskCollectionService from '@/services/taskCollection'
import TaskCollectionService, {type TaskFilterParams} from '@/services/taskCollection'
import {setModuleLoading} from '@/stores/helper'
import type {ITask} from '@/modelTypes/ITask'
import type {IProject} from '@/modelTypes/IProject'
import type {IBucket} from '@/modelTypes/IBucket'
import {useAuthStore} from '@/stores/auth'
const TASKS_PER_BUCKET = 25
@ -44,6 +45,8 @@ const addTaskToBucketAndSort = (buckets: IBucket[], task: ITask) => {
* It should hold only the current buckets.
*/
export const useKanbanStore = defineStore('kanban', () => {
const authStore = useAuthStore()
const buckets = ref<IBucket[]>([])
const projectId = ref<IProject['id']>(0)
const bucketLoading = ref<{[id: IBucket['id']]: boolean}>({})
@ -247,7 +250,7 @@ export const useKanbanStore = defineStore('kanban', () => {
async function loadNextTasksForBucket(
projectId: IProject['id'],
ps,
ps: TaskFilterParams,
bucketId: IBucket['id'],
) {
const isLoading = bucketLoading.value[bucketId] ?? false
@ -265,7 +268,7 @@ export const useKanbanStore = defineStore('kanban', () => {
const cancel = setModuleLoading(setIsLoading)
setBucketLoading({bucketId: bucketId, loading: true})
const params = JSON.parse(JSON.stringify(ps))
const params: TaskFilterParams = JSON.parse(JSON.stringify(ps))
params.sort_by = 'kanban_position'
params.order_by = 'asc'
@ -286,6 +289,8 @@ export const useKanbanStore = defineStore('kanban', () => {
params.filter_value = [...(params.filter_value ?? []), bucketId]
params.filter_comparator = [...(params.filter_comparator ?? []), 'equals']
}
params.filter_timezone = authStore.settings.timezone
params.per_page = TASKS_PER_BUCKET

View File

@ -28,7 +28,7 @@ import {useKanbanStore} from '@/stores/kanban'
import {useBaseStore} from '@/stores/base'
import ProjectUserService from '@/services/projectUsers'
import {useAuthStore} from '@/stores/auth'
import TaskCollectionService from '@/services/taskCollection'
import TaskCollectionService, {type TaskFilterParams} from '@/services/taskCollection'
import {getRandomColorHex} from '@/helpers/color/randomColor'
interface MatchedAssignee extends IUser {
@ -124,7 +124,11 @@ export const useTaskStore = defineStore('task', () => {
})
}
async function loadTasks(params, projectId: IProject['id'] | null = null) {
async function loadTasks(params: TaskFilterParams, projectId: IProject['id'] | null = null) {
if (params.filter_timezone === '') {
params.filter_timezone = authStore.settings.timezone
}
const cancel = setModuleLoading(setIsLoading)
try {

View File

@ -9,6 +9,7 @@ import TaskService from '@/services/task'
import TaskModel from '@/models/task'
import {error, success} from '@/message'
import {useAuthStore} from '@/stores/auth'
// FIXME: unify with general `useTaskList`
export function useGanttTaskList<F extends Filters>(
@ -21,12 +22,18 @@ export function useGanttTaskList<F extends Filters>(
}) {
const taskCollectionService = shallowReactive(new TaskCollectionService())
const taskService = shallowReactive(new TaskService())
const authStore = useAuthStore()
const isLoading = computed(() => taskCollectionService.loading)
const tasks = ref<Map<ITask['id'], ITask>>(new Map())
async function fetchTasks(params: TaskFilterParams, page = 1): Promise<ITask[]> {
if(params.filter_timezone === '') {
params.filter_timezone = authStore.settings.timezone
}
const tasks = await taskCollectionService.getAll({projectId: filters.value.projectId}, params, page) as ITask[]
if (options.loadAll && page < taskCollectionService.totalPages) {
const nextTasks = await fetchTasks(params, page + 1)

View File

@ -85,6 +85,7 @@ import type {ITask} from '@/modelTypes/ITask'
import {useAuthStore} from '@/stores/auth'
import {useTaskStore} from '@/stores/tasks'
import {useProjectStore} from '@/stores/projects'
import type {TaskFilterParams} from '@/services/taskCollection'
// Linting disabled because we explicitely enabled destructuring in vite's config, this will work.
// eslint-disable-next-line vue/no-setup-props-destructure
@ -184,6 +185,7 @@ async function loadPendingTasks(from: string, to: string) {
const params = {
sortBy: ['due_date', 'id'],
orderBy: ['asc', 'desc'],
filterTimezone: authStore.settings.timezone,
filterBy: ['done'],
filterValue: ['false'],
filterComparator: ['equals'],