improve date handling and fix empty tasks error

This commit is contained in:
safwansamsudeen 2024-12-02 14:34:11 +05:30
parent 7ac5422950
commit 3519755dc3

View File

@ -79,7 +79,14 @@ export default class Gantt {
setup_tasks(tasks) { setup_tasks(tasks) {
// prepare tasks // prepare tasks
this.tasks = tasks.map((task, i) => { this.tasks = tasks
.map((task, i) => {
// invalid flag
if (!task.start || !task.end) {
console.error(`task "${task.id}" doesn't have valid dates`);
return false;
}
// convert to Date objects // convert to Date objects
task._start = date_utils.parse(task.start); task._start = date_utils.parse(task.start);
if (task.end === undefined && task.duration !== undefined) { if (task.end === undefined && task.duration !== undefined) {
@ -93,36 +100,26 @@ export default class Gantt {
}); });
} }
task._end = date_utils.parse(task.end); task._end = date_utils.parse(task.end);
let diff = date_utils.diff(task._end, task._start, 'year'); let diff = date_utils.diff(task._end, task._start, 'year');
if (diff < 0) { if (diff < 0) {
throw Error( console.error(
"start of task can't be after end of task: in task #, " + `start of task can't be after end of task: in task "${task.id}"`,
(i + 1),
); );
return false;
} }
// make task invalid if duration too large // make task invalid if duration too large
if (date_utils.diff(task._end, task._start, 'year') > 10) { if (date_utils.diff(task._end, task._start, 'year') > 10) {
task.end = null; console.error(
`the duration of task "${task.id}" is too long (above ten years)`,
);
return false;
} }
// cache index // cache index
task._index = i; task._index = i;
// invalid dates
if (!task.start && !task.end) {
const today = date_utils.today();
task._start = today;
task._end = date_utils.add(today, 2, 'day');
}
if (!task.start && task.end) {
task._start = date_utils.add(task._end, -2, 'day');
}
if (task.start && !task.end) {
task._end = date_utils.add(task._start, 2, 'day');
}
// if hours is not set, assume the last day is full day // if hours is not set, assume the last day is full day
// e.g: 2018-09-09 becomes 2018-09-09 23:59:59 // e.g: 2018-09-09 becomes 2018-09-09 23:59:59
const task_end_values = date_utils.get_date_values(task._end); const task_end_values = date_utils.get_date_values(task._end);
@ -130,13 +127,11 @@ export default class Gantt {
task._end = date_utils.add(task._end, 24, 'hour'); task._end = date_utils.add(task._end, 24, 'hour');
} }
// invalid flag
if (!task.start || !task.end) {
task.invalid = true;
}
// dependencies // dependencies
if (typeof task.dependencies === 'string' || !task.dependencies) { if (
typeof task.dependencies === 'string' ||
!task.dependencies
) {
let deps = []; let deps = [];
if (task.dependencies) { if (task.dependencies) {
deps = task.dependencies deps = task.dependencies
@ -157,7 +152,8 @@ export default class Gantt {
} }
return task; return task;
}); })
.filter((t) => t);
this.setup_dependencies(); this.setup_dependencies();
} }
@ -201,8 +197,12 @@ export default class Gantt {
} }
setup_gantt_dates() { setup_gantt_dates() {
// set global start and end date
let gantt_start, gantt_end; let gantt_start, gantt_end;
if (!this.tasks.length) {
gantt_start = new Date();
gantt_end = new Date();
}
for (let task of this.tasks) { for (let task of this.tasks) {
if (!gantt_start || task._start < gantt_start) { if (!gantt_start || task._start < gantt_start) {
gantt_start = task._start; gantt_start = task._start;