improve date handling and fix empty tasks error
This commit is contained in:
parent
7ac5422950
commit
3519755dc3
154
src/index.js
154
src/index.js
@ -79,85 +79,81 @@ export default class Gantt {
|
|||||||
|
|
||||||
setup_tasks(tasks) {
|
setup_tasks(tasks) {
|
||||||
// prepare tasks
|
// prepare tasks
|
||||||
this.tasks = tasks.map((task, i) => {
|
this.tasks = tasks
|
||||||
// convert to Date objects
|
.map((task, i) => {
|
||||||
task._start = date_utils.parse(task.start);
|
// invalid flag
|
||||||
if (task.end === undefined && task.duration !== undefined) {
|
if (!task.start || !task.end) {
|
||||||
task.end = task._start;
|
console.error(`task "${task.id}" doesn't have valid dates`);
|
||||||
let durations = task.duration.split(' ');
|
return false;
|
||||||
|
|
||||||
durations.forEach((tmpDuration) => {
|
|
||||||
let { duration, scale } =
|
|
||||||
date_utils.parse_duration(tmpDuration);
|
|
||||||
task.end = date_utils.add(task.end, duration, scale);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
task._end = date_utils.parse(task.end);
|
|
||||||
let diff = date_utils.diff(task._end, task._start, 'year');
|
|
||||||
if (diff < 0) {
|
|
||||||
throw Error(
|
|
||||||
"start of task can't be after end of task: in task #, " +
|
|
||||||
(i + 1),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// make task invalid if duration too large
|
|
||||||
if (date_utils.diff(task._end, task._start, 'year') > 10) {
|
|
||||||
task.end = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// cache index
|
|
||||||
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
|
|
||||||
// e.g: 2018-09-09 becomes 2018-09-09 23:59:59
|
|
||||||
const task_end_values = date_utils.get_date_values(task._end);
|
|
||||||
if (task_end_values.slice(3).every((d) => d === 0)) {
|
|
||||||
task._end = date_utils.add(task._end, 24, 'hour');
|
|
||||||
}
|
|
||||||
|
|
||||||
// invalid flag
|
|
||||||
if (!task.start || !task.end) {
|
|
||||||
task.invalid = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// dependencies
|
|
||||||
if (typeof task.dependencies === 'string' || !task.dependencies) {
|
|
||||||
let deps = [];
|
|
||||||
if (task.dependencies) {
|
|
||||||
deps = task.dependencies
|
|
||||||
.split(',')
|
|
||||||
.map((d) => d.trim().replaceAll(' ', '_'))
|
|
||||||
.filter((d) => d);
|
|
||||||
}
|
}
|
||||||
task.dependencies = deps;
|
|
||||||
}
|
|
||||||
|
|
||||||
// uids
|
// convert to Date objects
|
||||||
if (!task.id) {
|
task._start = date_utils.parse(task.start);
|
||||||
task.id = generate_id(task);
|
if (task.end === undefined && task.duration !== undefined) {
|
||||||
} else if (typeof task.id === 'string') {
|
task.end = task._start;
|
||||||
task.id = task.id.replaceAll(' ', '_');
|
let durations = task.duration.split(' ');
|
||||||
} else {
|
|
||||||
task.id = `${task.id}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
return task;
|
durations.forEach((tmpDuration) => {
|
||||||
});
|
let { duration, scale } =
|
||||||
|
date_utils.parse_duration(tmpDuration);
|
||||||
|
task.end = date_utils.add(task.end, duration, scale);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
task._end = date_utils.parse(task.end);
|
||||||
|
|
||||||
|
let diff = date_utils.diff(task._end, task._start, 'year');
|
||||||
|
if (diff < 0) {
|
||||||
|
console.error(
|
||||||
|
`start of task can't be after end of task: in task "${task.id}"`,
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// make task invalid if duration too large
|
||||||
|
if (date_utils.diff(task._end, task._start, 'year') > 10) {
|
||||||
|
console.error(
|
||||||
|
`the duration of task "${task.id}" is too long (above ten years)`,
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cache index
|
||||||
|
task._index = i;
|
||||||
|
|
||||||
|
// if hours is not set, assume the last day is full day
|
||||||
|
// e.g: 2018-09-09 becomes 2018-09-09 23:59:59
|
||||||
|
const task_end_values = date_utils.get_date_values(task._end);
|
||||||
|
if (task_end_values.slice(3).every((d) => d === 0)) {
|
||||||
|
task._end = date_utils.add(task._end, 24, 'hour');
|
||||||
|
}
|
||||||
|
|
||||||
|
// dependencies
|
||||||
|
if (
|
||||||
|
typeof task.dependencies === 'string' ||
|
||||||
|
!task.dependencies
|
||||||
|
) {
|
||||||
|
let deps = [];
|
||||||
|
if (task.dependencies) {
|
||||||
|
deps = task.dependencies
|
||||||
|
.split(',')
|
||||||
|
.map((d) => d.trim().replaceAll(' ', '_'))
|
||||||
|
.filter((d) => d);
|
||||||
|
}
|
||||||
|
task.dependencies = deps;
|
||||||
|
}
|
||||||
|
|
||||||
|
// uids
|
||||||
|
if (!task.id) {
|
||||||
|
task.id = generate_id(task);
|
||||||
|
} else if (typeof task.id === 'string') {
|
||||||
|
task.id = task.id.replaceAll(' ', '_');
|
||||||
|
} else {
|
||||||
|
task.id = `${task.id}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user