Commit c0eabc09 authored by Nia Kathoni's avatar Nia Kathoni Committed by Daniel Cothran
Browse files

Issue #3198334 by nikathone, extect, srdtwc, diamondsea: Preview does not work on admin pages

parent 3eada0d9
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -492,7 +492,7 @@ class Highcharts extends ChartBase implements ContainerFactoryPluginInterface {
          if ($element[$key][$sub_key]['#type'] === 'chart_data_item') {
            // Make sure defaults are loaded.
            if (empty($element[$key][$sub_key]['#defaults_loaded'])) {
              $element[$key][$sub_key] += $element_info->getInfo($element[$key][$sub_key]['#type']);
              $element[$key][$sub_key] += $this->elementInfo->getInfo($element[$key][$sub_key]['#type']);
            }

            $data_item = $element[$key][$sub_key];
+20 −19
Original line number Diff line number Diff line
@@ -1167,21 +1167,23 @@ class BaseSettings extends FormElement {
  private static function processSeriesForm(array $element, array $options, FormStateInterface $form_state) {
    // Chart preview.
    $parents = $element['#parents'];
    $id_prefix = implode('-', $parents);
    $css_id_prefix = implode('-', $parents);
    $id_prefix = str_replace('-', '_', $css_id_prefix);
    $open_preview_elt_state_key = $id_prefix . '__open_preview';
    $element_state = ChartDataCollectorTable::getElementState($parents, $form_state);

    if (!$element_state) {
      $element_state = $options;
      // Closing preview here cause this is probably initial form load.
      $open_preview = FALSE;
      $element_state[$id_prefix . '__open_preview'] = $open_preview;
      $element_state[$open_preview_elt_state_key] = $open_preview;
      ChartDataCollectorTable::setElementState($parents, $form_state, $element_state);
    }
    else {
      $open_preview = $element_state[$id_prefix . '__open_preview'];
      $open_preview = $element_state[$open_preview_elt_state_key];
    }

    $wrapper_id = $element['#wrapper_id'] . '--preview';
    $wrapper_id = $css_id_prefix . '--preview--ajax-wrapper';
    $element['preview'] = [
      '#type' => 'details',
      '#title' => new TranslatableMarkup('Preview'),
@@ -1193,9 +1195,9 @@ class BaseSettings extends FormElement {
    $element['preview']['submit'] = [
      '#type' => 'submit',
      '#value' => new TranslatableMarkup('Update Preview'),
      '#name' => $id_prefix . '--preview-submit',
      '#name' => $id_prefix . '__preview_submit',
      '#attributes' => [
        'class' => [Html::cleanCssIdentifier($id_prefix . '--preview-submit')],
        'class' => [$css_id_prefix . '--preview-submit'],
      ],
      '#submit' => [[get_called_class(), 'chartPreviewSubmit']],
      '#limit_validation_errors' => [$parents],
@@ -1206,22 +1208,22 @@ class BaseSettings extends FormElement {
        'effect' => 'fade',
      ],
      '#operation' => 'preview',
      '#open_preview_elt_state_key' => $open_preview_elt_state_key,
    ];

    $preview_content = new TranslatableMarkup('<p>Please fill up the required value below then update the preview.</p>');
    if (!empty($element_state['library']) && !empty($element_state['series'])) {
      /** @var \Drupal\Core\Render\RendererInterface $renderer */
      $renderer = \Drupal::service('renderer');
      $chart_build = Chart::buildElement($options, $wrapper_id);
      $chart_id = $id_prefix . '__preview_chart';
      $chart_build = Chart::buildElement($options, $chart_id);
      $chart_build['#id'] = $id_prefix . '--preview-chart';
      // @todo check if this would work with various hooks.
      $chart_build['#id'] = $wrapper_id;
      $chart_build['#chart_id'] = $id_prefix;

      $preview_content = $renderer->render($chart_build);
      $chart_build['#chart_id'] = $chart_id;
      $element['preview']['content'] = $chart_build;
    }
    else {
      $element['preview']['content'] = [
      '#markup' => $preview_content,
        '#markup' => new TranslatableMarkup('<p>Please fill up the required value below then update the preview.</p>'),
      ];
    }

    $element['series'] = [
      '#type' => 'chart_data_collector_table',
@@ -1249,11 +1251,10 @@ class BaseSettings extends FormElement {
  public static function chartPreviewSubmit(array $form, FormStateInterface $form_state) {
    $triggering_element = $form_state->getTriggeringElement();
    $element_parents = array_slice($triggering_element['#parents'], 0, -2);
    $id_prefix = implode('-', $element_parents);

    // Getting the current element state.
    $element_state = ChartDataCollectorTable::getElementState($element_parents, $form_state);
    $element_state[$id_prefix . '__open_preview'] = TRUE;
    $element_state[$triggering_element['#open_preview_elt_state_key']] = TRUE;
    // Updating form state storage.
    ChartDataCollectorTable::setElementState($element_parents, $form_state, $element_state);
    $form_state->setRebuild();
+89 −85
Original line number Diff line number Diff line
@@ -305,7 +305,7 @@ class Chart extends RenderElement implements ContainerFactoryPluginInterface {
   * @return array
   *   The element.
   */
  public static function buildElement(array $settings, $chart_id) {
  public static function buildElement(array $settings, string $chart_id): array {
    $type = $settings['type'];
    $single_axis = in_array($type, ['pie', 'donut']);
    $display_colors = $settings['display']['colors'] ?? [];
@@ -332,7 +332,10 @@ class Chart extends RenderElement implements ContainerFactoryPluginInterface {
      '#height_units' => $settings['display']['dimensions']['height_units'],
    ];

    if (!empty($settings['series'])) {
    if (empty($settings['series'])) {
      return $element;
    }

    $table = $settings['series'];
    // Extracting the categories.
    $categories = ChartDataCollectorTable::getCategoriesFromCollectedTable($table, $type);
@@ -346,7 +349,9 @@ class Chart extends RenderElement implements ContainerFactoryPluginInterface {
      '#labels_rotation' => $settings['xaxis']['labels_rotation'],
    ];

      if (!empty($series_data)) {
    if (empty($series_data)) {
      return $element;
    }

    $element['yaxis'] = [
      '#type' => 'chart_yaxis',
@@ -378,6 +383,7 @@ class Chart extends RenderElement implements ContainerFactoryPluginInterface {
    // Overriding element colors for pie and donut chart types when the
    // settings display colors is empty.
    $overrides_element_colors = !$display_colors && ($type === 'pie' || $type === 'donut');
    $series_key = $chart_id . '__series';
    if ($single_axis) {
      $new_series = [];
      $labels = [];
@@ -390,7 +396,7 @@ class Chart extends RenderElement implements ContainerFactoryPluginInterface {
      }
      $element['xaxis']['#labels'] = $labels;
      // @todo Address more than one series.
          $element[$chart_id] = [
      $element[$series_key] = [
        '#type' => 'chart_data',
        '#data' => $new_series,
        '#title' => $series_data[0]['title'] ?? '',
@@ -399,7 +405,7 @@ class Chart extends RenderElement implements ContainerFactoryPluginInterface {
    else {
      $series_counter = 0;
      foreach ($series_data as $data_index => $data) {
            $key = $chart_id . '_' . $data_index;
        $key = $series_key . '__' . $data_index;
        $element[$key] = [
          '#type' => 'chart_data',
          '#data' => $data['data'],
@@ -422,8 +428,6 @@ class Chart extends RenderElement implements ContainerFactoryPluginInterface {
        $series_counter++;
      }
    }
      }
    }

    return $element;
  }