| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 | 'use strict';module.exports = function(Chart) {	var helpers = Chart.helpers;	var defaultConfig = {		position: 'left',		ticks: {			callback: Chart.Ticks.formatters.linear		}	};	var LinearScale = Chart.LinearScaleBase.extend({		determineDataLimits: function() {			var me = this;			var opts = me.options;			var chart = me.chart;			var data = chart.data;			var datasets = data.datasets;			var isHorizontal = me.isHorizontal();			function IDMatches(meta) {				return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;			}			// First Calculate the range			me.min = null;			me.max = null;			if (opts.stacked) {				var valuesPerType = {};				helpers.each(datasets, function(dataset, datasetIndex) {					var meta = chart.getDatasetMeta(datasetIndex);					if (valuesPerType[meta.type] === undefined) {						valuesPerType[meta.type] = {							positiveValues: [],							negativeValues: []						};					}					// Store these per type					var positiveValues = valuesPerType[meta.type].positiveValues;					var negativeValues = valuesPerType[meta.type].negativeValues;					if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {						helpers.each(dataset.data, function(rawValue, index) {							var value = +me.getRightValue(rawValue);							if (isNaN(value) || meta.data[index].hidden) {								return;							}							positiveValues[index] = positiveValues[index] || 0;							negativeValues[index] = negativeValues[index] || 0;							if (opts.relativePoints) {								positiveValues[index] = 100;							} else if (value < 0) {								negativeValues[index] += value;							} else {								positiveValues[index] += value;							}						});					}				});				helpers.each(valuesPerType, function(valuesForType) {					var values = valuesForType.positiveValues.concat(valuesForType.negativeValues);					var minVal = helpers.min(values);					var maxVal = helpers.max(values);					me.min = me.min === null ? minVal : Math.min(me.min, minVal);					me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);				});			} else {				helpers.each(datasets, function(dataset, datasetIndex) {					var meta = chart.getDatasetMeta(datasetIndex);					if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {						helpers.each(dataset.data, function(rawValue, index) {							var value = +me.getRightValue(rawValue);							if (isNaN(value) || meta.data[index].hidden) {								return;							}							if (me.min === null) {								me.min = value;							} else if (value < me.min) {								me.min = value;							}							if (me.max === null) {								me.max = value;							} else if (value > me.max) {								me.max = value;							}						});					}				});			}			// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero			this.handleTickRangeOptions();		},		getTickLimit: function() {			var maxTicks;			var me = this;			var tickOpts = me.options.ticks;			if (me.isHorizontal()) {				maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50));			} else {				// The factor of 2 used to scale the font size has been experimentally determined.				var tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, Chart.defaults.global.defaultFontSize);				maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize)));			}			return maxTicks;		},		// Called after the ticks are built. We need		handleDirectionalChanges: function() {			if (!this.isHorizontal()) {				// We are in a vertical orientation. The top value is the highest. So reverse the array				this.ticks.reverse();			}		},		getLabelForIndex: function(index, datasetIndex) {			return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);		},		// Utils		getPixelForValue: function(value) {			// This must be called after fit has been run so that			// this.left, this.top, this.right, and this.bottom have been defined			var me = this;			var start = me.start;			var rightValue = +me.getRightValue(value);			var pixel;			var range = me.end - start;			if (me.isHorizontal()) {				pixel = me.left + (me.width / range * (rightValue - start));				return Math.round(pixel);			}			pixel = me.bottom - (me.height / range * (rightValue - start));			return Math.round(pixel);		},		getValueForPixel: function(pixel) {			var me = this;			var isHorizontal = me.isHorizontal();			var innerDimension = isHorizontal ? me.width : me.height;			var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;			return me.start + ((me.end - me.start) * offset);		},		getPixelForTick: function(index) {			return this.getPixelForValue(this.ticksAsNumbers[index]);		}	});	Chart.scaleService.registerScaleType('linear', LinearScale, defaultConfig);};
 |