Линия Chart.js с 2 различными подсказками и точечными цветами - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь добавить на свой график линию с всплывающей подсказкой «Контрактный пробег», однако мне нужно добавить одну точку на этой линии, которая будет иметь отдельную подсказку «Ожидаемый конечный пробег».Мои данные будут выглядеть так:

var line = [
    {xLabel: "2018-03-05", yValue: '0'},
    {xLabel: "2018-03-06"},
    {xLabel: "2018-03-07"},
    {xLabel: "2018-03-08"},
    {xLabel: "2018-03-09"},
    {xLabel: "2018-03-10", yValue: "220", **toolTip: 'Expected End Mileage'**},
    {xLabel: "2018-03-11"},
    {xLabel: "2018-03-12"},
    {xLabel: "2018-03-13", yValue: '300'},
    {xLabel: "2018-03-14"},
    {xLabel: "2018-03-15"},
    {xLabel: "2018-03-16"},
    {xLabel: "2018-03-17"},
    {xLabel: "2018-03-18"},
    {xLabel: "2018-03-19"},
    {xLabel: "2018-03-20", yValue: '400'}
];

Это моя функция для построения графика:

getLineChartFieldGroup = function(cfg, data) {

    // do nothing if configuration or data not defined.
    if (!cfg || !cfg.lines || !data) return;

    var chartColors_ = [];
    var chartSeries_ = [];
    var chartDataset_ = [];

    // builds the chart colors, series and dataset.
    angular.forEach(cfg.lines, function(line) {
        chartSeries_.push(line.tooltip || null);
        chartColors_.push(line.color || null);
        chartDataset_.push({fill: (line.fillColor || false), xAxisID: 'xAxis', yAxisID: 'yAxis', spanGaps: true, borderDash: line.borderDash});
    });

    // builds the global chart configurations, labels and data.
    var xAxisLabel_ = cfg.globalConfig ? cfg.globalConfig.xAxisLabel : '';
    var yAxisLabel_ = cfg.globalConfig ? cfg.globalConfig.yAxisLabel : '';
    var lineTension_ = cfg.globalConfig ? cfg.globalConfig.lineTension : 0;
    var defaultData_ = cfg.globalConfig ? cfg.globalConfig.defaultData : null;
    var chartLabels_ = getChartLabels(data);
    var chartData_ = getChartData(cfg.lines, data, chartLabels_, defaultData_);

    // prepares the label and data to display at end of the chart.
    // condition to align the single point to middle of the chart.
    if (chartLabels_.length === 1) {
        var parsedDate = parseDate(chartLabels_[0]);

        var prevMonth = new Date(parsedDate.getFullYear(), parsedDate.getMonth() - 1, 1);
        var nextMonth = new Date(parsedDate.getFullYear(), parsedDate.getMonth() + 1, 1);

        chartLabels_.unshift(formattedDateYYYYMMDD(prevMonth, '-'));
        for (var pIndex = 0; pIndex < chartData_.length; pIndex++) {
            chartData_[pIndex].unshift(null);
        }

        chartLabels_.push(formattedDateYYYYMMDD(nextMonth, '-'));
        for (var nIndex = 0; nIndex < chartData_.length; nIndex++) {
            chartData_[nIndex].push(null);
        }
    }

    // builds the chart field group.
    lineChartFieldGroup = [
        {
            className: 'col-xs-12 col-md-12',
            template: "<canvas height=\"25%\" width=\"100%\" class='chart chart-line' chart-labels='to.chartLabels' chart-series='to.chartSeries' chart-data='to.chartData' chart-colors='to.chartColors' chart-options='to.chartOptions' chart-dataset-override='to.chartDataset'>",
            templateOptions: {
                chartLabels: chartLabels_,
                chartSeries: chartSeries_,
                chartData: chartData_,
                chartColors: chartColors_,
                chartDataset: chartDataset_,
                chartOptions: {
                    scales: {
                        xAxes: [
                            {
                                id: 'xAxis',
                                type: 'time',
                                ticks: {
                                    autoSkip: true,
                                    maxTicksLimit: 12,
                                    minRotation: 30,
                                    maxRotation: 30
                                },
                                display: true,
                                time: {
                                    tooltipFormat: 'DD/MM/YYYY',
                                    unit: 'month',
                                    displayFormats: {month: 'MMM YYYY'}
                                },
                                scaleLabel: {display: true, labelString: xAxisLabel_}
                            }
                        ],
                        yAxes: [
                            {
                                id: 'yAxis',
                                type: 'linear',
                                ticks: {
                                    callback: function(label, index, labels) {
                                        if (Math.floor(label) === label) {
                                            return label;
                                        }
                                    }
                                },
                                tooltips: false,
                                display: true,
                                position: 'left',
                                scaleLabel: {display: true, labelString: yAxisLabel_}
                            }
                        ]
                    },
                    elements: {
                        line: {tension: lineTension_}
                    }
                }
            }
        }
    ];
    return lineChartFieldGroup;
};

Как я получаю данные линии

lines.line1 = [
            {xLabel: "2018-04-05", yValue: '0'},
            {xLabel: "2018-04-06"},
            {xLabel: "2018-04-07"},
            {xLabel: "2018-04-08"},
            {xLabel: "2018-04-09"},
            {xLabel: "2018-04-10", yValue: "220", toolTip: 'Expected End Mileage'},
            {xLabel: "2018-04-11"},
            {xLabel: "2018-04-12"},
            {xLabel: "2018-04-13", yValue: '300'},
            {xLabel: "2018-04-14"},
            {xLabel: "2018-04-15"},
            {xLabel: "2018-04-16"},
            {xLabel: "2018-04-17"},
            {xLabel: "2018-04-18"},
            {xLabel: "2018-04-19"},
            {xLabel: "2018-04-20", yValue: '400'}
        ];

var chartConfig = {
    lines: [
        {tooltip: 'Contract Mileage', color: '#c73617', fillColor: false, key: 'secondLine', borderDash: [2,2]}
                ],
    globalConfig: {
        xAxisLabel: 'Months',
        yAxisLabel: 'Odometer',
        lineTension: 0,
        defaultData: null
    }
};

// Fuel usage form to display the average consumption.
vm.odometerChartFields.push({
    fieldGroup: [
        {
        className: 'row',
            fieldGroup: [
                {
                    className: 'col-xs-12',
                    fieldGroup: getLineChartFieldGroup(chartConfig, lines)
                }
            ]
         }
      ]
   }
 )

IЯ пытаюсь добиться этого, чтобы другие точки, кроме точки со свойством toolTip, отображали пробег, где единица со свойством toolTip показывает разные значения.Кроме того, тот, у которого разные всплывающие подсказки, должен иметь различный цвет, чтобы быть заметным.

enter image description here

enter image description here

это вообще возможно?

...