in src/gantt.ts [2500:2554]
private taskProgressRender(
taskSelection: Selection<Task>): void {
const taskProgressShow: boolean = this.viewModel.settings.taskCompletion.show;
let index = 0, groupedTaskIndex = 0;
let taskProgress: Selection<any> = taskSelection
.selectAll(Selectors.TaskProgress.selectorName)
.data((d: Task, i: number) => {
const taskProgressPercentage = this.getDaysOffTaskProgressPercent(d);
// logic used for grouped tasks, when there are several bars related to one category
if (index === d.index) {
groupedTaskIndex++;
} else {
groupedTaskIndex = 0;
index = d.index;
}
const url = `${d.index}-${groupedTaskIndex}-${isStringNotNullEmptyOrUndefined(d.taskType) ? d.taskType.toString() : "taskType"}`;
const encodedUrl = `task${hashCode(url)}`;
return [{
key: encodedUrl, values: <LinearStop[]>[
{ completion: 0, color: d.color },
{ completion: taskProgressPercentage, color: d.color },
{ completion: taskProgressPercentage, color: d.color },
{ completion: 1, color: d.color }
]
}];
});
const taskProgressMerged = taskProgress
.enter()
.append("linearGradient")
.merge(taskProgress);
taskProgressMerged.classed(Selectors.TaskProgress.className, true);
taskProgressMerged
.attr("id", (data) => data.key);
let stopsSelection = taskProgressMerged.selectAll("stop");
let stopsSelectionData = stopsSelection.data(gradient => <LinearStop[]>gradient.values);
// draw 4 stops: 1st and 2d stops are for completed rect part; 3d and 4th ones - for main rect
stopsSelectionData.enter()
.append("stop")
.merge(<any>stopsSelection)
.attr("offset", (data: LinearStop) => `${data.completion * 100}%`)
.attr("stop-color", (data: LinearStop) => this.colorHelper.getHighContrastColor("foreground", data.color))
.attr("stop-opacity", (data: LinearStop, index: number) => (index > 1) && taskProgressShow ? Gantt.NotCompletedTaskOpacity : Gantt.TaskOpacity);
taskProgress
.exit()
.remove();
}