From cd588caa026087f13da82853f4c7d8e0e84b6558 Mon Sep 17 00:00:00 2001 From: konrad Date: Sat, 27 Jun 2020 17:04:30 +0000 Subject: [PATCH] Fix Datetime Handling (#168) Fix task filters Fix null dates Co-authored-by: kolaente Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/168 --- src/components/migrator/migration.vue | 4 +-- src/models/task.js | 38 +++++++++++++-------------- src/views/list/views/Table.vue | 6 ++--- src/views/tasks/ShowTasks.vue | 9 ++++--- src/views/tasks/TaskDetailView.vue | 6 ++--- 5 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/components/migrator/migration.vue b/src/components/migrator/migration.vue index 74455afd..db385df7 100644 --- a/src/components/migrator/migration.vue +++ b/src/components/migrator/migration.vue @@ -78,8 +78,8 @@ this.wunderlistCode = this.$route.query.code this.migrationService.getStatus() .then(r => { - if(r.time_unix) { - this.lastMigrationDate = new Date(r.time_unix) + if(r.time) { + this.lastMigrationDate = new Date(r.time) return } this.migrate() diff --git a/src/models/task.js b/src/models/task.js index 311f11c5..ce84e42e 100644 --- a/src/models/task.js +++ b/src/models/task.js @@ -14,9 +14,9 @@ export default class TaskModel extends AbstractModel { this.listId = Number(this.listId) // Make date objects from timestamps - this.dueDate = this.dueDate ? new Date(this.dueDate) : null - this.startDate = this.startDate ? new Date(this.startDate) : null - this.endDate = this.endDate ? new Date(this.endDate) : null + this.dueDate = this.dueDate && !this.dueDate.startsWith('0001') ? new Date(this.dueDate) : null + this.startDate = this.startDate && !this.startDate.startsWith('0001') ? new Date(this.startDate) : null + this.endDate = this.endDate && !this.endDate.startsWith('0001') ? new Date(this.endDate) : null // Cancel all scheduled notifications for this task to be sure to only have available notifications this.cancelScheduledNotifications() @@ -32,13 +32,13 @@ export default class TaskModel extends AbstractModel { // Parse the repeat after into something usable this.parseRepeatAfter() - + // Parse the assignees into user models this.assignees = this.assignees.map(a => { return new UserModel(a) }) this.createdBy = new UserModel(this.createdBy) - + this.labels = this.labels.map(l => { return new LabelModel(l) }) @@ -52,7 +52,7 @@ export default class TaskModel extends AbstractModel { } // Make all subtasks to task models - Object.keys(this.relatedTasks).forEach(relationKind => { + Object.keys(this.relatedTasks).forEach(relationKind => { this.relatedTasks[relationKind] = this.relatedTasks[relationKind].map(t => { return new TaskModel(t) }) @@ -64,14 +64,14 @@ export default class TaskModel extends AbstractModel { }) // Set the task identifier to empty if the list does not have one - if(this.identifier === `-${this.index}`) { + if (this.identifier === `-${this.index}`) { this.identifier = '' } this.created = new Date(this.created) this.updated = new Date(this.updated) } - + defaults() { return { id: 0, @@ -81,7 +81,7 @@ export default class TaskModel extends AbstractModel { priority: 0, labels: [], assignees: [], - + dueDate: 0, startDate: 0, endDate: 0, @@ -99,15 +99,15 @@ export default class TaskModel extends AbstractModel { createdBy: UserModel, created: null, updated: null, - + listId: 0, // Meta, only used when creating a new task } } - + ///////////////// // Helper functions /////////////// - + /** * Parses the "repeat after x seconds" from the task into a usable js object inside the task. * This function should only be called from the constructor. @@ -157,7 +157,7 @@ export default class TaskModel extends AbstractModel { async scheduleNotification(date) { - if(date < new Date()) { + if (date < new Date()) { console.debug('Date is in the past, not scheduling a notification. Date is ', date) return } @@ -199,12 +199,12 @@ export default class TaskModel extends AbstractModel { }, ], }) - .then(() => { - console.debug('Notification scheduled for ' + date) - }) - .catch(e => { - console.debug('Error scheduling notification', e) - }) + .then(() => { + console.debug('Notification scheduled for ' + date) + }) + .catch(e => { + console.debug('Error scheduling notification', e) + }) } } diff --git a/src/views/list/views/Table.vue b/src/views/list/views/Table.vue index aeebf7b5..ee40d136 100644 --- a/src/views/list/views/Table.vue +++ b/src/views/list/views/Table.vue @@ -68,15 +68,15 @@ Due Date - + Start Date - + End Date - + % Done diff --git a/src/views/tasks/ShowTasks.vue b/src/views/tasks/ShowTasks.vue index 3c4a5e06..cee33d5f 100644 --- a/src/views/tasks/ShowTasks.vue +++ b/src/views/tasks/ShowTasks.vue @@ -57,24 +57,25 @@ } const params = { - sort_by: ['due_date_unix', 'id'], + sort_by: ['due_date', 'id'], order_by: ['desc', 'desc'], filter_by: ['done'], filter_value: [false], filter_comparator: ['equals'], filter_concat: 'and', + filter_include_nulls: true, } if (!this.showAll) { params.filter_by.push('start_date') - params.filter_value.push(Math.round(+this.startDate / 1000)) + params.filter_value.push(this.startDate) params.filter_comparator.push('greater') params.filter_by.push('end_date') - params.filter_value.push(Math.round(+this.endDate / 1000)) + params.filter_value.push(this.endDate) params.filter_comparator.push('less') params.filter_by.push('due_date') - params.filter_value.push(Math.round(+this.endDate / 1000)) + params.filter_value.push(this.endDate) params.filter_comparator.push('less') } diff --git a/src/views/tasks/TaskDetailView.vue b/src/views/tasks/TaskDetailView.vue index 5211a485..ef200868 100644 --- a/src/views/tasks/TaskDetailView.vue +++ b/src/views/tasks/TaskDetailView.vue @@ -460,9 +460,9 @@ }, setActiveFields() { - this.dueDate = +new Date(this.task.dueDate) === 0 ? null : this.task.dueDate - this.task.startDate = +new Date(this.task.startDate) === 0 ? null : this.task.startDate - this.task.endDate = +new Date(this.task.endDate) === 0 ? null : this.task.endDate + this.dueDate = this.task.dueDate ? this.task.dueDate : null + this.task.startDate = this.task.startDate ? this.task.startDate : null + this.task.endDate = this.task.endDate ? this.task.endDate : null // Set all active fields based on values in the model this.activeFields.assignees = this.task.assignees.length > 0