From bd18e4181b77ee0221ad3c79fde18e5b74a8f9e1 Mon Sep 17 00:00:00 2001 From: Tiberiu Dumitru Date: Wed, 22 Oct 2025 10:29:59 +0300 Subject: [PATCH 1/6] OEL-4278: Extending drupal attributes and fixes for proper html attributes. --- .storybook/drupal-attribute.js | 56 ++++++++ .storybook/environment.js | 4 +- .../__snapshots__/carousel.test.js.snap | 24 ++-- .../__snapshots__/dropdown.test.js.snap | 12 +- .../__snapshots__/form-input.test.js.snap | 6 +- .../bcl-form/__snapshots__/form.test.js.snap | 54 ++++---- .../__snapshots__/list-group.test.js.snap | 2 +- .../__snapshots__/navbar.test.js.snap | 16 ++- .../__snapshots__/navigation.test.js.snap | 2 +- .../__snapshots__/select.test.js.snap | 46 +++---- .../__snapshots__/textarea.test.js.snap | 6 +- .../__snapshots__/contact-form.test.js.snap | 78 ++++++----- .../__snapshots__/event.test.js.snap | 18 ++- .../__snapshots__/featured-media.test.js.snap | 6 +- .../bcl-file/__snapshots__/file.test.js.snap | 98 +++++++------- src/compositions/bcl-file/file.html.twig | 2 +- .../__snapshots__/glossary.test.js.snap | 24 ++-- .../__snapshots__/group.test.js.snap | 39 +++--- .../__snapshots__/header.test.js.snap | 6 + .../__snapshots__/landing-page.test.js.snap | 2 + .../__snapshots__/mega-menu.test.js.snap | 3 + .../bcl-news/__snapshots__/news.test.js.snap | 8 +- .../bcl-page/__snapshots__/page.test.js.snap | 18 +-- .../__snapshots__/person.test.js.snap | 14 +- .../__snapshots__/procurement.test.js.snap | 50 +++---- .../__snapshots__/project.test.js.snap | 20 ++- .../__snapshots__/publication.test.js.snap | 34 +++-- .../__snapshots__/search.test.js.snap | 12 +- .../__snapshots__/subscription.test.js.snap | 14 +- .../bcl-user/__snapshots__/user.test.js.snap | 100 +++++++------- .../__snapshots__/vacancy.test.js.snap | 50 +++---- .../storybook/.storybook/environment.js | 14 +- tools/test-utils/index.js | 124 +++++++++++++++++- tools/webpack/twig-wrapper-loader.cjs | 33 +++++ 34 files changed, 649 insertions(+), 346 deletions(-) create mode 100644 .storybook/drupal-attribute.js diff --git a/.storybook/drupal-attribute.js b/.storybook/drupal-attribute.js new file mode 100644 index 000000000..d1207dd10 --- /dev/null +++ b/.storybook/drupal-attribute.js @@ -0,0 +1,56 @@ +const { DrupalAttribute } = require("drupal-attribute"); + +/** + * Storybook-specific DrupalAttribute variant. + * + * Aligns the JS implementation with Drupal's PHP Attribute behavior by keeping + * empty-string attribute values (e.g. `hidden=""`) instead of dropping them. + */ +class StorybookDrupalAttribute extends DrupalAttribute { + toString() { + const components = []; + + for (const key of this.keys()) { + let value = this.get(key); + + if (value === null || value === undefined || value === false) { + continue; + } + + if (value === true) { + components.push(key); + continue; + } + + if (Array.isArray(value)) { + const filtered = value + .filter((v) => v !== null && v !== undefined && v !== "") + .map(String); + + if (filtered.length === 0) { + continue; + } + + value = filtered.join(" "); + } + + if (value === key) { + components.push(key); + continue; + } + + if (value === "") { + components.push(`${key}=""`); + continue; + } + + components.push(`${key}="${String(value)}"`); + } + + return components.length ? ` ${components.join(" ")}` : ""; + } +} + +module.exports = { + StorybookDrupalAttribute, +}; diff --git a/.storybook/environment.js b/.storybook/environment.js index 251c59710..af5e304f0 100644 --- a/.storybook/environment.js +++ b/.storybook/environment.js @@ -6,7 +6,7 @@ const { createFilesystemLoader, createFunction, } = require("twing"); -const { DrupalAttribute } = require("drupal-attribute"); +const { StorybookDrupalAttribute } = require("./drupal-attribute"); const projComponentsAbsPath = path.resolve(__dirname, "../src/components"); const projCompositionsAbsPath = path.resolve(__dirname, "../src/compositions"); @@ -23,7 +23,7 @@ try { const createAttribute = createFunction( "create_attribute", - () => Promise.resolve(new DrupalAttribute()), + () => Promise.resolve(new StorybookDrupalAttribute()), [], ); diff --git a/src/components/bcl-carousel/__snapshots__/carousel.test.js.snap b/src/components/bcl-carousel/__snapshots__/carousel.test.js.snap index e77391cb0..81a8ac484 100644 --- a/src/components/bcl-carousel/__snapshots__/carousel.test.js.snap +++ b/src/components/bcl-carousel/__snapshots__/carousel.test.js.snap @@ -11,7 +11,7 @@ exports[`OE - carousel renders correctly 1`] = ` class="carousel-indicators d-none d-md-flex" >