From 186fbeee5d891ce07ff689fbe8e7c3c3b38a6936 Mon Sep 17 00:00:00 2001 From: Daniel Cothran <dcothran@jsi.local> Date: Fri, 10 Mar 2017 18:19:49 -0500 Subject: [PATCH] make it so that multiple charts can exist together on the same page --- charts.module | 12 ++- charts.theme.inc | 38 ---------- modules/charts_c3/charts_c3.module | 8 +- modules/charts_c3/js/charts_c3.js | 13 ++-- .../charts_c3/src/Settings/CThree/CThree.php | 11 ++- .../charts_google/charts_google.libraries.yml | 1 + modules/charts_google/js/charts_google.js | 74 ++++++++++--------- templates/views-view-charts.html.twig | 3 +- 8 files changed, 71 insertions(+), 89 deletions(-) delete mode 100644 charts.theme.inc diff --git a/charts.module b/charts.module index b96b8ed..cfe52ec 100644 --- a/charts.module +++ b/charts.module @@ -33,7 +33,9 @@ function template_preprocess_views_view_charts(&$variables) { $attachmentView = $service->getAttachmentViews(); $view = $variables['view']; - + $viewId = $view->id(); + $displayId = $view->display_handler->display['id']; + $chartId = $viewId . '__' . $displayId; $categoriesAttachment = array(); $seriesDataAttachment = array(); @@ -79,7 +81,8 @@ function template_preprocess_views_view_charts(&$variables) { $googleOptions = charts_google_create_charts_options($options, $seriesData); $googleChartType = charts_google_create_chart_type($options); $variables['chart_type'] = 'google'; - $variables['attributes']['class'][0] = 'chart-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); @@ -90,18 +93,21 @@ function template_preprocess_views_view_charts(&$variables) { $highchart = charts_highcharts_render_charts($options, $categories, $seriesData); $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': - $c3 = charts_c3_render_charts($options, $categories, $seriesData); + $c3 = charts_c3_render_charts($options, $categories, $seriesData, $chartId); $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. } + } diff --git a/charts.theme.inc b/charts.theme.inc deleted file mode 100644 index 8327b55..0000000 --- a/charts.theme.inc +++ /dev/null @@ -1,38 +0,0 @@ -<?php - -/** - * @file - * Theme for Charts views. - * @param $page - */ - -/** - * Hook attaches assests to pages depending on library selected - * - * @param $attachments - */ -/*function charts_page_attachments(&$attachments) -{ - $service = \Drupal::service('charts.charts_service'); - $library = $service->getLibrarySelected(); - /*Depending on the library selected, javescript files associated to the selected library will only be attached to - the template.*/ - -/* switch($library){ - case 'google': - $attachments['#attached']['library'][] = 'charts_google/charts_google'; - $attachments['#attached']['library'][] = 'charts_google/google'; - break; - case 'highcharts': - $attachments['#attached']['library'][] = 'charts_highcharts/charts_highcharts'; - $attachments['#attached']['library'][] = 'charts_highcharts/highcharts'; - break; - case 'c3': - $attachments['#attached']['library'][] = 'charts_c3/charts_c3'; - $attachments['#attached']['library'][] = 'charts_c3/c3'; - break; - - default: - - } -}*/ \ No newline at end of file diff --git a/modules/charts_c3/charts_c3.module b/modules/charts_c3/charts_c3.module index fe3d703..9f3ce57 100644 --- a/modules/charts_c3/charts_c3.module +++ b/modules/charts_c3/charts_c3.module @@ -1,8 +1,10 @@ <?php + /** * @file * 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; @@ -21,7 +23,7 @@ function charts_c3_charts_info() { return $info; } -function charts_c3_render_charts($options, $categories = array(), $seriesData = array()) { +function charts_c3_render_charts($options, $categories = array(), $seriesData = array(), $chartId) { $c3Data = array(); for ($i = 0; $i < count($seriesData); $i++) { @@ -35,9 +37,9 @@ function charts_c3_render_charts($options, $categories = array(), $seriesData = $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); diff --git a/modules/charts_c3/js/charts_c3.js b/modules/charts_c3/js/charts_c3.js index 0830593..1809538 100644 --- a/modules/charts_c3/js/charts_c3.js +++ b/modules/charts_c3/js/charts_c3.js @@ -8,11 +8,14 @@ Drupal.behaviors.chartsC3 = { attach: function (context, settings) { - $('.charts-c3').once().each(function () { - if ($(this).attr('data-chart')) { - var c3Chart = $('.charts-c3').attr('data-chart'); - c3.generate(JSON.parse(c3Chart)); - } + $('.charts-c3').each(function(param) { + var chartId = $(this).attr('id'); + $('#'+chartId).once().each(function () { + if ($(this).attr('data-chart')) { + var c3Chart = $(this).attr('data-chart'); + c3.generate(JSON.parse(c3Chart)); + } + }); }); } }; diff --git a/modules/charts_c3/src/Settings/CThree/CThree.php b/modules/charts_c3/src/Settings/CThree/CThree.php index d2e7388..c98a878 100644 --- a/modules/charts_c3/src/Settings/CThree/CThree.php +++ b/modules/charts_c3/src/Settings/CThree/CThree.php @@ -4,7 +4,7 @@ namespace Drupal\charts_c3\Settings\CThree; class CThree implements \JsonSerializable { private $color; - private $bindto = '#chart'; + private $bindto; private $data; private $axis; private $title; @@ -54,10 +54,17 @@ class CThree implements \JsonSerializable { /** * @return string */ - public function getBindto() { + public function getBindTo() { return $this->bindto; } + /** + * @param mixed $bindto + */ + public function setBindTo($bindto) { + $this->bindto = $bindto; + } + /** * @return mixed */ diff --git a/modules/charts_google/charts_google.libraries.yml b/modules/charts_google/charts_google.libraries.yml index 72090a0..19ebf46 100644 --- a/modules/charts_google/charts_google.libraries.yml +++ b/modules/charts_google/charts_google.libraries.yml @@ -6,6 +6,7 @@ charts_google: - core/jquery - core/jquery.once - core/drupal + - core/drupalSettings google: remote: https://www.gstatic.com/charts/loader.js diff --git a/modules/charts_google/js/charts_google.js b/modules/charts_google/js/charts_google.js index b381ffe..1822e70 100644 --- a/modules/charts_google/js/charts_google.js +++ b/modules/charts_google/js/charts_google.js @@ -9,46 +9,48 @@ attach: function (context, settings) { google.charts.load('current', {packages: ['corechart']}); - var dataTable; - var googleChartOptions; - var googleChartType; + $('.charts-google').each(function(param) { + var chartId = $(this).attr('id'); + $('#'+chartId).once().each(function () { + if ($(this).attr('data-chart')) { + var dataTable = $(this).attr('data-chart'); + var googleChartOptions = $(this).attr('google-options'); + var googleChartType = $(this).attr('google-chart-type'); + google.charts.setOnLoadCallback(draw(googleChartType, dataTable, googleChartOptions)); + } + }); + function draw(chartType, dataTable,googleChartOptions) { - $('.chart-google').once().each(function () { - if ($(this).attr('data-chart')) { - dataTable = $(this).attr('data-chart'); - googleChartOptions = $(this).attr('google-options'); - googleChartType = $(this).attr('google-chart-type'); - google.charts.setOnLoadCallback(drawChart); - } + return function () { + var data = google.visualization.arrayToDataTable(JSON.parse(dataTable)); + var googleChartTypeObject = JSON.parse(chartType); + var googleChartTypeFormatted = googleChartTypeObject.type; + var chart; + switch (googleChartTypeFormatted) { + case 'BarChart': + chart = new google.visualization.BarChart(document.getElementById(chartId)); + break; + case 'ColumnChart': + chart = new google.visualization.ColumnChart(document.getElementById(chartId)); + break; + case 'PieChart': + chart = new google.visualization.PieChart(document.getElementById(chartId)); + break; + case 'ScatterChart': + chart = new google.visualization.ScatterChart(document.getElementById(chartId)); + break; + case 'AreaChart': + chart = new google.visualization.AreaChart(document.getElementById(chartId)); + break; + case 'LineChart': + chart = new google.visualization.LineChart(document.getElementById(chartId)); + } + chart.draw(data, JSON.parse(googleChartOptions)); + } + } }); - function drawChart() { - var data = google.visualization.arrayToDataTable(JSON.parse(dataTable)); - var googleChartTypeObject = JSON.parse(googleChartType); - var googleChartTypeFormatted = googleChartTypeObject.type; - var chart; - switch (googleChartTypeFormatted) { - case 'BarChart': - chart = new google.visualization.BarChart(document.getElementById('chart')); - break; - case 'ColumnChart': - chart = new google.visualization.ColumnChart(document.getElementById('chart')); - break; - case 'PieChart': - chart = new google.visualization.PieChart(document.getElementById('chart')); - break; - case 'ScatterChart': - chart = new google.visualization.ScatterChart(document.getElementById('chart')); - break; - case 'AreaChart': - chart = new google.visualization.AreaChart(document.getElementById('chart')); - break; - case 'LineChart': - chart = new google.visualization.LineChart(document.getElementById('chart')); - } - chart.draw(data, JSON.parse(googleChartOptions)); - } } }; }(jQuery)); diff --git a/templates/views-view-charts.html.twig b/templates/views-view-charts.html.twig index f740559..2481122 100644 --- a/templates/views-view-charts.html.twig +++ b/templates/views-view-charts.html.twig @@ -11,5 +11,4 @@ {% else %} Unconfigured charts {% endif %} -<div {{ attributes }} {{ content_attributes }} id="chart" - style="width:100%; height:400px;"></div> +<div {{ attributes }} {{ content_attributes }} style="width:100%; height:400px;"></div> -- GitLab