Chart.js/src/scales/scale.category.js

101 lines
3.2 KiB
JavaScript
Raw Normal View History

"use strict";
module.exports = function(Chart) {
var helpers = Chart.helpers;
// Default config for a category scale
var defaultConfig = {
position: "bottom"
};
var DatasetScale = Chart.Scale.extend({
2016-04-17 16:33:38 +02:00
// Implement this so that
determineDataLimits: function() {
var me = this;
me.minIndex = 0;
me.maxIndex = me.chart.data.labels.length - 1;
2016-04-03 05:05:48 +02:00
var findIndex;
if (me.options.ticks.min !== undefined) {
2016-04-03 05:05:48 +02:00
// user specified min value
findIndex = helpers.indexOf(me.chart.data.labels, me.options.ticks.min);
me.minIndex = findIndex !== -1 ? findIndex : me.minIndex;
2016-04-03 05:05:48 +02:00
}
if (me.options.ticks.max !== undefined) {
2016-04-03 05:05:48 +02:00
// user specified max value
findIndex = helpers.indexOf(me.chart.data.labels, me.options.ticks.max);
me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;
2016-04-03 05:05:48 +02:00
}
me.min = me.chart.data.labels[me.minIndex];
me.max = me.chart.data.labels[me.maxIndex];
2016-04-17 16:33:38 +02:00
},
buildTicks: function(index) {
var me = this;
2016-04-03 05:05:48 +02:00
// If we are viewing some subset of labels, slice the original array
me.ticks = (me.minIndex === 0 && me.maxIndex === me.chart.data.labels.length - 1) ? me.chart.data.labels : me.chart.data.labels.slice(me.minIndex, me.maxIndex + 1);
},
getLabelForIndex: function(index, datasetIndex) {
return this.ticks[index];
},
// Used to get data value locations. Value can either be an index or a numerical value
getPixelForValue: function(value, index, datasetIndex, includeOffset) {
var me = this;
2016-04-03 05:05:48 +02:00
// 1 is added because we need the length but we have the indexes
var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);
2016-04-03 05:05:48 +02:00
if (me.isHorizontal()) {
var innerWidth = me.width - (me.paddingLeft + me.paddingRight);
2016-04-03 05:05:48 +02:00
var valueWidth = innerWidth / offsetAmt;
var widthOffset = (valueWidth * (index - me.minIndex)) + me.paddingLeft;
if (me.options.gridLines.offsetGridLines && includeOffset) {
widthOffset += (valueWidth / 2);
}
return me.left + Math.round(widthOffset);
} else {
var innerHeight = me.height - (me.paddingTop + me.paddingBottom);
2016-04-03 05:05:48 +02:00
var valueHeight = innerHeight / offsetAmt;
var heightOffset = (valueHeight * (index - me.minIndex)) + me.paddingTop;
if (me.options.gridLines.offsetGridLines && includeOffset) {
heightOffset += (valueHeight / 2);
}
return me.top + Math.round(heightOffset);
}
2016-04-03 05:05:48 +02:00
},
getPixelForTick: function(index, includeOffset) {
2016-04-17 16:33:38 +02:00
return this.getPixelForValue(this.ticks[index], index + this.minIndex, null, includeOffset);
},
getValueForPixel: function(pixel) {
var me = this;
var value;
var offsetAmt = Math.max((me.ticks.length - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);
var horz = me.isHorizontal();
var innerDimension = horz ? me.width - (me.paddingLeft + me.paddingRight) : me.height - (me.paddingTop + me.paddingBottom);
var valueDimension = innerDimension / offsetAmt;
if (me.options.gridLines.offsetGridLines) {
pixel -= (valueDimension / 2);
}
pixel -= horz ? me.paddingLeft : me.paddingTop;
if (pixel <= 0) {
value = 0;
} else {
value = Math.round(pixel / valueDimension);
}
return value;
}
});
Chart.scaleService.registerScaleType("category", DatasetScale, defaultConfig);
};