Commit d09a95d3 authored by Sergey Shadrin's avatar Sergey Shadrin

[#124455] Updated core to 10.3.1

parent a8127491
...@@ -36,9 +36,9 @@ ...@@ -36,9 +36,9 @@
"drupal/config_ignore": "^3.3", "drupal/config_ignore": "^3.3",
"drupal/config_pages": "^2.15", "drupal/config_pages": "^2.15",
"drupal/config_split": "^2.0", "drupal/config_split": "^2.0",
"drupal/core-composer-scaffold": "^10.0", "drupal/core-composer-scaffold": "10.3.1",
"drupal/core-project-message": "^10.0", "drupal/core-project-message": "10.3.1",
"drupal/core-recommended": "^10.0", "drupal/core-recommended": "10.3.1",
"drupal/csv_serialization": "^4.0", "drupal/csv_serialization": "^4.0",
"drupal/ctools": "^4.1", "drupal/ctools": "^4.1",
"drupal/devel": "^5.2", "drupal/devel": "^5.2",
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "6a361af2e861ea2934a2334778455467", "content-hash": "9c4d63fd9886cc5e33ef088767477565",
"packages": [ "packages": [
{ {
"name": "algolia/places", "name": "algolia/places",
...@@ -2898,16 +2898,16 @@ ...@@ -2898,16 +2898,16 @@
}, },
{ {
"name": "drupal/core", "name": "drupal/core",
"version": "10.3.0", "version": "10.3.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/drupal/core.git", "url": "https://github.com/drupal/core.git",
"reference": "6f1af3070110d7d0f2a6671bea26add34667f765" "reference": "d137403a30d4154404e473785f48dfc889d77e23"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/drupal/core/zipball/6f1af3070110d7d0f2a6671bea26add34667f765", "url": "https://api.github.com/repos/drupal/core/zipball/d137403a30d4154404e473785f48dfc889d77e23",
"reference": "6f1af3070110d7d0f2a6671bea26add34667f765", "reference": "d137403a30d4154404e473785f48dfc889d77e23",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
...@@ -3056,13 +3056,13 @@ ...@@ -3056,13 +3056,13 @@
], ],
"description": "Drupal is an open source content management platform powering millions of websites and applications.", "description": "Drupal is an open source content management platform powering millions of websites and applications.",
"support": { "support": {
"source": "https://github.com/drupal/core/tree/10.3.0" "source": "https://github.com/drupal/core/tree/10.3.1"
}, },
"time": "2024-06-20T18:58:42+00:00" "time": "2024-07-04T11:33:45+00:00"
}, },
{ {
"name": "drupal/core-composer-scaffold", "name": "drupal/core-composer-scaffold",
"version": "10.3.0", "version": "10.3.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/drupal/core-composer-scaffold.git", "url": "https://github.com/drupal/core-composer-scaffold.git",
...@@ -3106,13 +3106,13 @@ ...@@ -3106,13 +3106,13 @@
"drupal" "drupal"
], ],
"support": { "support": {
"source": "https://github.com/drupal/core-composer-scaffold/tree/10.3.0" "source": "https://github.com/drupal/core-composer-scaffold/tree/10.3.1"
}, },
"time": "2024-05-11T08:21:39+00:00" "time": "2024-05-11T08:21:39+00:00"
}, },
{ {
"name": "drupal/core-project-message", "name": "drupal/core-project-message",
"version": "10.3.0", "version": "10.3.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/drupal/core-project-message.git", "url": "https://github.com/drupal/core-project-message.git",
...@@ -3153,16 +3153,16 @@ ...@@ -3153,16 +3153,16 @@
}, },
{ {
"name": "drupal/core-recommended", "name": "drupal/core-recommended",
"version": "10.3.0", "version": "10.3.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/drupal/core-recommended.git", "url": "https://github.com/drupal/core-recommended.git",
"reference": "991f849f74e585597b1f7b11daf9acf79b546939" "reference": "a5183f2be315b7e5deec89fdeafe9fc9a2e54f57"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/drupal/core-recommended/zipball/991f849f74e585597b1f7b11daf9acf79b546939", "url": "https://api.github.com/repos/drupal/core-recommended/zipball/a5183f2be315b7e5deec89fdeafe9fc9a2e54f57",
"reference": "991f849f74e585597b1f7b11daf9acf79b546939", "reference": "a5183f2be315b7e5deec89fdeafe9fc9a2e54f57",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
...@@ -3171,7 +3171,7 @@ ...@@ -3171,7 +3171,7 @@
"doctrine/annotations": "~1.14.3", "doctrine/annotations": "~1.14.3",
"doctrine/deprecations": "~1.1.3", "doctrine/deprecations": "~1.1.3",
"doctrine/lexer": "~2.1.1", "doctrine/lexer": "~2.1.1",
"drupal/core": "10.3.0", "drupal/core": "10.3.1",
"egulias/email-validator": "~4.0.2", "egulias/email-validator": "~4.0.2",
"guzzlehttp/guzzle": "~7.8.1", "guzzlehttp/guzzle": "~7.8.1",
"guzzlehttp/promises": "~2.0.2", "guzzlehttp/promises": "~2.0.2",
...@@ -3232,9 +3232,9 @@ ...@@ -3232,9 +3232,9 @@
], ],
"description": "Core and its dependencies with known-compatible minor versions. Require this project INSTEAD OF drupal/core.", "description": "Core and its dependencies with known-compatible minor versions. Require this project INSTEAD OF drupal/core.",
"support": { "support": {
"source": "https://github.com/drupal/core-recommended/tree/10.3.0" "source": "https://github.com/drupal/core-recommended/tree/10.3.1"
}, },
"time": "2024-06-20T18:58:42+00:00" "time": "2024-07-04T11:33:45+00:00"
}, },
{ {
"name": "drupal/crop", "name": "drupal/crop",
......
...@@ -310,6 +310,13 @@ Migrate ...@@ -310,6 +310,13 @@ Migrate
- Michael Lutz 'mikelutz' https://www.drupal.org/u/mikelutz - Michael Lutz 'mikelutz' https://www.drupal.org/u/mikelutz
- Victoria Spagnolo 'quietone' https://www.drupal.org/u/quietone - Victoria Spagnolo 'quietone' https://www.drupal.org/u/quietone
Navigation
- Cristina Chumillas 'ckrina' https://www.drupal.org/u/ckrina
- Ivan Berdinsky 'finnsky' https://www.drupal.org/u/finnsky
- Matthew Oliveira 'm4olivei' https://www.drupal.org/u/m4olivei
- Théodore Biadala 'nod_' https://www.drupal.org/u/nod_
- Pablo López 'plopesc' https://www.drupal.org/u/plopesc
Node Node
- ? - ?
......
...@@ -426,6 +426,8 @@ function install_begin_request($class_loader, &$install_state) { ...@@ -426,6 +426,8 @@ function install_begin_request($class_loader, &$install_state) {
$kernel::bootEnvironment(); $kernel::bootEnvironment();
$kernel->setSitePath($site_path); $kernel->setSitePath($site_path);
$kernel->boot(); $kernel->boot();
// Get the new version of the container from the kernel. This is now a
// complete container with all services.
$container = $kernel->getContainer(); $container = $kernel->getContainer();
// If Drupal is being installed behind a proxy, configure the request. // If Drupal is being installed behind a proxy, configure the request.
ReverseProxyMiddleware::setSettingsOnRequest($request, Settings::getInstance()); ReverseProxyMiddleware::setSettingsOnRequest($request, Settings::getInstance());
......
...@@ -75,7 +75,7 @@ class Drupal { ...@@ -75,7 +75,7 @@ class Drupal {
/** /**
* The current system version. * The current system version.
*/ */
const VERSION = '10.3.0'; const VERSION = '10.3.1';
/** /**
* Core API compatibility. * Core API compatibility.
......
...@@ -403,7 +403,7 @@ class LibraryDiscoveryParser { ...@@ -403,7 +403,7 @@ class LibraryDiscoveryParser {
} }
} }
// Core also provides additional libraries that don't come from the YAML, // Core also provides additional libraries that don't come from the YAML,
// file nor the hook_library_info_build. They come from single directory // file nor the hook_library_info_build. They come from single-directory
// component definitions. // component definitions.
$additional_libraries = $extension === 'core' $additional_libraries = $extension === 'core'
? $this->librariesForComponents() ? $this->librariesForComponents()
...@@ -478,10 +478,10 @@ class LibraryDiscoveryParser { ...@@ -478,10 +478,10 @@ class LibraryDiscoveryParser {
} }
/** /**
* Builds the dynamic library definitions for single directory components. * Builds the dynamic library definitions for single-directory components.
* *
* @return array * @return array
* The core library definitions for Single Directory Components. * The core library definitions for Single-Directory Components.
*/ */
protected function librariesForComponents(): array { protected function librariesForComponents(): array {
// Iterate over all the components to get the CSS and JS files. // Iterate over all the components to get the CSS and JS files.
......
...@@ -53,6 +53,22 @@ use Drupal\Core\Validation\Plugin\Validation\Constraint\FullyValidatableConstrai ...@@ -53,6 +53,22 @@ use Drupal\Core\Validation\Plugin\Validation\Constraint\FullyValidatableConstrai
*/ */
class ConfigActionManager extends DefaultPluginManager { class ConfigActionManager extends DefaultPluginManager {
/**
* Information about all deprecated plugin IDs.
*
* @var string[]
*/
private static array $deprecatedPluginIds = [
'entity_create:ensure_exists' => [
'replacement' => 'entity_create:createIfNotExists',
'message' => 'The plugin ID "entity_create:ensure_exists" is deprecated in drupal:10.3.1 and will be removed in drupal:12.0.0. Use "entity_create:createIfNotExists" instead. See https://www.drupal.org/node/3458273.',
],
'simple_config_update' => [
'replacement' => 'simpleConfigUpdate',
'message' => 'The plugin ID "simple_config_update" is deprecated in drupal:10.3.1 and will be removed in drupal:12.0.0. Use "simpleConfigUpdate" instead. See https://www.drupal.org/node/3458273.',
],
];
/** /**
* Constructs a new \Drupal\Core\Config\Action\ConfigActionManager object. * Constructs a new \Drupal\Core\Config\Action\ConfigActionManager object.
* *
...@@ -218,4 +234,28 @@ class ConfigActionManager extends DefaultPluginManager { ...@@ -218,4 +234,28 @@ class ConfigActionManager extends DefaultPluginManager {
return $map; return $map;
} }
/**
* {@inheritdoc}
*/
public function alterDefinitions(&$definitions): void {
// Adds backwards compatibility for plugins that have been renamed.
foreach (self::$deprecatedPluginIds as $legacy => $new_plugin_id) {
$definitions[$legacy] = $definitions[$new_plugin_id['replacement']];
}
parent::alterDefinitions($definitions);
}
/**
* {@inheritdoc}
*/
public function createInstance($plugin_id, array $configuration = []) {
$instance = parent::createInstance($plugin_id, $configuration);
// Trigger deprecation notices for renamed plugins.
if (array_key_exists($plugin_id, self::$deprecatedPluginIds)) {
// phpcs:ignore Drupal.Semantics.FunctionTriggerError
@trigger_error(self::$deprecatedPluginIds[$plugin_id]['message'], E_USER_DEPRECATED);
}
return $instance;
}
} }
...@@ -22,8 +22,8 @@ final class EntityCreateDeriver extends DeriverBase { ...@@ -22,8 +22,8 @@ final class EntityCreateDeriver extends DeriverBase {
// These derivatives apply to all entity types. // These derivatives apply to all entity types.
$base_plugin_definition['entity_types'] = ['*']; $base_plugin_definition['entity_types'] = ['*'];
$this->derivatives['ensure_exists'] = $base_plugin_definition + ['constructor_args' => ['exists' => Exists::ReturnEarlyIfExists]]; $this->derivatives['createIfNotExists'] = $base_plugin_definition + ['constructor_args' => ['exists' => Exists::ReturnEarlyIfExists]];
$this->derivatives['ensure_exists']['admin_label'] = $this->t('Ensure entity exists'); $this->derivatives['createIfNotExists']['admin_label'] = $this->t('Create entity if it does not exist');
$this->derivatives['create'] = $base_plugin_definition + ['constructor_args' => ['exists' => Exists::ErrorIfExists]]; $this->derivatives['create'] = $base_plugin_definition + ['constructor_args' => ['exists' => Exists::ErrorIfExists]];
$this->derivatives['create']['admin_label'] = $this->t('Entity create'); $this->derivatives['create']['admin_label'] = $this->t('Entity create');
......
...@@ -17,7 +17,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; ...@@ -17,7 +17,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
* This API is experimental. * This API is experimental.
*/ */
#[ConfigAction( #[ConfigAction(
id: 'simple_config_update', id: 'simpleConfigUpdate',
admin_label: new TranslatableMarkup('Simple configuration update'), admin_label: new TranslatableMarkup('Simple configuration update'),
)] )]
final class SimpleConfigUpdate implements ConfigActionPluginInterface, ContainerFactoryPluginInterface { final class SimpleConfigUpdate implements ConfigActionPluginInterface, ContainerFactoryPluginInterface {
......
...@@ -5,13 +5,12 @@ namespace Drupal\Core\Extension; ...@@ -5,13 +5,12 @@ namespace Drupal\Core\Extension;
use Drupal\Component\Graph\Graph; use Drupal\Component\Graph\Graph;
use Drupal\Component\Utility\NestedArray; use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Cache\CacheBackendInterface; use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\DestructableInterface;
use Drupal\Core\Extension\Exception\UnknownExtensionException; use Drupal\Core\Extension\Exception\UnknownExtensionException;
/** /**
* Class that manages modules in a Drupal installation. * Class that manages modules in a Drupal installation.
*/ */
class ModuleHandler implements ModuleHandlerInterface, DestructableInterface { class ModuleHandler implements ModuleHandlerInterface {
/** /**
* List of loaded files. * List of loaded files.
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
namespace Drupal\Core\Extension; namespace Drupal\Core\Extension;
use Drupal\Core\DestructableInterface;
/** /**
* Interface for classes that manage a set of enabled modules. * Interface for classes that manage a set of enabled modules.
* *
...@@ -9,7 +11,7 @@ namespace Drupal\Core\Extension; ...@@ -9,7 +11,7 @@ namespace Drupal\Core\Extension;
* responsible for loading module files and maintaining information about module * responsible for loading module files and maintaining information about module
* dependencies and hook implementations. * dependencies and hook implementations.
*/ */
interface ModuleHandlerInterface { interface ModuleHandlerInterface extends DestructableInterface {
/** /**
* Includes a module's .module file. * Includes a module's .module file.
......
...@@ -345,6 +345,12 @@ class FormValidator implements FormValidatorInterface { ...@@ -345,6 +345,12 @@ class FormValidator implements FormValidatorInterface {
if (is_array($elements['#value'])) { if (is_array($elements['#value'])) {
$value = in_array($elements['#type'], ['checkboxes', 'tableselect']) ? array_keys($elements['#value']) : $elements['#value']; $value = in_array($elements['#type'], ['checkboxes', 'tableselect']) ? array_keys($elements['#value']) : $elements['#value'];
foreach ($value as $v) { foreach ($value as $v) {
if (!is_scalar($v)) {
$message_arguments['%type'] = gettype($v);
$form_state->setError($elements, $this->t('The submitted value type %type in the %name element is not allowed.', $message_arguments));
$this->logger->error('The submitted value type %type in the %name element is not allowed.', $message_arguments);
continue;
}
if (!isset($options[$v])) { if (!isset($options[$v])) {
$message_arguments['%choice'] = $v; $message_arguments['%choice'] = $v;
$form_state->setError($elements, $this->t('The submitted value %choice in the %name element is not allowed.', $message_arguments)); $form_state->setError($elements, $this->t('The submitted value %choice in the %name element is not allowed.', $message_arguments));
......
...@@ -16,7 +16,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; ...@@ -16,7 +16,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
* *
* @see https://guzzle.readthedocs.org/en/latest/handlers-and-middleware.html * @see https://guzzle.readthedocs.org/en/latest/handlers-and-middleware.html
* *
* @see \Drupal\Core\Http\Client * @see \GuzzleHttp\Client
* @see \Drupal\Core\Test\HttpClientMiddleware\TestHttpClientMiddleware * @see \Drupal\Core\Test\HttpClientMiddleware\TestHttpClientMiddleware
*/ */
class HandlerStackConfigurator { class HandlerStackConfigurator {
......
...@@ -8,7 +8,7 @@ use Drupal\Core\Security\DoTrustedCallbackTrait; ...@@ -8,7 +8,7 @@ use Drupal\Core\Security\DoTrustedCallbackTrait;
use Drupal\Core\Render\Component\Exception\InvalidComponentDataException; use Drupal\Core\Render\Component\Exception\InvalidComponentDataException;
/** /**
* Provides a Single Directory Component render element. * Provides a Single-Directory Component render element.
* *
* Properties: * Properties:
* - #component: The machine name of the component. * - #component: The machine name of the component.
...@@ -100,7 +100,7 @@ class ComponentElement extends RenderElementBase { ...@@ -100,7 +100,7 @@ class ComponentElement extends RenderElementBase {
array $slots_alter_callbacks, array $slots_alter_callbacks,
array &$context, array &$context,
): string { ): string {
$template = '{# This template was dynamically generated by single directory components #}' . PHP_EOL; $template = '{# This template was dynamically generated by single-directory components #}' . PHP_EOL;
$template .= sprintf('{%% embed \'%s\' %%}', $id); $template .= sprintf('{%% embed \'%s\' %%}', $id);
$template .= PHP_EOL; $template .= PHP_EOL;
foreach ($slots as $slot_name => $slot_value) { foreach ($slots as $slot_name => $slot_value) {
......
...@@ -149,7 +149,7 @@ ...@@ -149,7 +149,7 @@
} }
/** /**
* Handles an autocompletefocus event. * Handles an autocomplete focus event.
* *
* @return {boolean} * @return {boolean}
* Always returns false. * Always returns false.
...@@ -159,7 +159,7 @@ ...@@ -159,7 +159,7 @@
} }
/** /**
* Handles an autocompleteselect event. * Handles an autocomplete select event.
* *
* @param {jQuery.Event} event * @param {jQuery.Event} event
* The event triggered. * The event triggered.
......
...@@ -20,9 +20,6 @@ arrowstop ...@@ -20,9 +20,6 @@ arrowstop
arrowthick arrowthick
arrowthickstop arrowthickstop
assertable assertable
autocompletefocus
autocompleteselect
autocompleting
autoconfiguration autoconfiguration
autoconfigure autoconfigure
autoconfigured autoconfigured
...@@ -77,7 +74,6 @@ blockpromoted ...@@ -77,7 +74,6 @@ blockpromoted
blockquotes blockquotes
blockrecipe blockrecipe
blockrelated blockrelated
blocktest
bodyless bodyless
boing boing
bovigo bovigo
...@@ -254,11 +250,9 @@ fdiv ...@@ -254,11 +250,9 @@ fdiv
fieldable fieldable
fieldapi fieldapi
fieldblock fieldblock
fieldbody
fieldgroup fieldgroup
fieldgroups fieldgroups
fieldlayout fieldlayout
fieldlinks
fieldnames fieldnames
fieldsets fieldsets
filemime filemime
...@@ -703,17 +697,10 @@ tappable ...@@ -703,17 +697,10 @@ tappable
taskless taskless
tcomment tcomment
templating templating
testajax
testblock
testbody
testbot testbot
testbots testbots
testcase testcase
testcontent
testcontextawareblock
testdialog
testgroups testgroups
testkey
testlogger testlogger
testsuite testsuite
testsuites testsuites
...@@ -754,7 +741,6 @@ twistie ...@@ -754,7 +741,6 @@ twistie
twocol twocol
tzid tzid
uids uids
ulwa
unban unban
uncacheable uncacheable
uncategorized uncategorized
......
...@@ -37,13 +37,27 @@ ...@@ -37,13 +37,27 @@
* The default destination for JavaScript messages. * The default destination for JavaScript messages.
*/ */
static defaultWrapper() { static defaultWrapper() {
let wrapper = document.querySelector('[data-drupal-messages]'); // Search for the element with '[data-drupal-messages]' selector.
// If not found then only try to search for fallback element.
let wrapper =
document.querySelector('[data-drupal-messages]') ||
document.querySelector('[data-drupal-messages-fallback]');
if (!wrapper) { if (!wrapper) {
wrapper = document.querySelector('[data-drupal-messages-fallback]'); // If no status messages element is found, a fallback element is created to prevent
// execution-breaking JS errors when attempting to report a problem.
// This scenario can occur on any page that does not include a status_messages
// render element.
wrapper = document.createElement('div');
document.body.appendChild(wrapper);
}
if (wrapper.hasAttribute('data-drupal-messages-fallback')) {
// Remove the fallback attribute if it exists.
wrapper.removeAttribute('data-drupal-messages-fallback'); wrapper.removeAttribute('data-drupal-messages-fallback');
wrapper.setAttribute('data-drupal-messages', '');
wrapper.classList.remove('hidden'); wrapper.classList.remove('hidden');
} }
wrapper.setAttribute('data-drupal-messages', '');
return wrapper.innerHTML === '' return wrapper.innerHTML === ''
? Drupal.Message.messageInternalWrapper(wrapper) ? Drupal.Message.messageInternalWrapper(wrapper)
: wrapper.firstElementChild; : wrapper.firstElementChild;
......
...@@ -93,15 +93,16 @@ ...@@ -93,15 +93,16 @@
*/ */
Drupal.behaviors.states = { Drupal.behaviors.states = {
attach(context, settings) { attach(context, settings) {
const $states = $(context).find('[data-drupal-states]'); // Uses once to avoid duplicates if attach is called multiple times.
const il = $states.length; const elements = once('states', '[data-drupal-states]', context);
const il = elements.length;
for (let i = 0; i < il; i++) { for (let i = 0; i < il; i++) {
const config = JSON.parse( const config = JSON.parse(
$states[i].getAttribute('data-drupal-states'), elements[i].getAttribute('data-drupal-states'),
); );
Object.keys(config || {}).forEach((state) => { Object.keys(config || {}).forEach((state) => {
new states.Dependent({ new states.Dependent({
element: $($states[i]), element: $(elements[i]),
state: states.State.sanitize(state), state: states.State.sanitize(state),
constraints: config[state], constraints: config[state],
}); });
......
...@@ -196,8 +196,11 @@ ...@@ -196,8 +196,11 @@
}) })
.end() .end()
.show() .show()
.siblings(':hidden.vertical-tabs__active-tab')[0].value = .siblings(':hidden.vertical-tabs__active-tab')
this.details.attr('id'); .get()
.forEach((hidden) => {
hidden.value = this.details.attr('id');
});
this.details.attr('open', true); this.details.attr('open', true);
this.item.addClass('is-selected'); this.item.addClass('is-selected');
// Mark the active tab for screen readers. // Mark the active tab for screen readers.
......
...@@ -330,6 +330,7 @@ class BigPipePlaceholderTestCases { ...@@ -330,6 +330,7 @@ class BigPipePlaceholderTestCases {
// cspell:disable-next-line // cspell:disable-next-line
$exception->bigPipePlaceholderId = 'callback=%5CDrupal%5Cbig_pipe_test%5CBigPipeTestController%3A%3Aexception&amp;args%5B0%5D=llamas&amp;args%5B1%5D=suck&amp;token=uhKFNfT4eF449_W-kDQX8E5z4yHyt0-nSHUlwaGAQeU'; $exception->bigPipePlaceholderId = 'callback=%5CDrupal%5Cbig_pipe_test%5CBigPipeTestController%3A%3Aexception&amp;args%5B0%5D=llamas&amp;args%5B1%5D=suck&amp;token=uhKFNfT4eF449_W-kDQX8E5z4yHyt0-nSHUlwaGAQeU';
$exception->bigPipePlaceholderRenderArray = [ $exception->bigPipePlaceholderRenderArray = [
// cspell:disable-next-line
'#prefix' => '<span data-big-pipe-placeholder-id="callback=%5CDrupal%5Cbig_pipe_test%5CBigPipeTestController%3A%3Aexception&amp;args%5B0%5D=llamas&amp;args%5B1%5D=suck&amp;token=uhKFNfT4eF449_W-kDQX8E5z4yHyt0-nSHUlwaGAQeU">', '#prefix' => '<span data-big-pipe-placeholder-id="callback=%5CDrupal%5Cbig_pipe_test%5CBigPipeTestController%3A%3Aexception&amp;args%5B0%5D=llamas&amp;args%5B1%5D=suck&amp;token=uhKFNfT4eF449_W-kDQX8E5z4yHyt0-nSHUlwaGAQeU">',
'interface_preview' => [ 'interface_preview' => [
'#theme' => 'big_pipe_interface_preview', '#theme' => 'big_pipe_interface_preview',
......
...@@ -78,6 +78,7 @@ class FiberPlaceholderTest extends UnitTestCase { ...@@ -78,6 +78,7 @@ class FiberPlaceholderTest extends UnitTestCase {
'ajaxPageState' => [], 'ajaxPageState' => [],
], ],
'big_pipe_placeholders' => [ 'big_pipe_placeholders' => [
// cspell:disable-next-line
'callback=%5CDrupal%5CTests%5Cbig_pipe%5CUnit%5CRender%5CTurtleLazyBuilder%3A%3Aturtle&amp;&amp;token=uhKFNfT4eF449_W-kDQX8E5z4yHyt0-nSHUlwaGAQeU' => [ 'callback=%5CDrupal%5CTests%5Cbig_pipe%5CUnit%5CRender%5CTurtleLazyBuilder%3A%3Aturtle&amp;&amp;token=uhKFNfT4eF449_W-kDQX8E5z4yHyt0-nSHUlwaGAQeU' => [
'#lazy_builder' => [ '#lazy_builder' => [
'\Drupal\Tests\big_pipe\Unit\Render\TurtleLazyBuilder::turtle', '\Drupal\Tests\big_pipe\Unit\Render\TurtleLazyBuilder::turtle',
...@@ -89,6 +90,7 @@ class FiberPlaceholderTest extends UnitTestCase { ...@@ -89,6 +90,7 @@ class FiberPlaceholderTest extends UnitTestCase {
$response->setAttachments($attachments); $response->setAttachments($attachments);
// Construct minimal HTML response. // Construct minimal HTML response.
// cspell:disable-next-line
$content = '<html><body><span data-big-pipe-placeholder-id="callback=%5CDrupal%5CTests%5Cbig_pipe%5CUnit%5CRender%5CTurtleLazyBuilder%3A%3Aturtle&amp;&amp;token=uhKFNfT4eF449_W-kDQX8E5z4yHyt0-nSHUlwaGAQeU"></body></html>'; $content = '<html><body><span data-big-pipe-placeholder-id="callback=%5CDrupal%5CTests%5Cbig_pipe%5CUnit%5CRender%5CTurtleLazyBuilder%3A%3Aturtle&amp;&amp;token=uhKFNfT4eF449_W-kDQX8E5z4yHyt0-nSHUlwaGAQeU"></body></html>';
$response->setContent($content); $response->setContent($content);
......
...@@ -10,6 +10,7 @@ use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl; ...@@ -10,6 +10,7 @@ use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl;
use Drupal\Tests\BrowserTestBase; use Drupal\Tests\BrowserTestBase;
// cspell:ignore displaymessage scriptalertxsssubjectscript // cspell:ignore displaymessage scriptalertxsssubjectscript
// cspell:ignore testcontextawareblock
/** /**
* Tests that the block configuration UI exists and stores data correctly. * Tests that the block configuration UI exists and stores data correctly.
......
...@@ -8,6 +8,8 @@ use Drupal\block_content\BlockContentInterface; ...@@ -8,6 +8,8 @@ use Drupal\block_content\BlockContentInterface;
use Drupal\block_content\Entity\BlockContent; use Drupal\block_content\Entity\BlockContent;
use Drupal\Core\Database\Database; use Drupal\Core\Database\Database;
// cspell:ignore testblock
/** /**
* Create a block and test saving it. * Create a block and test saving it.
* *
......
...@@ -10,7 +10,7 @@ use Drupal\field\Entity\FieldConfig; ...@@ -10,7 +10,7 @@ use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig; use Drupal\field\Entity\FieldStorageConfig;
use Drupal\node\Entity\NodeType; use Drupal\node\Entity\NodeType;
// cspell:ignore tuvan // cspell:ignore testcontent tuvan
/** /**
* Translate settings and entities to various languages. * Translate settings and entities to various languages.
......
...@@ -268,7 +268,11 @@ abstract class EntityDisplayFormBase extends EntityForm { ...@@ -268,7 +268,11 @@ abstract class EntityDisplayFormBase extends EntityForm {
// spinners will be added manually by the client-side script. // spinners will be added manually by the client-side script.
'progress' => 'none', 'progress' => 'none',
], ],
'#attributes' => ['class' => ['visually-hidden']], '#attributes' => [
'class' => ['visually-hidden'],
// Ensure the button is not focusable via keyboard navigation.
'tabindex' => '-1',
],
]; ];
$form['actions'] = ['#type' => 'actions']; $form['actions'] = ['#type' => 'actions'];
......
...@@ -47,7 +47,7 @@ class Sort { ...@@ -47,7 +47,7 @@ class Sort {
/** /**
* The fields on which to sort. * The fields on which to sort.
* *
* @var string * @var array
*/ */
protected $fields; protected $fields;
......
...@@ -102,7 +102,7 @@ class LanguageBrowserDetectionAcceptLanguageTest extends BrowserTestBase { ...@@ -102,7 +102,7 @@ class LanguageBrowserDetectionAcceptLanguageTest extends BrowserTestBase {
$this->assertSession()->responseHeaderDoesNotExist('X-Drupal-Cache'); $this->assertSession()->responseHeaderDoesNotExist('X-Drupal-Cache');
// Check with browser without language settings - should return fallback language. // Check with browser without language settings - should return fallback language.
$this->drupalGet('/system-test/echo/language test', [], ['Accept-Language' => NULL]); $this->drupalGet('/system-test/echo/language test', [], ['Accept-Language' => '']);
$this->assertSession()->responseHeaderEquals('Content-Language', 'en'); $this->assertSession()->responseHeaderEquals('Content-Language', 'en');
$this->assertSession()->responseHeaderDoesNotExist('X-Drupal-Cache'); $this->assertSession()->responseHeaderDoesNotExist('X-Drupal-Cache');
......
...@@ -11,7 +11,7 @@ use Drupal\Core\StringTranslation\TranslatableMarkup; ...@@ -11,7 +11,7 @@ use Drupal\Core\StringTranslation\TranslatableMarkup;
* Provides a 'TestAjax' block. * Provides a 'TestAjax' block.
*/ */
#[Block( #[Block(
id: "layout_builder_test_testajax", id: "layout_builder_test_ajax",
admin_label: new TranslatableMarkup("TestAjax"), admin_label: new TranslatableMarkup("TestAjax"),
category: new TranslatableMarkup("Test") category: new TranslatableMarkup("Test")
)] )]
......
...@@ -7,6 +7,8 @@ namespace Drupal\Tests\layout_builder\Functional; ...@@ -7,6 +7,8 @@ namespace Drupal\Tests\layout_builder\Functional;
use Drupal\node\Entity\Node; use Drupal\node\Entity\Node;
use Drupal\views\Entity\View; use Drupal\views\Entity\View;
// cspell:ignore blocktest
/** /**
* Tests the Layout Builder UI with blocks. * Tests the Layout Builder UI with blocks.
* *
......
...@@ -104,8 +104,8 @@ class AjaxBlockTest extends WebDriverTestBase { ...@@ -104,8 +104,8 @@ class AjaxBlockTest extends WebDriverTestBase {
// Then add the block. // Then add the block.
$assert_session->waitForElementVisible('named', ['button', 'Add block'])->press(); $assert_session->waitForElementVisible('named', ['button', 'Add block'])->press();
$assert_session->assertWaitOnAjaxRequest(); $assert_session->assertWaitOnAjaxRequest();
$assert_session->waitForElementVisible('css', '.block-layout-builder-test-testajax'); $assert_session->waitForElementVisible('css', '.block-layout-builder-test-ajax');
$block_elements = $this->cssSelect('.block-layout-builder-test-testajax'); $block_elements = $this->cssSelect('.block-layout-builder-test-ajax');
// Should be exactly one of these in there. // Should be exactly one of these in there.
$this->assertCount(1, $block_elements); $this->assertCount(1, $block_elements);
$assert_session->pageTextContains('Every word is like an unnecessary stain on silence and nothingness.'); $assert_session->pageTextContains('Every word is like an unnecessary stain on silence and nothingness.');
......
...@@ -9,6 +9,8 @@ use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay; ...@@ -9,6 +9,8 @@ use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
use Drupal\Tests\contextual\FunctionalJavascript\ContextualLinkClickTrait; use Drupal\Tests\contextual\FunctionalJavascript\ContextualLinkClickTrait;
use Drupal\Tests\system\Traits\OffCanvasTestTrait; use Drupal\Tests\system\Traits\OffCanvasTestTrait;
// cspell:ignore testbody
/** /**
* Tests toggling of content preview. * Tests toggling of content preview.
* *
......
...@@ -8,6 +8,8 @@ use Drupal\FunctionalJavascriptTests\WebDriverTestBase; ...@@ -8,6 +8,8 @@ use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay; use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
use Drupal\Tests\system\Functional\Cache\AssertPageCacheContextsAndTagsTrait; use Drupal\Tests\system\Functional\Cache\AssertPageCacheContextsAndTagsTrait;
// cspell:ignore blocktest
/** /**
* Test contextual links compatibility with the Layout Builder. * Test contextual links compatibility with the Layout Builder.
* *
......
...@@ -13,6 +13,8 @@ use Drupal\FunctionalJavascriptTests\WebDriverTestBase; ...@@ -13,6 +13,8 @@ use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
use Drupal\Tests\contextual\FunctionalJavascript\ContextualLinkClickTrait; use Drupal\Tests\contextual\FunctionalJavascript\ContextualLinkClickTrait;
use Drupal\Tests\system\Traits\OffCanvasTestTrait; use Drupal\Tests\system\Traits\OffCanvasTestTrait;
// cspell:ignore fieldbody
/** /**
* Tests the Layout Builder disables interactions of rendered blocks. * Tests the Layout Builder disables interactions of rendered blocks.
* *
......
...@@ -8,6 +8,8 @@ use Drupal\block_content\Entity\BlockContentType; ...@@ -8,6 +8,8 @@ use Drupal\block_content\Entity\BlockContentType;
use Drupal\FunctionalJavascriptTests\WebDriverTestBase; use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
use Drupal\Tests\contextual\FunctionalJavascript\ContextualLinkClickTrait; use Drupal\Tests\contextual\FunctionalJavascript\ContextualLinkClickTrait;
// cspell:ignore fieldbody
/** /**
* Tests the Layout Builder UI. * Tests the Layout Builder UI.
* *
......
...@@ -8,6 +8,8 @@ use Drupal\FunctionalJavascriptTests\WebDriverTestBase; ...@@ -8,6 +8,8 @@ use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay; use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
use Drupal\Tests\contextual\FunctionalJavascript\ContextualLinkClickTrait; use Drupal\Tests\contextual\FunctionalJavascript\ContextualLinkClickTrait;
// cspell:ignore fieldbody fieldlinks
/** /**
* Tests moving blocks via the form. * Tests moving blocks via the form.
* *
......
...@@ -190,6 +190,7 @@ function locale_schema() { ...@@ -190,6 +190,7 @@ function locale_schema() {
], ],
'indexes' => [ 'indexes' => [
'string_type' => ['sid', 'type'], 'string_type' => ['sid', 'type'],
'type_name' => ['type', 'name'],
], ],
]; ];
...@@ -347,3 +348,64 @@ function locale_update_10100(&$sandbox = NULL) { ...@@ -347,3 +348,64 @@ function locale_update_10100(&$sandbox = NULL) {
$connection->schema()->changeField('locale_file', 'last_checked', 'last_checked', $new); $connection->schema()->changeField('locale_file', 'last_checked', 'last_checked', $new);
} }
} }
/**
* Add an index on locales_location on type and name.
*/
function locale_update_10300() {
$spec = [];
$spec['locales_location'] = [
'description' => 'Location information for source strings.',
'fields' => [
'lid' => [
'type' => 'serial',
'not null' => TRUE,
'description' => 'Unique identifier of this location.',
],
'sid' => [
'type' => 'int',
'not null' => TRUE,
'description' => 'Unique identifier of this string.',
],
'type' => [
'type' => 'varchar_ascii',
'length' => 50,
'not null' => TRUE,
'default' => '',
'description' => 'The location type (file, config, path, etc).',
],
'name' => [
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'default' => '',
'description' => 'Type dependent location information (file name, path, etc).',
],
'version' => [
'type' => 'varchar_ascii',
'length' => 20,
'not null' => TRUE,
'default' => 'none',
'description' => 'Version of Drupal where the location was found.',
],
],
'primary key' => ['lid'],
'foreign keys' => [
'locales_source' => [
'table' => 'locales_source',
'columns' => ['sid' => 'lid'],
],
],
'indexes' => [
'string_type' => ['sid', 'type'],
'type_name' => ['type', 'name'],
],
];
$schema = \Drupal::database()->schema();
// If the update has been manually applied, recreate the index using the
// current schema.
if ($schema->indexExists('locales_location', 'type_name')) {
$schema->dropIndex('locales_location', 'type_name');
}
$schema->addIndex('locales_location', 'type_name', ['type', 'name'], $spec['locales_location']);
}
<?php
declare(strict_types=1);
namespace Drupal\Tests\locale\Functional;
use Drupal\FunctionalTests\Update\UpdatePathTestBase;
/**
* Tests Locale update functions.
*
* @group locale
*/
class LocalesLocationAddIndexUpdateTest extends UpdatePathTestBase {
/**
* {@inheritdoc}
*/
protected $defaultTheme = 'stark';
/**
* {@inheritdoc}
*/
protected function setDatabaseDumpFiles() {
$this->databaseDumpFiles[] = $this->root . '/core/modules/system/tests/fixtures/update/drupal-10.3.0.filled.standard.php.gz';
}
/**
* Tests locale_update_10300().
*
* @see locale_update_10300
*/
public function testIndex(): void {
$this->assertFalse(\Drupal::database()
->schema()
->indexExists('locales_location', 'type_name'));
// Run updates and test them.
$this->runUpdates();
$this->assertTrue(\Drupal::database()
->schema()
->indexExists('locales_location', 'type_name'));
}
/**
* Tests locale_update_10300().
*
* @see locale_update_10300
*/
public function testExistingIndex(): void {
$spec = [];
$spec['locales_location'] = [
'description' => 'Location information for source strings.',
'fields' => [
'lid' => [
'type' => 'serial',
'not null' => TRUE,
'description' => 'Unique identifier of this location.',
],
'sid' => [
'type' => 'int',
'not null' => TRUE,
'description' => 'Unique identifier of this string.',
],
'type' => [
'type' => 'varchar_ascii',
'length' => 50,
'not null' => TRUE,
'default' => '',
'description' => 'The location type (file, config, path, etc).',
],
'name' => [
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'default' => '',
'description' => 'Type dependent location information (file name, path, etc).',
],
'version' => [
'type' => 'varchar_ascii',
'length' => 20,
'not null' => TRUE,
'default' => 'none',
'description' => 'Version of Drupal where the location was found.',
],
],
'primary key' => ['lid'],
'foreign keys' => [
'locales_source' => [
'table' => 'locales_source',
'columns' => ['sid' => 'lid'],
],
],
'indexes' => [
'string_type' => ['sid', 'type'],
'type_name' => ['type', 'name'],
],
];
\Drupal::database()->schema()->addIndex('locales_location', 'type_name', ['type', 'name', 'sid'], $spec['locales_location']);
// Run updates and test them.
$this->runUpdates();
// Ensure the update runs successfully even if an index existed prior to
// the update.
$schema = \Drupal::database()->schema();
$this->assertTrue($schema->indexExists('locales_location', 'type_name'));
}
}
...@@ -2,11 +2,10 @@ ...@@ -2,11 +2,10 @@
declare(strict_types=1); declare(strict_types=1);
namespace Drupal\Tests\media\Functional; namespace Drupal\Tests\media\Kernel;
use Drupal\media\OEmbed\ProviderException; use Drupal\media\OEmbed\ProviderException;
use GuzzleHttp\Psr7\Utils; use GuzzleHttp\Psr7\Utils;
use Prophecy\PhpUnit\ProphecyTrait;
/** /**
* Tests the oEmbed provider repository. * Tests the oEmbed provider repository.
...@@ -15,14 +14,7 @@ use Prophecy\PhpUnit\ProphecyTrait; ...@@ -15,14 +14,7 @@ use Prophecy\PhpUnit\ProphecyTrait;
* *
* @group media * @group media
*/ */
class ProviderRepositoryTest extends MediaFunctionalTestBase { class ProviderRepositoryTest extends MediaKernelTestBase {
use ProphecyTrait;
/**
* {@inheritdoc}
*/
protected $defaultTheme = 'stark';
/** /**
* Tests that provider discovery fails if the provider database is empty. * Tests that provider discovery fails if the provider database is empty.
......
...@@ -1059,13 +1059,13 @@ class MenuUiTest extends BrowserTestBase { ...@@ -1059,13 +1059,13 @@ class MenuUiTest extends BrowserTestBase {
public function testMenuParentsJsAccess(): void { public function testMenuParentsJsAccess(): void {
$this->drupalLogin($this->drupalCreateUser(['administer menu'])); $this->drupalLogin($this->drupalCreateUser(['administer menu']));
// Just check access to the callback overall, the POST data is irrelevant. // Just check access to the callback overall, the POST data is irrelevant.
$this->drupalGet('admin/structure/menu/parents', ['query' => [MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_ajax']], ['X-Requested-With: XMLHttpRequest']); $this->drupalGet('admin/structure/menu/parents', ['query' => [MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_ajax']], ['X-Requested-With' => 'XMLHttpRequest']);
$this->assertSession()->statusCodeEquals(200); $this->assertSession()->statusCodeEquals(200);
// Log in as authenticated user. // Log in as authenticated user.
$this->drupalLogin($this->drupalCreateUser()); $this->drupalLogin($this->drupalCreateUser());
// Check that a simple user is not able to access the menu. // Check that a simple user is not able to access the menu.
$this->drupalGet('admin/structure/menu/parents', ['query' => [MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_ajax']], ['X-Requested-With: XMLHttpRequest']); $this->drupalGet('admin/structure/menu/parents', ['query' => [MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_ajax']], ['X-Requested-With' => 'XMLHttpRequest']);
$this->assertSession()->statusCodeEquals(403); $this->assertSession()->statusCodeEquals(403);
} }
......
...@@ -20,7 +20,7 @@ use Drupal\migrate\MigrateSkipRowException; ...@@ -20,7 +20,7 @@ use Drupal\migrate\MigrateSkipRowException;
* - method: (optional) What to do if the input value is empty. Possible values: * - method: (optional) What to do if the input value is empty. Possible values:
* - row: Skips the entire row when an empty value is encountered. * - row: Skips the entire row when an empty value is encountered.
* - process: Prevents further processing of the input property when the value * - process: Prevents further processing of the input property when the value
* is empty. * is empty and sets the value to NULL.
* - message: (optional) A message to be logged in the {migrate_message_*} table * - message: (optional) A message to be logged in the {migrate_message_*} table
* for this row. Messages are only logged for the 'row' method. If not set, * for this row. Messages are only logged for the 'row' method. If not set,
* nothing is logged in the message table. * nothing is logged in the message table.
......
...@@ -194,7 +194,7 @@ class PageCacheTest extends BrowserTestBase { ...@@ -194,7 +194,7 @@ class PageCacheTest extends BrowserTestBase {
$this->assertSession()->statusCodeEquals(304); $this->assertSession()->statusCodeEquals(304);
// Ensure a conditional request without If-None-Match returns 200 OK. // Ensure a conditional request without If-None-Match returns 200 OK.
$this->drupalGet('', [], ['If-Modified-Since' => $last_modified, 'If-None-Match' => NULL]); $this->drupalGet('', [], ['If-Modified-Since' => $last_modified, 'If-None-Match' => '']);
// Verify the page is not printed twice when the cache is warm. // Verify the page is not printed twice when the cache is warm.
$this->assertSession()->responseNotMatches('#<html.*<html#'); $this->assertSession()->responseNotMatches('#<html.*<html#');
$this->assertSession()->statusCodeEquals(200); $this->assertSession()->statusCodeEquals(200);
......
...@@ -338,7 +338,7 @@ class StyleSerializerEntityTest extends ViewTestBase { ...@@ -338,7 +338,7 @@ class StyleSerializerEntityTest extends ViewTestBase {
$this->submitForm([], 'Save'); $this->submitForm([], 'Save');
// Should return a 406. Emulates a sample Firefox header. // Should return a 406. Emulates a sample Firefox header.
$this->drupalGet('test/serialize/field', [], ['Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8']); $this->drupalGet('test/serialize/field', [], ['Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8']);
$this->assertSession()->responseHeaderEquals('content-type', 'text/html; charset=UTF-8'); $this->assertSession()->responseHeaderEquals('content-type', 'text/html; charset=UTF-8');
$this->assertSession()->statusCodeEquals(406); $this->assertSession()->statusCodeEquals(406);
......
name: Single Directory Components name: Single-Directory Components
type: module type: module
description: 'Allows discovery and rendering of self-contained UI components.' description: 'Allows discovery and rendering of self-contained UI components.'
version: VERSION version: VERSION
......
...@@ -58,19 +58,6 @@ class BatchController implements ContainerInjectionInterface { ...@@ -58,19 +58,6 @@ class BatchController implements ContainerInjectionInterface {
return $output; return $output;
} }
elseif (isset($output)) { elseif (isset($output)) {
// Directly render a status message placeholder without any messages.
// Messages are not intended to be show on the batch page, but in the
// event an error in a AJAX callback the messages will be displayed.
// @todo Remove in https://drupal.org/i/3396099.
$output['batch_messages'] = [
'#theme' => 'status_messages',
'#message_list' => [],
'#status_headings' => [
'status' => $this->t('Status message'),
'error' => $this->t('Error message'),
'warning' => $this->t('Warning message'),
],
];
$title = $output['#title'] ?? NULL; $title = $output['#title'] ?? NULL;
$page = [ $page = [
'#type' => 'page', '#type' => 'page',
......
...@@ -64,6 +64,14 @@ class DevelopmentSettingsForm extends FormBase { ...@@ -64,6 +64,14 @@ class DevelopmentSettingsForm extends FormBase {
'checked' => TRUE, 'checked' => TRUE,
], ],
]; ];
$form['disable_rendered_output_cache_bins'] = [
'#type' => 'checkbox',
'#title' => $this->t('Do not cache markup'),
'#description' => $this->t('Disables render cache, dynamic page cache, and page cache.'),
'#default_value' => $development_settings->get('disable_rendered_output_cache_bins', FALSE),
];
$form['twig_development_mode'] = [ $form['twig_development_mode'] = [
'#type' => 'checkbox', '#type' => 'checkbox',
'#title' => $this->t('Twig development mode'), '#title' => $this->t('Twig development mode'),
...@@ -98,13 +106,6 @@ class DevelopmentSettingsForm extends FormBase { ...@@ -98,13 +106,6 @@ class DevelopmentSettingsForm extends FormBase {
]; ];
} }
$form['disable_rendered_output_cache_bins'] = [
'#type' => 'checkbox',
'#title' => $this->t('Do not cache markup'),
'#description' => $this->t('Disables render cache, dynamic page cache, and page cache.'),
'#default_value' => $development_settings->get('disable_rendered_output_cache_bins', FALSE),
];
$form['actions']['#type'] = 'actions'; $form['actions']['#type'] = 'actions';
$form['actions']['submit'] = [ $form['actions']['submit'] = [
'#type' => 'submit', '#type' => 'submit',
......
...@@ -129,7 +129,7 @@ function ajax_forms_test_advanced_commands_css_callback($form, FormStateInterfac ...@@ -129,7 +129,7 @@ function ajax_forms_test_advanced_commands_css_callback($form, FormStateInterfac
function ajax_forms_test_advanced_commands_data_callback($form, FormStateInterface $form_state) { function ajax_forms_test_advanced_commands_data_callback($form, FormStateInterface $form_state) {
$selector = '#data_div'; $selector = '#data_div';
$response = new AjaxResponse(); $response = new AjaxResponse();
$response->addCommand(new DataCommand($selector, 'testkey', 'test_value')); $response->addCommand(new DataCommand($selector, 'test_key', 'test_value'));
return $response; return $response;
} }
......
...@@ -730,6 +730,30 @@ class JavascriptStatesForm extends FormBase { ...@@ -730,6 +730,30 @@ class JavascriptStatesForm extends FormBase {
'#title' => 'Enable textarea', '#title' => 'Enable textarea',
]; ];
$form['test_select_visible_dependence']['select_visible_1'] = [
'#type' => 'select',
'#title' => 'Select visible 1',
'#options' => [0 => 0, 1 => 1],
'#default_value' => 0,
];
$form['test_select_visible_dependence']['select_visible_2'] = [
'#type' => 'select',
'#title' => 'Select visible 2',
'#options' => [0 => 0, 1 => 1],
'#default_value' => 0,
];
$form['test_select_visible_dependence']['select_visible_3'] = [
'#type' => 'select',
'#title' => 'Select should show when 0 and 1 are selected',
'#options' => [0 => 0, 1 => 1],
'#states' => [
'visible' => [
':input[name="select_visible_1"]' => ['value' => 0],
':input[name="select_visible_2"]' => ['value' => 1],
],
],
];
return $form; return $form;
} }
......
...@@ -149,7 +149,7 @@ class FrameworkTest extends BrowserTestBase { ...@@ -149,7 +149,7 @@ class FrameworkTest extends BrowserTestBase {
* Decoded JSON. * Decoded JSON.
*/ */
protected function drupalGetAjax($path, array $options = [], array $headers = []) { protected function drupalGetAjax($path, array $options = [], array $headers = []) {
$headers[] = 'X-Requested-With: XMLHttpRequest'; $headers = ['X-Requested-With' => 'XMLHttpRequest'];
if (!isset($options['query'][MainContentViewSubscriber::WRAPPER_FORMAT])) { if (!isset($options['query'][MainContentViewSubscriber::WRAPPER_FORMAT])) {
$options['query'][MainContentViewSubscriber::WRAPPER_FORMAT] = 'drupal_ajax'; $options['query'][MainContentViewSubscriber::WRAPPER_FORMAT] = 'drupal_ajax';
} }
......
...@@ -45,7 +45,7 @@ class ContentNegotiationTest extends BrowserTestBase { ...@@ -45,7 +45,7 @@ class ContentNegotiationTest extends BrowserTestBase {
'Android #2 (2012)' => 'text/xml,text/html,application/xhtml+xml,image/png,text/plain,*/*;q=0.8', 'Android #2 (2012)' => 'text/xml,text/html,application/xhtml+xml,image/png,text/plain,*/*;q=0.8',
]; ];
foreach ($tests as $case => $header) { foreach ($tests as $case => $header) {
$this->drupalGet('', [], ['Accept: ' . $header]); $this->drupalGet('', [], ['Accept' => $header]);
$this->assertSession()->pageTextNotContains('Unsupported Media Type'); $this->assertSession()->pageTextNotContains('Unsupported Media Type');
$this->assertSession()->pageTextContains('Log in'); $this->assertSession()->pageTextContains('Log in');
} }
......
...@@ -191,7 +191,7 @@ class StorageTest extends BrowserTestBase { ...@@ -191,7 +191,7 @@ class StorageTest extends BrowserTestBase {
$build_id = $this->assertSession()->hiddenFieldExists('form_build_id')->getValue(); $build_id = $this->assertSession()->hiddenFieldExists('form_build_id')->getValue();
// Try to poison the form cache. // Try to poison the form cache.
$response = $this->drupalGet('form-test/form-storage-legacy/' . $build_id, ['query' => [MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_ajax']], ['X-Requested-With: XMLHttpRequest']); $response = $this->drupalGet('form-test/form-storage-legacy/' . $build_id, ['query' => [MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_ajax']], ['X-Requested-With' => 'XMLHttpRequest']);
$original = json_decode($response, TRUE); $original = json_decode($response, TRUE);
$this->assertEquals($original['form']['#build_id_old'], $build_id, 'Original build_id was recorded'); $this->assertEquals($original['form']['#build_id_old'], $build_id, 'Original build_id was recorded');
...@@ -208,7 +208,7 @@ class StorageTest extends BrowserTestBase { ...@@ -208,7 +208,7 @@ class StorageTest extends BrowserTestBase {
$this->assertTrue($status, 'A watchdog message was logged by \Drupal::formBuilder()->setCache'); $this->assertTrue($status, 'A watchdog message was logged by \Drupal::formBuilder()->setCache');
// Ensure that the form state was not poisoned by the preceding call. // Ensure that the form state was not poisoned by the preceding call.
$response = $this->drupalGet('form-test/form-storage-legacy/' . $build_id, ['query' => [MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_ajax']], ['X-Requested-With: XMLHttpRequest']); $response = $this->drupalGet('form-test/form-storage-legacy/' . $build_id, ['query' => [MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_ajax']], ['X-Requested-With' => 'XMLHttpRequest']);
$original = json_decode($response, TRUE); $original = json_decode($response, TRUE);
$this->assertEquals($original['form']['#build_id_old'], $build_id, 'Original build_id was recorded'); $this->assertEquals($original['form']['#build_id_old'], $build_id, 'Original build_id was recorded');
$this->assertNotEquals($original['form']['#build_id'], $build_id, 'New build_id was generated'); $this->assertNotEquals($original['form']['#build_id'], $build_id, 'New build_id was generated');
......
...@@ -298,7 +298,7 @@ class RouterTest extends BrowserTestBase { ...@@ -298,7 +298,7 @@ class RouterTest extends BrowserTestBase {
// This will fail with a JSON parse error if the request is not routed to // This will fail with a JSON parse error if the request is not routed to
// The correct controller. // The correct controller.
$options['query'][MainContentViewSubscriber::WRAPPER_FORMAT] = 'drupal_ajax'; $options['query'][MainContentViewSubscriber::WRAPPER_FORMAT] = 'drupal_ajax';
$headers[] = 'X-Requested-With: XMLHttpRequest'; $headers = ['X-Requested-With' => 'XMLHttpRequest'];
$this->drupalGet('/router_test/test10', $options, $headers); $this->drupalGet('/router_test/test10', $options, $headers);
$this->assertSession()->responseHeaderEquals('Content-Type', 'application/json'); $this->assertSession()->responseHeaderEquals('Content-Type', 'application/json');
......
...@@ -29,7 +29,7 @@ class StackSessionHandlerIntegrationTest extends BrowserTestBase { ...@@ -29,7 +29,7 @@ class StackSessionHandlerIntegrationTest extends BrowserTestBase {
*/ */
public function testRequest(): void { public function testRequest(): void {
$options['query'][MainContentViewSubscriber::WRAPPER_FORMAT] = 'drupal_ajax'; $options['query'][MainContentViewSubscriber::WRAPPER_FORMAT] = 'drupal_ajax';
$headers[] = 'X-Requested-With: XMLHttpRequest'; $headers = ['X-Requested-With' => 'XMLHttpRequest'];
$actual_trace = json_decode($this->drupalGet('session-test/trace-handler', $options, $headers)); $actual_trace = json_decode($this->drupalGet('session-test/trace-handler', $options, $headers));
$sessionId = $this->getSessionCookies()->getCookieByName($this->getSessionName())->getValue(); $sessionId = $this->getSessionCookies()->getCookieByName($this->getSessionName())->getValue();
$expect_trace = [ $expect_trace = [
......
...@@ -9,7 +9,7 @@ use Drupal\node\Entity\Node; ...@@ -9,7 +9,7 @@ use Drupal\node\Entity\Node;
use Drupal\node\Entity\NodeType; use Drupal\node\Entity\NodeType;
use Drupal\user\Entity\User; use Drupal\user\Entity\User;
// cspell:ignore hola usuario // cspell:ignore hola testblock usuario
/** /**
* Runs UpdatePathTestBase with a dump filled with content. * Runs UpdatePathTestBase with a dump filled with content.
......
...@@ -69,10 +69,10 @@ class MailTest extends KernelTestBase { ...@@ -69,10 +69,10 @@ class MailTest extends KernelTestBase {
$this->assertInstanceOf(TestPhpMailFailure::class, $mail_backend); $this->assertInstanceOf(TestPhpMailFailure::class, $mail_backend);
// Add a module-specific mail backend. // Add a module-specific mail backend.
$this->config('system.mail')->set('interface.my_module_testkey', 'test_mail_collector')->save(); $this->config('system.mail')->set('interface.my_module_test_key', 'test_mail_collector')->save();
// Get the added MailInterface class instance. // Get the added MailInterface class instance.
$mail_backend = \Drupal::service('plugin.manager.mail')->getInstance(['module' => 'my_module', 'key' => 'testkey']); $mail_backend = \Drupal::service('plugin.manager.mail')->getInstance(['module' => 'my_module', 'key' => 'test_key']);
// Assert whether the added mail backend is an instance of the expected // Assert whether the added mail backend is an instance of the expected
// class. // class.
......
...@@ -385,7 +385,7 @@ class ToolbarAdminMenuTest extends BrowserTestBase { ...@@ -385,7 +385,7 @@ class ToolbarAdminMenuTest extends BrowserTestBase {
// Request a new page to refresh the drupalSettings object. // Request a new page to refresh the drupalSettings object.
$subtrees_hash = $this->getSubtreesHash(); $subtrees_hash = $this->getSubtreesHash();
$this->drupalGet('toolbar/subtrees/' . $subtrees_hash, ['query' => [MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_ajax']], ['X-Requested-With: XMLHttpRequest']); $this->drupalGet('toolbar/subtrees/' . $subtrees_hash, ['query' => [MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_ajax']], ['X-Requested-With' => 'XMLHttpRequest']);
$ajax_result = json_decode($this->getSession()->getPage()->getContent(), TRUE); $ajax_result = json_decode($this->getSession()->getPage()->getContent(), TRUE);
$this->assertEquals('setToolbarSubtrees', $ajax_result[0]['command'], 'Subtrees response uses the correct command.'); $this->assertEquals('setToolbarSubtrees', $ajax_result[0]['command'], 'Subtrees response uses the correct command.');
$this->assertEquals(['system-admin_content', 'system-admin_structure', 'system-themes_page', 'system-modules_list', 'system-admin_config', 'entity-user-collection', 'front'], array_keys($ajax_result[0]['subtrees']), 'Correct subtrees returned.'); $this->assertEquals(['system-admin_content', 'system-admin_structure', 'system-themes_page', 'system-modules_list', 'system-admin_config', 'entity-user-collection', 'front'], array_keys($ajax_result[0]['subtrees']), 'Correct subtrees returned.');
......
...@@ -5,7 +5,7 @@ config: ...@@ -5,7 +5,7 @@ config:
actions: actions:
user.role.administrator: user.role.administrator:
# If this role already exists, then this action has no effect. If it doesn't exist, we'll create it with the following values. # If this role already exists, then this action has no effect. If it doesn't exist, we'll create it with the following values.
ensure_exists: createIfNotExists:
id: administrator id: administrator
label: Administrator label: Administrator
weight: 3 weight: 3
......
...@@ -5,7 +5,7 @@ config: ...@@ -5,7 +5,7 @@ config:
actions: actions:
user.role.content_editor: user.role.content_editor:
# If this role already exists, then this action has no effect. If it doesn't exist, we'll create it with the following values. # If this role already exists, then this action has no effect. If it doesn't exist, we'll create it with the following values.
ensure_exists: createIfNotExists:
id: content_editor id: content_editor
label: 'Content editor' label: 'Content editor'
weight: 2 weight: 2
......
...@@ -20,5 +20,5 @@ config: ...@@ -20,5 +20,5 @@ config:
- block.block.claro_secondary_local_tasks - block.block.claro_secondary_local_tasks
actions: actions:
system.theme: system.theme:
simple_config_update: simpleConfigUpdate:
admin: claro admin: claro
...@@ -25,5 +25,5 @@ config: ...@@ -25,5 +25,5 @@ config:
- core.date_format.olivero_medium - core.date_format.olivero_medium
actions: actions:
system.theme: system.theme:
simple_config_update: simpleConfigUpdate:
default: olivero default: olivero
...@@ -36,7 +36,7 @@ config: ...@@ -36,7 +36,7 @@ config:
# mapped to the \Drupal\user\Entity\Role::grantPermission() method. # mapped to the \Drupal\user\Entity\Role::grantPermission() method.
actions: actions:
user.role.editor: user.role.editor:
ensure_exists: createIfNotExists:
label: 'Editor' label: 'Editor'
grantPermissions: grantPermissions:
- 'delete any article content' - 'delete any article content'
......
...@@ -11,7 +11,7 @@ config: ...@@ -11,7 +11,7 @@ config:
- system.menu.footer - system.menu.footer
actions: actions:
core.menu.static_menu_link_overrides: core.menu.static_menu_link_overrides:
simple_config_update: simpleConfigUpdate:
definitions.contact__site_page: definitions.contact__site_page:
menu_name: footer menu_name: footer
parent: '' parent: ''
......
...@@ -64,10 +64,10 @@ config: ...@@ -64,10 +64,10 @@ config:
- views.view.who_s_online - views.view.who_s_online
actions: actions:
node.settings: node.settings:
simple_config_update: simpleConfigUpdate:
use_admin_theme: true use_admin_theme: true
system.site: system.site:
simple_config_update: simpleConfigUpdate:
page.front: /node page.front: /node
user.role.anonymous: user.role.anonymous:
grantPermission: 'access content' grantPermission: 'access content'
...@@ -96,7 +96,7 @@ config: ...@@ -96,7 +96,7 @@ config:
- 'delete own %bundle content' - 'delete own %bundle content'
- 'edit own %bundle content' - 'edit own %bundle content'
user.settings: user.settings:
simple_config_update: simpleConfigUpdate:
verify_mail: true verify_mail: true
register: visitors_admin_approval register: visitors_admin_approval
cancel_method: user_cancel_block cancel_method: user_cancel_block
...@@ -102,7 +102,7 @@ class CommandsTest extends WebDriverTestBase { ...@@ -102,7 +102,7 @@ class CommandsTest extends WebDriverTestBase {
// Tests the 'data' command. // Tests the 'data' command.
$page->pressButton("AJAX data command: Issue command."); $page->pressButton("AJAX data command: Issue command.");
$this->assertTrue($page->waitFor(10, function () use ($session) { $this->assertTrue($page->waitFor(10, function () use ($session) {
return 'test_value' === $session->evaluateScript('window.jQuery("#data_div").data("testkey")'); return 'test_value' === $session->evaluateScript('window.jQuery("#data_div").data("test_key")');
})); }));
// Tests the 'html' command. // Tests the 'html' command.
......
...@@ -8,6 +8,8 @@ use Drupal\ajax_test\Controller\AjaxTestController; ...@@ -8,6 +8,8 @@ use Drupal\ajax_test\Controller\AjaxTestController;
use Drupal\Core\Ajax\OpenModalDialogWithUrl; use Drupal\Core\Ajax\OpenModalDialogWithUrl;
use Drupal\FunctionalJavascriptTests\WebDriverTestBase; use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
// cspell:ignore testdialog
/** /**
* Performs tests on opening and manipulating dialogs via AJAX commands. * Performs tests on opening and manipulating dialogs via AJAX commands.
* *
......
...@@ -443,6 +443,15 @@ class JavascriptStatesTest extends WebDriverTestBase { ...@@ -443,6 +443,15 @@ class JavascriptStatesTest extends WebDriverTestBase {
$this->assertFalse($item_visible_value2->isVisible()); $this->assertFalse($item_visible_value2->isVisible());
$this->assertTrue($textfield_visible_value3->isVisible()); $this->assertTrue($textfield_visible_value3->isVisible());
$this->assertTrue($textfield_visible_value2_or_value3->isVisible()); $this->assertTrue($textfield_visible_value2_or_value3->isVisible());
$this->container->get('module_installer')->install(['big_pipe']);
$this->drupalGet('form-test/javascript-states-form');
$select_visible_2 = $this->assertSession()->elementExists('css', 'select[name="select_visible_2"]');
$select_visible_3 = $this->assertSession()->elementExists('css', 'select[name="select_visible_3"]');
$this->assertFalse($select_visible_3->isVisible());
$select_visible_2->setValue('1');
$this->assertTrue($select_visible_3->isVisible());
} }
/** /**
......
...@@ -16,7 +16,7 @@ class WebDriverWebAssert extends JSWebAssert { ...@@ -16,7 +16,7 @@ class WebDriverWebAssert extends JSWebAssert {
* The status code. * The status code.
*/ */
public function statusCodeEquals($code) { public function statusCodeEquals($code) {
@trigger_error('Support for statusCodeEquals is to be dropped from JavaScript tests. See https://www.drupal.org/node/2857562.'); @trigger_error('WebDriverWebAssert::statusCodeEquals() is deprecated in drupal:8.4.0 and is removed in drupal:12.0.0. See https://www.drupal.org/node/2857562', E_USER_DEPRECATED);
parent::statusCodeEquals($code); parent::statusCodeEquals($code);
} }
...@@ -27,7 +27,7 @@ class WebDriverWebAssert extends JSWebAssert { ...@@ -27,7 +27,7 @@ class WebDriverWebAssert extends JSWebAssert {
* The status code. * The status code.
*/ */
public function statusCodeNotEquals($code) { public function statusCodeNotEquals($code) {
@trigger_error('Support for statusCodeNotEquals is to be dropped from JavaScript tests. See https://www.drupal.org/node/2857562.'); @trigger_error('WebDriverWebAssert::statusCodeNotEquals() is deprecated in drupal:8.4.0 and is removed in drupal:12.0.0. See https://www.drupal.org/node/2857562', E_USER_DEPRECATED);
parent::statusCodeNotEquals($code); parent::statusCodeNotEquals($code);
} }
...@@ -40,7 +40,7 @@ class WebDriverWebAssert extends JSWebAssert { ...@@ -40,7 +40,7 @@ class WebDriverWebAssert extends JSWebAssert {
* The value to check the header against. * The value to check the header against.
*/ */
public function responseHeaderEquals($name, $value) { public function responseHeaderEquals($name, $value) {
@trigger_error('Support for responseHeaderEquals is to be dropped from JavaScript tests. See https://www.drupal.org/node/2857562.'); @trigger_error('WebDriverWebAssert::responseHeaderEquals() is deprecated in drupal:8.4.0 and is removed in drupal:12.0.0. See https://www.drupal.org/node/2857562', E_USER_DEPRECATED);
parent::responseHeaderEquals($name, $value); parent::responseHeaderEquals($name, $value);
} }
...@@ -53,7 +53,7 @@ class WebDriverWebAssert extends JSWebAssert { ...@@ -53,7 +53,7 @@ class WebDriverWebAssert extends JSWebAssert {
* The value to check the header against. * The value to check the header against.
*/ */
public function responseHeaderNotEquals($name, $value) { public function responseHeaderNotEquals($name, $value) {
@trigger_error('Support for responseHeaderNotEquals is to be dropped from JavaScript tests. See https://www.drupal.org/node/2857562.'); @trigger_error('WebDriverWebAssert::responseHeaderNotEquals() is deprecated in drupal:8.4.0 and is removed in drupal:12.0.0. See https://www.drupal.org/node/2857562', E_USER_DEPRECATED);
parent::responseHeaderNotEquals($name, $value); parent::responseHeaderNotEquals($name, $value);
} }
...@@ -66,7 +66,7 @@ class WebDriverWebAssert extends JSWebAssert { ...@@ -66,7 +66,7 @@ class WebDriverWebAssert extends JSWebAssert {
* The value to check the header against. * The value to check the header against.
*/ */
public function responseHeaderContains($name, $value) { public function responseHeaderContains($name, $value) {
@trigger_error('Support for responseHeaderContains is to be dropped from JavaScript tests. See https://www.drupal.org/node/2857562.'); @trigger_error('WebDriverWebAssert::responseHeaderContains() is deprecated in drupal:8.4.0 and is removed in drupal:12.0.0. See https://www.drupal.org/node/2857562', E_USER_DEPRECATED);
parent::responseHeaderContains($name, $value); parent::responseHeaderContains($name, $value);
} }
...@@ -79,7 +79,7 @@ class WebDriverWebAssert extends JSWebAssert { ...@@ -79,7 +79,7 @@ class WebDriverWebAssert extends JSWebAssert {
* The value to check the header against. * The value to check the header against.
*/ */
public function responseHeaderNotContains($name, $value) { public function responseHeaderNotContains($name, $value) {
@trigger_error('Support for responseHeaderNotContains is to be dropped from JavaScript tests. See https://www.drupal.org/node/2857562.'); @trigger_error('WebDriverWebAssert::responseHeaderNotContains() is deprecated in drupal:8.4.0 and is removed in drupal:12.0.0. See https://www.drupal.org/node/2857562', E_USER_DEPRECATED);
parent::responseHeaderNotContains($name, $value); parent::responseHeaderNotContains($name, $value);
} }
...@@ -92,7 +92,7 @@ class WebDriverWebAssert extends JSWebAssert { ...@@ -92,7 +92,7 @@ class WebDriverWebAssert extends JSWebAssert {
* The value to check the header against. * The value to check the header against.
*/ */
public function responseHeaderMatches($name, $regex) { public function responseHeaderMatches($name, $regex) {
@trigger_error('Support for responseHeaderMatches is to be dropped from JavaScript tests. See https://www.drupal.org/node/2857562.'); @trigger_error('WebDriverWebAssert::responseHeaderMatches() is deprecated in drupal:8.4.0 and is removed in drupal:12.0.0. See https://www.drupal.org/node/2857562', E_USER_DEPRECATED);
parent::responseHeaderMatches($name, $regex); parent::responseHeaderMatches($name, $regex);
} }
...@@ -105,7 +105,7 @@ class WebDriverWebAssert extends JSWebAssert { ...@@ -105,7 +105,7 @@ class WebDriverWebAssert extends JSWebAssert {
* The value to check the header against. * The value to check the header against.
*/ */
public function responseHeaderNotMatches($name, $regex) { public function responseHeaderNotMatches($name, $regex) {
@trigger_error('Support for responseHeaderNotMatches is to be dropped from JavaScript tests. See https://www.drupal.org/node/2857562.'); @trigger_error('WebDriverWebAssert::responseHeaderNotMatches() is deprecated in drupal:8.4.0 and is removed in drupal:12.0.0. See https://www.drupal.org/node/2857562', E_USER_DEPRECATED);
parent::responseHeaderNotMatches($name, $regex); parent::responseHeaderNotMatches($name, $regex);
} }
......
...@@ -33,15 +33,15 @@ class ConfigActionTest extends KernelTestBase { ...@@ -33,15 +33,15 @@ class ConfigActionTest extends KernelTestBase {
$this->assertCount(0, \Drupal::entityTypeManager()->getStorage('config_test')->loadMultiple(), 'There are no config_test entities'); $this->assertCount(0, \Drupal::entityTypeManager()->getStorage('config_test')->loadMultiple(), 'There are no config_test entities');
/** @var \Drupal\Core\Config\Action\ConfigActionManager $manager */ /** @var \Drupal\Core\Config\Action\ConfigActionManager $manager */
$manager = $this->container->get('plugin.manager.config_action'); $manager = $this->container->get('plugin.manager.config_action');
$manager->applyAction('entity_create:ensure_exists', 'config_test.dynamic.action_test', ['label' => 'Action test']); $manager->applyAction('entity_create:createIfNotExists', 'config_test.dynamic.action_test', ['label' => 'Action test']);
/** @var \Drupal\config_test\Entity\ConfigTest[] $config_test_entities */ /** @var \Drupal\config_test\Entity\ConfigTest[] $config_test_entities */
$config_test_entities = \Drupal::entityTypeManager()->getStorage('config_test')->loadMultiple(); $config_test_entities = \Drupal::entityTypeManager()->getStorage('config_test')->loadMultiple();
$this->assertCount(1, \Drupal::entityTypeManager()->getStorage('config_test')->loadMultiple(), 'There is 1 config_test entity'); $this->assertCount(1, \Drupal::entityTypeManager()->getStorage('config_test')->loadMultiple(), 'There is 1 config_test entity');
$this->assertSame('Action test', $config_test_entities['action_test']->label()); $this->assertSame('Action test', $config_test_entities['action_test']->label());
$this->assertTrue(Uuid::isValid((string) $config_test_entities['action_test']->uuid()), 'Config entity assigned a valid UUID'); $this->assertTrue(Uuid::isValid((string) $config_test_entities['action_test']->uuid()), 'Config entity assigned a valid UUID');
// Calling ensure exists action again will not error. // Calling createIfNotExists action again will not error.
$manager->applyAction('entity_create:ensure_exists', 'config_test.dynamic.action_test', ['label' => 'Action test']); $manager->applyAction('entity_create:createIfNotExists', 'config_test.dynamic.action_test', ['label' => 'Action test']);
try { try {
$manager->applyAction('entity_create:create', 'config_test.dynamic.action_test', ['label' => 'Action test']); $manager->applyAction('entity_create:create', 'config_test.dynamic.action_test', ['label' => 'Action test']);
...@@ -244,11 +244,11 @@ class ConfigActionTest extends KernelTestBase { ...@@ -244,11 +244,11 @@ class ConfigActionTest extends KernelTestBase {
/** @var \Drupal\Core\Config\Action\ConfigActionManager $manager */ /** @var \Drupal\Core\Config\Action\ConfigActionManager $manager */
$manager = $this->container->get('plugin.manager.config_action'); $manager = $this->container->get('plugin.manager.config_action');
// Call the simple config update action. // Call the simple config update action.
$manager->applyAction('simple_config_update', 'config_test.system', ['foo' => 'Yay!']); $manager->applyAction('simpleConfigUpdate', 'config_test.system', ['foo' => 'Yay!']);
$this->assertSame('Yay!', $this->config('config_test.system')->get('foo')); $this->assertSame('Yay!', $this->config('config_test.system')->get('foo'));
try { try {
$manager->applyAction('simple_config_update', 'config_test.system', 'Test'); $manager->applyAction('simpleConfigUpdate', 'config_test.system', 'Test');
$this->fail('Expected exception not thrown'); $this->fail('Expected exception not thrown');
} }
catch (ConfigActionException $e) { catch (ConfigActionException $e) {
...@@ -257,7 +257,7 @@ class ConfigActionTest extends KernelTestBase { ...@@ -257,7 +257,7 @@ class ConfigActionTest extends KernelTestBase {
$this->config('config_test.system')->delete(); $this->config('config_test.system')->delete();
try { try {
$manager->applyAction('simple_config_update', 'config_test.system', ['foo' => 'Yay!']); $manager->applyAction('simpleConfigUpdate', 'config_test.system', ['foo' => 'Yay!']);
$this->fail('Expected exception not thrown'); $this->fail('Expected exception not thrown');
} }
catch (ConfigActionException $e) { catch (ConfigActionException $e) {
...@@ -273,7 +273,7 @@ class ConfigActionTest extends KernelTestBase { ...@@ -273,7 +273,7 @@ class ConfigActionTest extends KernelTestBase {
$this->assertCount(0, $storage->loadMultiple(), 'There are no config_test entities'); $this->assertCount(0, $storage->loadMultiple(), 'There are no config_test entities');
/** @var \Drupal\Core\Config\Action\ConfigActionManager $manager */ /** @var \Drupal\Core\Config\Action\ConfigActionManager $manager */
$manager = $this->container->get('plugin.manager.config_action'); $manager = $this->container->get('plugin.manager.config_action');
$manager->applyAction('ensure_exists', 'config_test.dynamic.action_test', ['label' => 'Action test', 'protected_property' => '']); $manager->applyAction('createIfNotExists', 'config_test.dynamic.action_test', ['label' => 'Action test', 'protected_property' => '']);
/** @var \Drupal\config_test\Entity\ConfigTest[] $config_test_entities */ /** @var \Drupal\config_test\Entity\ConfigTest[] $config_test_entities */
$config_test_entities = $storage->loadMultiple(); $config_test_entities = $storage->loadMultiple();
$this->assertCount(1, $config_test_entities, 'There is 1 config_test entity'); $this->assertCount(1, $config_test_entities, 'There is 1 config_test entity');
...@@ -299,7 +299,7 @@ class ConfigActionTest extends KernelTestBase { ...@@ -299,7 +299,7 @@ class ConfigActionTest extends KernelTestBase {
$manager = $this->container->get('plugin.manager.config_action'); $manager = $this->container->get('plugin.manager.config_action');
$this->expectException(DuplicateConfigActionIdException::class); $this->expectException(DuplicateConfigActionIdException::class);
$this->expectExceptionMessage("The plugins 'entity_method:config_test.dynamic:setProtectedProperty' and 'config_action_duplicate_test:config_test.dynamic:setProtectedProperty' both resolve to the same shorthand action ID for the 'config_test' entity type"); $this->expectExceptionMessage("The plugins 'entity_method:config_test.dynamic:setProtectedProperty' and 'config_action_duplicate_test:config_test.dynamic:setProtectedProperty' both resolve to the same shorthand action ID for the 'config_test' entity type");
$manager->applyAction('ensure_exists', 'config_test.dynamic.action_test', ['label' => 'Action test', 'protected_property' => '']); $manager->applyAction('createIfNotExists', 'config_test.dynamic.action_test', ['label' => 'Action test', 'protected_property' => '']);
} }
/** /**
......
...@@ -77,7 +77,7 @@ name: Config actions making bad decisions ...@@ -77,7 +77,7 @@ name: Config actions making bad decisions
config: config:
actions: actions:
$config_name: $config_name:
simple_config_update: simpleConfigUpdate:
$label_key: '' $label_key: ''
YAML; YAML;
...@@ -118,7 +118,7 @@ name: Config actions making bad decisions ...@@ -118,7 +118,7 @@ name: Config actions making bad decisions
config: config:
actions: actions:
random.config: random.config:
simple_config_update: simpleConfigUpdate:
label: '' label: ''
YAML; YAML;
......
...@@ -208,7 +208,7 @@ install: ...@@ -208,7 +208,7 @@ install:
config: config:
actions: actions:
config_test.dynamic.recipe: config_test.dynamic.recipe:
ensure_exists: createIfNotExists:
label: 'Created by recipe' label: 'Created by recipe'
setBody: 'Description set by recipe' setBody: 'Description set by recipe'
YAML; YAML;
...@@ -219,6 +219,27 @@ YAML; ...@@ -219,6 +219,27 @@ YAML;
RecipeRunner::processRecipe($recipe); RecipeRunner::processRecipe($recipe);
} }
/**
* Tests that renamed plugins are marked as deprecated.
*
* @group legacy
*/
public function testRenamedConfigActions(): void {
$recipe_data = <<<YAML
name: Renamed config action
install:
- config_test
config:
actions:
config_test.dynamic.recipe:
ensure_exists:
label: 'Created by recipe'
YAML;
$recipe = $this->createRecipe($recipe_data);
$this->expectDeprecation('The plugin ID "entity_create:ensure_exists" is deprecated in drupal:10.3.1 and will be removed in drupal:12.0.0. Use "entity_create:createIfNotExists" instead. See https://www.drupal.org/node/3458273.');
RecipeRunner::processRecipe($recipe);
}
public function testRecipesAreDisambiguatedByPath(): void { public function testRecipesAreDisambiguatedByPath(): void {
$recipe_data = <<<YAML $recipe_data = <<<YAML
name: 'Recipe include' name: 'Recipe include'
......
...@@ -264,7 +264,7 @@ install: ...@@ -264,7 +264,7 @@ install:
config: config:
actions: actions:
config_test.dynamic.recipe: config_test.dynamic.recipe:
ensure_exists: createIfNotExists:
label: 'Created by recipe' label: 'Created by recipe'
setProtectedProperty: 'Set by recipe' setProtectedProperty: 'Set by recipe'
YAML, YAML,
......
...@@ -122,7 +122,7 @@ name: 'Wildcards gone wild...' ...@@ -122,7 +122,7 @@ name: 'Wildcards gone wild...'
config: config:
actions: actions:
$expression: $expression:
simple_config_update: simpleConfigUpdate:
label: 'Changed by config action' label: 'Changed by config action'
YAML; YAML;
$recipe = $this->createRecipe($contents); $recipe = $this->createRecipe($contents);
......
// cspell:ignore is-autocompleting
module.exports = { module.exports = {
'@tags': ['core'], '@tags': ['core'],
...@@ -28,7 +30,8 @@ module.exports = { ...@@ -28,7 +30,8 @@ module.exports = {
.waitForElementVisible('body', 1000); .waitForElementVisible('body', 1000);
// Tests that entering a character from the // Tests that entering a character from the
// data-autocomplete-first-character-blacklist doesn't start autocompleting. // data-autocomplete-first-character-blacklist doesn't start the
// autocomplete process.
browser browser
.setValue('[name="autocomplete_4"]', '/') .setValue('[name="autocomplete_4"]', '/')
.pause(1000) .pause(1000)
......
...@@ -462,6 +462,19 @@ class FormValidatorTest extends UnitTestCase { ...@@ -462,6 +462,19 @@ class FormValidatorTest extends UnitTestCase {
'Test cannot be longer than <em class="placeholder">7</em> characters but is currently <em class="placeholder">8</em> characters long.', 'Test cannot be longer than <em class="placeholder">7</em> characters but is currently <em class="placeholder">8</em> characters long.',
FALSE, FALSE,
], ],
[
[
'#type' => 'select',
'#options' => [
'foo' => 'Foo',
'bar' => 'Bar',
],
'#value' => [[]],
'#multiple' => TRUE,
],
'The submitted value type <em class="placeholder">array</em> in the <em class="placeholder">Test</em> element is not allowed.',
TRUE,
],
]; ];
} }
......
...@@ -157,7 +157,7 @@ class MailManagerTest extends UnitTestCase { ...@@ -157,7 +157,7 @@ class MailManagerTest extends UnitTestCase {
public function testGetInstance(): void { public function testGetInstance(): void {
$interface = [ $interface = [
'default' => 'php_mail', 'default' => 'php_mail',
'example_testkey' => 'test_mail_collector', 'example_test_key' => 'test_mail_collector',
]; ];
$this->setUpMailManager($interface); $this->setUpMailManager($interface);
...@@ -167,7 +167,7 @@ class MailManagerTest extends UnitTestCase { ...@@ -167,7 +167,7 @@ class MailManagerTest extends UnitTestCase {
$this->assertInstanceOf('Drupal\Core\Mail\Plugin\Mail\PhpMail', $instance); $this->assertInstanceOf('Drupal\Core\Mail\Plugin\Mail\PhpMail', $instance);
// Test that a matching message_id returns the specified plugin instance. // Test that a matching message_id returns the specified plugin instance.
$options = ['module' => 'example', 'key' => 'testkey']; $options = ['module' => 'example', 'key' => 'test_key'];
$instance = $this->mailManager->getInstance($options); $instance = $this->mailManager->getInstance($options);
$this->assertInstanceOf('Drupal\Core\Mail\Plugin\Mail\TestMailCollector', $instance); $this->assertInstanceOf('Drupal\Core\Mail\Plugin\Mail\TestMailCollector', $instance);
} }
...@@ -180,7 +180,7 @@ class MailManagerTest extends UnitTestCase { ...@@ -180,7 +180,7 @@ class MailManagerTest extends UnitTestCase {
public function testMailInRenderContext(): void { public function testMailInRenderContext(): void {
$interface = [ $interface = [
'default' => 'php_mail', 'default' => 'php_mail',
'example_testkey' => 'test_mail_collector', 'example_test_key' => 'test_mail_collector',
]; ];
$this->setUpMailManager($interface); $this->setUpMailManager($interface);
......
...@@ -5,9 +5,9 @@ install: ...@@ -5,9 +5,9 @@ install:
config: config:
actions: actions:
config_test.dynamic.recipe: config_test.dynamic.recipe:
ensure_exists: createIfNotExists:
label: 'Created by recipe' label: 'Created by recipe'
setProtectedProperty: 'Set by recipe' setProtectedProperty: 'Set by recipe'
config_test.system: config_test.system:
simple_config_update: simpleConfigUpdate:
foo: 'not bar' foo: 'not bar'
...@@ -5,5 +5,5 @@ install: ...@@ -5,5 +5,5 @@ install:
config: config:
actions: actions:
node.settings: node.settings:
simple_config_update: simpleConfigUpdate:
use_admin_theme: true use_admin_theme: true
...@@ -5,5 +5,5 @@ recipes: ...@@ -5,5 +5,5 @@ recipes:
config: config:
actions: actions:
node.settings: node.settings:
simple_config_update: simpleConfigUpdate:
use_admin_theme: true use_admin_theme: true
...@@ -5,5 +5,5 @@ recipes: ...@@ -5,5 +5,5 @@ recipes:
config: config:
actions: actions:
node.settings: node.settings:
simple_config_update: simpleConfigUpdate:
use_admin_theme: true use_admin_theme: true
...@@ -15,5 +15,5 @@ config: ...@@ -15,5 +15,5 @@ config:
# This will cause a validation error, which will trigger a rollback. # This will cause a validation error, which will trigger a rollback.
# The rollback should fail, since the Media module can't be uninstalled # The rollback should fail, since the Media module can't be uninstalled
# now that the plain_text format is using one of its filters. # now that the plain_text format is using one of its filters.
simple_config_update: simpleConfigUpdate:
non_existent_key: whatever! non_existent_key: whatever!
...@@ -152,6 +152,7 @@ libraries-extend: ...@@ -152,6 +152,7 @@ libraries-extend:
- claro/drupal.node.preview - claro/drupal.node.preview
views/views.module: views/views.module:
- claro/views - claro/views
views_ui/admin.styling:
- claro/views_ui - claro/views_ui
media/media_embed_ckeditor_theme: media/media_embed_ckeditor_theme:
- claro/classy.media_embed_ckeditor_theme - claro/classy.media_embed_ckeditor_theme
......
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
* @see autocomplete.js * @see autocomplete.js
*/ */
/* cspell:ignore is-autocompleting */
/** /**
* Since the autocomplete library is attached conditionally and not globally, * Since the autocomplete library is attached conditionally and not globally,
* we can be 99% sure that the default icon will be used. * we can be 99% sure that the default icon will be used.
...@@ -19,14 +21,14 @@ ...@@ -19,14 +21,14 @@
* autocomplete input's background — until are sure that it will be pushed by * autocomplete input's background — until are sure that it will be pushed by
* the server with HTTP/2. * the server with HTTP/2.
* *
* The autocompleting (active) state's background-image is inlined because * The active autocomplete state's background-image is inlined because non-used
* non-used CSS selectors are usually ignored; popular browsers don't download * CSS selectors are usually ignored; popular browsers don't download their
* their 'url' references. * 'url' references.
* If these selectors become active, the browser needs some time for painting * If these selectors become active, the browser needs some time for painting
* previously ignored remote asset: it should get it from server, parse it and * previously ignored remote asset: it should get it from server, parse it and
* repaint the background of autocomplete field. With the inlined background we * repaint the background of autocomplete field. With the inlined background we
* can prevent an additional timeout caused by a new request/response pair. * can prevent an additional timeout caused by a new request/response pair.
* Besides this, the autocompleting event itself may easily finish before the * Besides this, the autocomplete event itself may easily finish before the
* missing asset gets downloaded/parsed/painted, and the missing instant visual * missing asset gets downloaded/parsed/painted, and the missing instant visual
* feedback would be a usability/accessibility issue as well. * feedback would be a usability/accessibility issue as well.
*/ */
...@@ -53,7 +55,7 @@ ...@@ -53,7 +55,7 @@
} }
/** /**
* Autocomplete wrapper for autocompleting message. * Autocomplete wrapper for autocomplete message.
*/ */
.claro-autocomplete { .claro-autocomplete {
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
* @see autocomplete.js * @see autocomplete.js
*/ */
/* cspell:ignore is-autocompleting */
/** /**
* Since the autocomplete library is attached conditionally and not globally, * Since the autocomplete library is attached conditionally and not globally,
* we can be 99% sure that the default icon will be used. * we can be 99% sure that the default icon will be used.
...@@ -12,14 +14,14 @@ ...@@ -12,14 +14,14 @@
* autocomplete input's background — until are sure that it will be pushed by * autocomplete input's background — until are sure that it will be pushed by
* the server with HTTP/2. * the server with HTTP/2.
* *
* The autocompleting (active) state's background-image is inlined because * The active autocomplete state's background-image is inlined because non-used
* non-used CSS selectors are usually ignored; popular browsers don't download * CSS selectors are usually ignored; popular browsers don't download their
* their 'url' references. * 'url' references.
* If these selectors become active, the browser needs some time for painting * If these selectors become active, the browser needs some time for painting
* previously ignored remote asset: it should get it from server, parse it and * previously ignored remote asset: it should get it from server, parse it and
* repaint the background of autocomplete field. With the inlined background we * repaint the background of autocomplete field. With the inlined background we
* can prevent an additional timeout caused by a new request/response pair. * can prevent an additional timeout caused by a new request/response pair.
* Besides this, the autocompleting event itself may easily finish before the * Besides this, the autocomplete event itself may easily finish before the
* missing asset gets downloaded/parsed/painted, and the missing instant visual * missing asset gets downloaded/parsed/painted, and the missing instant visual
* feedback would be a usability/accessibility issue as well. * feedback would be a usability/accessibility issue as well.
*/ */
...@@ -50,7 +52,7 @@ ...@@ -50,7 +52,7 @@
} }
/** /**
* Autocomplete wrapper for autocompleting message. * Autocomplete wrapper for autocomplete message.
*/ */
.claro-autocomplete { .claro-autocomplete {
position: relative; position: relative;
......
...@@ -28,33 +28,23 @@ ...@@ -28,33 +28,23 @@
padding: 0; padding: 0;
} }
.table-file-multiple-widget .tabledrag-handle { .table-file-multiple-widget .tabledrag-handle,
float: left; /* LTR */ .table-file-multiple-widget .tabledrag-changed {
} float: left;
[dir="rtl"] .table-file-multiple-widget .tabledrag-handle {
float: right;
} }
.table-file-multiple-widget .tabledrag-changed { .table-file-multiple-widget .tabledrag-changed {
float: left; /* LTR */
line-height: calc(var(--tabledrag-handle-icon-size) + calc(var(--space-xs) * 2)); line-height: calc(var(--tabledrag-handle-icon-size) + calc(var(--space-xs) * 2));
} }
[dir="rtl"] .table-file-multiple-widget .tabledrag-changed {
float: left;
}
.table-file-multiple-widget td { .table-file-multiple-widget td {
height: calc(var(--space-m) * 3); height: calc(var(--space-m) * 3);
padding-block: var(--space-m);
} }
.table-file-multiple-widget td > :first-child { .table-file-multiple-widget td > :first-child,
margin-top: 0;
}
.table-file-multiple-widget td > :last-child { .table-file-multiple-widget td > :last-child {
margin-bottom: 0; margin-block: 0;
} }
.table-file-multiple-widget .button.button:only-child { .table-file-multiple-widget .button.button:only-child {
...@@ -68,20 +58,19 @@ ...@@ -68,20 +58,19 @@
font-size: var(--font-size-s); font-size: var(--font-size-s);
} }
.table-file-multiple-widget td {
padding-top: var(--space-m);
padding-bottom: var(--space-m);
}
.table-file-multiple-widget .tabledrag-cell { .table-file-multiple-widget .tabledrag-cell {
padding-top: var(--space-xs); padding-block: var(--space-xs);
padding-bottom: var(--space-xs);
} }
.table-file-multiple-widget .checkbox .form-type--boolean { .table-file-multiple-widget .checkbox .form-type--boolean {
line-height: calc(var(--space-m) * 3); line-height: calc(var(--space-m) * 3);
} }
[dir="rtl"] .table-file-multiple-widget .tabledrag-handle,
[dir="rtl"] .table-file-multiple-widget .tabledrag-changed {
float: right;
}
.no-touchevents .table-file-multiple-widget .checkbox .form-type--boolean { .no-touchevents .table-file-multiple-widget .checkbox .form-type--boolean {
line-height: var(--line-height); line-height: var(--line-height);
} }
...@@ -101,7 +90,7 @@ ...@@ -101,7 +90,7 @@
*/ */
.table-file-multiple-widget--no-upload > tbody:last-child > tr:last-child { .table-file-multiple-widget--no-upload > tbody:last-child > tr:last-child {
border-bottom: 0; border-block-end: 0;
} }
/** /**
...@@ -110,12 +99,9 @@ ...@@ -110,12 +99,9 @@
@media screen and (max-width: 37.5em) { @media screen and (max-width: 37.5em) {
.claro-details__wrapper .file-widget-multiple__table-wrapper { .claro-details__wrapper .file-widget-multiple__table-wrapper {
margin-right: calc(var(--space-m) * -1); margin-inline: calc(var(--space-m) * -1);
margin-left: calc(var(--space-m) * -1);
} }
.claro-details__wrapper .file-widget-multiple__table-wrapper > :not(table) { .claro-details__wrapper .file-widget-multiple__table-wrapper > :not(table) {
margin-right: var(--space-m); margin-inline: var(--space-m);
margin-left: var(--space-m);
} }
} }
...@@ -3,73 +3,59 @@ ...@@ -3,73 +3,59 @@
* Styles for multiple file widget table. * Styles for multiple file widget table.
*/ */
.table-file-multiple-widget tbody { .table-file-multiple-widget {
vertical-align: top; & tbody {
} vertical-align: top;
}
.table-file-multiple-widget .tabledrag-cell-content { & .tabledrag-cell-content {
position: relative; position: relative;
display: block; display: block;
height: auto; height: auto;
}
& > * {
.table-file-multiple-widget .tabledrag-cell-content > * { display: block;
display: block; }
} }
& .tabledrag-cell-content__item {
.table-file-multiple-widget .tabledrag-cell-content__item { padding: 0;
padding: 0; }
} & .tabledrag-handle,
& .tabledrag-changed {
.table-file-multiple-widget .tabledrag-handle { float: left;
float: left; /* LTR */ }
} & .tabledrag-changed {
[dir="rtl"] .table-file-multiple-widget .tabledrag-handle { line-height: calc(var(--tabledrag-handle-icon-size) + calc(var(--space-xs) * 2));
float: right; }
} & td {
height: calc(var(--space-m) * 3);
.table-file-multiple-widget .tabledrag-changed { padding-block: var(--space-m);
float: left; /* LTR */ & > :first-child,
line-height: calc(var(--tabledrag-handle-icon-size) + calc(var(--space-xs) * 2)); & > :last-child {
} margin-block: 0;
[dir="rtl"] .table-file-multiple-widget .tabledrag-changed { }
float: left; }
} & .button.button:only-child {
margin: 0;
.table-file-multiple-widget td { }
height: calc(var(--space-m) * 3); & th {
} height: calc(var(--space-m) * 2);
color: var(--color-gray-800);
.table-file-multiple-widget td > :first-child { background: var(--color-gray-050);
margin-top: 0; font-size: var(--font-size-s);
} }
.table-file-multiple-widget td > :last-child { & .tabledrag-cell {
margin-bottom: 0; padding-block: var(--space-xs);
} }
& .checkbox .form-type--boolean {
.table-file-multiple-widget .button.button:only-child { line-height: calc(var(--space-m) * 3);
margin: 0; }
}
.table-file-multiple-widget th {
height: calc(var(--space-m) * 2);
color: var(--color-gray-800);
background: var(--color-gray-050);
font-size: var(--font-size-s);
}
.table-file-multiple-widget td {
padding-top: var(--space-m);
padding-bottom: var(--space-m);
}
.table-file-multiple-widget .tabledrag-cell {
padding-top: var(--space-xs);
padding-bottom: var(--space-xs);
} }
.table-file-multiple-widget .checkbox .form-type--boolean { [dir="rtl"] .table-file-multiple-widget {
line-height: calc(var(--space-m) * 3); & .tabledrag-handle,
& .tabledrag-changed {
float: right;
}
} }
.no-touchevents .table-file-multiple-widget .checkbox .form-type--boolean { .no-touchevents .table-file-multiple-widget .checkbox .form-type--boolean {
...@@ -89,7 +75,7 @@ ...@@ -89,7 +75,7 @@
* (A full file widget with limited cardinality.) * (A full file widget with limited cardinality.)
*/ */
.table-file-multiple-widget--no-upload > tbody:last-child > tr:last-child { .table-file-multiple-widget--no-upload > tbody:last-child > tr:last-child {
border-bottom: 0; border-block-end: 0;
} }
/** /**
...@@ -97,12 +83,9 @@ ...@@ -97,12 +83,9 @@
*/ */
@media screen and (max-width: 37.5em) { @media screen and (max-width: 37.5em) {
.claro-details__wrapper .file-widget-multiple__table-wrapper { .claro-details__wrapper .file-widget-multiple__table-wrapper {
margin-right: calc(var(--space-m) * -1); margin-inline: calc(var(--space-m) * -1);
margin-left: calc(var(--space-m) * -1); & > :not(table) {
} margin-inline: var(--space-m);
}
.claro-details__wrapper .file-widget-multiple__table-wrapper > :not(table) {
margin-right: var(--space-m);
margin-left: var(--space-m);
} }
} }
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
* Claro's enhancement for autocomplete form element. * Claro's enhancement for autocomplete form element.
*/ */
// cspell:ignore is-autocompleting
(($, Drupal, once) => { (($, Drupal, once) => {
Drupal.behaviors.claroAutoCompete = { Drupal.behaviors.claroAutoCompete = {
attach(context) { attach(context) {
......
...@@ -110,3 +110,9 @@ ...@@ -110,3 +110,9 @@
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
} }
/* Reset width set by layout.css */
body.is-fixed .site-header__inner__container {
width: auto;
}
...@@ -105,3 +105,8 @@ body:not(.is-always-mobile-nav) .site-header__fixable.is-fixed:not(.is-expanded) ...@@ -105,3 +105,8 @@ body:not(.is-always-mobile-nav) .site-header__fixable.is-fixed:not(.is-expanded)
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
} }
/* Reset width set by layout.css */
body.is-fixed .site-header__inner__container {
width: auto;
}
...@@ -3033,17 +3033,17 @@ ...@@ -3033,17 +3033,17 @@
}, },
{ {
"name": "drupal/core", "name": "drupal/core",
"version": "10.3.0", "version": "10.3.1",
"version_normalized": "10.3.0.0", "version_normalized": "10.3.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/drupal/core.git", "url": "https://github.com/drupal/core.git",
"reference": "6f1af3070110d7d0f2a6671bea26add34667f765" "reference": "d137403a30d4154404e473785f48dfc889d77e23"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/drupal/core/zipball/6f1af3070110d7d0f2a6671bea26add34667f765", "url": "https://api.github.com/repos/drupal/core/zipball/d137403a30d4154404e473785f48dfc889d77e23",
"reference": "6f1af3070110d7d0f2a6671bea26add34667f765", "reference": "d137403a30d4154404e473785f48dfc889d77e23",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
...@@ -3123,7 +3123,7 @@ ...@@ -3123,7 +3123,7 @@
"suggest": { "suggest": {
"ext-zip": "Needed to extend the plugin.manager.archiver service capability with the handling of files in the ZIP format." "ext-zip": "Needed to extend the plugin.manager.archiver service capability with the handling of files in the ZIP format."
}, },
"time": "2024-06-20T18:58:42+00:00", "time": "2024-07-04T11:33:45+00:00",
"type": "drupal-core", "type": "drupal-core",
"extra": { "extra": {
"drupal-scaffold": { "drupal-scaffold": {
...@@ -3201,14 +3201,14 @@ ...@@ -3201,14 +3201,14 @@
], ],
"description": "Drupal is an open source content management platform powering millions of websites and applications.", "description": "Drupal is an open source content management platform powering millions of websites and applications.",
"support": { "support": {
"source": "https://github.com/drupal/core/tree/10.3.0" "source": "https://github.com/drupal/core/tree/10.3.1"
}, },
"install-path": "../../core" "install-path": "../../core"
}, },
{ {
"name": "drupal/core-composer-scaffold", "name": "drupal/core-composer-scaffold",
"version": "10.3.0", "version": "10.3.1",
"version_normalized": "10.3.0.0", "version_normalized": "10.3.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/drupal/core-composer-scaffold.git", "url": "https://github.com/drupal/core-composer-scaffold.git",
...@@ -3254,14 +3254,14 @@ ...@@ -3254,14 +3254,14 @@
"drupal" "drupal"
], ],
"support": { "support": {
"source": "https://github.com/drupal/core-composer-scaffold/tree/10.3.0" "source": "https://github.com/drupal/core-composer-scaffold/tree/10.3.1"
}, },
"install-path": "../drupal/core-composer-scaffold" "install-path": "../drupal/core-composer-scaffold"
}, },
{ {
"name": "drupal/core-project-message", "name": "drupal/core-project-message",
"version": "10.3.0", "version": "10.3.1",
"version_normalized": "10.3.0.0", "version_normalized": "10.3.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/drupal/core-project-message.git", "url": "https://github.com/drupal/core-project-message.git",
...@@ -3304,17 +3304,17 @@ ...@@ -3304,17 +3304,17 @@
}, },
{ {
"name": "drupal/core-recommended", "name": "drupal/core-recommended",
"version": "10.3.0", "version": "10.3.1",
"version_normalized": "10.3.0.0", "version_normalized": "10.3.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/drupal/core-recommended.git", "url": "https://github.com/drupal/core-recommended.git",
"reference": "991f849f74e585597b1f7b11daf9acf79b546939" "reference": "a5183f2be315b7e5deec89fdeafe9fc9a2e54f57"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/drupal/core-recommended/zipball/991f849f74e585597b1f7b11daf9acf79b546939", "url": "https://api.github.com/repos/drupal/core-recommended/zipball/a5183f2be315b7e5deec89fdeafe9fc9a2e54f57",
"reference": "991f849f74e585597b1f7b11daf9acf79b546939", "reference": "a5183f2be315b7e5deec89fdeafe9fc9a2e54f57",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
...@@ -3323,7 +3323,7 @@ ...@@ -3323,7 +3323,7 @@
"doctrine/annotations": "~1.14.3", "doctrine/annotations": "~1.14.3",
"doctrine/deprecations": "~1.1.3", "doctrine/deprecations": "~1.1.3",
"doctrine/lexer": "~2.1.1", "doctrine/lexer": "~2.1.1",
"drupal/core": "10.3.0", "drupal/core": "10.3.1",
"egulias/email-validator": "~4.0.2", "egulias/email-validator": "~4.0.2",
"guzzlehttp/guzzle": "~7.8.1", "guzzlehttp/guzzle": "~7.8.1",
"guzzlehttp/promises": "~2.0.2", "guzzlehttp/promises": "~2.0.2",
...@@ -3377,7 +3377,7 @@ ...@@ -3377,7 +3377,7 @@
"conflict": { "conflict": {
"webflo/drupal-core-strict": "*" "webflo/drupal-core-strict": "*"
}, },
"time": "2024-06-20T18:58:42+00:00", "time": "2024-07-04T11:33:45+00:00",
"type": "metapackage", "type": "metapackage",
"notification-url": "https://packagist.org/downloads/", "notification-url": "https://packagist.org/downloads/",
"license": [ "license": [
...@@ -3385,7 +3385,7 @@ ...@@ -3385,7 +3385,7 @@
], ],
"description": "Core and its dependencies with known-compatible minor versions. Require this project INSTEAD OF drupal/core.", "description": "Core and its dependencies with known-compatible minor versions. Require this project INSTEAD OF drupal/core.",
"support": { "support": {
"source": "https://github.com/drupal/core-recommended/tree/10.3.0" "source": "https://github.com/drupal/core-recommended/tree/10.3.1"
}, },
"install-path": null "install-path": null
}, },
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
'name' => 'drupal/recommended-project', 'name' => 'drupal/recommended-project',
'pretty_version' => '10.3.x-dev', 'pretty_version' => '10.3.x-dev',
'version' => '10.3.9999999.9999999-dev', 'version' => '10.3.9999999.9999999-dev',
'reference' => 'd5d3a9a4c04c7d1e169cf2acf18008a3e4c73fc6', 'reference' => 'a8127491e88d6a95ce4c3f41f0fa576c9874bb25',
'type' => 'project', 'type' => 'project',
'install_path' => __DIR__ . '/../../', 'install_path' => __DIR__ . '/../../',
'aliases' => array(), 'aliases' => array(),
...@@ -416,9 +416,9 @@ ...@@ -416,9 +416,9 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'drupal/core' => array( 'drupal/core' => array(
'pretty_version' => '10.3.0', 'pretty_version' => '10.3.1',
'version' => '10.3.0.0', 'version' => '10.3.1.0',
'reference' => '6f1af3070110d7d0f2a6671bea26add34667f765', 'reference' => 'd137403a30d4154404e473785f48dfc889d77e23',
'type' => 'drupal-core', 'type' => 'drupal-core',
'install_path' => __DIR__ . '/../../core', 'install_path' => __DIR__ . '/../../core',
'aliases' => array(), 'aliases' => array(),
...@@ -427,24 +427,24 @@ ...@@ -427,24 +427,24 @@
'drupal/core-annotation' => array( 'drupal/core-annotation' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-assertion' => array( 'drupal/core-assertion' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-class-finder' => array( 'drupal/core-class-finder' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-composer-scaffold' => array( 'drupal/core-composer-scaffold' => array(
'pretty_version' => '10.3.0', 'pretty_version' => '10.3.1',
'version' => '10.3.0.0', 'version' => '10.3.1.0',
'reference' => 'a1a186caeb89899143e0c6912ccee9d3d7181dbe', 'reference' => 'a1a186caeb89899143e0c6912ccee9d3d7181dbe',
'type' => 'composer-plugin', 'type' => 'composer-plugin',
'install_path' => __DIR__ . '/../drupal/core-composer-scaffold', 'install_path' => __DIR__ . '/../drupal/core-composer-scaffold',
...@@ -454,90 +454,90 @@ ...@@ -454,90 +454,90 @@
'drupal/core-datetime' => array( 'drupal/core-datetime' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-dependency-injection' => array( 'drupal/core-dependency-injection' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-diff' => array( 'drupal/core-diff' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-discovery' => array( 'drupal/core-discovery' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-event-dispatcher' => array( 'drupal/core-event-dispatcher' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-file-cache' => array( 'drupal/core-file-cache' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-file-security' => array( 'drupal/core-file-security' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-filesystem' => array( 'drupal/core-filesystem' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-front-matter' => array( 'drupal/core-front-matter' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-gettext' => array( 'drupal/core-gettext' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-graph' => array( 'drupal/core-graph' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-http-foundation' => array( 'drupal/core-http-foundation' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-php-storage' => array( 'drupal/core-php-storage' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-plugin' => array( 'drupal/core-plugin' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-project-message' => array( 'drupal/core-project-message' => array(
'pretty_version' => '10.3.0', 'pretty_version' => '10.3.1',
'version' => '10.3.0.0', 'version' => '10.3.1.0',
'reference' => 'd1da83722735cb0f7ccabf9fef7b5607b442c3a8', 'reference' => 'd1da83722735cb0f7ccabf9fef7b5607b442c3a8',
'type' => 'composer-plugin', 'type' => 'composer-plugin',
'install_path' => __DIR__ . '/../drupal/core-project-message', 'install_path' => __DIR__ . '/../drupal/core-project-message',
...@@ -547,13 +547,13 @@ ...@@ -547,13 +547,13 @@
'drupal/core-proxy-builder' => array( 'drupal/core-proxy-builder' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-recommended' => array( 'drupal/core-recommended' => array(
'pretty_version' => '10.3.0', 'pretty_version' => '10.3.1',
'version' => '10.3.0.0', 'version' => '10.3.1.0',
'reference' => '991f849f74e585597b1f7b11daf9acf79b546939', 'reference' => 'a5183f2be315b7e5deec89fdeafe9fc9a2e54f57',
'type' => 'metapackage', 'type' => 'metapackage',
'install_path' => null, 'install_path' => null,
'aliases' => array(), 'aliases' => array(),
...@@ -562,37 +562,37 @@ ...@@ -562,37 +562,37 @@
'drupal/core-render' => array( 'drupal/core-render' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-serialization' => array( 'drupal/core-serialization' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-transliteration' => array( 'drupal/core-transliteration' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-utility' => array( 'drupal/core-utility' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-uuid' => array( 'drupal/core-uuid' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/core-version' => array( 'drupal/core-version' => array(
'dev_requirement' => false, 'dev_requirement' => false,
'replaced' => array( 'replaced' => array(
0 => '10.3.0', 0 => '10.3.1',
), ),
), ),
'drupal/crop' => array( 'drupal/crop' => array(
...@@ -1102,7 +1102,7 @@ ...@@ -1102,7 +1102,7 @@
'drupal/recommended-project' => array( 'drupal/recommended-project' => array(
'pretty_version' => '10.3.x-dev', 'pretty_version' => '10.3.x-dev',
'version' => '10.3.9999999.9999999-dev', 'version' => '10.3.9999999.9999999-dev',
'reference' => 'd5d3a9a4c04c7d1e169cf2acf18008a3e4c73fc6', 'reference' => 'a8127491e88d6a95ce4c3f41f0fa576c9874bb25',
'type' => 'project', 'type' => 'project',
'install_path' => __DIR__ . '/../../', 'install_path' => __DIR__ . '/../../',
'aliases' => array(), 'aliases' => array(),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment