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

132 lines
3.9 KiB
JavaScript
Raw Normal View History

2016-09-14 20:05:19 +02:00
'use strict';
module.exports = function(Chart) {
// Default config for a category scale
var defaultConfig = {
2016-09-14 20:05:19 +02:00
position: 'bottom'
};
var DatasetScale = Chart.Scale.extend({
/**
* Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those
* else fall back to data.labels
* @private
*/
getLabels: function() {
var data = this.chart.data;
return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;
},
2016-04-17 16:33:38 +02:00
determineDataLimits: function() {
var me = this;
var labels = me.getLabels();
me.minIndex = 0;
me.maxIndex = 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 = labels.indexOf(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 = labels.indexOf(me.options.ticks.max);
me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;
2016-04-03 05:05:48 +02:00
}
me.min = labels[me.minIndex];
me.max = labels[me.maxIndex];
2016-04-17 16:33:38 +02:00
},
2016-06-18 11:00:11 +02:00
buildTicks: function() {
var me = this;
var labels = me.getLabels();
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 === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1);
},
getLabelForIndex: function(index, datasetIndex) {
var me = this;
var data = me.chart.data;
var isHorizontal = me.isHorizontal();
if (data.yLabels && !isHorizontal) {
return me.getRightValue(data.datasets[datasetIndex].data[index]);
}
return me.ticks[index - me.minIndex];
},
// 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 value is a data object, then index is the index in the data array,
// not the index of the scale. We need to change that.
var valueCategory;
if (value !== undefined && value !== null) {
valueCategory = me.isHorizontal() ? value.x : value.y;
}
if (valueCategory !== undefined || (value !== undefined && isNaN(index))) {
var labels = me.getLabels();
value = valueCategory || value;
var idx = labels.indexOf(value);
index = idx !== -1 ? idx : index;
}
if (me.isHorizontal()) {
var valueWidth = me.width / offsetAmt;
var widthOffset = (valueWidth * (index - me.minIndex));
if (me.options.gridLines.offsetGridLines && includeOffset || me.maxIndex === me.minIndex && includeOffset) {
widthOffset += (valueWidth / 2);
}
return me.left + Math.round(widthOffset);
2016-09-15 02:23:30 +02:00
}
var valueHeight = me.height / offsetAmt;
var heightOffset = (valueHeight * (index - me.minIndex));
2016-09-15 02:23:30 +02:00
if (me.options.gridLines.offsetGridLines && includeOffset) {
heightOffset += (valueHeight / 2);
}
2016-09-15 02:23:30 +02:00
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 valueDimension = (horz ? me.width : me.height) / offsetAmt;
pixel -= horz ? me.left : me.top;
if (me.options.gridLines.offsetGridLines) {
pixel -= (valueDimension / 2);
}
if (pixel <= 0) {
value = 0;
} else {
value = Math.round(pixel / valueDimension);
}
return value;
},
getBasePixel: function() {
return this.bottom;
}
});
2016-09-14 20:05:19 +02:00
Chart.scaleService.registerScaleType('category', DatasetScale, defaultConfig);
2016-09-14 20:05:19 +02:00
};