mirror of
https://github.com/chartjs/Chart.js.git
synced 2024-10-06 12:19:08 +02:00
Merge pull request #3261 from desowin/3211
Implement moment diff cache in time scale
This commit is contained in:
commit
d8b13ca4ab
@ -87,6 +87,22 @@ module.exports = function(Chart) {
|
|||||||
|
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
getLabelDiff: function(datasetIndex, index) {
|
||||||
|
var me = this;
|
||||||
|
if (datasetIndex === null || index === null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (me.labelDiffs === undefined) {
|
||||||
|
me.buildLabelDiffs();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof me.labelDiffs[datasetIndex] !== 'undefined') {
|
||||||
|
return me.labelDiffs[datasetIndex][index];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
},
|
||||||
getMomentStartOf: function(tick) {
|
getMomentStartOf: function(tick) {
|
||||||
var me = this;
|
var me = this;
|
||||||
if (me.options.time.unit === 'week' && me.options.time.isoWeekday !== false) {
|
if (me.options.time.unit === 'week' && me.options.time.isoWeekday !== false) {
|
||||||
@ -163,6 +179,46 @@ module.exports = function(Chart) {
|
|||||||
me.firstTick = (me.firstTick || moment()).clone();
|
me.firstTick = (me.firstTick || moment()).clone();
|
||||||
me.lastTick = (me.lastTick || moment()).clone();
|
me.lastTick = (me.lastTick || moment()).clone();
|
||||||
},
|
},
|
||||||
|
buildLabelDiffs: function() {
|
||||||
|
var me = this;
|
||||||
|
me.labelDiffs = [];
|
||||||
|
var scaleLabelDiffs = [];
|
||||||
|
// Parse common labels once
|
||||||
|
if (me.chart.data.labels && me.chart.data.labels.length > 0) {
|
||||||
|
helpers.each(me.chart.data.labels, function(label) {
|
||||||
|
var labelMoment = me.parseTime(label);
|
||||||
|
|
||||||
|
if (labelMoment.isValid()) {
|
||||||
|
if (me.options.time.round) {
|
||||||
|
labelMoment.startOf(me.options.time.round);
|
||||||
|
}
|
||||||
|
scaleLabelDiffs.push(labelMoment.diff(me.firstTick, me.tickUnit, true));
|
||||||
|
}
|
||||||
|
}, me);
|
||||||
|
}
|
||||||
|
|
||||||
|
helpers.each(me.chart.data.datasets, function(dataset) {
|
||||||
|
var diffsForDataset = [];
|
||||||
|
|
||||||
|
if (typeof dataset.data[0] === 'object' && dataset.data[0] !== null) {
|
||||||
|
helpers.each(dataset.data, function(value) {
|
||||||
|
var labelMoment = me.parseTime(me.getRightValue(value));
|
||||||
|
|
||||||
|
if (labelMoment.isValid()) {
|
||||||
|
if (me.options.time.round) {
|
||||||
|
labelMoment.startOf(me.options.time.round);
|
||||||
|
}
|
||||||
|
diffsForDataset.push(labelMoment.diff(me.firstTick, me.tickUnit, true));
|
||||||
|
}
|
||||||
|
}, me);
|
||||||
|
} else {
|
||||||
|
// We have no labels. Use common ones
|
||||||
|
diffsForDataset = scaleLabelDiffs;
|
||||||
|
}
|
||||||
|
|
||||||
|
me.labelDiffs.push(diffsForDataset);
|
||||||
|
}, me);
|
||||||
|
},
|
||||||
buildTicks: function() {
|
buildTicks: function() {
|
||||||
var me = this;
|
var me = this;
|
||||||
|
|
||||||
@ -297,6 +353,9 @@ module.exports = function(Chart) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
me.ctx.restore();
|
me.ctx.restore();
|
||||||
|
|
||||||
|
// Invalidate label diffs cache
|
||||||
|
me.labelDiffs = undefined;
|
||||||
},
|
},
|
||||||
// Get tooltip label
|
// Get tooltip label
|
||||||
getLabelForIndex: function(index, datasetIndex) {
|
getLabelForIndex: function(index, datasetIndex) {
|
||||||
@ -333,15 +392,22 @@ module.exports = function(Chart) {
|
|||||||
},
|
},
|
||||||
getPixelForValue: function(value, index, datasetIndex) {
|
getPixelForValue: function(value, index, datasetIndex) {
|
||||||
var me = this;
|
var me = this;
|
||||||
if (!value || !value.isValid) {
|
var offset = null;
|
||||||
// not already a moment object
|
if (index !== undefined && datasetIndex !== undefined) {
|
||||||
value = me.parseTime(me.getRightValue(value));
|
offset = me.getLabelDiff(datasetIndex, index);
|
||||||
}
|
}
|
||||||
var labelMoment = value && value.isValid && value.isValid() ? value : me.getLabelMoment(datasetIndex, index);
|
|
||||||
|
|
||||||
if (labelMoment) {
|
if (offset === null) {
|
||||||
var offset = labelMoment.diff(me.firstTick, me.tickUnit, true);
|
if (!value || !value.isValid) {
|
||||||
|
// not already a moment object
|
||||||
|
value = me.parseTime(me.getRightValue(value));
|
||||||
|
}
|
||||||
|
if (value && value.isValid && value.isValid()) {
|
||||||
|
offset = value.diff(me.firstTick, me.tickUnit, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (offset !== null) {
|
||||||
var decimal = offset !== 0 ? offset / me.scaleSizeInUnits : offset;
|
var decimal = offset !== 0 ? offset / me.scaleSizeInUnits : offset;
|
||||||
|
|
||||||
if (me.isHorizontal()) {
|
if (me.isHorizontal()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user