"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({ // Implement this so that determineDataLimits: function() { var me = this; me.minIndex = 0; me.maxIndex = me.chart.data.labels.length - 1; var findIndex; if (me.options.ticks.min !== undefined) { // user specified min value findIndex = helpers.indexOf(me.chart.data.labels, me.options.ticks.min); me.minIndex = findIndex !== -1 ? findIndex : me.minIndex; } if (me.options.ticks.max !== undefined) { // user specified max value findIndex = helpers.indexOf(me.chart.data.labels, me.options.ticks.max); me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex; } me.min = me.chart.data.labels[me.minIndex]; me.max = me.chart.data.labels[me.maxIndex]; }, buildTicks: function(index) { var me = this; // 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; // 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); if (me.isHorizontal()) { var innerWidth = me.width - (me.paddingLeft + me.paddingRight); 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); 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); } }, getPixelForTick: function(index, includeOffset) { 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); };