From 90f883901b407a02996dc5ad614c5de842b24654 Mon Sep 17 00:00:00 2001 From: Dmytro Storozhuk Date: Tue, 10 Mar 2026 17:14:39 -0500 Subject: [PATCH 1/9] DP-45228: Update `drupal/csv_field` module to `3.0.x-dev` Switched `drupal/csv_field` dependency to `3.0.x-dev` for improved flexibility and updated security coverage metadata in `composer.json` and `composer.lock`. Signed-off-by: Dmytro Storozhuk --- composer.json | 2 +- composer.lock | 24 +++++++++++------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/composer.json b/composer.json index 12d6d45cad..a1b0b6b4e8 100644 --- a/composer.json +++ b/composer.json @@ -172,7 +172,7 @@ "drupal/core-composer-scaffold": "^10", "drupal/core-project-message": "^10", "drupal/core-recommended": "^10", - "drupal/csv_field": "^3.0", + "drupal/csv_field": "3.0.x-dev@dev", "drupal/csv_serialization": "^2.0 || ^3.0", "drupal/datalayer": "^2", "drupal/devel": "^5", diff --git a/composer.lock b/composer.lock index 33de0e758a..20d86ce518 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3f791d1dfd24854dc206a86423d9fdcd", + "content-hash": "342f27779d9aae4956bac6ded84d840a", "packages": [ { "name": "akamai-open/edgegrid-auth", @@ -4424,17 +4424,11 @@ }, { "name": "drupal/csv_field", - "version": "3.0.0", + "version": "dev-3.0.x", "source": { "type": "git", "url": "https://git.drupalcode.org/project/csv_field.git", - "reference": "3.0.0" - }, - "dist": { - "type": "zip", - "url": "https://ftp.drupal.org/files/projects/csv_field-3.0.0.zip", - "reference": "3.0.0", - "shasum": "71130f30129f24cf61c1efc1cd54ad1b9ed62140" + "reference": "38c4cbb2a28a2b36f117a44a5bfb85fd123ce9cf" }, "require": { "drupal/core": "^9.3 || ^10 || ^11", @@ -4442,12 +4436,15 @@ }, "type": "drupal-module", "extra": { + "branch-alias": { + "dev-3.0.x": "3.0.x-dev" + }, "drupal": { - "version": "3.0.0", - "datestamp": "1770676311", + "version": "3.0.0+1-dev", + "datestamp": "1773167091", "security-coverage": { - "status": "covered", - "message": "Covered by Drupal's security advisory policy" + "status": "not-covered", + "message": "Dev releases are not covered by Drupal security advisories." } } }, @@ -25687,6 +25684,7 @@ "drupal/clamav": 20, "drupal/config_ignore": 20, "drupal/content_language_no_outbound": 5, + "drupal/csv_field": 20, "drupal/entityreference_filter": 10, "drupal/field_tokens": 20, "drupal/focal_point": 20, From 1b5589f31fa0bf3ea0cb6a0bd83ff56c1ec0344e Mon Sep 17 00:00:00 2001 From: Dmytro Storozhuk Date: Tue, 10 Mar 2026 17:15:56 -0500 Subject: [PATCH 2/9] DP-45228: Add changelog entry for CSV Table / Datatables changes Signed-off-by: Dmytro Storozhuk --- changelogs/DP-45228.yml | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 changelogs/DP-45228.yml diff --git a/changelogs/DP-45228.yml b/changelogs/DP-45228.yml new file mode 100644 index 0000000000..7297b3d02c --- /dev/null +++ b/changelogs/DP-45228.yml @@ -0,0 +1,41 @@ +# +# Write your changelog entry here. Every pull request must have a changelog yml file. +# +# Change types: +# ############################################################################# +# You can use one of the following types: +# - Added: For new features. +# - Changed: For changes to existing functionality. +# - Deprecated: For soon-to-be removed features. +# - Removed: For removed features. +# - Fixed: For any bug fixes. +# - Security: In case of vulnerabilities. +# +# Format +# ############################################################################# +# The format is crucial. Please follow the examples below. For reference, the requirements are: +# - All 3 parts are required and you must include "Type", "description" and "issue". +# - "Type" must be left aligned and followed by a colon. +# - "description" must be indented with 2 spaces followed by a colon +# - "issue" must be indented with 4 spaces followed by a colon. +# - "issue" is for the Jira ticket number only e.g. DP-1234 +# - No extra spaces, indents, or blank lines are allowed. +# +# Example: +# ############################################################################# +# Fixed: +# - description: Fixes scrolling on edit pages in Safari. +# issue: DP-13314 +# +# You may add more than 1 description & issue for each type using the following format: +# Changed: +# - description: Automating the release branch. +# issue: DP-10166 +# - description: Second change item that needs a description. +# issue: DP-19875 +# - description: Third change item that needs a description along with an issue. +# issue: DP-19843 +# +Changed: + - description: CSV Table / Datatables changes + issue: DP-45228 From acda0eddb84e863f702d05f1d965deba7203387c Mon Sep 17 00:00:00 2001 From: Arthur Baghdasaryan Date: Mon, 6 Apr 2026 12:18:30 +0400 Subject: [PATCH 3/9] csv_field --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 75141214ce..e5835c891e 100644 --- a/composer.json +++ b/composer.json @@ -185,7 +185,7 @@ "drupal/core-composer-scaffold": "~11.3.3", "drupal/core-project-message": "~11.3.3", "drupal/core-recommended": "~11.3.3", - "drupal/csv_field": "3.0.x-dev@dev", + "drupal/csv_field": "^3.0", "drupal/csv_serialization": "^4.0", "drupal/datalayer": "^2", "drupal/devel": "^5", From 955a4079375f227643a9b29c6c391006a81fd7ad Mon Sep 17 00:00:00 2001 From: Arthur Baghdasaryan Date: Tue, 7 Apr 2026 13:01:56 +0400 Subject: [PATCH 4/9] New tests --- .../CsvFieldUserFlowTest.php | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/docroot/modules/custom/mass_content/tests/src/ExistingSiteJavascript/CsvFieldUserFlowTest.php b/docroot/modules/custom/mass_content/tests/src/ExistingSiteJavascript/CsvFieldUserFlowTest.php index afd422da38..ac58073430 100644 --- a/docroot/modules/custom/mass_content/tests/src/ExistingSiteJavascript/CsvFieldUserFlowTest.php +++ b/docroot/modules/custom/mass_content/tests/src/ExistingSiteJavascript/CsvFieldUserFlowTest.php @@ -401,6 +401,59 @@ public function testCsvFlowResponsiveChildRowInteraction(): void { $this->assertNotNull($control, 'Responsive control column should be visible at narrow width.'); } + /** + * Ensures hidden responsive column headers are not keyboard focusable. + */ + public function testCsvFlowHiddenResponsiveHeadersNotFocusable(): void { + $this->drupalLogin($this->createAdminUser()); + + $file = $this->createWideCsvFile('csv-responsive-hidden-headers.csv'); + $csv_table = $this->createCsvTableParagraph($file, [ + 'searching' => 1, + 'pageLength' => 5, + 'lengthChange' => 1, + 'responsive' => 'childRow', + 'download' => 1, + 'urls' => [ + 'autolink' => 0, + ], + ], 'CSV Responsive Header Focus'); + $section = $this->createSectionParagraph($csv_table); + $node = $this->createOrgPageWithCsvTable($section, 'CSV Flow Hidden Responsive Headers'); + + $this->drupalGet('node/' . $node->id()); + + $assert = $this->assertSession(); + $assert->waitForElement('css', '.dataTables_wrapper'); + $this->getSession()->resizeWindow(480, 900, 'current'); + $this->getSession()->wait(3000); + + $non_focusable_hidden_header_violations = $this->getSession()->evaluateScript( + "(function() { + var headers = document.querySelectorAll('.dataTables_wrapper thead th'); + var violations = 0; + headers.forEach(function(th) { + var rect = th.getBoundingClientRect(); + var style = window.getComputedStyle(th); + var isResponsiveHidden = th.classList.contains('dtr-hidden') || + (style.position === 'absolute' && rect.width <= 1 && rect.height <= 1); + + if (!isResponsiveHidden) { + return; + } + + var headerTabIndex = th.getAttribute('tabindex'); + var hasFocusableDescendant = th.querySelector('a[href], button, input, select, textarea, [tabindex]:not([tabindex=\"-1\"])') !== null; + if (headerTabIndex !== '-1' || hasFocusableDescendant) { + violations++; + } + }); + return violations; + })();" + ); + $this->assertSame(0, (int) $non_focusable_hidden_header_violations, 'Hidden responsive headers must not be keyboard focusable.'); + } + /** * Ensures first column is rendered as table row headers. */ @@ -426,10 +479,45 @@ public function testCsvFlowFirstColumnRowHeaderInteraction(): void { $assert = $this->assertSession(); $assert->waitForElement('css', '.dataTables_wrapper'); + $table = $assert->elementExists('css', '.dataTable.display'); + $settings = $table->getAttribute('data-settings'); + $this->assertStringContainsString('"firstColumnRowHeader":1', $settings); $assert->elementExists('css', 'table.dataTable tbody tr th'); $assert->pageTextContains('Alpha Office'); } + /** + * Ensures first column defaults to regular data cells when unchecked. + */ + public function testCsvFlowFirstColumnRowHeaderDefaultsUnchecked(): void { + $this->drupalLogin($this->createAdminUser()); + + $file = $this->createLargeCsvFile('csv-row-header-default-unchecked.csv'); + $csv_table = $this->createCsvTableParagraph($file, [ + 'searching' => 1, + 'pageLength' => 5, + 'lengthChange' => 1, + 'responsive' => 'childRow', + 'download' => 1, + 'urls' => [ + 'autolink' => 0, + ], + ], 'CSV Row Header Default Unchecked'); + $section = $this->createSectionParagraph($csv_table); + $node = $this->createOrgPageWithCsvTable($section, 'CSV Flow First Column Row Header Default Unchecked'); + + $this->drupalGet('node/' . $node->id()); + + $assert = $this->assertSession(); + $assert->waitForElement('css', '.dataTables_wrapper'); + $table = $assert->elementExists('css', '.dataTable.display'); + $settings = $table->getAttribute('data-settings'); + $this->assertStringNotContainsString('"firstColumnRowHeader":1', $settings); + $assert->elementNotExists('css', 'table.dataTable tbody tr th'); + $assert->elementExists('css', 'table.dataTable tbody tr td'); + $assert->pageTextContains('Alpha Office'); + } + /** * Ensures download link points to the CSV and returns expected content. */ From 3f2a1c2e3deee6090e3cca548496ff59b1ef6b5c Mon Sep 17 00:00:00 2001 From: Dmytro Storozhuk Date: Wed, 15 Apr 2026 22:25:21 -0500 Subject: [PATCH 5/9] DP-45228: Switch `drupal/csv_field` to `3.0.x-dev` and update security coverage metadata in composer files Signed-off-by: Dmytro Storozhuk --- composer.json | 2 +- composer.lock | 24 +++++++++++------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/composer.json b/composer.json index 308e3ea3b8..cc3d07a6b3 100644 --- a/composer.json +++ b/composer.json @@ -185,7 +185,7 @@ "drupal/core-composer-scaffold": "~11.3.3", "drupal/core-project-message": "~11.3.3", "drupal/core-recommended": "~11.3.3", - "drupal/csv_field": "^3.0", + "drupal/csv_field": "3.0.x-dev@dev", "drupal/csv_serialization": "^4.0", "drupal/datalayer": "^2", "drupal/devel": "^5", diff --git a/composer.lock b/composer.lock index 12ddb30da9..9c339ead2b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1f4ed688d02b82a8256a0bc070a63651", + "content-hash": "74e55d67a60c12dd1190f335673ba578", "packages": [ { "name": "akamai-open/edgegrid-auth", @@ -4323,17 +4323,11 @@ }, { "name": "drupal/csv_field", - "version": "3.0.2", + "version": "dev-3.0.x", "source": { "type": "git", "url": "https://git.drupalcode.org/project/csv_field.git", - "reference": "3.0.2" - }, - "dist": { - "type": "zip", - "url": "https://ftp.drupal.org/files/projects/csv_field-3.0.2.zip", - "reference": "3.0.2", - "shasum": "61dcee998b5c61fb72821504e229edace125b4a5" + "reference": "3d5f4377154962ea67ff241fcdbf6f3b7d16de79" }, "require": { "drupal/core": "^9.3 || ^10 || ^11", @@ -4341,12 +4335,15 @@ }, "type": "drupal-module", "extra": { + "branch-alias": { + "dev-3.0.x": "3.0.x-dev" + }, "drupal": { - "version": "3.0.2", - "datestamp": "1774425928", + "version": "3.0.2+1-dev", + "datestamp": "1776309393", "security-coverage": { - "status": "covered", - "message": "Covered by Drupal's security advisory policy" + "status": "not-covered", + "message": "Dev releases are not covered by Drupal security advisories." } } }, @@ -25733,6 +25730,7 @@ "drupal/clamav": 20, "drupal/color": 15, "drupal/conditional_fields": 15, + "drupal/csv_field": 20, "drupal/entity_usage": 10, "drupal/entityreference_filter": 10, "drupal/imageapi_optimize_binaries": 10, From 74fd8651ede6f07b7e2b5168f07e9653a5e3fbf2 Mon Sep 17 00:00:00 2001 From: Dmytro Storozhuk Date: Thu, 16 Apr 2026 12:37:12 -0500 Subject: [PATCH 6/9] DP-45228: Improve DataTables sort icon contrast and visibility Signed-off-by: Dmytro Storozhuk --- .../custom/mass_theme/overrides/css/datatables.css | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docroot/themes/custom/mass_theme/overrides/css/datatables.css b/docroot/themes/custom/mass_theme/overrides/css/datatables.css index bb720329da..dca5097f5a 100644 --- a/docroot/themes/custom/mass_theme/overrides/css/datatables.css +++ b/docroot/themes/custom/mass_theme/overrides/css/datatables.css @@ -132,15 +132,20 @@ button.dt-paging-button.next { -/* sort icons */ +/* sort icons: inactive arrows use #8C8C8C for contrast on #f2f2f2 header */ table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:before, table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:after, table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:before, table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:after, table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before, table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:after, table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:before, table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after, table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:before, table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:after, table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:before, table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:after, table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before, table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:after, table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:before, table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after { line-height: 12px; - opacity: 0.25; + color: #555555; + opacity: 1; } +/* Active sort arrow: dark color, slightly larger */ table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before, table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after { + color: #141414; opacity: 1; + display: inline-block; + transform: scale(1.3); } table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order, From 3495a93cf88f7e8aace425768b38b050fb4c4c88 Mon Sep 17 00:00:00 2001 From: Dmytro Storozhuk Date: Thu, 16 Apr 2026 13:37:03 -0500 Subject: [PATCH 7/9] DP-45228: Update `drupal/csv_field` module reference in composer.lock Updated `drupal/csv_field` dependency to the latest `3.0.x-dev` commit in `composer.lock` to ensure alignment with the latest changes. Signed-off-by: Dmytro Storozhuk --- composer.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.lock b/composer.lock index 9c339ead2b..a9b2ae7868 100644 --- a/composer.lock +++ b/composer.lock @@ -4327,7 +4327,7 @@ "source": { "type": "git", "url": "https://git.drupalcode.org/project/csv_field.git", - "reference": "3d5f4377154962ea67ff241fcdbf6f3b7d16de79" + "reference": "057b69f6b9cf786030e0748d8f813be2a186e052" }, "require": { "drupal/core": "^9.3 || ^10 || ^11", @@ -4339,8 +4339,8 @@ "dev-3.0.x": "3.0.x-dev" }, "drupal": { - "version": "3.0.2+1-dev", - "datestamp": "1776309393", + "version": "3.0.2+4-dev", + "datestamp": "1776362857", "security-coverage": { "status": "not-covered", "message": "Dev releases are not covered by Drupal security advisories." From 97746467bd523811d9a68eb125e5b43de520ea07 Mon Sep 17 00:00:00 2001 From: Dmytro Storozhuk Date: Thu, 16 Apr 2026 14:19:56 -0500 Subject: [PATCH 8/9] DP-45228: Replace default DataTables sort icons with custom SVGs for improved accessibility and design consistency Signed-off-by: Dmytro Storozhuk --- .../mass_theme/overrides/css/datatables.css | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/docroot/themes/custom/mass_theme/overrides/css/datatables.css b/docroot/themes/custom/mass_theme/overrides/css/datatables.css index dca5097f5a..a048d0a61a 100644 --- a/docroot/themes/custom/mass_theme/overrides/css/datatables.css +++ b/docroot/themes/custom/mass_theme/overrides/css/datatables.css @@ -132,20 +132,10 @@ button.dt-paging-button.next { -/* sort icons: inactive arrows use #8C8C8C for contrast on #f2f2f2 header */ -table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:before, table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:after, table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:before, table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:after, table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before, table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:after, table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:before, table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after, table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:before, table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:after, table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:before, table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:after, table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before, table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:after, table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:before, table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after { - line-height: 12px; - color: #555555; - opacity: 1; -} - -/* Active sort arrow: dark color, slightly larger */ -table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before, -table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after { - color: #141414; - opacity: 1; - display: inline-block; - transform: scale(1.3); +/* Sort icon SVGs — handled in csv_field/css/csv-table.css */ +/* Hide default DataTables pseudo-element arrows */ +table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:before, table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:before, table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before, table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:before, table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:before, table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:before, table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before, table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:before, table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:after, table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:after, table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:after, table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after, table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:after, table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:after, table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:after, table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after { + display: none; } table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order, From da051dda334d4969f37295315552584d2da17b6f Mon Sep 17 00:00:00 2001 From: Dmytro Storozhuk Date: Thu, 16 Apr 2026 14:32:24 -0500 Subject: [PATCH 9/9] DP-45228: Update `drupal/csv_field` module reference in composer.lock Updated `drupal/csv_field` dependency to the latest `3.0.x-dev` commit in `composer.lock` for alignment with recent improvements. Signed-off-by: Dmytro Storozhuk --- composer.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.lock b/composer.lock index a9b2ae7868..203a50b2ef 100644 --- a/composer.lock +++ b/composer.lock @@ -4327,7 +4327,7 @@ "source": { "type": "git", "url": "https://git.drupalcode.org/project/csv_field.git", - "reference": "057b69f6b9cf786030e0748d8f813be2a186e052" + "reference": "88e4de3dbcec0bb3a92b81c603e131b34515d2eb" }, "require": { "drupal/core": "^9.3 || ^10 || ^11", @@ -4339,8 +4339,8 @@ "dev-3.0.x": "3.0.x-dev" }, "drupal": { - "version": "3.0.2+4-dev", - "datestamp": "1776362857", + "version": "3.0.2+5-dev", + "datestamp": "1776367221", "security-coverage": { "status": "not-covered", "message": "Dev releases are not covered by Drupal security advisories."