From 426bcc3bfd2c3f5211ab8d606fdfa026cd2b544d Mon Sep 17 00:00:00 2001 From: catch <catch@35733.no-reply.drupal.org> Date: Mon, 2 Oct 2023 16:49:13 +0100 Subject: [PATCH] Issue #2894449 by benjy, alexpott, _utsavsharma, B-Prod, benjifisher: Indirect modification of overloaded element with Views responsive table --- .../src/Functional/Plugin/StyleTableTest.php | 21 ++++++++++++++++ core/modules/views/views.theme.inc | 24 +++++++++---------- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/core/modules/views/tests/src/Functional/Plugin/StyleTableTest.php b/core/modules/views/tests/src/Functional/Plugin/StyleTableTest.php index 08755487ce12..c3e157ac4148 100644 --- a/core/modules/views/tests/src/Functional/Plugin/StyleTableTest.php +++ b/core/modules/views/tests/src/Functional/Plugin/StyleTableTest.php @@ -224,6 +224,27 @@ public function testGrouping() { } } + /** + * Tests responsive classes and column assigning. + */ + public function testResponsiveMergedColumns() { + /** @var \Drupal\views\ViewEntityInterface $view */ + $view = \Drupal::entityTypeManager()->getStorage('view')->load('test_table'); + + // Merge the two job columns together and set the responsive priority on + // the column that is merged to. + $display = &$view->getDisplay('default'); + $display['display_options']['style']['options']['columns']['job'] = 'job_1'; + $display['display_options']['style']['options']['info']['job_1']['separator'] = ', '; + $display['display_options']['style']['options']['info']['job_1']['responsive'] = 'priority-low'; + $view->save(); + + // Ensure that both columns are properly combined. + $this->drupalGet('test-table'); + $this->assertSession()->elementExists('xpath', '//tbody/tr/td[contains(concat(" ", @class, " "), " priority-low views-field views-field-job views-field-job-1 ")]'); + $this->assertSession()->elementExists('xpath', '//tbody/tr/td[contains(., "Drummer, Drummer")]'); + } + /** * Tests the cacheability of the table display. */ diff --git a/core/modules/views/views.theme.inc b/core/modules/views/views.theme.inc index 948f459065ed..be6bfee2e4b9 100644 --- a/core/modules/views/views.theme.inc +++ b/core/modules/views/views.theme.inc @@ -501,19 +501,19 @@ function template_preprocess_views_view_table(&$variables) { $variables['header'][$field]['default_classes'] = $fields[$field]->options['element_default_classes']; // Set up the header label class. - $variables['header'][$field]['attributes'] = []; + $variables['header'][$field]['attributes'] = new Attribute(); $class = $fields[$field]->elementLabelClasses(0); if ($class) { - $variables['header'][$field]['attributes']['class'][] = $class; + $variables['header'][$field]['attributes']->addClass($class); } // Add responsive header classes. if (!empty($options['info'][$field]['responsive'])) { - $variables['header'][$field]['attributes']['class'][] = $options['info'][$field]['responsive']; + $variables['header'][$field]['attributes']->addClass($options['info'][$field]['responsive']); $responsive = TRUE; } // Add a CSS align class to each field if one was set. if (!empty($options['info'][$field]['align'])) { - $variables['header'][$field]['attributes']['class'][] = Html::cleanCssIdentifier($options['info'][$field]['align']); + $variables['header'][$field]['attributes']->addClass(Html::cleanCssIdentifier($options['info'][$field]['align'])); } // Add a header label wrapper if one was selected. if ($variables['header'][$field]['content']) { @@ -522,7 +522,7 @@ function template_preprocess_views_view_table(&$variables) { $variables['header'][$field]['wrapper_element'] = $element_label_type; } // Improves accessibility of complex tables. - $variables['header'][$field]['attributes']['id'] = Html::getUniqueId('view-' . $field . '-table-column'); + $variables['header'][$field]['attributes']->setAttribute('id', Html::getUniqueId('view-' . $field . '-table-column')); } // aria-sort is a WAI-ARIA property that indicates if items in a table // or grid are sorted in ascending or descending order. See @@ -535,8 +535,6 @@ function template_preprocess_views_view_table(&$variables) { if (!empty($variables['header'][$field]['content'])) { $has_header_labels = TRUE; } - - $variables['header'][$field]['attributes'] = new Attribute($variables['header'][$field]['attributes']); } // Add a CSS align class to each field if one was set. @@ -564,21 +562,24 @@ function template_preprocess_views_view_table(&$variables) { // Add field classes. if (!isset($column_reference['attributes'])) { - $column_reference['attributes'] = []; + $column_reference['attributes'] = new Attribute(); + } + elseif (!($column_reference['attributes'] instanceof Attribute)) { + $column_reference['attributes'] = new Attribute($column_reference['attributes']); } if ($classes = $fields[$field]->elementClasses($num)) { - $column_reference['attributes']['class'][] = $classes; + $column_reference['attributes']->addClass(preg_split('/\s+/', $classes)); } // Add responsive header classes. if (!empty($options['info'][$field]['responsive'])) { - $column_reference['attributes']['class'][] = $options['info'][$field]['responsive']; + $column_reference['attributes']->addClass($options['info'][$field]['responsive']); } // Improves accessibility of complex tables. if (isset($variables['header'][$field]['attributes']['id'])) { - $column_reference['attributes']['headers'] = [$variables['header'][$field]['attributes']['id']]; + $column_reference['attributes']->setAttribute('headers', [$variables['header'][$field]['attributes']['id']]); } if (!empty($fields[$field])) { @@ -604,7 +605,6 @@ function template_preprocess_views_view_table(&$variables) { } } } - $column_reference['attributes'] = new Attribute($column_reference['attributes']); } // Remove columns if the "empty_column" option is checked and the -- GitLab