2019-03-02 11:25:10 +01:00
|
|
|
import AbstractModel from './abstractModel'
|
|
|
|
import TaskModel from './task'
|
|
|
|
import UserModel from './user'
|
|
|
|
|
|
|
|
export default class ListModel extends AbstractModel {
|
|
|
|
|
|
|
|
constructor(data) {
|
|
|
|
super(data)
|
|
|
|
|
|
|
|
// Make all tasks to task models
|
|
|
|
this.tasks = this.tasks.map(t => {
|
|
|
|
return new TaskModel(t)
|
|
|
|
})
|
|
|
|
|
|
|
|
this.owner = new UserModel(this.owner)
|
|
|
|
this.sortTasks()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Default attributes that define the "empty" state.
|
|
|
|
defaults() {
|
|
|
|
return {
|
|
|
|
id: 0,
|
|
|
|
title: '',
|
|
|
|
description: '',
|
|
|
|
owner: UserModel,
|
|
|
|
tasks: [],
|
|
|
|
namespaceID: 0,
|
|
|
|
|
|
|
|
created: 0,
|
|
|
|
updated: 0,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
////////
|
|
|
|
// Helpers
|
|
|
|
//////
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sorts all tasks according to their due date
|
|
|
|
* @returns {this}
|
|
|
|
*/
|
|
|
|
sortTasks() {
|
|
|
|
if (this.tasks === null || this.tasks === []) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
return this.tasks.sort(function(a,b) {
|
|
|
|
if (a.done < b.done)
|
|
|
|
return -1
|
|
|
|
if (a.done > b.done)
|
|
|
|
return 1
|
2019-10-19 21:26:52 +02:00
|
|
|
|
|
|
|
if (a.id > b.id)
|
|
|
|
return -1
|
|
|
|
if (a.id < b.id)
|
|
|
|
return 1
|
2019-03-02 11:25:10 +01:00
|
|
|
return 0
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds a task to the task array of this list. Usually only used when creating a new task
|
|
|
|
* @param task
|
|
|
|
*/
|
|
|
|
addTaskToList(task) {
|
|
|
|
// If it's a subtask, add it to its parent, otherwise append it to the list of tasks
|
|
|
|
if (task.parentTaskID === 0) {
|
|
|
|
this.tasks.push(task)
|
|
|
|
} else {
|
|
|
|
for (const t in this.tasks) {
|
|
|
|
if (this.tasks[t].id === task.parentTaskID) {
|
|
|
|
this.tasks[t].subtasks.push(task)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.sortTasks()
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets a task by its ID by looping through all tasks.
|
|
|
|
* @param id
|
|
|
|
* @returns {TaskModel}
|
|
|
|
*/
|
|
|
|
getTaskByID(id) {
|
|
|
|
// TODO: Binary search?
|
|
|
|
for (const t in this.tasks) {
|
|
|
|
if (this.tasks[t].id === parseInt(id)) {
|
|
|
|
return this.tasks[t]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return {} // FIXME: This should probably throw something to make it clear to the user noting was found
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Loops through all tasks and updates the one with the id it has
|
|
|
|
* @param task
|
|
|
|
*/
|
|
|
|
updateTaskByID(task) {
|
|
|
|
for (const t in this.tasks) {
|
|
|
|
if (this.tasks[t].id === task.id) {
|
|
|
|
this.tasks[t] = task
|
|
|
|
break
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.tasks[t].id === task.parentTaskID) {
|
|
|
|
for (const s in this.tasks[t].subtasks) {
|
|
|
|
if (this.tasks[t].subtasks[s].id === task.id) {
|
|
|
|
this.tasks[t].subtasks[s] = task
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.sortTasks()
|
|
|
|
}
|
|
|
|
}
|