MDL-55092 core: Add support for custom Y axis labels
authorFrederic Massart <fred@moodle.com>
Fri, 1 Jul 2016 05:05:40 +0000 (13:05 +0800)
committerDan Poltawski <dan@moodle.com>
Mon, 25 Jul 2016 09:42:54 +0000 (10:42 +0100)
Part of MDL-54987 epic.

lib/amd/build/chart_axis.min.js
lib/amd/build/chart_output_chartjs.min.js
lib/amd/src/chart_axis.js
lib/amd/src/chart_output_chartjs.js
lib/classes/chart_axis.php

index 9499e8d..22ebd64 100644 (file)
Binary files a/lib/amd/build/chart_axis.min.js and b/lib/amd/build/chart_axis.min.js differ
index 2bc3de8..ff3210f 100644 (file)
Binary files a/lib/amd/build/chart_output_chartjs.min.js and b/lib/amd/build/chart_output_chartjs.min.js differ
index 53a2b75..69db868 100644 (file)
@@ -36,6 +36,7 @@ define([], function() {
     Axis.prototype.POS_TOP = 'top';
 
     Axis.prototype._label = null;
+    Axis.prototype._labels = null;
     Axis.prototype._max = null;
     Axis.prototype._min = null;
     Axis.prototype._position = null;
@@ -48,6 +49,7 @@ define([], function() {
         s.setStepSize(obj.stepSize);
         s.setMax(obj.max);
         s.setMin(obj.min);
+        s.setLabels(obj.labels);
         return s;
     };
 
@@ -55,6 +57,10 @@ define([], function() {
         return this._label;
     };
 
+    Axis.prototype.getLabels = function() {
+        return this._labels;
+    };
+
     Axis.prototype.getMax = function() {
         return this._max;
     };
@@ -75,6 +81,20 @@ define([], function() {
         this._label = label || null;
     };
 
+    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);
+        }
+    };
+
     Axis.prototype.setMax = function(max) {
         this._max = typeof max !== 'undefined' ? max : null;
     };
index 2a7d24f..54daedd 100644 (file)
@@ -122,9 +122,17 @@ define([
         }.bind(this));
 
         this._chart.getYAxes().forEach(function(axis, i) {
+            var axisLabels = axis.getLabels();
+
             config.options.scales = config.options.scales || {};
             config.options.scales.yAxes = config.options.scales.yAxes || [];
             config.options.scales.yAxes[i] = this._makeAxisConfig(axis);
+
+            if (axisLabels !== null) {
+                config.options.scales.yAxes[i].ticks.callback = function(value) {
+                    return axisLabels[parseInt(value, 10)] || '';
+                };
+            }
         }.bind(this));
 
         return config;
index 3ea1342..58ee667 100644 (file)
@@ -45,6 +45,7 @@ class chart_axis implements JsonSerializable {
     const POS_TOP = 'top';
 
     protected $label = null;
+    protected $labels = null;
     protected $max = null;
     protected $min = null;
     protected $position = self::POS_DEFAULT;
@@ -57,6 +58,10 @@ class chart_axis implements JsonSerializable {
         return $this->label;
     }
 
+    public function get_labels() {
+        return $this->labels;
+    }
+
     public function get_max() {
         return $this->max;
     }
@@ -76,6 +81,7 @@ class chart_axis implements JsonSerializable {
     public function jsonSerialize() {
         return [
             'label' => $this->label,
+            'labels' => $this->labels,
             'max' => $this->max,
             'min' => $this->min,
             'position' => $this->position,
@@ -87,6 +93,10 @@ class chart_axis implements JsonSerializable {
         return $this->label = $label;
     }
 
+    public function set_labels($labels) {
+        return $this->labels = $labels;
+    }
+
     public function set_max($max) {
         return $this->max = $max;
     }