private taskProgressRender()

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();
    }