diff --git a/modules/charts_google/charts_google.inc b/modules/charts_google/charts_google.inc deleted file mode 100644 index 3310ed21255c9a73e2307e2a3b4ee531893bd405..0000000000000000000000000000000000000000 --- a/modules/charts_google/charts_google.inc +++ /dev/null @@ -1,318 +0,0 @@ -<?php - -/** - * @file - * Callbacks and utility functions for rendering a Google Chart. - */ - -/** - * Chart render callback; Convert all chart-level data. - * - * This essentially is an additional #pre_render callback. It operates in the - * same way and is simply called as part of the normal #pre_render process. - * - * @param array $chart - * The chart renderable. - * - * @return - * The modified chart renderable, with necessary #attached, #theme, and - * similar properties prepared for rendering. - */ -function _charts_google_render($chart) { - // Convert the chart renderable to a proper definition. - $chart_definition['visualization'] = _charts_google_visualization_type($chart['#chart_type']); - $chart_definition = _charts_google_populate_chart_options($chart, $chart_definition); - $chart_definition = _charts_google_populate_chart_axes($chart, $chart_definition); - $chart_definition = _charts_google_populate_chart_data($chart, $chart_definition); - - if (!isset($chart['#id'])) { - $chart['#id'] = drupal_html_id('google-chart-render'); - } - - // Trim out empty options. - charts_trim_array($chart_definition['options']); - - $chart['#attached']['library'][] = ['charts_google', 'charts_google']; - $chart['#attributes']['class'][] = 'charts-google'; - $chart['#chart_definition'] = $chart_definition; - - return $chart; -} - -/** - * Utility to convert a Drupal renderable type to a Google visualization type. - */ -function _charts_google_visualization_type($renderable_type) { - $types = [ - 'area' => 'AreaChart', - 'bar' => 'BarChart', - 'column' => 'ColumnChart', - 'line' => 'LineChart', - 'pie' => 'PieChart', - 'scatter' => 'ScatterChart', - ]; - drupal_alter('charts_google_visualization_types', $types); - return isset($types[$renderable_type]) ? $types[$renderable_type] : FALSE; -} - -/** - * Utility to populate main chart options. - */ -function _charts_google_populate_chart_options($chart, $chart_definition) { - $chart_definition['options']['title'] = $chart['#title'] ? $chart['#title'] : NULL; - $chart_definition['options']['titleTextStyle']['color'] = $chart['#title_color']; - $chart_definition['options']['titleTextStyle']['bold'] = $chart['#title_font_weight'] === 'bold' ? TRUE : FALSE; - $chart_definition['options']['titleTextStyle']['italic'] = $chart['#title_font_style'] === 'italic' ? TRUE : FALSE; - $chart_definition['options']['titleTextStyle']['fontSize'] = $chart['#title_font_size']; - $chart_definition['options']['titlePosition'] = $chart['#title_position']; - $chart_definition['options']['colors'] = $chart['#colors']; - $chart_definition['options']['fontName'] = $chart['#font']; - $chart_definition['options']['fontSize'] = $chart['#font_size']; - $chart_definition['options']['backgroundColor']['fill'] = $chart['#background']; - $chart_definition['options']['isStacked'] = $chart['#stacking'] ? TRUE : FALSE; - $chart_definition['options']['tooltip']['trigger'] = $chart['#tooltips'] ? 'focus' : 'none'; - $chart_definition['options']['tooltip']['isHtml'] = $chart['#tooltips_use_html'] ? TRUE : FALSE; - $chart_definition['options']['pieSliceText'] = $chart['#data_labels'] ? NULL : 'none'; - $chart_definition['options']['legend']['position'] = $chart['#legend_position'] ? $chart['#legend_position'] : 'none'; - $chart_definition['options']['legend']['alignment'] = 'center'; - $chart_definition['options']['interpolateNulls'] = TRUE; - - // TODO: Legend title (and thus these properties) not supported by Google. - $chart_definition['options']['legend']['title'] = $chart['#legend_title']; - $chart_definition['options']['legend']['titleTextStyle']['bold'] = $chart['#legend_title_font_weight'] === 'bold' ? TRUE : FALSE; - $chart_definition['options']['legend']['titleTextStyle']['italic'] = $chart['#legend_title_font_style'] === 'italic' ? TRUE : FALSE; - $chart_definition['options']['legend']['titleTextStyle']['fontSize'] = $chart['#legend_title_font_size']; - - $chart_definition['options']['legend']['textStyle']['bold'] = $chart['#legend_font_weight'] === 'bold' ? TRUE : FALSE; - $chart_definition['options']['legend']['textStyle']['italic'] = $chart['#legend_font_style'] === 'italic' ? TRUE : FALSE; - $chart_definition['options']['legend']['textStyle']['fontSize'] = $chart['#legend_font_size']; - $chart_definition['options']['width'] = $chart['#width'] ? $chart['#width'] : NULL; - $chart_definition['options']['height'] = $chart['#height'] ? $chart['#height'] : NULL; - - $chart_definition['options']['animation']['duration'] = 10000; - $chart_definition['options']['animation']['easing'] = 'out'; - - return $chart_definition; -} - -/** - * Utility to populate chart axes. - */ -function _charts_google_populate_chart_axes($chart, $chart_definition) { - foreach (element_children($chart) as $key) { - if ($chart[$key]['#type'] === 'chart_xaxis' || $chart[$key]['#type'] === 'chart_yaxis') { - // Make sure defaults are loaded. - if (empty($chart[$key]['#defaults_loaded'])) { - $chart[$key] += element_info($chart[$key]['#type']); - } - - // Populate the chart data. - $axis = []; - $axis['title'] = $chart[$key]['#title'] ? $chart[$key]['#title'] : ''; - $axis['titleTextStyle']['color'] = $chart[$key]['#title_color']; - $axis['titleTextStyle']['bold'] = $chart[$key]['#title_font_weight'] === 'bold' ? TRUE : FALSE; - $axis['titleTextStyle']['italic'] = $chart[$key]['#title_font_style'] === 'italic' ? TRUE : FALSE; - $axis['titleTextStyle']['fontSize'] = $chart[$key]['#title_font_size']; - // In Google, the row column of data is used as labels. - if ($chart[$key]['#labels'] && $chart[$key]['#type'] === 'chart_xaxis') { - foreach ($chart[$key]['#labels'] as $label_key => $label) { - $chart_definition['data'][$label_key + 1][0] = $label; - } - } - $axis['textStyle']['color'] = $chart[$key]['#labels_color']; - $axis['textStyle']['bold'] = $chart[$key]['#labels_font_weight'] === 'bold' ? TRUE : FALSE; - $axis['textStyle']['italic'] = $chart[$key]['#labels_font_style'] === 'italic' ? TRUE : FALSE; - $axis['textStyle']['fontSize'] = $chart[$key]['#labels_font_size']; - $axis['slantedText'] = !empty($chart[$key]['#labels_rotation']) ? TRUE : NULL; - $axis['slantedTextAngle'] = $chart[$key]['#labels_rotation']; - $axis['gridlines']['color'] = $chart[$key]['#grid_line_color']; - $axis['baselineColor'] = $chart[$key]['#base_line_color']; - $axis['minorGridlines']['color'] = $chart[$key]['#minor_grid_line_color']; - $axis['viewWindowMode'] = isset($chart[$key]['#max']) ? 'explicit' : NULL; - $axis['viewWindow']['max'] = strlen($chart[$key]['#max']) ? (int)$chart[$key]['#max'] : NULL; - $axis['viewWindow']['min'] = strlen($chart[$key]['#min']) ? (int)$chart[$key]['#min'] : NULL; - - // Multi-axis support only applies to the major axis in Google charts. - $chart_type_info = charts_get_type($chart['#chart_type']); - $axis_index = $chart[$key]['#opposite'] ? 1 : 0; - if ($chart[$key]['#type'] === 'chart_xaxis') { - $axis_keys = !$chart_type_info['axis_inverted'] ? ['hAxis'] : [ - 'vAxes', - $axis_index, - ]; - } else { - $axis_keys = !$chart_type_info['axis_inverted'] ? [ - 'vAxes', - $axis_index, - ] : ['hAxis']; - } - $axis_drilldown = &$chart_definition['options']; - foreach ($axis_keys as $key) { - $axis_drilldown = &$axis_drilldown[$key]; - } - $axis_drilldown = $axis; - } - } - - return $chart_definition; -} - -/** - * Utility to populate chart data. - */ -function _charts_google_populate_chart_data(&$chart, $chart_definition) { - $chart_definition['options']['series'] = []; - $chart_type_info = charts_get_type($chart['#chart_type']); - $series_number = 0; - foreach (element_children($chart) as $key) { - if ($chart[$key]['#type'] === 'chart_data') { - $series = []; - - // Make sure defaults are loaded. - if (empty($chart[$key]['#defaults_loaded'])) { - $chart[$key] += element_info($chart[$key]['#type']); - } - - // Convert target named axis keys to integers. - $axis_index = 0; - if (isset($chart[$key]['#target_axis'])) { - $axis_name = $chart[$key]['#target_axis']; - foreach (element_children($chart) as $axis_key) { - $multi_axis_type = $chart_type_info['axis_inverted'] ? 'chart_xaxis' : 'chart_yaxis'; - if ($chart[$axis_key]['#type'] === $multi_axis_type) { - if ($axis_key === $axis_name) { - break; - } - $axis_index++; - } - } - $series['targetAxisIndex'] = $axis_index; - } - - // Allow data to provide the labels. This will override the axis settings. - if ($chart[$key]['#labels']) { - foreach ($chart[$key]['#labels'] as $label_index => $label) { - $chart_definition['data'][$label_index + 1][0] = $label; - } - } - - if ($chart[$key]['#title']) { - $chart_definition['data'][0][$series_number + 1] = $chart[$key]['#title']; - } - foreach ($chart[$key]['#data'] as $index => $data_value) { - // Nested array values typically used for scatter charts. This weird - // approach leaves columns empty in order to make arbitrary pairings. - // See https://developers.google.com/chart/interactive/docs/gallery/scatterchart#Data_Format - if (is_array($data_value)) { - $chart_definition['data'][] = [ - 0 => $data_value[0], - $series_number + 1 => $data_value[1], - ]; - } // Most charts provide a single-dimension array of values. - else { - $chart_definition['data'][$index + 1][$series_number + 1] = $data_value; - } - } - - $series['color'] = $chart[$key]['#color']; - $series['pointSize'] = $chart[$key]['#marker_radius']; - $series['visibleInLegend'] = $chart[$key]['#show_in_legend']; - - // Labels only supported on pies. - $series['pieSliceText'] = $chart[$key]['#show_labels'] ? 'label' : 'none'; - - // These properties are not real Google Charts properties. They are - // utilized by the formatter in charts_google.js. - $decimal_count = $chart[$key]['#decimal_count'] ? '.' . str_repeat('0', $chart[$key]['#decimal_count']) : ''; - $prefix = _charts_google_escape_icu_characters($chart[$key]['#prefix']); - $suffix = _charts_google_escape_icu_characters($chart[$key]['#suffix']); - $format = $prefix . '#' . $decimal_count . $suffix; - $series['_format']['format'] = $format; - - // TODO: Convert this from PHP's date format to ICU format. - // See https://developers.google.com/chart/interactive/docs/reference#dateformatter. - //$series['_format']['dateFormat'] = $chart[$key]['#date_format']; - // Conveniently only the axis that supports multiple axes is the one that - // can receive formatting, so we know that the key will always be plural. - $axis_type = $chart_type_info['axis_inverted'] ? 'hAxes' : 'vAxes'; - $chart_definition['options'][$axis_type][$axis_index]['format'] = $format; - - // Convert to a ComboChart if mixing types. - // See https://developers.google.com/chart/interactive/docs/gallery/combochart?hl=en. - if ($chart[$key]['#chart_type']) { - // Oddly Google calls a "column" chart a "bars" series. Using actual bar - // charts is not supported in combo charts with Google. - $main_chart_type = $chart['#chart_type'] === 'column' ? 'bars' : $chart['#chart_type']; - $chart_definition['visualization'] = 'ComboChart'; - $chart_definition['options']['seriesType'] = $main_chart_type; - - $data_chart_type = $chart[$key]['#chart_type'] === 'column' ? 'bars' : $chart[$key]['#chart_type']; - $series['type'] = $data_chart_type; - } - - // Add the series to the main chart definition. - charts_trim_array($series); - $chart_definition['options']['series'][$series_number] = $series; - - // Merge in any point-specific data points. - foreach (element_children($chart[$key]) as $sub_key) { - if ($chart[$key][$sub_key]['#type'] === 'chart_data_item') { - - // Make sure defaults are loaded. - if (empty($chart[$key][$sub_key]['#defaults_loaded'])) { - $chart[$key][$sub_key] += element_info($chart[$key][$sub_key]['#type']); - } - - $data_item = $chart[$key][$sub_key]; - if ($data_item['#data']) { - $chart_definition['data'][$sub_key + 1][$series_number + 1] = $data_item['#data']; - } - // These data properties are manually applied to cells in JS. - // Color role not yet supported. See https://code.google.com/p/google-visualization-api-issues/issues/detail?id=1267 - $chart_definition['_data'][$sub_key + 1][$series_number + 1]['color'] = $data_item['#color']; - $chart_definition['_data'][$sub_key + 1][$series_number + 1]['tooltip'] = $data_item['#title']; - charts_trim_array($chart_definition['_data'][$sub_key + 1][$series_number + 1]); - } - } - - $series_number++; - - } - } - - // Once complete, normalize the chart data to ensure a full 2D structure. - $data = $chart_definition['data']; - - // Stub out corner value. - $data[0][0] = isset($data[0][0]) ? $data[0][0] : 'x'; - - // Ensure consistent column count. - $column_count = count($data[0]); - foreach ($data as $row => $values) { - for ($n = 0; $n < $column_count; $n++) { - $data[$row][$n] = isset($data[$row][$n]) ? $data[$row][$n] : NULL; - } - ksort($data[$row]); - } - ksort($data); - - $chart_definition['data'] = $data; - - return $chart_definition; -} - -/** - * Utility to escape special characters in ICU number formats. - * - * Google will use the ICU format to auto-adjust numbers based on special - * characters that are used in the format. This function escapes these special - * characters so they just show up as the character specified. - * - * The format string is a subset of the ICU pattern set. For instance, - * {pattern:'#,###%'} will result in output values "1,000%", "750%", and "50%" - * for values 10, 7.5, and 0.5. - */ -function _charts_google_escape_icu_characters($string) { - return preg_replace('/([0-9@#\.\-,E\+;%\'\*])/', "'$1'", $string); - -} diff --git a/modules/charts_highcharts/charts_highcharts.inc b/modules/charts_highcharts/charts_highcharts.inc deleted file mode 100644 index d11e2eaeb30ebe5fdca5f8a75a1d68f5bb4fa160..0000000000000000000000000000000000000000 --- a/modules/charts_highcharts/charts_highcharts.inc +++ /dev/null @@ -1,339 +0,0 @@ -<?php - -/** - * @file - * Callbacks and utility functions for rendering a Highcharts Chart. - */ - -use Drupal\Component\Utility\Html; -use Drupal\Component\Utility\NestedArray; - -/** - * Chart render callback; Convert all chart-level data. - * - * This essentially is an additional #pre_render callback. It operates in the - * same way and is simply called as part of the normal #pre_render process. - * - * @param array $chart - * The chart renderable. - * @return array The modified chart renderable, with necessary #attached, #theme, and - * The modified chart renderable, with necessary #attached, #theme, and - * similar properties prepared for rendering. - */ -function _charts_highcharts_render($chart) { - - // Populate chart settings. - $chart_definition = []; - $chart_definition = _charts_highcharts_populate_chart_options($chart, $chart_definition); - $chart_definition = _charts_highcharts_populate_chart_axes($chart, $chart_definition); - $chart_definition = _charts_highcharts_populate_chart_data($chart, $chart_definition); - - // Remove machine names from series. Highcharts series must be an array. - $series = array_values($chart_definition['series']); - unset($chart_definition['series']); - - // Trim out empty options (excluding "series" for efficiency). - charts_trim_array($chart_definition); - - // Put back the data. - $chart_definition['series'] = $series; - - if (!isset($chart['#id'])) { - $chart['#id'] = Html::getUniqueId('highchart-render'); - } - - $chart['#attached']['library'][] = [ - 'charts_highcharts', - 'charts_highcharts' - ]; - $chart['#attributes']['class'][] = 'charts-highchart'; - $chart['#chart_definition'] = $chart_definition; - - return $chart; -} - -/** - * Utility to convert a Drupal renderable type to a Google visualization type. - * - * @param $renderable_type - * - * @return bool|mixed - */ -function _charts_highcharts_type($renderable_type) { - $types = [ - 'area_chart' => 'AreaChart', - 'bar_chart' => 'BarChart', - 'column_chart' => 'ColumnChart', - 'line_chart' => 'LineChart', - 'pie_chart' => 'PieChart', - 'scatter_chart' => 'ScatterChart', - ]; - Drupal::moduleHandler()->alter('charts_highcharts_types', $types); - return isset($types[$renderable_type]) ? $types[$renderable_type] : FALSE; -} - -/** - * Utility to populate main chart options. - * @param $chart - * @param $chart_definition - * @return mixed - */ -function _charts_highcharts_populate_chart_options($chart, $chart_definition) { - $chart_definition['chart']['type'] = $chart['#chart_type']; - $chart_definition['title']['text'] = $chart['#title'] ? $chart['#title'] : ''; - $chart_definition['title']['style']['color'] = $chart['#title_color']; - $chart_definition['title']['style']['fontWeight'] = $chart['#title_font_weight']; - $chart_definition['title']['style']['fontStyle'] = $chart['#title_font_style']; - $chart_definition['title']['style']['fontSize'] = $chart['#title_font_size']; - $chart_definition['title']['verticalAlign'] = $chart['#title_position'] === 'in' ? 'top' : NULL; - $chart_definition['title']['y'] = $chart['#title_position'] === 'in' ? 24 : NULL; - $chart_definition['colors'] = $chart['#colors']; - $chart_definition['chart']['style']['fontFamily'] = $chart['#font']; - $chart_definition['chart']['style']['fontSize'] = $chart['#font_size']; - $chart_definition['chart']['backgroundColor'] = $chart['#background']; - $chart_definition['plotOptions']['series']['stacking'] = !is_string($chart['#stacking']) && $chart['#stacking'] ? 'normal' : $chart['#stacking']; - $chart_definition['tooltip']['enabled'] = $chart['#tooltips'] ? TRUE : FALSE; - $chart_definition['tooltip']['useHTML'] = $chart['#tooltips_use_html'] ? TRUE : FALSE; - $chart_definition['plotOptions']['series']['dataLabels']['enabled'] = $chart['#data_labels'] ? TRUE : FALSE; - - // These changes are for consistency with Google. Perhaps too specific? - if ($chart['#chart_type'] === 'pie') { - $chart_definition['plotOptions']['pie']['dataLabels']['distance'] = -30; - $chart_definition['plotOptions']['pie']['dataLabels']['color'] = 'white'; - $chart_definition['plotOptions']['pie']['dataLabels']['format'] = '{percentage:.1f}%'; - $chart_definition['tooltip']['pointFormat'] = '<b>{point.y} ({point.percentage:.1f}%)</b><br/>'; - } - - $chart_definition['legend']['enabled'] = $chart['#legend']; - $chart_definition['legend']['title']['text'] = $chart['#legend_title']; - $chart_definition['legend']['title']['style']['fontWeight'] = $chart['#legend_title_font_weight']; - $chart_definition['legend']['title']['style']['fontStyle'] = $chart['#legend_title_font_style']; - $chart_definition['legend']['title']['style']['fontSize'] = $chart['#legend_title_font_size']; - if ($chart['#legend_position'] === 'bottom') { - $chart_definition['legend']['verticalAlign'] = 'bottom'; - $chart_definition['legend']['layout'] = 'horizontal'; - } elseif ($chart['#legend_position'] === 'top') { - $chart_definition['legend']['verticalAlign'] = 'top'; - $chart_definition['legend']['layout'] = 'horizontal'; - } else { - $chart_definition['legend']['align'] = $chart['#legend_position']; - $chart_definition['legend']['verticalAlign'] = 'middle'; - $chart_definition['legend']['layout'] = 'vertical'; - } - $chart_definition['legend']['itemStyle']['fontWeight'] = $chart['#legend_font_weight']; - $chart_definition['legend']['itemStyle']['fontStyle'] = $chart['#legend_font_style']; - $chart_definition['legend']['itemStyle']['fontSize'] = $chart['#legend_font_size']; - $chart_definition['chart']['width'] = $chart['#width'] ? $chart['#width'] : NULL; - $chart_definition['chart']['height'] = $chart['#height'] ? $chart['#height'] : NULL; - $chart_definition['credits']['enabled'] = FALSE; - - // Merge in chart raw options. - if (isset($chart['#raw_options'])) { - $chart_definition = NestedArray::mergeDeep($chart_definition, $chart['#raw_options']); - } - - return $chart_definition; -} - -/** - * Utility to populate chart axes. - * @param $chart - * @param $chart_definition - * @return mixed - */ -function _charts_highcharts_populate_chart_axes($chart, $chart_definition) { - foreach (\Drupal::state()->getMultiple($chart) as $key) { - if ($chart[$key]['#type'] === 'chart_xaxis' || $chart[$key]['#type'] === 'chart_yaxis') { - // Make sure defaults are loaded. - if (empty($chart[$key]['#defaults_loaded'])) { - $chart[$key] += \Drupal::service('element_info') - ->getInfo($chart[$key]['#type']); - } - - // Populate the chart data. - $axisType = $chart[$key]['#type'] === 'chart_xaxis' ? 'xAxis' : 'yAxis'; - $axis = []; - $axis['type'] = $chart[$key]['#axis_type']; - $axis['title']['text'] = $chart[$key]['#title']; - $axis['title']['style']['color'] = $chart[$key]['#title_color']; - $axis['title']['style']['fontWeight'] = $chart[$key]['#title_font_weight']; - $axis['title']['style']['fontStyle'] = $chart[$key]['#title_font_style']; - $axis['title']['style']['fontSize'] = $chart[$key]['#title_font_size']; - $axis['categories'] = $chart[$key]['#labels']; - $axis['labels']['style']['color'] = $chart[$key]['#labels_color']; - $axis['labels']['style']['fontWeight'] = $chart[$key]['#labels_font_weight']; - $axis['labels']['style']['fontStyle'] = $chart[$key]['#labels_font_style']; - $axis['labels']['style']['fontSize'] = $chart[$key]['#labels_font_size']; - $axis['labels']['rotation'] = $chart[$key]['#labels_rotation']; - $axis['gridLineColor'] = $chart[$key]['#grid_line_color']; - $axis['lineColor'] = $chart[$key]['#base_line_color']; - $axis['minorGridLineColor'] = $chart[$key]['#minor_grid_line_color']; - $axis['endOnTick'] = isset($chart[$key]['#max']) ? FALSE : NULL; - $axis['max'] = $chart[$key]['#max']; - $axis['min'] = $chart[$key]['#min']; - $axis['opposite'] = $chart[$key]['#opposite']; - - // Dealing with axis rotation in a reasonable manner is complicated in - // Highcharts. We want the label to be reasonably positioned on the - // outside of the chart when labels are rotated. - if ($axis['labels']['rotation']) { - $chart_type = charts_get_type($chart['#chart_type']); - if ($axisType === 'xAxis' && !$chart_type['axis_inverted']) { - $axis['labels']['align'] = 'left'; - } elseif ($axisType === 'yAxis' && $chart_type['axis_inverted']) { - $axis['labels']['align'] = 'left'; - } else { - // Rotation not allowed on left/right axis. - unset($axis['labels']['rotation']); - } - } - - // Merge in axis raw options. - if (isset($chart[$key]['#raw_options'])) { - $axis = NestedArray::mergeDeep($axis, $chart[$key]['#raw_options']); - } - - $chart_definition[$axisType][] = $axis; - } - } - - return $chart_definition; -} - -/** - * Utility to populate chart data. - * @param $chart - * @param $chart_definition - * @return mixed - */ -function _charts_highcharts_populate_chart_data(&$chart, $chart_definition) { - $chart_definition['series'] = []; - foreach (\Drupal::state()->getMultiple($chart) as $key) { - if ($chart[$key]['#type'] === 'chart_data') { - $series = []; - $series_data = []; - - // Make sure defaults are loaded. - if (empty($chart[$key]['#defaults_loaded'])) { - $chart[$key] += \Drupal::service('element_info') - ->getInfo($chart[$key]['#type']); - } - - // Convert target named axis keys to integers. - if (isset($chart[$key]['#target_axis'])) { - $axis_name = $chart[$key]['#target_axis']; - $axis_index = 0; - foreach (\Drupal::state()->getMultiple($chart) as $axis_key) { - if ($chart[$axis_key]['#type'] === 'chart_yaxis') { - if ($axis_key === $axis_name) { - break; - } - $axis_index++; - } - } - $series['yAxis'] = $axis_index; - } - - // Allow data to provide the labels. This will override the axis settings. - if ($chart[$key]['#labels']) { - foreach ($chart[$key]['#labels'] as $label_index => $label) { - $series_data[$label_index][0] = $label; - } - } - - // Populate the data. - foreach ($chart[$key]['#data'] as $data_index => $data) { - if (isset($series_data[$data_index])) { - $series_data[$data_index][] = $data; - } else { - $series_data[$data_index] = $data; - } - } - - $series['type'] = $chart[$key]['#chart_type']; - $series['name'] = $chart[$key]['#title']; - $series['color'] = $chart[$key]['#color']; - $series['marker']['radius'] = $chart[$key]['#marker_radius']; - $series['showInLegend'] = $chart[$key]['#show_in_legend']; - $series['connectNulls'] = TRUE; - - $series['tooltip']['valueDecimals'] = $chart[$key]['#decimal_count']; - $series['tooltip']['xDateFormat'] = $chart[$key]['#date_format']; - $series['tooltip']['valuePrefix'] = $chart[$key]['#prefix']; - $series['tooltip']['valueSuffix'] = $chart[$key]['#suffix']; - - if ($chart[$key]['#prefix'] || $chart[$key]['#suffix']) { - $yaxis_index = isset($series['yAxis']) ? $series['yAxis'] : 0; - // For axis formatting, we need to use a format string. - // See http://docs.highcharts.com/#formatting. - $decimal_formatting = $chart[$key]['#decimal_count'] ? (':.' . $chart[$key]['#decimal_count'] . 'f') : ''; - $chart_definition['yAxis'][$yaxis_index]['labels']['format'] = $chart[$key]['#prefix'] . "{value$decimal_formatting}" . $chart[$key]['#suffix']; - } - - // Remove unnecessary keys to trim down the resulting JS settings. - charts_trim_array($series); - $series['data'] = $series_data; - - // Merge in series raw options. - if (isset($chart[$key]['#raw_options'])) { - $series = NestedArray::mergeDeep($series, $chart[$key]['#raw_options']); - } - - // Add the series to the main chart definition. - $chart_definition['series'][$key] = $series; - - // Merge in any point-specific data points. - foreach (\Drupal::state()->getMultiple($chart[$key]) as $sub_key) { - if ($chart[$key][$sub_key]['#type'] === 'chart_data_item') { - - // Make sure defaults are loaded. - if (empty($chart[$key][$sub_key]['#defaults_loaded'])) { - $chart[$key][$sub_key] += \Drupal::service('element_info') - ->getInfo($chart[$key][$sub_key]['#type']); - } - - $data_item = $chart[$key][$sub_key]; - $series_point = &$chart_definition['series'][$key]['data'][$sub_key]; - - // Convert the point from a simple data value to a complex point. - if (!isset($series_point['data'])) { - $data = $series_point; - $series_point = []; - if (is_array($data)) { - $series_point['name'] = $data[0]; - $series_point['y'] = $data[1]; - } else { - $series_point['y'] = $data; - } - } - if (isset($data_item['#data'])) { - if (is_array($data_item['#data'])) { - $series_point['x'] = $data_item['#data'][0]; - $series_point['y'] = $data_item['#data'][1]; - } else { - $series_point['y'] = $data_item['#data']; - } - } - if ($data_item['#title']) { - $series_point['name'] = $data_item['#title']; - } - - // Setting the color requires several properties for consistency. - $series_point['color'] = $data_item['#color']; - $series_point['fillColor'] = $data_item['#color']; - $series_point['states']['hover']['fillColor'] = $data_item['#color']; - $series_point['states']['select']['fillColor'] = $data_item['#color']; - charts_trim_array($series_point); - - // Merge in point raw options. - if (isset($data_item['#raw_options'])) { - $series_point = NestedArray::mergeDeep($series_point, $data_item['#raw_options']); - } - } - } - - } - } - - return $chart_definition; -}