in src/gantt.ts [1740:1799]
private groupTasks(tasks: Task[]): GroupedTask[] {
if (this.viewModel.settings.general.groupTasks) {
let groupedTasks: _.Dictionary<Task[]> = _.groupBy(tasks,
x => (x.parent ? `${x.parent}.${x.name}` : x.name));
let result: GroupedTask[] = [];
const taskKeys: string[] = Object.keys(groupedTasks);
let alreadyReviewedKeys: string[] = [];
taskKeys.forEach((key: string) => {
const isKeyAlreadyReviewed = _.includes(alreadyReviewedKeys, key);
if (!isKeyAlreadyReviewed) {
let name: string = key;
if (groupedTasks[key] && groupedTasks[key].length && groupedTasks[key][0].parent && key.indexOf(groupedTasks[key][0].parent) !== -1) {
name = key.substr(groupedTasks[key][0].parent.length + 1, key.length);
}
// add current task
const taskRecord = <GroupedTask>{
name,
tasks: groupedTasks[key]
};
result.push(taskRecord);
alreadyReviewedKeys.push(key);
// see all the children and add them
groupedTasks[key].forEach((task: Task) => {
if (task.children && !_.includes(this.collapsedTasks, task.name)) {
task.children.forEach((childrenTask: Task) => {
const childrenFullName = `${name}.${childrenTask.name}`;
const isChildrenKeyAlreadyReviewed = _.includes(alreadyReviewedKeys, childrenFullName);
if (!isChildrenKeyAlreadyReviewed) {
const childrenRecord = <GroupedTask>{
name: childrenTask.name,
tasks: groupedTasks[childrenFullName]
};
result.push(childrenRecord);
alreadyReviewedKeys.push(childrenFullName);
}
});
}
});
}
});
result.forEach((x, i) => {
x.tasks.forEach(t => t.index = i);
x.index = i;
});
return result;
}
return tasks.map(x => <GroupedTask>{
name: x.name,
index: x.index,
tasks: [x]
});
}