forked from vikunja/frontend
kolaente
7746d39161
Repeating "monthly" or "yearly" was never what people expected, only 30 or 365 days which is not always correct. This change removes these settings since the repeating modes will be re-done anyway. Related to vikunja/frontend#3585 (comment)
115 lines
3.0 KiB
TypeScript
115 lines
3.0 KiB
TypeScript
import AbstractService from './abstractService'
|
|
import TaskModel from '@/models/task'
|
|
import type {ITask} from '@/modelTypes/ITask'
|
|
import AttachmentService from './attachment'
|
|
import LabelService from './label'
|
|
|
|
import {colorFromHex} from '@/helpers/color/colorFromHex'
|
|
import {SECONDS_A_DAY, SECONDS_A_HOUR, SECONDS_A_WEEK, SECONDS_A_MONTH, SECONDS_A_YEAR} from '@/constants/date'
|
|
|
|
const parseDate = date => {
|
|
if (date) {
|
|
return new Date(date).toISOString()
|
|
}
|
|
|
|
return null
|
|
}
|
|
|
|
export default class TaskService extends AbstractService<ITask> {
|
|
constructor() {
|
|
super({
|
|
create: '/projects/{projectId}/tasks',
|
|
getAll: '/tasks/all',
|
|
get: '/tasks/{id}',
|
|
update: '/tasks/{id}',
|
|
delete: '/tasks/{id}',
|
|
})
|
|
}
|
|
|
|
modelFactory(data) {
|
|
return new TaskModel(data)
|
|
}
|
|
|
|
beforeUpdate(model) {
|
|
return this.processModel(model)
|
|
}
|
|
|
|
beforeCreate(model) {
|
|
return this.processModel(model)
|
|
}
|
|
|
|
processModel(updatedModel) {
|
|
const model = { ...updatedModel }
|
|
|
|
model.title = model.title?.trim()
|
|
|
|
// Ensure that projectId is an int
|
|
model.projectId = Number(model.projectId)
|
|
|
|
// Convert dates into an iso string
|
|
model.dueDate = parseDate(model.dueDate)
|
|
model.startDate = parseDate(model.startDate)
|
|
model.endDate = parseDate(model.endDate)
|
|
model.doneAt = parseDate(model.doneAt)
|
|
model.created = new Date(model.created).toISOString()
|
|
model.updated = new Date(model.updated).toISOString()
|
|
|
|
model.reminderDates = null
|
|
// remove all nulls, these would create empty reminders
|
|
for (const index in model.reminders) {
|
|
if (model.reminders[index] === null) {
|
|
model.reminders.splice(index, 1)
|
|
}
|
|
}
|
|
// Make normal timestamps from js dates
|
|
if (model.reminders.length > 0) {
|
|
model.reminders.forEach(r => {
|
|
r.reminder = new Date(r.reminder).toISOString()
|
|
})
|
|
}
|
|
|
|
// Make the repeating amount to seconds
|
|
let repeatAfterSeconds = 0
|
|
if (model.repeatAfter !== null && (model.repeatAfter.amount !== null || model.repeatAfter.amount !== 0)) {
|
|
switch (model.repeatAfter.type) {
|
|
case 'hours':
|
|
repeatAfterSeconds = model.repeatAfter.amount * SECONDS_A_HOUR
|
|
break
|
|
case 'days':
|
|
repeatAfterSeconds = model.repeatAfter.amount * SECONDS_A_DAY
|
|
break
|
|
case 'weeks':
|
|
repeatAfterSeconds = model.repeatAfter.amount * SECONDS_A_WEEK
|
|
break
|
|
}
|
|
}
|
|
model.repeatAfter = repeatAfterSeconds
|
|
|
|
model.hexColor = colorFromHex(model.hexColor)
|
|
|
|
// Do the same for all related tasks
|
|
Object.keys(model.relatedTasks).forEach(relationKind => {
|
|
model.relatedTasks[relationKind] = model.relatedTasks[relationKind].map(t => {
|
|
return this.processModel(t)
|
|
})
|
|
})
|
|
|
|
// Process all attachments to preven parsing errors
|
|
if (model.attachments.length > 0) {
|
|
const attachmentService = new AttachmentService()
|
|
model.attachments.map(a => {
|
|
return attachmentService.processModel(a)
|
|
})
|
|
}
|
|
|
|
// Preprocess all labels
|
|
if (model.labels.length > 0) {
|
|
const labelService = new LabelService()
|
|
model.labels = model.labels.map(l => labelService.processModel(l))
|
|
}
|
|
|
|
return model as ITask
|
|
}
|
|
}
|
|
|