mirror of
https://github.com/chartjs/Chart.js.git
synced 2026-03-05 16:04:03 +01:00
98 lines
2.5 KiB
JavaScript
98 lines
2.5 KiB
JavaScript
/**
|
|
* Plugin based on discussion from the following Chart.js issues:
|
|
* @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569
|
|
* @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897
|
|
*/
|
|
|
|
import LineElement from '../../elements/element.line.js';
|
|
import {_drawfill} from './filler.drawing.js';
|
|
import {_shouldApplyFill} from './filler.helper.js';
|
|
import {_decodeFill, _resolveTarget} from './filler.options.js';
|
|
|
|
export default {
|
|
id: 'filler',
|
|
|
|
afterDatasetsUpdate(chart, _args, options) {
|
|
const count = (chart.data.datasets || []).length;
|
|
const sources = [];
|
|
let meta, i, line, source;
|
|
|
|
for (i = 0; i < count; ++i) {
|
|
meta = chart.getDatasetMeta(i);
|
|
line = meta.dataset;
|
|
source = null;
|
|
|
|
if (line && line.options && line instanceof LineElement) {
|
|
source = {
|
|
visible: chart.isDatasetVisible(i),
|
|
index: i,
|
|
fill: _decodeFill(line, i, count),
|
|
chart,
|
|
axis: meta.controller.options.indexAxis,
|
|
scale: meta.vScale,
|
|
line,
|
|
};
|
|
}
|
|
|
|
meta.$filler = source;
|
|
sources.push(source);
|
|
}
|
|
|
|
for (i = 0; i < count; ++i) {
|
|
source = sources[i];
|
|
if (!source || source.fill === false) {
|
|
continue;
|
|
}
|
|
|
|
source.fill = _resolveTarget(sources, i, options.propagate);
|
|
}
|
|
},
|
|
|
|
beforeDraw(chart, _args, options) {
|
|
const draw = options.drawTime === 'beforeDraw';
|
|
const metasets = chart.getSortedVisibleDatasetMetas();
|
|
const area = chart.chartArea;
|
|
for (let i = metasets.length - 1; i >= 0; --i) {
|
|
const source = metasets[i].$filler;
|
|
if (!source) {
|
|
continue;
|
|
}
|
|
|
|
source.line.updateControlPoints(area, source.axis);
|
|
if (draw && source.fill) {
|
|
_drawfill(chart.ctx, source, area);
|
|
}
|
|
}
|
|
},
|
|
|
|
beforeDatasetsDraw(chart, _args, options) {
|
|
if (options.drawTime !== 'beforeDatasetsDraw') {
|
|
return;
|
|
}
|
|
|
|
const metasets = chart.getSortedVisibleDatasetMetas();
|
|
for (let i = metasets.length - 1; i >= 0; --i) {
|
|
const source = metasets[i].$filler;
|
|
|
|
if (_shouldApplyFill(source)) {
|
|
_drawfill(chart.ctx, source, chart.chartArea);
|
|
}
|
|
}
|
|
},
|
|
|
|
beforeDatasetDraw(chart, args, options) {
|
|
const source = args.meta.$filler;
|
|
|
|
if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {
|
|
return;
|
|
}
|
|
|
|
_drawfill(chart.ctx, source, chart.chartArea);
|
|
},
|
|
|
|
defaults: {
|
|
propagate: true,
|
|
drawTime: 'beforeDatasetDraw'
|
|
}
|
|
};
|