From 037aa55e2725722cee6885b56392802e79df86f5 Mon Sep 17 00:00:00 2001
From: andileco <daniel@andile.co>
Date: Tue, 4 Apr 2017 15:43:30 -0400
Subject: [PATCH] Add charts render interface.

---
 includes/charts.pages.inc                     |  5 +--
 .../charts_c3/src/Charts/C3ChartsRender.php   | 19 +++++-------
 .../src/Charts/GoogleChartsRender.php         | 31 +++++++------------
 .../src/Charts/HighchartsChartsRender.php     | 19 +++++-------
 src/Charts/ChartsRenderInterface.php          | 12 +++++++
 src/Charts/ModuleSelector.php                 |  3 +-
 6 files changed, 43 insertions(+), 46 deletions(-)
 create mode 100644 src/Charts/ChartsRenderInterface.php

diff --git a/includes/charts.pages.inc b/includes/charts.pages.inc
index 9e34b1a..ece8aae 100644
--- a/includes/charts.pages.inc
+++ b/includes/charts.pages.inc
@@ -40,9 +40,6 @@ define('CHARTS_SINGLE_AXIS', 'y_only');
  */
 define('CHARTS_DUAL_AXIS', 'xy');
 
-// Store Charts preprocess theme functions in a separate .inc file.
-\Drupal::moduleHandler()->loadInclude('charts', 'inc', 'charts.theme');
-
 /**
  * Retrieve a list of all charting libraries available.
  *
@@ -611,7 +608,7 @@ function charts_default_settings_form($form, $form_state) {
  */
 function charts_default_settings_form_submit($form, $form_state) {
   \Drupal::state()
-    ->set('charts_default_settings', $form_state['values']['charts_default_settings']); //was variable_set
+    ->set('charts_default_settings', $form_state['values']['charts_default_settings']);
 }
 
 
diff --git a/modules/charts_c3/src/Charts/C3ChartsRender.php b/modules/charts_c3/src/Charts/C3ChartsRender.php
index 8e26f97..d1a46f5 100644
--- a/modules/charts_c3/src/Charts/C3ChartsRender.php
+++ b/modules/charts_c3/src/Charts/C3ChartsRender.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\charts_c3\Charts;
 
+use Drupal\charts\Charts\ChartsRenderInterface;
 use Drupal\charts\Util\Util;
 use Drupal\charts_c3\Settings\CThree\ChartType;
 use Drupal\charts_c3\Settings\CThree\CThree;
@@ -10,16 +11,10 @@ use Drupal\charts_c3\Settings\CThree\ChartData;
 use Drupal\charts_c3\Settings\CThree\ChartColor;
 use Drupal\charts_c3\Settings\CThree\ChartAxis;
 
-class C3ChartsRender {
-
-  public function __construct($categories, $seriesData, $options, $attachmentDisplayOptions, &$variables, $chartId) {
+class C3ChartsRender implements ChartsRenderInterface {
 
+  public function __construct() {
     Util::checkMissingLibrary('charts_c3', '/vendor/cthree/c3.min.js');
-    $c3 = $this->charts_c3_render_charts($options, $categories, $seriesData, $chartId, $attachmentDisplayOptions);
-    $variables['chart_type'] = 'c3';
-    $variables['content_attributes']['data-chart'][] = json_encode($c3);
-    $variables['attributes']['id'][0] = $chartId;
-    $variables['attributes']['class'][] = 'charts-c3';
   }
 
   /**
@@ -31,7 +26,7 @@ class C3ChartsRender {
    *
    * @return CThree
    */
-  private function charts_c3_render_charts($options, $categories = [], $seriesData = [], $chartId, $attachmentDisplayOptions = []) {
+  public function charts_render_charts($options, $categories = [], $seriesData = [], $attachmentDisplayOptions = [], &$variables, $chartId) {
 
     $noAttachmentDisplays = count($attachmentDisplayOptions);
     $yAxis = [];
@@ -108,7 +103,9 @@ class C3ChartsRender {
     $chartColor->setPattern($seriesColors);
     $c3->setColor($chartColor);
 
-    return $c3;
+    $variables['chart_type'] = 'c3';
+    $variables['content_attributes']['data-chart'][] = json_encode($c3);
+    $variables['attributes']['id'][0] = $chartId;
+    $variables['attributes']['class'][] = 'charts-c3';
   }
-
 }
diff --git a/modules/charts_google/src/Charts/GoogleChartsRender.php b/modules/charts_google/src/Charts/GoogleChartsRender.php
index 925aefa..f67527e 100644
--- a/modules/charts_google/src/Charts/GoogleChartsRender.php
+++ b/modules/charts_google/src/Charts/GoogleChartsRender.php
@@ -2,30 +2,16 @@
 
 namespace Drupal\charts_google\Charts;
 
+use Drupal\charts\Charts\ChartsRenderInterface;
 use Drupal\charts\Util\Util;
 use Drupal\charts_google\Settings\Google\GoogleOptions;
 use Drupal\charts_google\Settings\Google\ChartType;
 use Drupal\charts_google\Settings\Google\ChartArea;
 
-class GoogleChartsRender {
+class GoogleChartsRender implements ChartsRenderInterface {
 
-  private $googleData;
-  private $googleOptions;
-  private $googleChartType;
-  private $chartId;
-
-  public function __construct($categories, $seriesData, $options, $attachmentDisplayOptions, &$variables, $chartId) {
+  public function __construct() {
     Util::checkMissingLibrary('charts_google', '/vendor/google/loader.js');
-    $this->chartId = $chartId;
-    $this->googleData = $this->charts_google_render_charts($categories, $seriesData);
-    $this->googleOptions = $this->charts_google_create_charts_options($options, $seriesData, $attachmentDisplayOptions);
-    $this->googleChartType = $this->charts_google_create_chart_type($options);
-    $variables['chart_type'] = 'google';
-    $variables['attributes']['class'][0] = 'charts-google';
-    $variables['attributes']['id'][0] = $this->chartId;
-    $variables['content_attributes']['data-chart'][] = $this->googleData;
-    $variables['attributes']['google-options'][1] = json_encode($this->googleOptions);
-    $variables['attributes']['google-chart-type'][2] = json_encode($this->googleChartType);
   }
 
   /**
@@ -35,7 +21,7 @@ class GoogleChartsRender {
    *
    * @return json|string
    */
-  private function charts_google_render_charts($categories = [], $seriesData = []) {
+  public function charts_render_charts($options, $categories = [], $seriesData = [], $attachmentDisplayOptions = [], &$variables, $chartId) {
 
     $dataTable = [];
     for ($j = 0; $j < count($categories); $j++) {
@@ -56,7 +42,14 @@ class GoogleChartsRender {
     array_unshift($dataTableHeader, 'label');
     array_unshift($dataTable, $dataTableHeader);
 
-    return json_encode($dataTable);
+    $googleOptions = $this->charts_google_create_charts_options($options, $seriesData, $attachmentDisplayOptions);
+    $googleChartType = $this->charts_google_create_chart_type($options);
+    $variables['chart_type'] = 'google';
+    $variables['attributes']['class'][0] = 'charts-google';
+    $variables['attributes']['id'][0] = $chartId;
+    $variables['content_attributes']['data-chart'][] = json_encode($dataTable);
+    $variables['attributes']['google-options'][1] = json_encode($googleOptions);
+    $variables['attributes']['google-chart-type'][2] = json_encode($googleChartType);
   }
 
   /**
diff --git a/modules/charts_highcharts/src/Charts/HighchartsChartsRender.php b/modules/charts_highcharts/src/Charts/HighchartsChartsRender.php
index e0116bb..f9e8685 100644
--- a/modules/charts_highcharts/src/Charts/HighchartsChartsRender.php
+++ b/modules/charts_highcharts/src/Charts/HighchartsChartsRender.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\charts_highcharts\Charts;
 
+use Drupal\charts\Charts\ChartsRenderInterface;
 use Drupal\charts\Util\Util;
 use Drupal\charts_highcharts\Settings\Highcharts\ChartType;
 use Drupal\charts_highcharts\Settings\Highcharts\ChartTitle;
@@ -18,17 +19,10 @@ use Drupal\charts_highcharts\Settings\Highcharts\ChartCredits;
 use Drupal\charts_highcharts\Settings\Highcharts\ChartLegend;
 use Drupal\charts_highcharts\Settings\Highcharts\Highcharts;
 
-class HighchartsChartsRender {
-
-  public function __construct($categories, $seriesData, $options, $attachmentDisplayOptions, &$variables, $chartId) {
+class HighchartsChartsRender implements ChartsRenderInterface {
 
+  public function __construct() {
     Util::checkMissingLibrary('charts_highcharts', '/vendor/highcharts/highcharts.js');
-    $highchart = $this->charts_highcharts_render_charts($options, $categories, $seriesData, $attachmentDisplayOptions);
-    $variables['chart_type'] = 'highcharts';
-    $variables['content_attributes']['data-chart'][] = json_encode($highchart);
-    $variables['attributes']['id'][0] = $chartId;
-    $variables['attributes']['class'][] = 'charts-highchart';
-
   }
 
   /**
@@ -42,7 +36,7 @@ class HighchartsChartsRender {
    *
    * @return Highcharts object to be used by highcharts javascripts visualization framework
    */
-  private function charts_highcharts_render_charts($options, $categories = [], $seriesData = [], $attachmentDisplayOptions = []) {
+  public function charts_render_charts($options, $categories = [], $seriesData = [], $attachmentDisplayOptions = [], &$variables, $chartId) {
 
     $chart = new ChartType();
     $chart->setType($options['type']);
@@ -108,6 +102,9 @@ class HighchartsChartsRender {
     $highchart->setLegend($chartLegend);
     $highchart->setSeries($seriesData);
 
-    return $highchart;
+    $variables['chart_type'] = 'highcharts';
+    $variables['content_attributes']['data-chart'][] = json_encode($highchart);
+    $variables['attributes']['id'][0] = $chartId;
+    $variables['attributes']['class'][] = 'charts-highchart';
   }
 }
diff --git a/src/Charts/ChartsRenderInterface.php b/src/Charts/ChartsRenderInterface.php
new file mode 100644
index 0000000..3032815
--- /dev/null
+++ b/src/Charts/ChartsRenderInterface.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @file
+ *
+ */
+
+namespace Drupal\charts\Charts;
+
+
+interface ChartsRenderInterface {
+  public function charts_render_charts($options, $categories = [], $seriesData = [], $attachmentDisplayOptions = [], &$variables, $chartId);
+}
\ No newline at end of file
diff --git a/src/Charts/ModuleSelector.php b/src/Charts/ModuleSelector.php
index af5ecc1..f97e400 100644
--- a/src/Charts/ModuleSelector.php
+++ b/src/Charts/ModuleSelector.php
@@ -34,7 +34,8 @@ class ModuleSelector {
     if ('charts_' . $moduleExist) {
       $className = ucfirst($moduleName);
       $moduleChartsRenderer = 'Drupal\charts_' . $moduleName . '\Charts\\' . ucfirst($moduleName) . 'ChartsRender';
-      $chartingModule = new $moduleChartsRenderer($this->categories, $this->seriesData, $this->options, $this->attachmentDisplayOptions, $variables, $this->chartId);
+      $chartingModule = new $moduleChartsRenderer();
+      $chartingModule->charts_render_charts($this->options, $this->categories, $this->seriesData, $this->attachmentDisplayOptions, $variables, $this->chartId);
     }
   }
 }
-- 
GitLab