From ec816353126edf51d968a8fa6847c91f85df286a Mon Sep 17 00:00:00 2001
From: Daniel Cothran <daniel@andile.co>
Date: Sat, 17 Feb 2018 13:38:14 -0500
Subject: [PATCH] Add stacking options for Google Charts

---
 .../src/Charts/GoogleChartsRender.php         |  6 ++
 .../src/Plugin/chart/GoogleCharts.php         |  6 ++
 .../src/Settings/Google/GoogleOptions.php     | 27 ++++++++
 .../src/Charts/HighchartsChartsRender.php     |  4 ++
 .../src/Plugin/chart/Highchart.php            |  4 ++
 .../Settings/Highcharts/ExportingOptions.php  | 65 +++++++++++++++++++
 .../src/Settings/Highcharts/Highcharts.php    | 21 ++++++
 .../views/style/ChartsPluginStyleChart.php    |  2 +-
 8 files changed, 134 insertions(+), 1 deletion(-)
 create mode 100644 modules/charts_highcharts/src/Settings/Highcharts/ExportingOptions.php

diff --git a/modules/charts_google/src/Charts/GoogleChartsRender.php b/modules/charts_google/src/Charts/GoogleChartsRender.php
index b4df824..f0d23c5 100644
--- a/modules/charts_google/src/Charts/GoogleChartsRender.php
+++ b/modules/charts_google/src/Charts/GoogleChartsRender.php
@@ -330,6 +330,12 @@ class GoogleChartsRender implements ChartsRenderInterface {
       $googleOptions->setThreeDimensional($options['three_dimensional']);
     }
 
+    // Determines if chart is stacked.
+    if (!empty($options['grouping'])) {
+      $options['grouping'] = TRUE;
+      $googleOptions->setStacking($options['grouping']);
+    }
+
     // 'legend' can be a string (for position) or an array with legend
     // properties: [position: 'top', textStyle: [color: 'blue', fontSize: 16]].
     if (isset($options['legend'])) {
diff --git a/modules/charts_google/src/Plugin/chart/GoogleCharts.php b/modules/charts_google/src/Plugin/chart/GoogleCharts.php
index 15751ba..679893f 100644
--- a/modules/charts_google/src/Plugin/chart/GoogleCharts.php
+++ b/modules/charts_google/src/Plugin/chart/GoogleCharts.php
@@ -339,6 +339,12 @@ class GoogleCharts extends AbstractChart {
       $googleOptions->setThreeDimensional($options['three_dimensional']);
     }
 
+    // Determines if chart is stacked.
+    if (!empty($options['grouping'])) {
+      $options['grouping'] = TRUE;
+      $googleOptions->setStacking($options['grouping']);
+    }
+
     // 'legend' can be a string (for position) or an array with legend
     // properties: [position: 'top', textStyle: [color: 'blue', fontSize: 16]].
     if (isset($options['legend'])) {
diff --git a/modules/charts_google/src/Settings/Google/GoogleOptions.php b/modules/charts_google/src/Settings/Google/GoogleOptions.php
index 885affa..71925fe 100644
--- a/modules/charts_google/src/Settings/Google/GoogleOptions.php
+++ b/modules/charts_google/src/Settings/Google/GoogleOptions.php
@@ -107,6 +107,13 @@ class GoogleOptions implements \JsonSerializable {
   */
   private $is3D;
 
+  /**
+   * Stacking option.
+   *
+   * @var mixed
+   */
+  private $isStacked;
+
   /**
    * Gets the title of the Material Chart. Only Material Charts support titles.
    *
@@ -394,6 +401,26 @@ class GoogleOptions implements \JsonSerializable {
     $this->is3D = $is3D;
   }
 
+  /**
+   * Gets stacking chart option.
+   *
+   * @return mixed
+   *   Stacking option.
+   */
+  public function getStacking() {
+    return $this->isStacked;
+  }
+
+  /**
+   * Sets stacking chart option.
+   *
+   * @param mixed $isStacked
+   *   Stacking option.
+   */
+  public function setStacking($isStacked) {
+    $this->isStacked = $isStacked;
+  }
+
   /**
    * Json Serialize.
    *
diff --git a/modules/charts_highcharts/src/Charts/HighchartsChartsRender.php b/modules/charts_highcharts/src/Charts/HighchartsChartsRender.php
index 2e8008f..3836d30 100644
--- a/modules/charts_highcharts/src/Charts/HighchartsChartsRender.php
+++ b/modules/charts_highcharts/src/Charts/HighchartsChartsRender.php
@@ -6,6 +6,7 @@ use Drupal\charts\Charts\ChartsRenderInterface;
 use Drupal\charts\Util\Util;
 use Drupal\charts_highcharts\Settings\Highcharts\Chart;
 use Drupal\charts_highcharts\Settings\Highcharts\ChartTitle;
+use Drupal\charts_highcharts\Settings\Highcharts\ExportingOptions;
 use Drupal\charts_highcharts\Settings\Highcharts\PlotOptionsStacking;
 use Drupal\charts_highcharts\Settings\Highcharts\Xaxis;
 use Drupal\charts_highcharts\Settings\Highcharts\XaxisTitle;
@@ -193,6 +194,8 @@ class HighchartsChartsRender implements ChartsRenderInterface {
       $chartLegend->setY('0');
     }
 
+    $exporting = new ExportingOptions($options['exporting'] ?: []);
+
     $highchart = new Highcharts();
     $highchart->setChart($chart);
     $highchart->setTitle($chartTitle);
@@ -203,6 +206,7 @@ class HighchartsChartsRender implements ChartsRenderInterface {
     $highchart->setCredits($chartCredits);
     $highchart->setLegend($chartLegend);
     $highchart->setSeries($seriesData);
+    $highchart->setExporting($exporting);
     $variables['chart_type'] = 'highcharts';
     $variables['content_attributes']['data-chart'][] = json_encode($highchart);
     $variables['attributes']['id'][0] = $chartId;
diff --git a/modules/charts_highcharts/src/Plugin/chart/Highchart.php b/modules/charts_highcharts/src/Plugin/chart/Highchart.php
index 37b70b7..981ff57 100644
--- a/modules/charts_highcharts/src/Plugin/chart/Highchart.php
+++ b/modules/charts_highcharts/src/Plugin/chart/Highchart.php
@@ -5,6 +5,7 @@ namespace Drupal\charts_highcharts\Plugin\chart;
 use Drupal\charts\Plugin\chart\AbstractChart;
 use Drupal\charts_highcharts\Settings\Highcharts\Chart;
 use Drupal\charts_highcharts\Settings\Highcharts\ChartTitle;
+use Drupal\charts_highcharts\Settings\Highcharts\ExportingOptions;
 use Drupal\charts_highcharts\Settings\Highcharts\PlotOptionsStacking;
 use Drupal\charts_highcharts\Settings\Highcharts\Xaxis;
 use Drupal\charts_highcharts\Settings\Highcharts\XaxisTitle;
@@ -200,6 +201,8 @@ class Highchart extends AbstractChart {
       $chartLegend->setY('0');
     }
 
+    $exporting = new ExportingOptions($options['exporting'] ?: []);
+
     $highchart = new Highcharts();
     $highchart->setChart($chart);
     $highchart->setTitle($chartTitle);
@@ -210,6 +213,7 @@ class Highchart extends AbstractChart {
     $highchart->setCredits($chartCredits);
     $highchart->setLegend($chartLegend);
     $highchart->setSeries($seriesData);
+    $highchart->setExporting($exporting);
     $variables['chart_type'] = 'highcharts';
     $variables['content_attributes']['data-chart'][] = json_encode($highchart);
     $variables['attributes']['id'][0] = $chartId;
diff --git a/modules/charts_highcharts/src/Settings/Highcharts/ExportingOptions.php b/modules/charts_highcharts/src/Settings/Highcharts/ExportingOptions.php
new file mode 100644
index 0000000..dee694e
--- /dev/null
+++ b/modules/charts_highcharts/src/Settings/Highcharts/ExportingOptions.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace Drupal\charts_highcharts\Settings\Highcharts;
+
+/**
+ * Class ExportingOptions.
+ */
+class ExportingOptions implements \JsonSerializable {
+
+  /**
+   * Is exporting enabled.
+   *
+   * @var bool
+   */
+  private $enabled = TRUE;
+
+  /**
+   * ExportingOptions constructor.
+   *
+   * @param array $array
+   *   (optional) A keyed array defining the exporting settings.
+   */
+  public function __construct(array $array = []) {
+    foreach ($array as $key => $value) {
+      switch ($key) {
+        case 'enabled':
+          $this->setEnabled($value);
+          break;
+      }
+    }
+  }
+
+  /**
+   * Get enabled.
+   *
+   * @return bool
+   *   Whether exporting is enabled.
+   */
+  public function getEnabled() {
+    return $this->enabled;
+  }
+
+  /**
+   * Set enabled.
+   *
+   * @param bool $enabled
+   *   Enabled if TRUE, disabled otherwise.
+   */
+  public function setEnabled($enabled) {
+    $this->enabled = $enabled;
+  }
+
+  /**
+   * Json Serialize.
+   *
+   * @return array
+   *   Json Serialize.
+   */
+  public function jsonSerialize() {
+    $vars = get_object_vars($this);
+
+    return $vars;
+  }
+
+}
\ No newline at end of file
diff --git a/modules/charts_highcharts/src/Settings/Highcharts/Highcharts.php b/modules/charts_highcharts/src/Settings/Highcharts/Highcharts.php
index 9deb147..a44d96b 100644
--- a/modules/charts_highcharts/src/Settings/Highcharts/Highcharts.php
+++ b/modules/charts_highcharts/src/Settings/Highcharts/Highcharts.php
@@ -17,6 +17,7 @@ class Highcharts implements \JsonSerializable {
   private $credits;
   private $innerSize = '%20';
   private $series;
+  private $exporting;
 
   /**
    * Get Chart.
@@ -218,6 +219,26 @@ class Highcharts implements \JsonSerializable {
     $this->series = $series;
   }
 
+  /**
+   * Get exporting options.
+   *
+   * @return \Drupal\charts_highcharts\Settings\Highcharts\ExportingOptions|null
+   *   The exporting options.
+   */
+  public function getExporting() {
+    return $this->exporting;
+  }
+
+  /**
+   * Set exporting options.
+   *
+   * @param \Drupal\charts_highcharts\Settings\Highcharts\ExportingOptions|null $exporting
+   *   The exporting options.
+   */
+  public function setExporting($exporting = NULL) {
+    $this->exporting = $exporting;
+  }
+
   /**
    * Json Serialize.
    *
diff --git a/src/Plugin/views/style/ChartsPluginStyleChart.php b/src/Plugin/views/style/ChartsPluginStyleChart.php
index b10c546..6aa0f5e 100644
--- a/src/Plugin/views/style/ChartsPluginStyleChart.php
+++ b/src/Plugin/views/style/ChartsPluginStyleChart.php
@@ -66,7 +66,7 @@ class ChartsPluginStyleChart extends StylePluginBase {
     // Limit grouping options (we only support one grouping field).
     if (isset($form['grouping'][0])) {
       $form['grouping'][0]['field']['#title'] = t('Grouping field');
-      $form['grouping'][0]['field']['#description'] = t('If grouping by a particular field, that field will be used to generate multiple data series on the same chart.');
+      $form['grouping'][0]['field']['#description'] = t('If grouping by a particular field, that field will be used to determine stacking of the chart. Generally this will be the same field as what you select for the "Label field" below. If you do not have more than one "Provides data" field below, there will be nothing to stack. If you want to have another series displayed, use a "Chart attachment" display, and set it to attach to this display. Stacking is still a work in progress for C3 Charts.');
       $form['grouping'][0]['field']['#attributes']['class'][] = 'charts-grouping-field';
       // Grouping by rendered version has no effect in charts. Hide the options.
       $form['grouping'][0]['rendered']['#access'] = FALSE;
-- 
GitLab