MDL-55710 core: Add support for doughnut charts
authorSimey Lameze <simey@moodle.com>
Thu, 25 Aug 2016 03:59:13 +0000 (11:59 +0800)
committerSimey Lameze <simey@moodle.com>
Fri, 26 Aug 2016 05:30:02 +0000 (13:30 +0800)
lib/amd/build/chart_output_chartjs.min.js
lib/amd/build/chart_pie.min.js
lib/amd/src/chart_output_chartjs.js
lib/amd/src/chart_pie.js
lib/classes/chart_pie.php

index 62ae60a..7b85711 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 aab6464..557d2b3 100644 (file)
Binary files a/lib/amd/build/chart_pie.min.js and b/lib/amd/build/chart_pie.min.js differ
index dee3915..e93fa8b 100644 (file)
@@ -99,11 +99,12 @@ define([
     };
 
     /**
-     * Get the chart type.
+     * Get the chart type and handles the Chart.js specific chart types.
      *
-     * It also handles the bar charts positioning, deciding if the bars should be displayed horizontally.
-     * Otherwise, get the chart TYPE value.
+     * By default returns the current chart TYPE value. Also does the handling of specific chart types, for example
+     * check if the bar chart should be horizontal and the pie chart should be displayed as a doughnut.
      *
+     * @method getChartType
      * @returns {String} the chart type.
      * @protected
      */
@@ -113,6 +114,9 @@ define([
         // Bars can be displayed vertically and horizontally, defining horizontalBar type.
         if (this._chart.getType() === Bar.prototype.TYPE && this._chart.getHorizontal() === true) {
             type = 'horizontalBar';
+        } else if (this._chart.getType() === Pie.prototype.TYPE && this._chart.getDoughnut() === true) {
+            // Pie chart can be displayed as doughnut.
+            type = 'doughnut';
         }
 
         return type;
index 632e109..bce2ef2 100644 (file)
@@ -38,6 +38,21 @@ define(['core/chart_base'], function(Base) {
     /** @override */
     Pie.prototype.TYPE = 'pie';
 
+    /**
+     * Whether the chart should be displayed as doughnut or not.
+     *
+     * @type {Bool}
+     * @protected
+     */
+    Pie.prototype._doughnut = null;
+
+    /** @override */
+    Pie.prototype.create = function(Klass, data) {
+        var chart = Base.prototype.create.apply(this, arguments);
+        chart.setDoughnut(data.doughnut);
+        return chart;
+    };
+
     /**
      * Overridden to add appropriate colors to the series.
      *
@@ -54,6 +69,26 @@ define(['core/chart_base'], function(Base) {
         return Base.prototype.addSeries.apply(this, arguments);
     };
 
+    /**
+     * Get whether the chart should be displayed as doughnut or not.
+     *
+     * @method getDoughnut
+     * @returns {Bool}
+     */
+    Pie.prototype.getDoughnut = function() {
+        return this._doughnut;
+    };
+
+    /**
+     * Set whether the chart should be displayed as doughnut or not.
+     *
+     * @method setDoughnut
+     * @param {Bool} doughnut True for doughnut type, false for pie.
+     */
+    Pie.prototype.setDoughnut = function(doughnut) {
+        this._doughnut = Boolean(doughnut);
+    };
+
     /**
      * Validate a series.
      *
index 32745ba..b4c2041 100644 (file)
@@ -33,4 +33,36 @@ defined('MOODLE_INTERNAL') || die();
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 class chart_pie extends chart_base {
+
+    /** @var bool $doughnut Whether the chart should be displayed as doughnut. */
+    protected $doughnut = null;
+
+    /**
+     * Get parent JSON and add specific pie related attributes and values.
+     *
+     * @return array
+     */
+    public function jsonSerialize() { // @codingStandardsIgnoreLine (CONTRIB-6469).
+        $data = parent::jsonSerialize();
+        $data['doughnut'] = $this->get_doughnut();
+        return $data;
+    }
+
+    /**
+     * Get whether the chart should be displayed as doughnut.
+     *
+     * @return bool
+     */
+    public function get_doughnut() {
+        return $this->doughnut;
+    }
+
+    /**
+     * Set whether the chart should be displayed as doughnut.
+     *
+     * @param bool $doughnut True for doughnut type, false for pie.
+     */
+    public function set_doughnut($doughnut) {
+        $this->doughnut = $doughnut;
+    }
 }