// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Chart axis.
*
* @module core/chart_axis
* @copyright 2016 Frédéric Massart - FMCorz.net
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define([], function() {
/**
* Chart axis class.
*
* This is used to represent an axis, whether X or Y.
*
* @class core/chart_axis
*/
function Axis() {
// Please eslint no-empty-function.
}
/**
* Default axis position.
* @const {Null}
*/
Axis.prototype.POS_DEFAULT = null;
/**
* Bottom axis position.
* @const {String}
*/
Axis.prototype.POS_BOTTOM = 'bottom';
/**
* Left axis position.
* @const {String}
*/
Axis.prototype.POS_LEFT = 'left';
/**
* Right axis position.
* @const {String}
*/
Axis.prototype.POS_RIGHT = 'right';
/**
* Top axis position.
* @const {String}
*/
Axis.prototype.POS_TOP = 'top';
/**
* Label of the axis.
* @type {String}
* @protected
*/
Axis.prototype._label = null;
/**
* Labels of the ticks.
* @type {String[]}
* @protected
*/
Axis.prototype._labels = null;
/**
* Maximum value of the axis.
* @type {Number}
* @protected
*/
Axis.prototype._max = null;
/**
* Minimum value of the axis.
* @type {Number}
* @protected
*/
Axis.prototype._min = null;
/**
* Position of the axis.
* @type {String}
* @protected
*/
Axis.prototype._position = null;
/**
* Steps on the axis.
* @type {Number}
* @protected
*/
Axis.prototype._stepSize = null;
/**
* Create a new instance of an axis from serialised data.
*
* @static
* @method create
* @param {Object} obj The data of the axis.
* @return {module:core/chart_axis}
*/
Axis.prototype.create = function(obj) {
var s = new Axis();
s.setPosition(obj.position);
s.setLabel(obj.label);
s.setStepSize(obj.stepSize);
s.setMax(obj.max);
s.setMin(obj.min);
s.setLabels(obj.labels);
return s;
};
/**
* Get the label of the axis.
*
* @method getLabel
* @return {String}
*/
Axis.prototype.getLabel = function() {
return this._label;
};
/**
* Get the labels of the ticks of the axis.
*
* @method getLabels
* @return {String[]}
*/
Axis.prototype.getLabels = function() {
return this._labels;
};
/**
* Get the maximum value of the axis.
*
* @method getMax
* @return {Number}
*/
Axis.prototype.getMax = function() {
return this._max;
};
/**
* Get the minimum value of the axis.
*
* @method getMin
* @return {Number}
*/
Axis.prototype.getMin = function() {
return this._min;
};
/**
* Get the position of the axis.
*
* @method getPosition
* @return {String}
*/
Axis.prototype.getPosition = function() {
return this._position;
};
/**
* Get the step size of the axis.
*
* @method getStepSize
* @return {Number}
*/
Axis.prototype.getStepSize = function() {
return this._stepSize;
};
/**
* Set the label of the axis.
*
* @method setLabel
* @param {String} label The label.
*/
Axis.prototype.setLabel = function(label) {
this._label = label || null;
};
/**
* Set the labels of the values on the axis.
*
* This automatically sets the [_stepSize]{@link module:core/chart_axis#_stepSize},
* [_min]{@link module:core/chart_axis#_min} and [_max]{@link module:core/chart_axis#_max}
* to define a scale from 0 to the number of labels when none of the previously
* mentioned values have been modified.
*
* You can use other values so long that your values in a series are mapped
* to the values represented by your _min, _max and _stepSize.
*
* @method setLabels
* @param {String[]} labels The labels.
*/
Axis.prototype.setLabels = function(labels) {
this._labels = labels || null;
// By default we set the grid according to the labels.
if (this._labels !== null
&& this._stepSize === null
&& (this._min === null || this._min === 0)
&& this._max === null) {
this.setStepSize(1);
this.setMin(0);
this.setMax(labels.length - 1);
}
};
/**
* Set the maximum value on the axis.
*
* When this is not set (or set to null) it is left for the output
* library to best guess what should be used.
*
* @method setMax
* @param {Number} max The value.
*/
Axis.prototype.setMax = function(max) {
this._max = typeof max !== 'undefined' ? max : null;
};
/**
* Set the minimum value on the axis.
*
* When this is not set (or set to null) it is left for the output
* library to best guess what should be used.
*
* @method setMin
* @param {Number} min The value.
*/
Axis.prototype.setMin = function(min) {
this._min = typeof min !== 'undefined' ? min : null;
};
/**
* Set the position of the axis.
*
* This does not validate whether or not the constant used is valid
* as the axis itself is not aware whether it represents the X or Y axis.
*
* The output library has to have a fallback in case the values are incorrect.
* When this is not set to {@link module:core/chart_axis#POS_DEFAULT} it is up
* to the output library to choose what position fits best.
*
* @method setPosition
* @param {String} position The value.
*/
Axis.prototype.setPosition = function(position) {
if (position != this.POS_DEFAULT
&& position != this.POS_BOTTOM
&& position != this.POS_LEFT
&& position != this.POS_RIGHT
&& position != this.POS_TOP) {
throw new Error('Invalid axis position.');
}
this._position = position;
};
/**
* Set the stepSize on the axis.
*
* This is used to determine where ticks are displayed on the axis between min and max.
*
* @method setStepSize
* @param {Number} stepSize The value.
*/
Axis.prototype.setStepSize = function(stepSize) {
if (typeof stepSize === 'undefined' || stepSize === null) {
stepSize = null;
} else if (isNaN(Number(stepSize))) {
throw new Error('Value for stepSize is not a number.');
} else {
stepSize = Number(stepSize);
}
this._stepSize = stepSize;
};
return Axis;
});