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