feat: add properties to models
This commit is contained in:
parent
74ad6e65e8
commit
797de0c543
33 changed files with 367 additions and 186 deletions
|
|
@ -2,69 +2,86 @@ import AbstractModel from './abstractModel'
|
|||
import UserModel from './user'
|
||||
import LabelModel from './label'
|
||||
import AttachmentModel from './attachment'
|
||||
import {REPEAT_MODE_DEFAULT} from './constants/taskRepeatModes'
|
||||
|
||||
import SubscriptionModel from '@/models/subscription'
|
||||
import {parseDateOrNull} from '@/helpers/parseDateOrNull'
|
||||
import type ListModel from './list'
|
||||
|
||||
const SUPPORTS_TRIGGERED_NOTIFICATION = 'Notification' in window && 'showTrigger' in Notification.prototype
|
||||
export const TASK_DEFAULT_COLOR = '#1973ff'
|
||||
|
||||
export const TASK_REPEAT_MODES = {
|
||||
'REPEAT_MODE_DEFAULT': 0,
|
||||
'REPEAT_MODE_MONTH': 1,
|
||||
'REPEAT_MODE_FROM_CURRENT_DATE': 2,
|
||||
} as const
|
||||
|
||||
export type TaskRepeatMode = typeof TASK_REPEAT_MODES[keyof typeof TASK_REPEAT_MODES]
|
||||
|
||||
export interface RepeatAfter {
|
||||
type: 'hours' | 'weeks' | 'months' | 'years' | 'days'
|
||||
amount: number
|
||||
}
|
||||
|
||||
export default class TaskModel extends AbstractModel {
|
||||
constructor(data) {
|
||||
id: number
|
||||
title: string
|
||||
description: string
|
||||
done: boolean
|
||||
doneAt: Date | null
|
||||
priority: 0
|
||||
labels: LabelModel[]
|
||||
assignees: UserModel[]
|
||||
|
||||
dueDate: Date | null
|
||||
startDate: Date | null
|
||||
endDate: Date | null
|
||||
repeatAfter: number | RepeatAfter
|
||||
repeatFromCurrentDate: boolean
|
||||
repeatMode: TaskRepeatMode
|
||||
reminderDates: Date[]
|
||||
parentTaskId: TaskModel['id']
|
||||
hexColor: string
|
||||
percentDone: number
|
||||
relatedTasks: { [relationKind: string]: TaskModel } // FIXME: use relationKinds
|
||||
attachments: AttachmentModel[]
|
||||
identifier: string
|
||||
index: number
|
||||
isFavorite: boolean
|
||||
subscription: SubscriptionModel
|
||||
|
||||
position: number
|
||||
kanbanPosition: number
|
||||
|
||||
createdBy: UserModel
|
||||
created: Date
|
||||
updated: Date
|
||||
|
||||
listId: ListModel['id'] // Meta, only used when creating a new task
|
||||
|
||||
constructor(data: Partial<TaskModel>) {
|
||||
super(data)
|
||||
|
||||
/** @type {number} */
|
||||
this.id = Number(this.id)
|
||||
|
||||
/** @type {string} */
|
||||
this.title = this.title?.trim()
|
||||
|
||||
/** @type {string} */
|
||||
this.description
|
||||
|
||||
/** @type {boolean} */
|
||||
this.done
|
||||
|
||||
/** @type */
|
||||
this.doneAt = parseDateOrNull(this.doneAt)
|
||||
|
||||
/** @type {number} */
|
||||
this.priority
|
||||
|
||||
/** @type {LabelModel[]} */
|
||||
this.labels = this.labels
|
||||
.map(l => new LabelModel(l))
|
||||
.sort((f, s) => f.title > s.title ? 1 : -1)
|
||||
|
||||
/** @type {UserModel[]} */
|
||||
// Parse the assignees into user models
|
||||
this.assignees = this.assignees.map(a => {
|
||||
return new UserModel(a)
|
||||
})
|
||||
|
||||
/** @type {Date} */
|
||||
this.dueDate = parseDateOrNull(this.dueDate)
|
||||
|
||||
/** @type {Date} */
|
||||
this.startDate = parseDateOrNull(this.startDate)
|
||||
|
||||
/** @type {Date} */
|
||||
this.endDate = parseDateOrNull(this.endDate)
|
||||
|
||||
/** @type */
|
||||
this.repeatAfter
|
||||
|
||||
// Parse the repeat after into something usable
|
||||
this.parseRepeatAfter()
|
||||
|
||||
/** @type {boolean} */
|
||||
this.repeatFromCurrentDate
|
||||
|
||||
/** @type {TaskRepeatMode: 0 | 1 | 2} */
|
||||
this.repeatMode
|
||||
|
||||
/** @type {Date[]} */
|
||||
this.reminderDates = this.reminderDates.map(d => new Date(d))
|
||||
|
||||
// Cancel all scheduled notifications for this task to be sure to only have available notifications
|
||||
|
|
@ -73,22 +90,10 @@ export default class TaskModel extends AbstractModel {
|
|||
this.reminderDates.forEach(d => this.scheduleNotification(d))
|
||||
})
|
||||
|
||||
/** @type {number} */
|
||||
this.parentTaskId
|
||||
|
||||
/** @type {string} */
|
||||
this.hexColor
|
||||
|
||||
if (this.hexColor !== '' && this.hexColor.substring(0, 1) !== '#') {
|
||||
this.hexColor = '#' + this.hexColor
|
||||
}
|
||||
|
||||
/** @type {number} */
|
||||
this.percentDone
|
||||
|
||||
/** @type {{ [relationKind: string]: TaskModel }} */
|
||||
this.relatedTasks
|
||||
|
||||
// Make all subtasks to task models
|
||||
Object.keys(this.relatedTasks).forEach(relationKind => {
|
||||
this.relatedTasks[relationKind] = this.relatedTasks[relationKind].map(t => {
|
||||
|
|
@ -97,46 +102,21 @@ export default class TaskModel extends AbstractModel {
|
|||
})
|
||||
|
||||
// Make all attachments to attachment models
|
||||
/** @type {AttachmentModel[]} */
|
||||
this.attachments = this.attachments.map(a => new AttachmentModel(a))
|
||||
|
||||
/** @type {string} */
|
||||
this.identifier
|
||||
|
||||
// Set the task identifier to empty if the list does not have one
|
||||
if (this.identifier === `-${this.index}`) {
|
||||
this.identifier = ''
|
||||
}
|
||||
|
||||
/** @type {number} */
|
||||
this.index
|
||||
|
||||
/** @type {boolean} */
|
||||
this.isFavorite
|
||||
|
||||
/** @type {SubscriptionModel} */
|
||||
this.subscription
|
||||
|
||||
if (typeof this.subscription !== 'undefined' && this.subscription !== null) {
|
||||
this.subscription = new SubscriptionModel(this.subscription)
|
||||
}
|
||||
|
||||
/** @type {number} */
|
||||
this.position
|
||||
|
||||
/** @type {number} */
|
||||
this.kanbanPosition
|
||||
|
||||
/** @type {UserModel} */
|
||||
this.createdBy = new UserModel(this.createdBy)
|
||||
|
||||
/** @type {Date} */
|
||||
this.created = new Date(this.created)
|
||||
|
||||
/** @type {Date} */
|
||||
this.updated = new Date(this.updated)
|
||||
|
||||
/** @type {number} */
|
||||
this.listId = Number(this.listId)
|
||||
}
|
||||
|
||||
|
|
@ -156,7 +136,7 @@ export default class TaskModel extends AbstractModel {
|
|||
endDate: 0,
|
||||
repeatAfter: 0,
|
||||
repeatFromCurrentDate: false,
|
||||
repeatMode: REPEAT_MODE_DEFAULT,
|
||||
repeatMode: TASK_REPEAT_MODES.REPEAT_MODE_DEFAULT,
|
||||
reminderDates: [],
|
||||
parentTaskId: 0,
|
||||
hexColor: '',
|
||||
|
|
@ -204,7 +184,7 @@ export default class TaskModel extends AbstractModel {
|
|||
* This function should only be called from the constructor.
|
||||
*/
|
||||
parseRepeatAfter() {
|
||||
const repeatAfterHours = (this.repeatAfter / 60) / 60
|
||||
const repeatAfterHours = (this.repeatAfter as number / 60) / 60
|
||||
this.repeatAfter = {type: 'hours', amount: repeatAfterHours}
|
||||
|
||||
// if its dividable by 24, its something with days, otherwise hours
|
||||
|
|
|
|||
Reference in a new issue