From 7f150408b77fec19c85b119f3411d94def66bfba Mon Sep 17 00:00:00 2001
From: andileco <daniel@andile.co>
Date: Fri, 31 Mar 2017 16:00:22 -0400
Subject: [PATCH] This commit takes all sub-module-specific code out of the
 core charts module, making the module more extensible. It also improves the
 libraries.yml files and removes unused code from various parts of the site.

---
 charts.api.php                                |  19 +--
 charts.libraries.yml                          |   9 --
 charts.module                                 |  43 +-----
 charts.services.yml                           |   3 +
 includes/charts.pages.inc                     |   1 -
 js/charts.admin.js                            | 113 ---------------
 modules/charts_c3/charts_c3.libraries.yml     |   4 +-
 modules/charts_c3/charts_c3.module            | 104 +-------------
 .../charts_c3/src/Charts/C3ChartsRender.php   | 114 ++++++++++++++++
 .../src/Settings/CThree/ChartAxis.php         |   2 +-
 .../src/Settings/CThree/ChartColor.php        |   2 +-
 .../src/Settings/CThree/ChartData.php         |   2 +-
 .../charts_google/charts_google.libraries.yml |   3 +-
 modules/charts_google/charts_google.module    | 104 +-------------
 .../src/Charts/GoogleChartsRender.php         | 129 ++++++++++++++++++
 .../charts_highcharts.libraries.yml           |   2 +-
 .../charts_highcharts.module                  | 101 +-------------
 .../src/Charts/HighchartsChartsRender.php     | 113 +++++++++++++++
 .../src/Settings/Highcharts/ChartLabel.php    |   2 +-
 .../src/Settings/Highcharts/Highcharts.php    |   8 +-
 .../src/Settings/Highcharts/Xaxis.php         |   2 +-
 src/Charts/ModuleSelector.php                 |  40 ++++++
 .../display/ChartsPluginDisplayChart.php      |  27 ++--
 .../views/style/ChartsPluginStyleChart.php    |  44 +++---
 src/Util/Util.php                             |  34 +++--
 templates/views-view-charts.html.twig         |  15 +-
 26 files changed, 487 insertions(+), 553 deletions(-)
 delete mode 100644 charts.libraries.yml
 delete mode 100644 js/charts.admin.js
 create mode 100644 modules/charts_c3/src/Charts/C3ChartsRender.php
 create mode 100644 modules/charts_google/src/Charts/GoogleChartsRender.php
 create mode 100644 modules/charts_highcharts/src/Charts/HighchartsChartsRender.php
 create mode 100644 src/Charts/ModuleSelector.php

diff --git a/charts.api.php b/charts.api.php
index d06d5d5..c2a33b5 100644
--- a/charts.api.php
+++ b/charts.api.php
@@ -102,15 +102,6 @@ function hook_chart_CHART_ID_alter(&$chart) {
  *   all charts may have a $chart_id.
  */
 function hook_chart_definition_alter(&$definition, $chart) {
-  if ($chart['#chart_library'] === 'google') {
-    $definition['options']['titleTextStyle']['fontSize'] = 20;
-  }
-  if ($chart['#chart_library'] === 'c3') {
-    $definition['options']['titleTextStyle']['fontSize'] = 20;
-  }
-  elseif ($chart['#chart_library'] === 'highcharts') {
-    $definition['title']['style']['fontSize'] = 20;
-  }
 }
 
 /**
@@ -132,16 +123,16 @@ function hook_chart_definition_CHART_ID_alter(&$chart) {
  * hook may be used as a #chart_library property on $chart renderables.
  */
 function hook_charts_info() {
-  $info['my_charting_library'] = array(
+  $info['my_charting_library'] = [
     'label' => t('New charting library'),
     // Specify a callback function which will be responsible for accepting a
     // $chart renderable and printing a chart on the page.
     'render' => '_my_charting_library_render',
     // Specify the chart types your library is capable of providing.
-    'types' => array('area', 'bar', 'column', 'line', 'pie', 'scatter'),
+    'types' => ['area', 'bar', 'column', 'line', 'pie', 'scatter'],
     // If your callback function is in a separate file, specify it's location.
     // 'file' => 'includes/my_charting_library.inc',
-  );
+  ];
   return $info;
 }
 
@@ -165,7 +156,7 @@ function hook_charts_info_alter(&$info) {
  * all charting libraries.
  */
 function hook_charts_type_info() {
-  $chart_types['bar'] = array(
+  $chart_types['bar'] = [
     'label' => t('Bar'),
     // If this chart supports both an X and Y axis, set this to
     // CHARTS_DUAL_AXIS. If only a single axis is supported (e.g. pie), then
@@ -178,7 +169,7 @@ function hook_charts_type_info() {
     // For bar/area/other charts that support stacking of series, set this value
     // to TRUE.
     'stacking' => TRUE,
-  );
+  ];
   return $chart_types;
 }
 
diff --git a/charts.libraries.yml b/charts.libraries.yml
deleted file mode 100644
index e50681f..0000000
--- a/charts.libraries.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-charts:
-  version: 1.x
-  js:
-    js/charts.admin.js: {}
-  dependencies:
-    - core/jquery
-    - core/jquery.once
-    - core/drupal
-    - core/drupalSettings
diff --git a/charts.module b/charts.module
index 1c2b192..ea293d0 100644
--- a/charts.module
+++ b/charts.module
@@ -6,6 +6,7 @@
  */
 
 use Drupal\charts\Util\Util;
+use Drupal\charts\Charts\ModuleSelector;
 
 /**
  * {@inheritdoc}
@@ -73,8 +74,7 @@ function template_preprocess_views_view_charts(&$variables) {
 
   if (0 < count($attachmentView)) {
     $data = Util::viewsData($view, $valueField, $labelField, $color, $attachmentChartTypeOption[$i]);
-  }
-  else {
+  } else {
     $data = Util::viewsData($view, $valueField, $labelField, $color, $attachmentChartTypeOption[$i] = NULL);
   }
 
@@ -91,43 +91,6 @@ function template_preprocess_views_view_charts(&$variables) {
   }
   $seriesData = array_merge($seriesData, $seriesDataAttachment);
 
-  // Handles the toggling from one library to another.
-  switch ($library) {
-    case 'google':
-      Util::checkMissingLibrary('charts_google', '/vendor/google/loader.js');
-      $googleData = charts_google_render_charts($categories, $seriesData);
-      $googleOptions = charts_google_create_charts_options($options, $seriesData, $attachmentDisplayOptions);
-      $googleChartType = 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'][] = $googleData;
-      $variables['attributes']['google-options'][1] = json_encode($googleOptions);
-      $variables['attributes']['google-chart-type'][2] = json_encode($googleChartType);
-
-      break;
-
-    case 'highcharts':
-      Util::checkMissingLibrary('charts_highcharts', '/vendor/highcharts/highcharts.js');
-      $highchart = 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';
-
-      break;
-
-    case 'c3':
-      Util::checkMissingLibrary('charts_c3', '/vendor/cthree/c3.min.js');
-      $c3 = 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';
-      break;
-
-    default:
-      // Not handled.
-  }
+  $moduleSelector = new ModuleSelector($library, $categories, $seriesData, $options, $attachmentDisplayOptions, $variables, $chartId);
 
 }
diff --git a/charts.services.yml b/charts.services.yml
index a948584..6295540 100644
--- a/charts.services.yml
+++ b/charts.services.yml
@@ -4,3 +4,6 @@ services:
 
   charts.charts_attachment:
     class: Drupal\charts\Services\ChartAttachmentService
+
+  charts.views_variable:
+    class: Drupal\charts\Services\ViewsDataService
diff --git a/includes/charts.pages.inc b/includes/charts.pages.inc
index 5fef5bb..9e34b1a 100644
--- a/includes/charts.pages.inc
+++ b/includes/charts.pages.inc
@@ -218,7 +218,6 @@ function charts_cast_element_integer_values(&$element) {
 function charts_settings_form($form, $defaults = array(), $field_options = array(), $parents = array()) {
   // Ensure all defaults are set.
   $options = array_merge(charts_default_settings(), $defaults);
-  $form['#attached']['library'][] = "charts/charts.admin";
 
   // Get a list of available chart libraries.
   $charts_info = charts_info();
diff --git a/js/charts.admin.js b/js/charts.admin.js
deleted file mode 100644
index 14b8c34..0000000
--- a/js/charts.admin.js
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * @file
- * Scripting for administrative interfaces of Charts module.
- */
-(function ($) {
-  'use strict';
-
-  Drupal.behaviors.chartsAdmin = {
-    attach: function (context, settings) {
-      // Change options based on the chart type selected.
-      $(context).find('.form-radios.chart-type-radios').once('charts-axis-inverted', function () {
-
-        // Manually attach collapsible fieldsets first.
-        if (Drupal.behaviors.collapse) {
-          Drupal.behaviors.collapse.attach(context, settings);
-        }
-
-        var xAxisLabel = $('fieldset.chart-xaxis .fieldset-title').html();
-        var yAxisLabel = $('fieldset.chart-yaxis .fieldset-title').html();
-
-        $(this).find('input:radio').change(function () {
-          if ($(this).is(':checked')) {
-            var groupingField = $(this).closest('form').find('.charts-grouping-field').val();
-
-            // Flip X/Y axis fieldset labels for inverted chart types.
-            if ($(this).attr('data-axis-inverted')) {
-              $('fieldset.chart-xaxis .fieldset-title').html(yAxisLabel);
-              $('fieldset.chart-xaxis .axis-inverted-show').closest('.form-item').show();
-              $('fieldset.chart-xaxis .axis-inverted-hide').closest('.form-item').hide();
-              $('fieldset.chart-yaxis .fieldset-title').html(xAxisLabel);
-              $('fieldset.chart-yaxis .axis-inverted-show').closest('.form-item').show();
-              $('fieldset.chart-yaxis .axis-inverted-hide').closest('.form-item').hide();
-            }
-            else {
-              $('fieldset.chart-xaxis .fieldset-title').html(xAxisLabel);
-              $('fieldset.chart-xaxis .axis-inverted-show').closest('.form-item').hide();
-              $('fieldset.chart-xaxis .axis-inverted-hide').closest('.form-item').show();
-              $('fieldset.chart-yaxis .fieldset-title').html(yAxisLabel);
-              $('fieldset.chart-yaxis .axis-inverted-show').closest('.form-item').hide();
-              $('fieldset.chart-yaxis .axis-inverted-hide').closest('.form-item').show();
-            }
-
-            // Show color options for single axis settings.
-            if ($(this).attr('data-axis-single')) {
-              $('fieldset.chart-xaxis').hide();
-              $('fieldset.chart-yaxis').hide();
-              $('th.chart-field-color, td.chart-field-color').hide();
-              $('div.chart-colors').show();
-            }
-            else {
-              $('fieldset.chart-xaxis').show();
-              $('fieldset.chart-yaxis').show();
-              if (groupingField) {
-                $('th.chart-field-color, td.chart-field-color').hide();
-                $('div.chart-colors').show();
-              }
-              else {
-                $('th.chart-field-color, td.chart-field-color').show();
-                $('div.chart-colors').hide();
-              }
-            }
-          }
-        });
-
-        // Set the initial values.
-        $(this).find('input:radio:checked').triggerHandler('change');
-      });
-
-      // React to the setting of a group field.
-      $(context).find('.charts-grouping-field').once('charts-grouping', function () {
-        $(this).change(function () {
-          var $form;
-          $form = $(this).closest('form');
-
-          // Hide the entire grouping field row, since no settings are applicable.
-          var value = $(this).val();
-          $form.find('#chart-fields tr').show();
-          if (value) {
-            var $labelField = $form.find('.chart-label-field input[value="' + value + '"]');
-            $labelField.closest('tr').hide();
-            if ($labelField.is(':checked')) {
-              $form.find('input[name="style_options[label_field]"][value=""]').attr('checked', 'checked').triggerHandler('change');
-            }
-          }
-          // Restripe the table after hiding/showing rows.
-          $form.find('#chart-fields tr:visible')
-            .removeClass('odd even')
-            .filter(':even').addClass('odd').end()
-            .filter(':odd').addClass('even');
-
-          // Recalculate shown color fields by triggering the chart type change.
-          $form.find('.form-radios.chart-type-radios input:radio:checked').triggerHandler('change');
-        }).triggerHandler('change');
-      });
-
-      // Disable the data checkbox when a field is set as a label.
-      $(context).find('td.chart-label-field input').once('charts-axis-inverted', function () {
-        var $radio = $(this);
-        $radio.change(function () {
-          if ($radio.is(':checked')) {
-            $('.chart-data-field input').show();
-            $('.chart-field-color input').show();
-            $('input.chart-field-disabled').remove();
-            $radio.closest('tr').find('.chart-data-field input').hide().after('<input type="checkbox" name="chart_field_disabled" disabled="disabled" class="chart-field-disabled" />');
-            $radio.closest('tr').find('.chart-field-color input').hide();
-          }
-        });
-        $radio.triggerHandler('change');
-      });
-
-    }
-  };
-}(jQuery));
diff --git a/modules/charts_c3/charts_c3.libraries.yml b/modules/charts_c3/charts_c3.libraries.yml
index ab41b79..2db5b68 100644
--- a/modules/charts_c3/charts_c3.libraries.yml
+++ b/modules/charts_c3/charts_c3.libraries.yml
@@ -29,7 +29,5 @@ c3:
   js:
     vendor/cthree/c3.min.js: {}
   dependencies:
-        - core/jquery
-        - core/jquery.once
-        - core/drupal
+        - charts_c3/charts_c3
         - charts_c3/d3
\ No newline at end of file
diff --git a/modules/charts_c3/charts_c3.module b/modules/charts_c3/charts_c3.module
index 0f70235..d8ee65b 100644
--- a/modules/charts_c3/charts_c3.module
+++ b/modules/charts_c3/charts_c3.module
@@ -5,111 +5,13 @@
  * Charts module integration with C3 library.
  */
 
-use Drupal\charts_c3\Settings\CThree\ChartType;
-use Drupal\charts_c3\Settings\CThree\CThree;
-use Drupal\charts_c3\Settings\CThree\ChartTitle;
-use Drupal\charts_c3\Settings\CThree\ChartData;
-use Drupal\charts_c3\Settings\CThree\ChartColor;
-use Drupal\charts_c3\Settings\CThree\ChartAxis;
-
 /**
  * Implements hook_charts_info().
  */
 function charts_c3_charts_info() {
-  $info['c3'] = array(
+  $info['c3'] = [
     'label' => t('C3 Charts'),
-    'types' => array('area', 'bar', 'column', 'line', 'pie', 'scatter'),
-  );
+    'types' => ['area', 'bar', 'column', 'line', 'pie', 'scatter'],
+  ];
   return $info;
 }
-
-/**
- * @param $options
- * @param array $categories
- * @param array $seriesData
- * @param $chartId
- * @param array $attachmentDisplayOptions
- *
- * @return CThree
- */
-function charts_c3_render_charts($options, $categories = array(), $seriesData = array(), $chartId, $attachmentDisplayOptions = []) {
-
-  $noAttachmentDisplays = count($attachmentDisplayOptions);
-  $yAxis = [];
-  $types = [];
-  //sets secondary axis from the first attachment only
-  if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0){
-    $yAxis[$seriesData[1]['name']] = 'y2';
-  }
-
-  for ($i = 1; $i <= count($attachmentDisplayOptions); $i++){
-    if ($attachmentDisplayOptions[$i - 1]['style']['options']['type'] == 'column')
-      $types[$seriesData[$i]['name']] = 'bar';
-    else
-      $types[$seriesData[$i]['name']] = $attachmentDisplayOptions[$i - 1]['style']['options']['type'];
-  }
-  $c3Data = array();
-  for ($i = 0; $i < count($seriesData); $i++) {
-    $c3DataTemp = $seriesData[$i]['data'];
-    array_unshift($c3DataTemp, $seriesData[$i]['name']);
-    array_push($c3Data, $c3DataTemp);
-  }
-
-  $c3Chart = new ChartType();
-  $c3Chart->setType($options['type']);
-  $c3ChartTitle = new ChartTitle();
-  $c3ChartTitle->setText($options['title']);
-  $chartAxis = new ChartAxis();
-  $c3 = new CThree();
-  $bindTo = '#' . $chartId;
-  $c3->setBindTo($bindTo);
-  //$c3->setChart($c3Chart);
-  //$c3->setLabels($options['data_labels']);
-  $c3->setTitle($c3ChartTitle);
-  $chartData = new ChartData();
-  if ($noAttachmentDisplays > 0){
-    $chartData->setLabels(FALSE);
-  }
-  if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0){
-    $chartData->axes = $yAxis;
-    $showSecAxis['show'] = true;
-    $showSecAxis['label'] = $attachmentDisplayOptions[0]['style']['options']['yaxis_title'];
-    $chartAxis->y2 = $showSecAxis;
-  }
-  $chartData->setType($options['type']);
-  $c3->setData($chartData);
-  if ($options['type'] == 'bar') {
-    $chartAxis->setRotated(TRUE);
-    array_unshift($categories, 'x');
-    array_push($c3Data, $categories);
-    $chartData->setColumns($c3Data);
-  }
-  else {
-    if ($options['type'] == 'column') {
-      $chartData->setType('bar');
-      $chartAxis->setRotated(FALSE);
-      array_unshift($categories, 'x');
-      array_push($c3Data, $categories);
-      $chartData->setColumns($c3Data);
-    }
-    else {
-      array_unshift($categories, 'x');
-      array_push($c3Data, $categories);
-      $chartData->setColumns($c3Data);
-    }
-  }
-  $chartData->types = $types;
-
-  $c3->setAxis($chartAxis);
-
-  $chartColor = new ChartColor();
-  $seriesColors = array();
-  for ($i = 0; $i < count($seriesData); $i++) {
-    $seriesColor = $seriesData[$i]['color'];
-    array_push($seriesColors, $seriesColor);
-  }
-  $chartColor->setPattern($seriesColors);
-  $c3->setColor($chartColor);
-
-  return $c3;
-}
diff --git a/modules/charts_c3/src/Charts/C3ChartsRender.php b/modules/charts_c3/src/Charts/C3ChartsRender.php
new file mode 100644
index 0000000..8e26f97
--- /dev/null
+++ b/modules/charts_c3/src/Charts/C3ChartsRender.php
@@ -0,0 +1,114 @@
+<?php
+
+namespace Drupal\charts_c3\Charts;
+
+use Drupal\charts\Util\Util;
+use Drupal\charts_c3\Settings\CThree\ChartType;
+use Drupal\charts_c3\Settings\CThree\CThree;
+use Drupal\charts_c3\Settings\CThree\ChartTitle;
+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) {
+
+    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';
+  }
+
+  /**
+   * @param $options
+   * @param array $categories
+   * @param array $seriesData
+   * @param $chartId
+   * @param array $attachmentDisplayOptions
+   *
+   * @return CThree
+   */
+  private function charts_c3_render_charts($options, $categories = [], $seriesData = [], $chartId, $attachmentDisplayOptions = []) {
+
+    $noAttachmentDisplays = count($attachmentDisplayOptions);
+    $yAxis = [];
+    $types = [];
+    //sets secondary axis from the first attachment only
+    if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0) {
+      $yAxis[$seriesData[1]['name']] = 'y2';
+    }
+
+    for ($i = 1; $i <= count($attachmentDisplayOptions); $i++) {
+      if ($attachmentDisplayOptions[$i - 1]['style']['options']['type'] == 'column')
+        $types[$seriesData[$i]['name']] = 'bar';
+      else
+        $types[$seriesData[$i]['name']] = $attachmentDisplayOptions[$i - 1]['style']['options']['type'];
+    }
+    $c3Data = [];
+    for ($i = 0; $i < count($seriesData); $i++) {
+      $c3DataTemp = $seriesData[$i]['data'];
+      array_unshift($c3DataTemp, $seriesData[$i]['name']);
+      array_push($c3Data, $c3DataTemp);
+    }
+
+    $c3Chart = new ChartType();
+    $c3Chart->setType($options['type']);
+    $c3ChartTitle = new ChartTitle();
+    $c3ChartTitle->setText($options['title']);
+    $chartAxis = new ChartAxis();
+    $c3 = new CThree();
+    $bindTo = '#' . $chartId;
+    $c3->setBindTo($bindTo);
+    //$c3->setChart($c3Chart);
+    //$c3->setLabels($options['data_labels']);
+    $c3->setTitle($c3ChartTitle);
+    $chartData = new ChartData();
+    if ($noAttachmentDisplays > 0) {
+      $chartData->setLabels(FALSE);
+    }
+    if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0) {
+      $chartData->axes = $yAxis;
+      $showSecAxis['show'] = true;
+      $showSecAxis['label'] = $attachmentDisplayOptions[0]['style']['options']['yaxis_title'];
+      $chartAxis->y2 = $showSecAxis;
+    }
+    $chartData->setType($options['type']);
+    $c3->setData($chartData);
+    if ($options['type'] == 'bar') {
+      $chartAxis->setRotated(TRUE);
+      array_unshift($categories, 'x');
+      array_push($c3Data, $categories);
+      $chartData->setColumns($c3Data);
+    } else {
+      if ($options['type'] == 'column') {
+        $chartData->setType('bar');
+        $chartAxis->setRotated(FALSE);
+        array_unshift($categories, 'x');
+        array_push($c3Data, $categories);
+        $chartData->setColumns($c3Data);
+      } else {
+        array_unshift($categories, 'x');
+        array_push($c3Data, $categories);
+        $chartData->setColumns($c3Data);
+      }
+    }
+    $chartData->types = $types;
+
+    $c3->setAxis($chartAxis);
+
+    $chartColor = new ChartColor();
+    $seriesColors = [];
+    for ($i = 0; $i < count($seriesData); $i++) {
+      $seriesColor = $seriesData[$i]['color'];
+      array_push($seriesColors, $seriesColor);
+    }
+    $chartColor->setPattern($seriesColors);
+    $c3->setColor($chartColor);
+
+    return $c3;
+  }
+
+}
diff --git a/modules/charts_c3/src/Settings/CThree/ChartAxis.php b/modules/charts_c3/src/Settings/CThree/ChartAxis.php
index 534906a..617254e 100644
--- a/modules/charts_c3/src/Settings/CThree/ChartAxis.php
+++ b/modules/charts_c3/src/Settings/CThree/ChartAxis.php
@@ -4,7 +4,7 @@ namespace Drupal\charts_c3\Settings\CThree;
 
 class ChartAxis implements \JsonSerializable {
   private $rotated = FALSE;
-  private $x = array('type' => 'category');
+  private $x = ['type' => 'category'];
 
   /**
    * @return mixed
diff --git a/modules/charts_c3/src/Settings/CThree/ChartColor.php b/modules/charts_c3/src/Settings/CThree/ChartColor.php
index 9f881c3..aeb81f6 100644
--- a/modules/charts_c3/src/Settings/CThree/ChartColor.php
+++ b/modules/charts_c3/src/Settings/CThree/ChartColor.php
@@ -3,7 +3,7 @@
 namespace Drupal\charts_c3\Settings\CThree;
 
 class ChartColor implements \JsonSerializable {
-  private $pattern = array();
+  private $pattern = [];
 
   /**
    * @return mixed
diff --git a/modules/charts_c3/src/Settings/CThree/ChartData.php b/modules/charts_c3/src/Settings/CThree/ChartData.php
index 32a3150..017c050 100644
--- a/modules/charts_c3/src/Settings/CThree/ChartData.php
+++ b/modules/charts_c3/src/Settings/CThree/ChartData.php
@@ -3,7 +3,7 @@
 namespace Drupal\charts_c3\Settings\CThree;
 
 class ChartData implements \JsonSerializable {
-  private $columns = array();
+  private $columns = [];
   private $type;
   private $labels = TRUE;
   private $x = 'x';
diff --git a/modules/charts_google/charts_google.libraries.yml b/modules/charts_google/charts_google.libraries.yml
index 19ebf46..d5a6e0f 100644
--- a/modules/charts_google/charts_google.libraries.yml
+++ b/modules/charts_google/charts_google.libraries.yml
@@ -6,7 +6,6 @@ charts_google:
         - core/jquery
         - core/jquery.once
         - core/drupal
-        - core/drupalSettings
 
 google:
   remote: https://www.gstatic.com/charts/loader.js
@@ -17,3 +16,5 @@ google:
       gpl-compatible: false
   js:
     vendor/google/loader.js: {}
+  dependencies:
+        - charts_google/charts_google
diff --git a/modules/charts_google/charts_google.module b/modules/charts_google/charts_google.module
index ba5c351..64f95c0 100644
--- a/modules/charts_google/charts_google.module
+++ b/modules/charts_google/charts_google.module
@@ -13,111 +13,13 @@ use Drupal\charts_google\Settings\Google\ChartArea;
  * Implements hook_charts_info().
  */
 function charts_google_charts_info() {
-  $info['google'] = array(
+  $info['google'] = [
     'label' => t('Google Charts'),
     'render' => '_charts_google_render',
-    'types' => array('area', 'bar', 'column', 'line', 'pie', 'scatter'),
+    'types' => ['area', 'bar', 'column', 'line', 'pie', 'scatter'],
     'file' => 'charts_google.inc',
-  );
+  ];
   return $info;
 }
 
-/**
- * Creates a JSON Object formatted for Google charts to use
- * @param array $categories
- * @param array $seriesData
- *
- * @return json|string
- */
-function charts_google_render_charts($categories = array(), $seriesData = array()) {
-
-  $dataTable = array();
-  for ($j = 0; $j < count($categories); $j++) {
-    $rowDataTable = [];
-    for ($i = 0; $i < count($seriesData); $i++) {
-      $rowDataTabletemp = $seriesData[$i]['data'][$j];
-      array_push($rowDataTable, $rowDataTabletemp);
-    }
-    array_unshift($rowDataTable, $categories[$j]);
-    array_push($dataTable, $rowDataTable);
-  }
-
-  $dataTableHeader = array();
-  for ($r = 0; $r < count($seriesData); $r++) {
-    array_push($dataTableHeader, $seriesData[$r]['name']);
-  }
-
-  array_unshift($dataTableHeader, 'label');
-  array_unshift($dataTable, $dataTableHeader);
-
-  return json_encode($dataTable);
-}
-
-/**
- * @param $options
- * @param array $seriesData
- * @param array $attachmentDisplayOptions
- * @return GoogleOptions object with chart options or settings to be used by google visualization framework
- */
-function charts_google_create_charts_options($options, $seriesData = array(), $attachmentDisplayOptions = []) {
-  $chartSelected = [];
-  $seriesTypes = array();
-  $firstVaxis = array('minValue'=> 0, 'title' => $options['yaxis_title']);
-  $secondVaxis = array('minValue'=> 0);
-  $vAxes = array();
-  array_push($vAxes, $firstVaxis);
-  //sets secondary axis from the first attachment only
-  if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0){
-    $secondVaxis['title'] = $attachmentDisplayOptions[0]['style']['options']['yaxis_title'];
-    array_push($vAxes, $secondVaxis);
-  }
-  array_push($chartSelected, $options['type']);
-  for ($i = 0; $i < count($attachmentDisplayOptions); $i++){
-    $attachmentChartType = $attachmentDisplayOptions[$i]['style']['options']['type'];
-    if ($attachmentChartType == 'column')
-      $attachmentChartType = 'bars';
-    if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0 && $i == 0){
-      $seriesTypes[$i + 1] = array('type' => $attachmentChartType, 'targetAxisIndex' => 1);
-    }
-    else
-      $seriesTypes[$i + 1] = array('type' => $attachmentChartType);
-    array_push($chartSelected, $attachmentChartType);
-  }
-
-  $chartSelected = array_unique($chartSelected);
-  $googleOptions = new GoogleOptions();
-  if (count($chartSelected) > 1){
-    $parentChartType = $options['type'];
-    if ($parentChartType == 'column')
-      $parentChartType = 'bars';
-    $googleOptions->seriesType = $parentChartType;
-    $googleOptions->series = $seriesTypes;
-  }
-  $googleOptions->setTitle($options['title']);
-  $googleOptions->vAxes = $vAxes;
-  //$vAxis['title'] = $options['yaxis_title'];
-  //$googleOptions->setVAxis($vAxis);
-  $chartArea = new ChartArea();
-  $chartArea->setWidth(400);
-  // $googleOptions->setChartArea($chartArea);
-  $seriesColors = array();
-  for ($i = 0; $i < count($seriesData); $i++) {
-    $seriesColor = $seriesData[$i]['color'];
-    array_push($seriesColors, $seriesColor);
-  }
-  $googleOptions->setColors($seriesColors);
 
-  return $googleOptions;
-}
-
-/**
- * @param $options
- * @return ChartType
- */
-function charts_google_create_chart_type($options) {
-
-  $googleChartType = new ChartType();
-  $googleChartType->setChartType($options['type']);
-
-  return $googleChartType;
-}
diff --git a/modules/charts_google/src/Charts/GoogleChartsRender.php b/modules/charts_google/src/Charts/GoogleChartsRender.php
new file mode 100644
index 0000000..925aefa
--- /dev/null
+++ b/modules/charts_google/src/Charts/GoogleChartsRender.php
@@ -0,0 +1,129 @@
+<?php
+
+namespace Drupal\charts_google\Charts;
+
+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 {
+
+  private $googleData;
+  private $googleOptions;
+  private $googleChartType;
+  private $chartId;
+
+  public function __construct($categories, $seriesData, $options, $attachmentDisplayOptions, &$variables, $chartId) {
+    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);
+  }
+
+  /**
+   * Creates a JSON Object formatted for Google charts to use
+   * @param array $categories
+   * @param array $seriesData
+   *
+   * @return json|string
+   */
+  private function charts_google_render_charts($categories = [], $seriesData = []) {
+
+    $dataTable = [];
+    for ($j = 0; $j < count($categories); $j++) {
+      $rowDataTable = [];
+      for ($i = 0; $i < count($seriesData); $i++) {
+        $rowDataTabletemp = $seriesData[$i]['data'][$j];
+        array_push($rowDataTable, $rowDataTabletemp);
+      }
+      array_unshift($rowDataTable, $categories[$j]);
+      array_push($dataTable, $rowDataTable);
+    }
+
+    $dataTableHeader = [];
+    for ($r = 0; $r < count($seriesData); $r++) {
+      array_push($dataTableHeader, $seriesData[$r]['name']);
+    }
+
+    array_unshift($dataTableHeader, 'label');
+    array_unshift($dataTable, $dataTableHeader);
+
+    return json_encode($dataTable);
+  }
+
+  /**
+   * @param $options
+   * @param array $seriesData
+   * @param array $attachmentDisplayOptions
+   * @return GoogleOptions object with chart options or settings to be used by google visualization framework
+   */
+  private function charts_google_create_charts_options($options, $seriesData = [], $attachmentDisplayOptions = []) {
+    $chartSelected = [];
+    $seriesTypes = [];
+    $firstVaxis = ['minValue' => 0, 'title' => $options['yaxis_title']];
+    $secondVaxis = ['minValue' => 0];
+    $vAxes = [];
+    array_push($vAxes, $firstVaxis);
+    //sets secondary axis from the first attachment only
+    if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0) {
+      $secondVaxis['title'] = $attachmentDisplayOptions[0]['style']['options']['yaxis_title'];
+      array_push($vAxes, $secondVaxis);
+    }
+    array_push($chartSelected, $options['type']);
+    for ($i = 0; $i < count($attachmentDisplayOptions); $i++) {
+      $attachmentChartType = $attachmentDisplayOptions[$i]['style']['options']['type'];
+      if ($attachmentChartType == 'column')
+        $attachmentChartType = 'bars';
+      if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0 && $i == 0) {
+        $seriesTypes[$i + 1] = ['type' => $attachmentChartType, 'targetAxisIndex' => 1];
+      } else
+        $seriesTypes[$i + 1] = ['type' => $attachmentChartType];
+      array_push($chartSelected, $attachmentChartType);
+    }
+
+    $chartSelected = array_unique($chartSelected);
+    $googleOptions = new GoogleOptions();
+    if (count($chartSelected) > 1) {
+      $parentChartType = $options['type'];
+      if ($parentChartType == 'column')
+        $parentChartType = 'bars';
+      $googleOptions->seriesType = $parentChartType;
+      $googleOptions->series = $seriesTypes;
+    }
+    $googleOptions->setTitle($options['title']);
+    $googleOptions->vAxes = $vAxes;
+    //$vAxis['title'] = $options['yaxis_title'];
+    //$googleOptions->setVAxis($vAxis);
+    $chartArea = new ChartArea();
+    $chartArea->setWidth(400);
+    // $googleOptions->setChartArea($chartArea);
+    $seriesColors = [];
+    for ($i = 0; $i < count($seriesData); $i++) {
+      $seriesColor = $seriesData[$i]['color'];
+      array_push($seriesColors, $seriesColor);
+    }
+    $googleOptions->setColors($seriesColors);
+
+    return $googleOptions;
+  }
+
+  /**
+   * @param $options
+   * @return ChartType
+   */
+  private function charts_google_create_chart_type($options) {
+
+    $googleChartType = new ChartType();
+    $googleChartType->setChartType($options['type']);
+
+    return $googleChartType;
+  }
+}
diff --git a/modules/charts_highcharts/charts_highcharts.libraries.yml b/modules/charts_highcharts/charts_highcharts.libraries.yml
index 03472b2..7a5d1fb 100644
--- a/modules/charts_highcharts/charts_highcharts.libraries.yml
+++ b/modules/charts_highcharts/charts_highcharts.libraries.yml
@@ -17,4 +17,4 @@ highcharts:
   js:
     vendor/highcharts/highcharts.js: {}
   dependencies:
-      - core/jquery
+      - charts_highcharts/charts_highcharts
diff --git a/modules/charts_highcharts/charts_highcharts.module b/modules/charts_highcharts/charts_highcharts.module
index 14cb767..258c824 100644
--- a/modules/charts_highcharts/charts_highcharts.module
+++ b/modules/charts_highcharts/charts_highcharts.module
@@ -3,111 +3,18 @@
  * @file
  * Charts module integration with Highcharts library.
  */
-use Drupal\charts_highcharts\Settings\Highcharts\ChartType;
-use Drupal\charts_highcharts\Settings\Highcharts\ChartTitle;
-use Drupal\charts_highcharts\Settings\Highcharts\Xaxis;
-use Drupal\charts_highcharts\Settings\Highcharts\ChartLabel;
-use Drupal\charts_highcharts\Settings\Highcharts\YaxisLabel;
-use Drupal\charts_highcharts\Settings\Highcharts\Yaxis;
-use Drupal\charts_highcharts\Settings\Highcharts\YaxisTitle;
-use Drupal\charts_highcharts\Settings\Highcharts\DataLabelStatus;
-use Drupal\charts_highcharts\Settings\Highcharts\DataLabels;
-use Drupal\charts_highcharts\Settings\Highcharts\PlotOptions;
-use Drupal\charts_highcharts\Settings\Highcharts\Tooltip;
-use Drupal\charts_highcharts\Settings\Highcharts\ChartCredits;
-use Drupal\charts_highcharts\Settings\Highcharts\ChartLegend;
-use Drupal\charts_highcharts\Settings\Highcharts\Highcharts;
+
 
 /**
  * Implements hook_charts_info().
  */
 function charts_highcharts_charts_info() {
-  $info['highcharts'] = array(
+  $info['highcharts'] = [
     'label' => t('Highcharts'),
     'render' => '_charts_highcharts_render',
-    'types' => array('area', 'bar', 'column', 'line', 'pie', 'scatter'),
+    'types' => ['area', 'bar', 'column', 'line', 'pie', 'scatter'],
     'file' => 'charts_highcharts.inc',
-  );
+  ];
 
   return $info;
 }
-
-/**
- * Creates a JSON Object formatted for Highcharts to use
- *
- * @param $options
- * @param array $categories
- * @param array $seriesData
- *
- * @param array $attachmentDisplayOptions
- *
- * @return Highcharts object to be used by highcharts javascripts visualization framework
- */
-function charts_highcharts_render_charts($options, $categories = array(), $seriesData = array(), $attachmentDisplayOptions = []) {
-
-  $chart = new ChartType();
-  $chart->setType($options['type']);
-  $chartTitle = new ChartTitle();
-  $chartTitle->setText($options['title']);
-  $chartXaxis = new Xaxis();
-  $chartLabels = new ChartLabel();
-  $chartLabels->setRotation($options['xaxis_labels_rotation']);
-  $chartXaxis->setCategories($categories);
-  $chartTitle->setText($options['title']);
-  $chartXaxis->setTitle($chartTitle);
-  $chartXaxis->setLabels($chartLabels);
-  $yaxisLabels = new YaxisLabel();
-  $chartYaxis = new Yaxis();
-  $yAxes = [];
-  $yAxisTitle = new YaxisTitle();
-  $yAxisTitle->setText($options['yaxis_title']);
-  if (!empty($options['yaxis_min'])){
-      $chartYaxis->min = $options['yaxis_min'];
-  }
-  if (!empty($options['yaxis_max'])){
-      $chartYaxis->max = $options['yaxis_max'];
-  }
-
-  $chartYaxis->setLabels($yaxisLabels);
-  $chartYaxis->setTitle($yAxisTitle);
-  array_push($yAxes, $chartYaxis);
-  // Chart libraries tend to supports only one secondary axis.
-  if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0){
-    $chartYaxisSecondary = new Yaxis();
-    $yAxisTitleSecondary = new YaxisTitle();
-    $yAxisTitleSecondary->setText($attachmentDisplayOptions[0]['style']['options']['yaxis_title']);
-    $chartYaxisSecondary->setTitle($yAxisTitleSecondary);
-    $chartYaxisSecondary->setLabels($yaxisLabels);
-    $chartYaxisSecondary->opposite = 'true';
-
-    if (!empty($attachmentDisplayOptions[0]['style']['options']['yaxis_min'])){
-      $chartYaxisSecondary->min = $attachmentDisplayOptions[0]['style']['options']['yaxis_min'];
-    }
-    if (!empty($attachmentDisplayOptions[0]['style']['options']['yaxis_max'])){
-      $chartYaxisSecondary->max = $attachmentDisplayOptions[0]['style']['options']['yaxis_max'];
-    }
-    array_push($yAxes, $chartYaxisSecondary);
-  }
-  $dataLabelStatus = new DataLabelStatus();
-  $dataLabels = new DataLabels();
-  $dataLabels->setDataLabels($dataLabelStatus);
-  $barPlotOptns = new PlotOptions();
-  $barPlotOptns->setBar($dataLabels);
-  $chartTooltip = new Tooltip();
-  $chartCredits = new ChartCredits();
-  $chartLegend = new ChartLegend();
-
-  $highchart = new Highcharts();
-  $highchart->setChart($chart);
-  $highchart->setTitle($chartTitle);
-  $highchart->setXAxis($chartXaxis);
-  //$highchart->setYAxis($chartYaxis);
-  $highchart->yAxis = $yAxes;
-  $highchart->setTooltip($chartTooltip);
-  $highchart->setPlotOptions($barPlotOptns);
-  $highchart->setCredits($chartCredits);
-  $highchart->setLegend($chartLegend);
-  $highchart->setSeries($seriesData);
-
-  return $highchart;
-}
diff --git a/modules/charts_highcharts/src/Charts/HighchartsChartsRender.php b/modules/charts_highcharts/src/Charts/HighchartsChartsRender.php
new file mode 100644
index 0000000..e0116bb
--- /dev/null
+++ b/modules/charts_highcharts/src/Charts/HighchartsChartsRender.php
@@ -0,0 +1,113 @@
+<?php
+
+namespace Drupal\charts_highcharts\Charts;
+
+use Drupal\charts\Util\Util;
+use Drupal\charts_highcharts\Settings\Highcharts\ChartType;
+use Drupal\charts_highcharts\Settings\Highcharts\ChartTitle;
+use Drupal\charts_highcharts\Settings\Highcharts\Xaxis;
+use Drupal\charts_highcharts\Settings\Highcharts\ChartLabel;
+use Drupal\charts_highcharts\Settings\Highcharts\YaxisLabel;
+use Drupal\charts_highcharts\Settings\Highcharts\Yaxis;
+use Drupal\charts_highcharts\Settings\Highcharts\YaxisTitle;
+use Drupal\charts_highcharts\Settings\Highcharts\DataLabelStatus;
+use Drupal\charts_highcharts\Settings\Highcharts\DataLabels;
+use Drupal\charts_highcharts\Settings\Highcharts\PlotOptions;
+use Drupal\charts_highcharts\Settings\Highcharts\Tooltip;
+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) {
+
+    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';
+
+  }
+
+  /**
+   * Creates a JSON Object formatted for Highcharts to use
+   *
+   * @param $options
+   * @param array $categories
+   * @param array $seriesData
+   *
+   * @param array $attachmentDisplayOptions
+   *
+   * @return Highcharts object to be used by highcharts javascripts visualization framework
+   */
+  private function charts_highcharts_render_charts($options, $categories = [], $seriesData = [], $attachmentDisplayOptions = []) {
+
+    $chart = new ChartType();
+    $chart->setType($options['type']);
+    $chartTitle = new ChartTitle();
+    $chartTitle->setText($options['title']);
+    $chartXaxis = new Xaxis();
+    $chartLabels = new ChartLabel();
+    $chartLabels->setRotation($options['xaxis_labels_rotation']);
+    $chartXaxis->setCategories($categories);
+    $chartTitle->setText($options['title']);
+    $chartXaxis->setTitle($chartTitle);
+    $chartXaxis->setLabels($chartLabels);
+    $yaxisLabels = new YaxisLabel();
+    $chartYaxis = new Yaxis();
+    $yAxes = [];
+    $yAxisTitle = new YaxisTitle();
+    $yAxisTitle->setText($options['yaxis_title']);
+    if (!empty($options['yaxis_min'])) {
+      $chartYaxis->min = $options['yaxis_min'];
+    }
+    if (!empty($options['yaxis_max'])) {
+      $chartYaxis->max = $options['yaxis_max'];
+    }
+
+    $chartYaxis->setLabels($yaxisLabels);
+    $chartYaxis->setTitle($yAxisTitle);
+    array_push($yAxes, $chartYaxis);
+    // Chart libraries tend to supports only one secondary axis.
+    if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0) {
+      $chartYaxisSecondary = new Yaxis();
+      $yAxisTitleSecondary = new YaxisTitle();
+      $yAxisTitleSecondary->setText($attachmentDisplayOptions[0]['style']['options']['yaxis_title']);
+      $chartYaxisSecondary->setTitle($yAxisTitleSecondary);
+      $chartYaxisSecondary->setLabels($yaxisLabels);
+      $chartYaxisSecondary->opposite = 'true';
+
+      if (!empty($attachmentDisplayOptions[0]['style']['options']['yaxis_min'])) {
+        $chartYaxisSecondary->min = $attachmentDisplayOptions[0]['style']['options']['yaxis_min'];
+      }
+      if (!empty($attachmentDisplayOptions[0]['style']['options']['yaxis_max'])) {
+        $chartYaxisSecondary->max = $attachmentDisplayOptions[0]['style']['options']['yaxis_max'];
+      }
+      array_push($yAxes, $chartYaxisSecondary);
+    }
+    $dataLabelStatus = new DataLabelStatus();
+    $dataLabels = new DataLabels();
+    $dataLabels->setDataLabels($dataLabelStatus);
+    $barPlotOptns = new PlotOptions();
+    $barPlotOptns->setBar($dataLabels);
+    $chartTooltip = new Tooltip();
+    $chartCredits = new ChartCredits();
+    $chartLegend = new ChartLegend();
+
+    $highchart = new Highcharts();
+    $highchart->setChart($chart);
+    $highchart->setTitle($chartTitle);
+    $highchart->setXAxis($chartXaxis);
+    //$highchart->setYAxis($chartYaxis);
+    $highchart->yAxis = $yAxes;
+    $highchart->setTooltip($chartTooltip);
+    $highchart->setPlotOptions($barPlotOptns);
+    $highchart->setCredits($chartCredits);
+    $highchart->setLegend($chartLegend);
+    $highchart->setSeries($seriesData);
+
+    return $highchart;
+  }
+}
diff --git a/modules/charts_highcharts/src/Settings/Highcharts/ChartLabel.php b/modules/charts_highcharts/src/Settings/Highcharts/ChartLabel.php
index ad7242c..7b65ae9 100644
--- a/modules/charts_highcharts/src/Settings/Highcharts/ChartLabel.php
+++ b/modules/charts_highcharts/src/Settings/Highcharts/ChartLabel.php
@@ -16,7 +16,7 @@ class ChartLabel implements \JsonSerializable {
    * @param mixed $rotation
    */
   public function setRotation($rotation) {
-    $this->rotation = (int) $rotation;
+    $this->rotation = (int)$rotation;
   }
 
   /**
diff --git a/modules/charts_highcharts/src/Settings/Highcharts/Highcharts.php b/modules/charts_highcharts/src/Settings/Highcharts/Highcharts.php
index cb556d5..9a6863b 100644
--- a/modules/charts_highcharts/src/Settings/Highcharts/Highcharts.php
+++ b/modules/charts_highcharts/src/Settings/Highcharts/Highcharts.php
@@ -6,7 +6,7 @@ class Highcharts implements \JsonSerializable {
   private $chart;
   private $title;
   private $xAxis;
- // private $yAxis;
+  // private $yAxis;
   private $tooltip;
   private $plotOptions;
   private $legend;
@@ -64,9 +64,9 @@ class Highcharts implements \JsonSerializable {
   /**
    * @param mixed $yAxis
    */
- /* public function setYAxis($yAxis) {
-    $this->yAxis = $yAxis;
-  }*/
+  /* public function setYAxis($yAxis) {
+     $this->yAxis = $yAxis;
+   }*/
 
   /**
    * @return mixed
diff --git a/modules/charts_highcharts/src/Settings/Highcharts/Xaxis.php b/modules/charts_highcharts/src/Settings/Highcharts/Xaxis.php
index b532f40..65ddc15 100644
--- a/modules/charts_highcharts/src/Settings/Highcharts/Xaxis.php
+++ b/modules/charts_highcharts/src/Settings/Highcharts/Xaxis.php
@@ -3,7 +3,7 @@
 namespace Drupal\charts_highcharts\Settings\Highcharts;
 
 class Xaxis implements \JsonSerializable {
-  private $categories = array();
+  private $categories = [];
   private $title;
   private $labels;
 
diff --git a/src/Charts/ModuleSelector.php b/src/Charts/ModuleSelector.php
new file mode 100644
index 0000000..af5ecc1
--- /dev/null
+++ b/src/Charts/ModuleSelector.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * @ file
+ *
+ *
+ */
+
+namespace Drupal\charts\Charts;
+
+class ModuleSelector {
+
+  private $moduleName;
+  private $assetLocation = '/vendor/';
+  private $assetName;
+  private $categories;
+  private $seriesData;
+  private $options;
+  private $attachmentDisplayOptions;
+  private $chartId;
+
+  public function __construct($moduleName, $categories, $seriesData, $options, $attachmentDisplayOptions, &$variables, $chartId) {
+    $this->moduleName = $moduleName;
+    $this->categories = $categories;
+    $this->seriesData = $seriesData;
+    $this->options = $options;
+    $this->attachmentDisplayOptions = $attachmentDisplayOptions;
+    $this->chartId = $chartId;
+    $this->moduleExists($moduleName, $variables);
+  }
+
+  private function moduleExists($moduleName, &$variables) {
+    $moduleExist = \Drupal::moduleHandler()->moduleExists($moduleName);
+    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);
+    }
+  }
+}
diff --git a/src/Plugin/views/display/ChartsPluginDisplayChart.php b/src/Plugin/views/display/ChartsPluginDisplayChart.php
index 3d3c184..cd13c6b 100644
--- a/src/Plugin/views/display/ChartsPluginDisplayChart.php
+++ b/src/Plugin/views/display/ChartsPluginDisplayChart.php
@@ -33,7 +33,7 @@ class ChartsPluginDisplayChart extends Attachment {
   protected function defineOptions() {
     $options = parent::defineOptions();
     $options['style_plugin']['default'] = 'chart';
-    $options['inherit_yaxis'] = array('default' => '1');
+    $options['inherit_yaxis'] = ['default' => '1'];
 
     return $options;
 
@@ -63,8 +63,7 @@ class ChartsPluginDisplayChart extends Attachment {
     $displays = array_filter($this->getOption('displays'));
     if (count($displays) > 1) {
       $attach_to = $this->t('Multiple displays');
-    }
-    elseif (count($displays) == 1) {
+    } elseif (count($displays) == 1) {
       $display = array_shift($displays);
       if ($display = $this->view->storage->getDisplay($display)) {
         $attach_to = $display['display_title'];
@@ -73,23 +72,23 @@ class ChartsPluginDisplayChart extends Attachment {
     if (!isset($attach_to)) {
       $attach_to = $this->t('Not defined');
     }
-    $options['displays'] = array(
+    $options['displays'] = [
       'category' => 'attachment',
       'title' => $this->t('Parent display'),
       'value' => $attach_to,
-    );
+    ];
 
-    $options['inherit_yaxis'] = array(
+    $options['inherit_yaxis'] = [
       'category' => 'attachment',
       'title' => $this->t('Axis settings'),
       'value' => $this->getOption('inherit_yaxis') ? t('Use primary Y-axis') : t('Create secondary axis'),
-    );
+    ];
 
-    $options['attachment_position'] = array('disabled' => TRUE);
+    $options['attachment_position'] = ['disabled' => TRUE];
 
-    $options['inherit_pager'] = array('disabled' => TRUE);
+    $options['inherit_pager'] = ['disabled' => TRUE];
 
-    $options['render_pager'] = array('disabled' => TRUE);
+    $options['render_pager'] = ['disabled' => TRUE];
 
   }
 
@@ -108,16 +107,16 @@ class ChartsPluginDisplayChart extends Attachment {
         break;
       case 'inherit_yaxis':
         $form['#title'] .= t('Axis settings');
-        $form['inherit_yaxis'] = array(
+        $form['inherit_yaxis'] = [
           '#title' => t('Y-Axis settings'),
           '#type' => 'radios',
-          '#options' => array(
+          '#options' => [
             1 => t('Inherit primary of parent display'),
             0 => t('Create a secondary axis'),
-          ),
+          ],
           '#default_value' => $this->getOption('inherit_yaxis'),
           '#description' => t('In most charts, the X and Y axis from the parent display are both shared with each attached child chart. However, if this chart is going to use a different unit of measurement, a secondary axis may be added on the opposite side of the normal Y-axis.'),
-        );
+        ];
         break;
     }
 
diff --git a/src/Plugin/views/style/ChartsPluginStyleChart.php b/src/Plugin/views/style/ChartsPluginStyleChart.php
index 38831eb..55b558d 100644
--- a/src/Plugin/views/style/ChartsPluginStyleChart.php
+++ b/src/Plugin/views/style/ChartsPluginStyleChart.php
@@ -34,7 +34,7 @@ class ChartsPluginStyleChart extends StylePluginBase {
     $options = parent::defineOptions();
 
     // Get the default chart values.
-    $defaults = \Drupal::state()->get('charts_default_settings', array());
+    $defaults = \Drupal::state()->get('charts_default_settings', []);
 
     $defaults += charts_default_settings();
     foreach ($defaults as $default_key => $default_value) {
@@ -46,7 +46,7 @@ class ChartsPluginStyleChart extends StylePluginBase {
     if ($this->view->style_plugin === 'chart_extension') {
       $options['type']['default'] = NULL;
     }
-    $options['path'] = array('default' => 'charts');
+    $options['path'] = ['default' => 'charts'];
 
     return $options;
   }
@@ -59,7 +59,7 @@ class ChartsPluginStyleChart extends StylePluginBase {
 
     $handlers = $this->displayHandler->getHandlers('field');
     if (empty($handlers)) {
-      $form['error_markup'] = array('#markup' => '<div class="error messages">' . t('You need at least one field before you can configure your table settings') . '</div>',);
+      $form['error_markup'] = ['#markup' => '<div class="error messages">' . t('You need at least one field before you can configure your table settings') . '</div>',];
     }
 
     // Limit grouping options (we only support one grouping field).
@@ -77,7 +77,7 @@ class ChartsPluginStyleChart extends StylePluginBase {
 
     // Merge in the global chart settings form.
     $field_options = $this->displayHandler->getFieldLabels();
-    $form = charts_settings_form($form, $this->options, $field_options, array('style_options'));
+    $form = charts_settings_form($form, $this->options, $field_options, ['style_options']);
 
     // Reduce the options if this is a chart extension.
     /*if (empty($this->displayHandler->getAttachedDisplays())) {
@@ -115,7 +115,7 @@ class ChartsPluginStyleChart extends StylePluginBase {
 
     $errors = parent::validate();
     $dataFields = $this->options['data_fields'];
-    $dataFieldsValueState = array();
+    $dataFieldsValueState = [];
     $dataFieldsCounter = 0;
 
     foreach ($dataFields as $value) {
@@ -159,7 +159,7 @@ class ChartsPluginStyleChart extends StylePluginBase {
 
     // Assemble the fields to be used to provide data access.
     $data_field_options = array_filter($this->options['data_fields']);
-    $data_fields = array();
+    $data_fields = [];
     foreach ($data_field_options as $field_key) {
       if (isset($field_handlers[$field_key])) {
         $data_fields[$field_key] = $field_handlers[$field_key];
@@ -170,7 +170,7 @@ class ChartsPluginStyleChart extends StylePluginBase {
       unset($data_fields[$label_field_key]);
     }
     $chart_id = $this->view->id() . '__' . $this->view->current_display;
-    $chart = array(
+    $chart = [
       '#type' => 'chart',
       '#chart_type' => $this->options['type'],
       '#chart_library' => $this->options['library'],
@@ -189,17 +189,17 @@ class ChartsPluginStyleChart extends StylePluginBase {
       '#view' => $this->view,
       // Pass info about the actual view results to allow further processing
       '#theme' => 'views_view_charts',
-    );
+    ];
     $chart_type_info = charts_get_type($this->options['type']);
     if ($chart_type_info['axis'] === CHARTS_SINGLE_AXIS) {
       $data_field_key = key($data_fields);
       $data_field = $data_fields[$data_field_key];
 
-      $data = array();
+      $data = [];
       $this->renderFields($this->view->result);
       $renders = $this->rendered_fields;
       foreach ($renders as $row_number => $row) {
-        $data_row = array();
+        $data_row = [];
         if ($label_field_key) {
           // Labels need to be decoded, as the charting library will re-encode.
           $data_row[] = htmlspecialchars_decode($this->getField($row_number, $label_field_key), ENT_QUOTES);
@@ -210,7 +210,7 @@ class ChartsPluginStyleChart extends StylePluginBase {
           $value = NULL;
         } // Strip thousands placeholders if present, then cast to float.
         else {
-          $value = (float)str_replace(array(',', ' '), '', $value);
+          $value = (float)str_replace([',', ' '], '', $value);
         }
         $data_row[] = $value;
         $data[] = $data_row;
@@ -220,25 +220,25 @@ class ChartsPluginStyleChart extends StylePluginBase {
         $chart['#legend_title'] = $label_field->options['label'];
       }
 
-      $chart[$this->view->current_display . '_series'] = array(
+      $chart[$this->view->current_display . '_series'] = [
         '#type' => 'chart_data',
         '#data' => $data,
         '#title' => $data_field->options['label'],
-      );
+      ];
 
     } else {
-      $chart['xaxis'] = array(
+      $chart['xaxis'] = [
         '#type' => 'chart_xaxis',
         '#title' => $this->options['xaxis_title'] ? $this->options['xaxis_title'] : FALSE,
         '#labels_rotation' => $this->options['xaxis_labels_rotation'],
-      );
-      $chart['yaxis'] = array(
+      ];
+      $chart['yaxis'] = [
         '#type' => 'chart_yaxis',
         '#title' => $this->options['yaxis_title'] ? $this->options['yaxis_title'] : FALSE,
         '#labels_rotation' => $this->options['yaxis_labels_rotation'],
         '#max' => $this->options['yaxis_max'],
         '#min' => $this->options['yaxis_min'],
-      );
+      ];
 
       // @todo incorporate this patch: https://www.drupal.org/files/issues/charts_grouping-2146927-6.patch.
       $sets = $this->renderGrouping($this->view->result, $this->options['grouping'], TRUE);
@@ -246,16 +246,16 @@ class ChartsPluginStyleChart extends StylePluginBase {
         $series_index = isset($series_index) ? $series_index + 1 : 0;
         $series_key = $this->view->current_display . '__' . $field_key . '_' . $series_index;
         foreach ($data_fields as $field_key => $field_handler) {
-          $chart[$series_key] = array(
+          $chart[$series_key] = [
             '#type' => 'chart_data',
-            '#data' => array(),
+            '#data' => [],
             // If using a grouping field, inherit from the chart level colors.
             '#color' => ($series_label === '' && isset($this->options['field_colors'][$field_key])) ? $this->options['field_colors'][$field_key] : NULL,
             '#title' => $series_label ? $series_label : $field_handler->options['label'],
             '#prefix' => $this->options['yaxis_prefix'] ? $this->options['yaxis_prefix'] : NULL,
             '#suffix' => $this->options['yaxis_suffix'] ? $this->options['yaxis_suffix'] : NULL,
             '#decimal_count' => $this->options['yaxis_decimal_count'] ? $this->options['yaxis_decimal_count'] : NULL,
-          );
+          ];
         }
 
         // Grouped results come back indexed by their original result number
@@ -278,7 +278,7 @@ class ChartsPluginStyleChart extends StylePluginBase {
               $value = NULL;
             } // Strip thousands placeholders if present, then cast to float.
             else {
-              $value = (float)str_replace(array(',', ' '), '', $value);
+              $value = (float)str_replace([',', ' '], '', $value);
             }
             $chart[$series_key]['#data'][] = $value;
           }
@@ -291,7 +291,7 @@ class ChartsPluginStyleChart extends StylePluginBase {
     // on top of it.
     $children_displays = $this->getChildrenChartDisplays();
     //contains the different subviews of the attachments
-    $attachments = array();
+    $attachments = [];
     $service = \Drupal::service('charts.charts_attachment');
 
     foreach ($children_displays as $child_display) {
diff --git a/src/Util/Util.php b/src/Util/Util.php
index 4bb54f8..b9f63dd 100644
--- a/src/Util/Util.php
+++ b/src/Util/Util.php
@@ -1,4 +1,10 @@
 <?php
+/**
+ * @file
+ *
+ * A class with a series of utility functions for manipulation of views & attachment data.
+ *
+ */
 
 namespace Drupal\charts\Util;
 
@@ -12,20 +18,20 @@ class Util {
    * @return array
    */
   public static function viewsData($view, $labelValues, $labelField, $color, $attachmentChartTypeOption) {
-    $data = array();
+    $data = [];
 
     foreach ($view->result as $id => $row) {
       $numberFields = 0;
-      $rowData = array();
+      $rowData = [];
       foreach ($labelValues as $fieldId => $rowDataValue) {
-        $rowData[$numberFields] = array(
+        $rowData[$numberFields] = [
           'value' => $view->field[$fieldId]->getValue($row),
           'label_field' => $view->field[$labelField]->getValue($row),
           'label' => $view->field[$fieldId]->label(),
           // 'label' => $view->display_handler->display['id'], to use display_id
           'color' => $color[$fieldId],
           'type' => $attachmentChartTypeOption,
-        );
+        ];
         $numberFields++;
       }
       $data[$id] = $rowData;
@@ -39,7 +45,7 @@ class Util {
    */
 
   public static function removeUnselectedFields($valueField) {
-    $fieldValues = array();
+    $fieldValues = [];
     foreach ($valueField as $key => $value) {
       if (!empty($value)) {
         $fieldValues[$key] = $value;
@@ -53,20 +59,20 @@ class Util {
    */
 
   public static function createChartableData($data) {
-    $chartData = array();
-    $categories = array();
-    $seriesData = array();
+    $chartData = [];
+    $categories = [];
+    $seriesData = [];
 
     for ($i = 0; $i < count($data[0]); $i++) {
 
-      $seriesRowData = array('name' => '', 'color' => '', 'type' => '', 'data' => array());
+      $seriesRowData = ['name' => '', 'color' => '', 'type' => '', 'data' => []];
       for ($j = 0; $j < count($data); $j++) {
         $categories[$j] = $data[$j][$i]['label_field'];
         $seriesRowData['name'] = $data[$j][$i]['label'];
         // $seriesRowData['name'] = $data[$j][$i]['label_field'];
         $seriesRowData['type'] = $data[$j][$i]['type'];
         $seriesRowData['color'] = $data[$j][$i]['color'];
-        array_push($seriesRowData['data'], ((int) ($data[$j][$i]['value'])));
+        array_push($seriesRowData['data'], ((int)($data[$j][$i]['value'])));
       }
       array_push($seriesData, $seriesRowData);
     }
@@ -83,11 +89,11 @@ class Util {
    * @param $libraryPath
    *
    */
-  public static function checkMissingLibrary($moduleName, $libraryPath){
+  public static function checkMissingLibrary($moduleName, $libraryPath) {
     $module_path = drupal_get_path('module', $moduleName);
-    if (!file_exists($module_path . $libraryPath)){
-      drupal_set_message(t('Charting libraries for '.$moduleName.' might 
-      not be installed. Run \'composer install\' for '.$moduleName.' sub-module.'), 'error');
+    if (!file_exists($module_path . $libraryPath)) {
+      drupal_set_message(t('Charting libraries for ' . $moduleName . ' might 
+      not be installed. Run \'composer install\' for ' . $moduleName . ' sub-module.'), 'error');
     }
   }
 
diff --git a/templates/views-view-charts.html.twig b/templates/views-view-charts.html.twig
index 2481122..5c4f4a3 100644
--- a/templates/views-view-charts.html.twig
+++ b/templates/views-view-charts.html.twig
@@ -1,14 +1,3 @@
-{% if chart_type == 'google' %}
-    {{ attach_library('charts_google/google') }}
-    {{ attach_library('charts_google/charts_google') }}
-{% elseif chart_type == 'highcharts' %}
-    {{ attach_library('charts_highcharts/highcharts') }}
-    {{ attach_library('charts_highcharts/charts_highcharts') }}
-{% elseif chart_type == 'c3' %}
-    {{ attach_library('charts_c3/d3') }}
-    {{ attach_library('charts_c3/c3') }}
-    {{ attach_library('charts_c3/charts_c3') }}
-{% else %}
-    Unconfigured charts
-{% endif %}
+{% set library = 'charts_' ~ chart_type ~ '/' ~ chart_type %}
+{{ attach_library("#{ library }") }}
 <div {{ attributes }} {{ content_attributes }} style="width:100%; height:400px;"></div>
-- 
GitLab