buildTree = (assignments, unpack) => d3.flatRollup(
assignments.sort((a, b) => a.start_date - b.start_date),
v => ({
start_date: d3.min(v, d => d.start_date),
end_date: d3.max(v, d => d.end_date),
}),
d => d.engagement.account.name,
d => unpack.account.has(d.engagement.account.name) ? d.engagement.name : "*",
d => unpack.account.has(d.engagement.account.name) && unpack.engagement.has(d.engagement.name) ? d.resource.name : "*",
).map((rollup) => {
const keys = rollup.slice(0, -1);
const data = rollup[rollup.length - 1];
const fKeys = keys.filter(k => k !== '*');
return {
key: keys.join('-'),
keys,
...data,
path: keys.join(' / '),
depth: fKeys.length,
level: Object.keys(unpack)[fKeys.length - 1],
label: fKeys[fKeys.length - 1],
parentLevel: Object.keys(unpack)[fKeys.length - 2],
parentLabel: fKeys[fKeys.length - 2],
lane: keys[0],
}
})