diff --git a/core/tests/Drupal/FunctionalJavascriptTests/Core/JsMessageTest.php b/core/tests/Drupal/FunctionalJavascriptTests/Core/JsMessageTest.php index 32e6c4531c03..e52149b74f9a 100644 --- a/core/tests/Drupal/FunctionalJavascriptTests/Core/JsMessageTest.php +++ b/core/tests/Drupal/FunctionalJavascriptTests/Core/JsMessageTest.php @@ -118,7 +118,13 @@ class JsMessageTest extends WebDriverTestBase { $current_messages[] = $message_div->getText(); } } - $this->assertEquals($expected_messages, $current_messages); + // Check that each message text contains the expected text. + if (count($expected_messages) !== count($current_messages)) { + $this->fail('The expected messages array contains a different number of values than the current messages array.'); + } + for ($i = 0; $i < count($expected_messages); $i++) { + $this->assertStringContainsString($expected_messages[$i], $current_messages[$i]); + } } } diff --git a/core/tests/Drupal/FunctionalJavascriptTests/Theme/OliveroMessagesTest.php b/core/tests/Drupal/FunctionalJavascriptTests/Theme/OliveroMessagesTest.php new file mode 100644 index 000000000000..31dd15db58fc --- /dev/null +++ b/core/tests/Drupal/FunctionalJavascriptTests/Theme/OliveroMessagesTest.php @@ -0,0 +1,62 @@ +install(['olivero']); + $theme_config = \Drupal::configFactory()->getEditable('system.theme'); + $theme_config->set('default', 'olivero'); + $theme_config->save(); + } + + /** + * Tests data-drupal-selector="messages" exists. + */ + public function testDataDrupalSelectors() { + $web_assert = $this->assertSession(); + $this->drupalGet('js_message_test_link'); + + foreach (JSMessageTestController::getMessagesSelectors() as $messagesSelector) { + $web_assert->elementExists('css', $messagesSelector); + foreach (JSMessageTestController::getTypes() as $type) { + $this->click('[id="add-' . $messagesSelector . '-' . $type . '"]'); + $selector = '[data-drupal-selector="messages"]'; + $msg_element = $web_assert->waitForElementVisible('css', $selector); + $this->assertNotEmpty($msg_element, "Message element visible: $selector"); + } + } + } + +} diff --git a/core/themes/olivero/js/messages.es6.js b/core/themes/olivero/js/messages.es6.js index 5a3ae83ab5e3..b7c16997b9f3 100644 --- a/core/themes/olivero/js/messages.es6.js +++ b/core/themes/olivero/js/messages.es6.js @@ -11,7 +11,9 @@ * The message object. */ const closeMessage = (message) => { - const messageContainer = message.querySelector('.messages__container'); + const messageContainer = message.querySelector( + '[data-drupal-selector="messages-container"]', + ); const closeBtnWrapper = document.createElement('div'); closeBtnWrapper.setAttribute('class', 'messages__button'); @@ -58,6 +60,7 @@ 'class', `messages-list__item messages messages--${type}`, ); + messageWrapper.setAttribute('data-drupal-selector', 'messages'); messageWrapper.setAttribute( 'role', type === 'error' || type === 'warning' ? 'alert' : 'status', @@ -91,7 +94,7 @@ } messageWrapper.innerHTML = ` -
+

${messagesTypes[type]}

${svg} @@ -117,7 +120,9 @@ */ Drupal.behaviors.messages = { attach(context) { - once('olivero-messages', '.messages', context).forEach(closeMessage); + once('messages', '[data-drupal-selector="messages"]', context).forEach( + closeMessage, + ); }, }; })(Drupal, once); diff --git a/core/themes/olivero/js/messages.js b/core/themes/olivero/js/messages.js index fc465e1ec2f2..0ec14ddec287 100644 --- a/core/themes/olivero/js/messages.js +++ b/core/themes/olivero/js/messages.js @@ -7,7 +7,7 @@ (function (Drupal, once) { var closeMessage = function closeMessage(message) { - var messageContainer = message.querySelector('.messages__container'); + var messageContainer = message.querySelector('[data-drupal-selector="messages-container"]'); var closeBtnWrapper = document.createElement('div'); closeBtnWrapper.setAttribute('class', 'messages__button'); var closeBtn = document.createElement('button'); @@ -31,6 +31,7 @@ var messagesTypes = Drupal.Message.getMessageTypeLabels(); var messageWrapper = document.createElement('div'); messageWrapper.setAttribute('class', "messages-list__item messages messages--".concat(type)); + messageWrapper.setAttribute('data-drupal-selector', 'messages'); messageWrapper.setAttribute('role', type === 'error' || type === 'warning' ? 'alert' : 'status'); messageWrapper.setAttribute('aria-labelledby', "".concat(id, "-title")); messageWrapper.setAttribute('data-drupal-message-id', id); @@ -55,14 +56,14 @@ svg += '
'; } - messageWrapper.innerHTML = "\n
\n
\n

").concat(messagesTypes[type], "

\n ").concat(svg, "\n
\n
\n ").concat(text, "\n
\n
\n "); + messageWrapper.innerHTML = "\n
\n
\n

").concat(messagesTypes[type], "

\n ").concat(svg, "\n
\n
\n ").concat(text, "\n
\n
\n "); closeMessage(messageWrapper); return messageWrapper; }; Drupal.behaviors.messages = { attach: function attach(context) { - once('olivero-messages', '.messages', context).forEach(closeMessage); + once('messages', '[data-drupal-selector="messages"]', context).forEach(closeMessage); } }; })(Drupal, once); \ No newline at end of file diff --git a/core/themes/olivero/templates/misc/status-messages.html.twig b/core/themes/olivero/templates/misc/status-messages.html.twig index a131e3c8d1a7..c607a84d941c 100644 --- a/core/themes/olivero/templates/misc/status-messages.html.twig +++ b/core/themes/olivero/templates/misc/status-messages.html.twig @@ -31,8 +31,13 @@ ] %} -
-