Skip to content
Snippets Groups Projects
Commit e327eabe authored by Daniel Cothran's avatar Daniel Cothran
Browse files

Charts can accept 'create secondary y-axis' option from Chart Attachment...

Charts can accept 'create secondary y-axis' option from Chart Attachment displays. This commit also removes a bug in Charts Google that led to duplicate empty fields.
parent 56f7b5d9
No related branches found
No related tags found
No related merge requests found
......@@ -28,6 +28,7 @@ function charts_theme($existing, $type, $theme, $path) {
function template_preprocess_views_view_charts(&$variables) {
$options = $variables['view']->style_plugin->options;
$attachmentDisplayOptions = [];
$service = \Drupal::service('charts.charts_attachment');
$attachmentView = $service->getAttachmentViews();
......@@ -38,18 +39,21 @@ function template_preprocess_views_view_charts(&$variables) {
$chartId = $viewId . '__' . $displayId;
$categoriesAttachment = array();
$seriesDataAttachment = array();
$attachmentChartTypeOption = array();
for ($i = 0; $i < count($attachmentView); $i++) {
$attachmentId = $attachmentView[$i]->display_handler->display['id'];
$attachmentDisplay = $view->storage->getDisplay($attachmentId);
$attachmentChartType = $attachmentDisplay['display_options']['style']['options']['type'];
array_push($attachmentChartTypeOption, $attachmentChartType);
$attachedValueField = $attachmentDisplay['display_options']['style']['options']['data_fields'];
$combinedAttachmentPage = Util::removeUnselectedFields($attachedValueField);
$attachmentColor = $attachmentView[$i]->style_plugin->options['field_colors'];
$labelField = $attachmentView[$i]->style_plugin->options['label_field'];
$dataAttachment = Util::viewsData($attachmentView[$i], $combinedAttachmentPage, $labelField, $attachmentColor);
$dataAttachment = Util::viewsData($attachmentView[$i], $combinedAttachmentPage, $labelField, $attachmentColor, $attachmentChartTypeOption[$i]);
$dataAttachmentFormatted = Util::createChartableData($dataAttachment);
for ($j = 0; $j < count($dataAttachmentFormatted[0]); $j++) {
......@@ -60,25 +64,38 @@ function template_preprocess_views_view_charts(&$variables) {
array_push($seriesDataAttachment, $dataAttachmentFormatted[1][$j]);
}
}
$library = $view->style_plugin->options['library'];
$variables['data'] = array();
$labelField = $view->style_plugin->options['label_field'];
$valueField = $view->style_plugin->options['data_fields'];
$valueField = Util::removeUnselectedFields($valueField);
$color = $view->style_plugin->options['field_colors'];
$data = Util::viewsData($view, $valueField, $labelField, $color);
if (0 < count($attachmentView)){
$data = Util::viewsData($view, $valueField, $labelField, $color, $attachmentChartTypeOption[$i]);
} else {
$data = Util::viewsData($view, $valueField, $labelField, $color, $attachmentChartTypeOption[$i] = NULL);
}
$data = Util::createChartableData($data);
$categories = $data[0];
$seriesData = $data[1];
$categories = array_merge($categories, $categoriesAttachment);
$categories = array_unique($categories);
for ($i =0; $i < count($attachmentView); $i++){
$attachmentId = $attachmentView[$i]->display_handler->display['id'];
$attachmentDisplay = $view->storage->getDisplay($attachmentId);
$attachmentDisplayOptions[$i] = $attachmentDisplay['display_options'];
}
$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);
$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';
......@@ -90,7 +107,8 @@ function template_preprocess_views_view_charts(&$variables) {
break;
case 'highcharts':
$highchart = charts_highcharts_render_charts($options, $categories, $seriesData);
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;
......@@ -99,7 +117,8 @@ function template_preprocess_views_view_charts(&$variables) {
break;
case 'c3':
$c3 = charts_c3_render_charts($options, $categories, $seriesData, $chartId);
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;
......@@ -111,3 +130,5 @@ function template_preprocess_views_view_charts(&$variables) {
}
}
......@@ -23,8 +23,31 @@ function charts_c3_charts_info() {
return $info;
}
function charts_c3_render_charts($options, $categories = array(), $seriesData = array(), $chartId) {
/**
* @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'];
......@@ -44,7 +67,15 @@ function charts_c3_render_charts($options, $categories = array(), $seriesData =
//$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') {
......@@ -67,6 +98,7 @@ function charts_c3_render_charts($options, $categories = array(), $seriesData =
$chartData->setColumns($c3Data);
}
}
$chartData->types = $types;
$c3->setAxis($chartAxis);
......@@ -79,6 +111,5 @@ function charts_c3_render_charts($options, $categories = array(), $seriesData =
$chartColor->setPattern($seriesColors);
$c3->setColor($chartColor);
return $c3;
}
......@@ -32,12 +32,6 @@ function charts_google_charts_info() {
function charts_google_render_charts($categories = array(), $seriesData = array()) {
$dataTable = array();
$dataTableHeader = array();
for ($r = 0; $r < count($seriesData); $r++) {
array_push($dataTableHeader, $seriesData[$r]['name']);
}
for ($j = 0; $j < count($categories); $j++) {
$rowDataTable = [];
for ($i = 0; $i < count($seriesData); $i++) {
......@@ -62,12 +56,47 @@ function charts_google_render_charts($categories = array(), $seriesData = array(
/**
* @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()) {
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);
......
......@@ -4,4 +4,5 @@ namespace Drupal\charts_google\Settings\Google;
class VerticalAxis {
private $title;
}
......@@ -39,9 +39,12 @@ function charts_highcharts_charts_info() {
* @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()) {
function charts_highcharts_render_charts($options, $categories = array(), $seriesData = array(), $attachmentDisplayOptions = []) {
$chart = new ChartType();
$chart->setType($options['type']);
$chartTitle = new ChartTitle();
......@@ -55,6 +58,7 @@ function charts_highcharts_render_charts($options, $categories = array(), $serie
$chartXaxis->setLabels($chartLabels);
$yaxisLabels = new YaxisLabel();
$chartYaxis = new Yaxis();
$yAxes = [];
$yAxisTitle = new YaxisTitle();
$yAxisTitle->setText($options['yaxis_title']);
if (!empty($options['yaxis_min'])){
......@@ -63,8 +67,27 @@ function charts_highcharts_render_charts($options, $categories = array(), $serie
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);
......@@ -78,7 +101,8 @@ function charts_highcharts_render_charts($options, $categories = array(), $serie
$highchart->setChart($chart);
$highchart->setTitle($chartTitle);
$highchart->setXAxis($chartXaxis);
$highchart->setYAxis($chartYaxis);
//$highchart->setYAxis($chartYaxis);
$highchart->yAxis = $yAxes;
$highchart->setTooltip($chartTooltip);
$highchart->setPlotOptions($barPlotOptns);
$highchart->setCredits($chartCredits);
......
......@@ -6,7 +6,7 @@ class Highcharts implements \JsonSerializable {
private $chart;
private $title;
private $xAxis;
private $yAxis;
// private $yAxis;
private $tooltip;
private $plotOptions;
private $legend;
......@@ -57,16 +57,16 @@ class Highcharts implements \JsonSerializable {
/**
* @return mixed
*/
public function getYAxis() {
/*public function getYAxis() {
return $this->yAxis;
}
}*/
/**
* @param mixed $yAxis
*/
public function setYAxis($yAxis) {
/* public function setYAxis($yAxis) {
$this->yAxis = $yAxis;
}
}*/
/**
* @return mixed
......
......@@ -11,7 +11,7 @@ class Util {
* @param $color
* @return array
*/
public static function viewsData($view, $labelValues, $labelField, $color) {
public static function viewsData($view, $labelValues, $labelField, $color, $attachmentChartTypeOption) {
$data = array();
foreach ($view->result as $id => $row) {
......@@ -24,6 +24,7 @@ class Util {
'label' => $view->field[$fieldId]->label(),
// 'label' => $view->display_handler->display['id'], to use display_id
'color' => $color[$fieldId],
'type' => $attachmentChartTypeOption,
);
$numberFields++;
}
......@@ -58,11 +59,12 @@ class Util {
for ($i = 0; $i < count($data[0]); $i++) {
$seriesRowData = array('name' => '', 'color' => '', 'data' => array());
$seriesRowData = array('name' => '', 'color' => '', 'type' => '', 'data' => array());
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'])));
}
......@@ -74,4 +76,19 @@ class Util {
return $chartData;
}
/**
* Checks for missing libraries necessary for data visualization
*
* @param $moduleName
* @param $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');
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment