private createMilestoneLine()

in src/gantt.ts [2850:2914]


    private createMilestoneLine(
        tasks: GroupedTask[],
        timestamp: number = Date.now(),
        milestoneTitle?: string): void {
        if (!this.hasNotNullableDates) {
            return;
        }

        let todayColor: string = this.viewModel.settings.dateType.todayColor;
        // TODO: add not today milestones color
        let milestoneDates = [new Date(timestamp)];
        tasks.forEach((task: GroupedTask) => {
            const subtasks: Task[] = task.tasks;
            subtasks.forEach((task: Task) => {
                if (!_.isEmpty(task.Milestones)) {
                    task.Milestones.forEach((milestone) => {
                        if (!_.includes(milestoneDates, milestone.start)) {
                            milestoneDates.push(milestone.start);
                        }
                    });
                }
            });
        });

        let line: Line[] = [];
        const dateTypeSettings: DateTypeSettings = this.viewModel.settings.dateType;
        milestoneDates.forEach((date: Date) => {
            const title = date === this.timeScale(timestamp) ? milestoneTitle : "Milestone";
            const lineOptions = {
                x1: this.timeScale(date),
                y1: Gantt.MilestoneTop,
                x2: this.timeScale(date),
                y2: this.getMilestoneLineLength(tasks.length),
                tooltipInfo: Gantt.getTooltipForMilestoneLine(date.toLocaleDateString(), this.localizationManager, dateTypeSettings, [title])
            };
            line.push(lineOptions);
        });

        let chartLineSelection: Selection<Line> = this.chartGroup
            .selectAll(Selectors.ChartLine.selectorName)
            .data(line);

        const chartLineSelectionMerged = chartLineSelection
            .enter()
            .append("line")
            .merge(chartLineSelection);

        chartLineSelectionMerged.classed(Selectors.ChartLine.className, true);

        chartLineSelectionMerged
            .attr("x1", (line: Line) => line.x1)
            .attr("y1", (line: Line) => line.y1)
            .attr("x2", (line: Line) => line.x2)
            .attr("y2", (line: Line) => line.y2)
            .style("stroke", (line: Line) => {
                let color = line.x1 === this.timeScale(timestamp) ? todayColor : Gantt.DefaultValues.MilestoneLineColor;
                return this.colorHelper.getHighContrastColor("foreground", color);
            });

        this.renderTooltip(chartLineSelectionMerged);

        chartLineSelection
            .exit()
            .remove();
    }