diff --git a/composer.json b/composer.json index 9b8fa8c6304ba73949d74676d65e2fb13e35ca6e..ff79da4a42158d1d845f2a3294e8b34a04a1b00a 100644 --- a/composer.json +++ b/composer.json @@ -111,7 +111,7 @@ "drupal/editor_advanced_link": "1.8", "drupal/embed": "1.4", "drupal/entity": "1.2", - "drupal/entity_browser": "1.10", + "drupal/entity_browser": "2.6", "drupal/entity_clone": "1.0.0-beta5", "drupal/entity_embed": "1.1", "drupal/entity_reference_revisions": "1.9", @@ -297,4 +297,4 @@ "php": "7.3" } } -} \ No newline at end of file +} diff --git a/composer.lock b/composer.lock index a6998f9407383128cfe3cd6be3baee4d12c68aa9..544f3cf2595db706c346133f9c51376d23fba7d4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b66a2b43b306587d15fdf11ea2858c8e", + "content-hash": "645bbe82bd778fc34efc567bb3d8b766", "packages": [ { "name": "alchemy/zippy", @@ -4094,36 +4094,35 @@ }, { "name": "drupal/entity_browser", - "version": "1.10.0", + "version": "2.6.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/entity_browser.git", - "reference": "8.x-1.10" + "reference": "8.x-2.6" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/entity_browser-8.x-1.10.zip", - "reference": "8.x-1.10", - "shasum": "1a6b9f293f4763759fee2362ed7566f270829356" + "url": "https://ftp.drupal.org/files/projects/entity_browser-8.x-2.6.zip", + "reference": "8.x-2.6", + "shasum": "95cad4ce9620ccb4f02afa0e8b8bbf7c73fc5aac" }, "require": { - "drupal/core": "^8.7.7 || ^9" + "drupal/core": "^8.8 || ^9" }, "require-dev": { "drupal/embed": "~1.0", - "drupal/entity": "~1.0", - "drupal/entity_embed": "~1.0", - "drupal/entityqueue": "~1.0", - "drupal/inline_entity_form": "~1.0", - "drupal/media_entity": "~1.0", - "drupal/paragraphs": "~1.0", + "drupal/entity_embed": "1.x-dev", + "drupal/entity_reference_revisions": "1.x-dev", + "drupal/entityqueue": "1.x-dev", + "drupal/inline_entity_form": "1.x-dev", + "drupal/paragraphs": "1.x-dev", "drupal/token": "~1.0" }, "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-1.10", - "datestamp": "1579563787", + "version": "8.x-2.6", + "datestamp": "1624401306", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php index d10cf1dfe638af1c3084458ed964d208e446c1b7..191152d918c46e75026532b8dd085aa2eaf4817b 100644 --- a/vendor/composer/InstalledVersions.php +++ b/vendor/composer/InstalledVersions.php @@ -20,8 +20,6 @@ - - class InstalledVersions { private static $installed = array ( @@ -32,7 +30,7 @@ class InstalledVersions 'aliases' => array ( ), - 'reference' => 'a971e84acff6246067d76e462156e6664731e864', + 'reference' => 'f4d37384d45bb2889df4d388c99bdb1a8deae5f9', 'name' => 'osu-asc-webservices/d8-upstream', ), 'versions' => @@ -975,12 +973,12 @@ class InstalledVersions ), 'drupal/entity_browser' => array ( - 'pretty_version' => '1.10.0', - 'version' => '1.10.0.0', + 'pretty_version' => '2.6.0', + 'version' => '2.6.0.0', 'aliases' => array ( ), - 'reference' => '8.x-1.10', + 'reference' => '8.x-2.6', ), 'drupal/entity_browser_entity_form' => array ( @@ -2262,7 +2260,7 @@ class InstalledVersions 'aliases' => array ( ), - 'reference' => 'a971e84acff6246067d76e462156e6664731e864', + 'reference' => 'f4d37384d45bb2889df4d388c99bdb1a8deae5f9', ), 'pantheon-systems/quicksilver-pushback' => array ( @@ -3118,6 +3116,7 @@ public static function getInstalledPackages() $packages[] = array_keys($installed['versions']); } + if (1 === \count($packages)) { return $packages[0]; } @@ -3281,11 +3280,8 @@ public static function getRootPackage() - public static function getRawData() { -@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); - return self::$installed; } @@ -3295,17 +3291,6 @@ public static function getRawData() -public static function getAllRawData() -{ -return self::getInstalled(); -} - - - - - - - @@ -3327,7 +3312,6 @@ public static function reload($data) - private static function getInstalled() { if (null === self::$canGetVendors) { diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 4d3c1db90ad69f89b5c3a45bc5be757306f418a2..ec92c95018fed230fd1d6c1dece7cf68389ad659 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -4159,40 +4159,36 @@ }, { "name": "drupal/entity_browser", - "version": "1.10.0", - "version_normalized": "1.10.0.0", + "version": "2.6.0", + "version_normalized": "2.6.0.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/entity_browser.git", - "reference": "8.x-1.10" + "reference": "8.x-2.6" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/entity_browser-8.x-1.10.zip", - "reference": "8.x-1.10", - "shasum": "1a6b9f293f4763759fee2362ed7566f270829356" + "url": "https://ftp.drupal.org/files/projects/entity_browser-8.x-2.6.zip", + "reference": "8.x-2.6", + "shasum": "95cad4ce9620ccb4f02afa0e8b8bbf7c73fc5aac" }, "require": { - "drupal/core": "^8.7.7 || ^9" + "drupal/core": "^8.8 || ^9" }, "require-dev": { "drupal/embed": "~1.0", - "drupal/entity": "~1.0", - "drupal/entity_embed": "~1.0", - "drupal/entityqueue": "~1.0", - "drupal/inline_entity_form": "~1.0", - "drupal/media_entity": "~1.0", - "drupal/paragraphs": "~1.0", + "drupal/entity_embed": "1.x-dev", + "drupal/entity_reference_revisions": "1.x-dev", + "drupal/entityqueue": "1.x-dev", + "drupal/inline_entity_form": "1.x-dev", + "drupal/paragraphs": "1.x-dev", "drupal/token": "~1.0" }, "type": "drupal-module", "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - }, "drupal": { - "version": "8.x-1.10", - "datestamp": "1579563787", + "version": "8.x-2.6", + "datestamp": "1624401306", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 3616e8059dec3af568f6a1a8b21c7261b86c3851..10671559eb10a27b54d4788ed2782ee5b0f389e9 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -6,7 +6,7 @@ 'aliases' => array ( ), - 'reference' => 'a971e84acff6246067d76e462156e6664731e864', + 'reference' => 'f4d37384d45bb2889df4d388c99bdb1a8deae5f9', 'name' => 'osu-asc-webservices/d8-upstream', ), 'versions' => @@ -949,12 +949,12 @@ ), 'drupal/entity_browser' => array ( - 'pretty_version' => '1.10.0', - 'version' => '1.10.0.0', + 'pretty_version' => '2.6.0', + 'version' => '2.6.0.0', 'aliases' => array ( ), - 'reference' => '8.x-1.10', + 'reference' => '8.x-2.6', ), 'drupal/entity_browser_entity_form' => array ( @@ -2236,7 +2236,7 @@ 'aliases' => array ( ), - 'reference' => 'a971e84acff6246067d76e462156e6664731e864', + 'reference' => 'f4d37384d45bb2889df4d388c99bdb1a8deae5f9', ), 'pantheon-systems/quicksilver-pushback' => array ( diff --git a/web/modules/entity_browser/composer.json b/web/modules/entity_browser/composer.json index 2b970368df5517ca92ba9e9e68cd1f37a90db5f8..d57e461de646552ae18d76bc7ec1876f452c8f96 100644 --- a/web/modules/entity_browser/composer.json +++ b/web/modules/entity_browser/composer.json @@ -28,16 +28,15 @@ "license": "GPL-2.0+", "minimum-stability": "dev", "require": { - "drupal/core": "^8.7.7 || ^9" + "drupal/core": "^8.8 || ^9" }, "require-dev": { "drupal/token": "~1.0", - "drupal/inline_entity_form": "~1.0", - "drupal/paragraphs": "~1.0", - "drupal/entity": "~1.0", - "drupal/media_entity": "~1.0", + "drupal/inline_entity_form": "1.x-dev", + "drupal/paragraphs": "1.x-dev", "drupal/embed": "~1.0", - "drupal/entity_embed": "~1.0", - "drupal/entityqueue": "~1.0" + "drupal/entity_embed": "1.x-dev", + "drupal/entityqueue": "1.x-dev", + "drupal/entity_reference_revisions": "1.x-dev" } } diff --git a/web/modules/entity_browser/entity_browser.info.yml b/web/modules/entity_browser/entity_browser.info.yml index 6a4e303bca0d76f525b79417c14b0024644c6088..db2ac484e6ed2e70a48e12ec7c35c3d18de2be91 100644 --- a/web/modules/entity_browser/entity_browser.info.yml +++ b/web/modules/entity_browser/entity_browser.info.yml @@ -2,17 +2,10 @@ name: Entity Browser description: 'Provide a generic entity browser/picker/selector.' type: module package: Media -core_version_requirement: ^8.7.7 || ^9 -test_dependencies: - - token:token - - inline_entity_form:inline_entity_form - - media_entity:media_entity - - paragraphs:paragraphs - - embed:embed - - entity_embed:entity_embed +core_version_requirement: ^8.8 || ^9 configure: entity.entity_browser.collection -# Information added by Drupal.org packaging script on 2020-01-20 -version: '8.x-1.10' +# Information added by Drupal.org packaging script on 2021-06-22 +version: '8.x-2.6' project: 'entity_browser' -datestamp: 1579563796 +datestamp: 1624401308 diff --git a/web/modules/entity_browser/entity_browser.install b/web/modules/entity_browser/entity_browser.install index dce49e213608e6d843db76990534fa83f9b6ded1..7d43698b0d8d3d5fec2180aa75cfd154e839f1ee 100644 --- a/web/modules/entity_browser/entity_browser.install +++ b/web/modules/entity_browser/entity_browser.install @@ -5,6 +5,42 @@ * Update hooks for the Entity browser module. */ +/** + * Implements hook_requirements(). + */ +function entity_browser_requirements($phase) { + $requirements = []; + + // This branch of Entity Browser shouldn't be used with core < 8.4.x or with + // media_entity 1.x enabled. + $incompatible = FALSE; + if (\Drupal::moduleHandler()->moduleExists('media_entity')) { + $info = \Drupal::service('extension.list.module')->getExtensionInfo('media_entity'); + if (empty($info['version'])) { + // If the version being used is -dev, $info['version'] will be empty. Try + // an alternative method to detect if we are using the 2.x branch in that + // case. + if (!file_exists(DRUPAL_ROOT . '/' . drupal_get_path('module', 'media_entity') . '/src/CliService.php')) { + $incompatible = TRUE; + } + } + elseif (version_compare($info['version'], '8.x-2') < 0) { + $incompatible = TRUE; + } + } + + if ($incompatible) { + $requirements['entity_browser_media'] = [ + 'title' => t('Entity Browser'), + 'value' => t('This branch of Entity Browser is not compatible with the version of Media Entity installed.'), + 'description' => t('This branch of Entity Browser is not compatible with the version of Media Entity installed.'), + 'severity' => REQUIREMENT_ERROR, + ]; + } + + return $requirements; +} + /** * Updates submit text for existing Entity browsers. */ @@ -59,3 +95,26 @@ function entity_browser_update_8002() { } } } + +/** + * Updates entity browsers to use the new media image upload widget plugin. + */ +function entity_browser_update_8201() { + $config_factory = \Drupal::configFactory(); + foreach ($config_factory->listAll('entity_browser.browser.') as $name) { + $config = $config_factory->getEditable($name); + $widgets = $config->get('widgets'); + $changed = FALSE; + foreach ($widgets as &$widget) { + if ($widget['id'] === 'media_entity_image_upload') { + $widget['id'] = 'media_image_upload'; + $widget['settings']['media_type'] = $widget['settings']['media_bundle']; + unset($widget['settings']['media_bundle']); + $changed = TRUE; + } + } + if ($changed) { + $config->set('widgets', $widgets)->save(TRUE); + } + } +} diff --git a/web/modules/entity_browser/entity_browser.libraries.yml b/web/modules/entity_browser/entity_browser.libraries.yml index 3bb86c86175766609a3506bec71ce60f9fc4e097..d128e9b3e7fd7661822f87a56a3fcd22bf9489eb 100644 --- a/web/modules/entity_browser/entity_browser.libraries.yml +++ b/web/modules/entity_browser/entity_browser.libraries.yml @@ -51,7 +51,7 @@ entity_reference: dependencies: - entity_browser/common - entity_browser/entity_list - - core/jquery.ui.sortable + - core/sortable file_browser: version: VERSION @@ -105,4 +105,4 @@ multi_step_display: js/entity_browser.multi_step_display.js: {} dependencies: - entity_browser/entity_list - - core/jquery.ui.sortable + - core/sortable diff --git a/web/modules/entity_browser/js/entity_browser.entity_reference.js b/web/modules/entity_browser/js/entity_browser.entity_reference.js index e3e343e809823451717debda0a9fa8b3cdbe3a59..93ee783e11756f2a0318e8030f46e6c73bbc3b89 100644 --- a/web/modules/entity_browser/js/entity_browser.entity_reference.js +++ b/web/modules/entity_browser/js/entity_browser.entity_reference.js @@ -5,7 +5,7 @@ * browser. */ -(function ($, Drupal) { +(function ($, Drupal, Sortable) { 'use strict'; @@ -14,9 +14,13 @@ */ Drupal.behaviors.entityBrowserEntityReference = { attach: function (context) { - $(context).find('.field--widget-entity-browser-entity-reference').each(function () { - $(this).find('.entities-list.sortable').sortable({ - stop: Drupal.entityBrowserEntityReference.entitiesReordered + var sortableSelector = context.querySelectorAll('.field--widget-entity-browser-entity-reference .entities-list.sortable'); + sortableSelector.forEach(function (widget) { + Sortable.create(widget, { + draggable: '.item-container', + onEnd: function onEnd() { + return Drupal.entityBrowserEntityReference.entitiesReordered(widget); + } }); }); // The AJAX callback will give us a flag when we need to re-open the @@ -42,19 +46,17 @@ /** * Reacts on sorting of the entities. * - * @param {object} event - * Event object. - * @param {object} ui - * Object with detailed information about the sort event. + * @param {object} widget + * Object with the sortable area. */ - Drupal.entityBrowserEntityReference.entitiesReordered = function (event, ui) { - var items = $(this).find('.item-container'); + Drupal.entityBrowserEntityReference.entitiesReordered = function (widget) { + var items = $(widget).find('.item-container'); var ids = []; for (var i = 0; i < items.length; i++) { ids[i] = $(items[i]).attr('data-entity-id'); } - $(this).parent().parent().find('input[type*=hidden][name*="[target_id]"]').val(ids.join(' ')); + $(widget).parent().find('input[type*=hidden][name*="[target_id]"]').val(ids.join(' ')); }; -}(jQuery, Drupal)); +}(jQuery, Drupal, Sortable)); diff --git a/web/modules/entity_browser/js/entity_browser.multi_step_display.js b/web/modules/entity_browser/js/entity_browser.multi_step_display.js index 9fe1d9e118718e70c9114e120095aa22444c87ba..11d1d9657880e53dc71057be57a841c30e3840a3 100644 --- a/web/modules/entity_browser/js/entity_browser.multi_step_display.js +++ b/web/modules/entity_browser/js/entity_browser.multi_step_display.js @@ -2,7 +2,7 @@ * @file entity_browser.multi_step_display.js */ -(function ($, Drupal) { +(function ($, Drupal, Sortable) { 'use strict'; @@ -10,12 +10,26 @@ * Registers behaviours related to selected entities. */ Drupal.behaviors.entityBrowserMultiStepDisplay = { + + /** + * Counter for proxy elements when adding items to selection. + * + * @see Drupal.entityBrowserMultiStepDisplay.addEntities + */ + uuid: 1, + attach: function (context) { - var $entities = $(context).find('.entities-list'); - $entities.sortable({ - stop: Drupal.entityBrowserMultiStepDisplay.entitiesReordered + var sortableSelector = context.querySelectorAll('.entities-list'); + sortableSelector.forEach(function (widget) { + Sortable.create(widget, { + draggable: '.item-container', + onEnd: function onEnd() { + return Drupal.entityBrowserMultiStepDisplay.entitiesReordered(widget); + } + }); }); + var $entities = $(context).find('.entities-list'); // Register add/remove entities event handlers. $entities.once('register-add-entities') .bind('add-entities', Drupal.entityBrowserMultiStepDisplay.addEntities); @@ -61,13 +75,11 @@ /** * Reacts on sorting of the entities. * - * @param {object} event - * Event object. - * @param {object} ui - * Object with detailed information about the sort event. + * @param {object} widget + * Object with the sortable area. */ - Drupal.entityBrowserMultiStepDisplay.entitiesReordered = function (event, ui) { - var items = $(this).find('.item-container'); + Drupal.entityBrowserMultiStepDisplay.entitiesReordered = function (widget) { + var items = $(widget).find('.item-container'); for (var i = 0; i < items.length; i++) { $(items[i]).find('.weight').val(i); } @@ -121,7 +133,7 @@ for (i = 0; i < entity_ids.length; i++) { // Add proxy element that will be replaced with returned Ajax Command. - var proxy_element = $('<div></div>').uniqueId(); + var proxy_element = $('<div></div>').attr("id", "ui-id-" + ( ++Drupal.behaviors.entityBrowserMultiStepDisplay.uuid )); entities_list.append(proxy_element); Drupal.entityBrowserCommandQueue.queueCommand( @@ -136,4 +148,4 @@ entities_list.siblings('[name=ajax_commands_handler]').trigger('execute-commands', [true]); }; -}(jQuery, Drupal)); +}(jQuery, Drupal, Sortable)); diff --git a/web/modules/entity_browser/modules/entity_form/entity_browser_entity_form.info.yml b/web/modules/entity_browser/modules/entity_form/entity_browser_entity_form.info.yml index 04c941f7d6b9b4cc2efa2ede06dc73e2c9246318..25222ac9d7abda136f250cb52e5dc4986288d423 100644 --- a/web/modules/entity_browser/modules/entity_form/entity_browser_entity_form.info.yml +++ b/web/modules/entity_browser/modules/entity_form/entity_browser_entity_form.info.yml @@ -7,7 +7,7 @@ dependencies: - entity_browser:entity_browser - inline_entity_form:inline_entity_form -# Information added by Drupal.org packaging script on 2020-01-20 -version: '8.x-1.10' +# Information added by Drupal.org packaging script on 2021-06-22 +version: '8.x-2.6' project: 'entity_browser' -datestamp: 1579563796 +datestamp: 1624401308 diff --git a/web/modules/entity_browser/modules/entity_form/tests/modules/entity_browser_entity_form_test/entity_browser_entity_form_test.info.yml b/web/modules/entity_browser/modules/entity_form/tests/modules/entity_browser_entity_form_test/entity_browser_entity_form_test.info.yml index 1ab7ad9c68b471d9eb2327f59b8856fa578a958e..5d5e02d3a21afdc6da8356caaabe73385e6f7aac 100644 --- a/web/modules/entity_browser/modules/entity_form/tests/modules/entity_browser_entity_form_test/entity_browser_entity_form_test.info.yml +++ b/web/modules/entity_browser/modules/entity_form/tests/modules/entity_browser_entity_form_test/entity_browser_entity_form_test.info.yml @@ -8,7 +8,7 @@ dependencies: - entity_browser_test:entity_browser_test - drupal:views -# Information added by Drupal.org packaging script on 2020-01-20 -version: '8.x-1.10' +# Information added by Drupal.org packaging script on 2021-06-22 +version: '8.x-2.6' project: 'entity_browser' -datestamp: 1579563796 +datestamp: 1624401308 diff --git a/web/modules/entity_browser/modules/example/entity_browser_example.info.yml b/web/modules/entity_browser/modules/example/entity_browser_example.info.yml index 9f79978b3e4480b56f201dc92b6d94046813255d..9dbf52a462afbc265e65ca15e47fafc5422f4e50 100644 --- a/web/modules/entity_browser/modules/example/entity_browser_example.info.yml +++ b/web/modules/entity_browser/modules/example/entity_browser_example.info.yml @@ -11,7 +11,7 @@ dependencies: - drupal:node - drupal:image -# Information added by Drupal.org packaging script on 2020-01-20 -version: '8.x-1.10' +# Information added by Drupal.org packaging script on 2021-06-22 +version: '8.x-2.6' project: 'entity_browser' -datestamp: 1579563796 +datestamp: 1624401308 diff --git a/web/modules/entity_browser/src/Permissions.php b/web/modules/entity_browser/src/Permissions.php index 6cb56835b1b5bca1ff6803805db0927fa4f0d6ca..21fa7581eaecc98d1ad9e041bac37481e36d3de7 100644 --- a/web/modules/entity_browser/src/Permissions.php +++ b/web/modules/entity_browser/src/Permissions.php @@ -4,7 +4,7 @@ use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; -use Drupal\Core\StringTranslation\TranslationManager; +use Drupal\Core\StringTranslation\StringTranslationTrait; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -12,6 +12,8 @@ */ class Permissions implements ContainerInjectionInterface { + use StringTranslationTrait; + /** * The entity browser storage. * @@ -19,23 +21,14 @@ class Permissions implements ContainerInjectionInterface { */ protected $browserStorage; - /** - * Translation manager service. - * - * @var \Drupal\Core\StringTranslation\TranslationManager - */ - protected $translationManager; - /** * Constructs Permissions object. * * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * Entity manager service. - * @param \Drupal\Core\StringTranslation\TranslationManager $translation */ - public function __construct(EntityTypeManagerInterface $entity_type_manager, TranslationManager $translation) { + public function __construct(EntityTypeManagerInterface $entity_type_manager) { $this->browserStorage = $entity_type_manager->getStorage('entity_browser'); - $this->translationManager = $translation; } /** @@ -43,8 +36,7 @@ public function __construct(EntityTypeManagerInterface $entity_type_manager, Tra */ public static function create(ContainerInterface $container) { return new static( - $container->get('entity_type.manager'), - $container->get('string_translation') + $container->get('entity_type.manager') ); } @@ -59,8 +51,8 @@ public function permissions() { foreach ($browsers as $browser) { if ($browser->route()) { $permissions['access ' . $browser->id() . ' entity browser pages'] = [ - 'title' => $this->translationManager->translate('Access @name pages', ['@name' => $browser->label()]), - 'description' => $this->translationManager->translate('Access pages that %browser uses to operate.', ['%browser' => $browser->label()]), + 'title' => $this->t('Access @name pages', ['@name' => $browser->label()]), + 'description' => $this->t('Access pages that %browser uses to operate.', ['%browser' => $browser->label()]), ]; } } diff --git a/web/modules/entity_browser/src/Plugin/EntityBrowser/Widget/MediaImageUpload.php b/web/modules/entity_browser/src/Plugin/EntityBrowser/Widget/MediaImageUpload.php new file mode 100644 index 0000000000000000000000000000000000000000..5baf1c80b0f49cda84440f0dc133edba8d972f2e --- /dev/null +++ b/web/modules/entity_browser/src/Plugin/EntityBrowser/Widget/MediaImageUpload.php @@ -0,0 +1,133 @@ +<?php + +namespace Drupal\entity_browser\Plugin\EntityBrowser\Widget; + +use Drupal\Core\Form\FormStateInterface; +use Drupal\Core\Url; +use Drupal\entity_browser\Plugin\EntityBrowser\Widget\Upload as FileUpload; +use Drupal\media\MediaInterface; + +/** + * Uses upload to create media images. + * + * @EntityBrowserWidget( + * id = "media_image_upload", + * label = @Translation("Upload images as media items"), + * description = @Translation("Upload widget that will create media entities of the uploaded images."), + * auto_select = FALSE + * ) + */ +class MediaImageUpload extends FileUpload { + + /** + * {@inheritdoc} + */ + public function defaultConfiguration() { + return [ + 'extensions' => 'jpg jpeg png gif', + 'media_type' => NULL, + ] + parent::defaultConfiguration(); + } + + /** + * {@inheritdoc} + */ + public function getForm(array &$original_form, FormStateInterface $form_state, array $aditional_widget_parameters) { + /** @var \Drupal\media\MediaTypeInterface $media_type */ + if (!$this->configuration['media_type'] || !($media_type = $this->entityTypeManager->getStorage('media_type')->load($this->configuration['media_type']))) { + return ['#markup' => $this->t('The media type is not configured correctly.')]; + } + + if ($media_type->getSource()->getPluginId() != 'image') { + return ['#markup' => $this->t('The configured media type is not using the image plugin.')]; + } + + $form = parent::getForm($original_form, $form_state, $aditional_widget_parameters); + $form['upload']['#upload_validators']['file_validate_extensions'] = [$this->configuration['extensions']]; + + return $form; + } + + /** + * {@inheritdoc} + */ + protected function prepareEntities(array $form, FormStateInterface $form_state) { + $files = parent::prepareEntities($form, $form_state); + + /** @var \Drupal\media\MediaTypeInterface $media_type */ + $media_type = $this->entityTypeManager + ->getStorage('media_type') + ->load($this->configuration['media_type']); + + $images = []; + foreach ($files as $file) { + /** @var \Drupal\media\MediaInterface $image */ + $image = $this->entityTypeManager->getStorage('media')->create([ + 'bundle' => $media_type->id(), + $media_type->getSource()->getConfiguration()['source_field'] => $file, + ]); + $images[] = $image; + } + + return $images; + } + + /** + * {@inheritdoc} + */ + public function submit(array &$element, array &$form, FormStateInterface $form_state) { + if (!empty($form_state->getTriggeringElement()['#eb_widget_main_submit'])) { + $images = $this->prepareEntities($form, $form_state); + array_walk( + $images, + function (MediaInterface $media) { + $media->save(); + } + ); + + $this->selectEntities($images, $form_state); + $this->clearFormValues($element, $form_state); + } + } + + /** + * {@inheritdoc} + */ + public function buildConfigurationForm(array $form, FormStateInterface $form_state) { + $form = parent::buildConfigurationForm($form, $form_state); + $form['extensions'] = [ + '#type' => 'textfield', + '#title' => $this->t('Allowed extensions'), + '#default_value' => $this->configuration['extensions'], + '#required' => TRUE, + ]; + + $media_type_options = []; + $media_types = $this + ->entityTypeManager + ->getStorage('media_type') + ->loadByProperties(['source' => 'image']); + + foreach ($media_types as $media_type) { + $media_type_options[$media_type->id()] = $media_type->label(); + } + + if (empty($media_type_options)) { + $url = Url::fromRoute('entity.media_type.add_form')->toString(); + $form['media_type'] = [ + '#markup' => $this->t("You don't have media type of the Image type. You should <a href='!link'>create one</a>", ['!link' => $url]), + ]; + } + else { + $form['media_type'] = [ + '#type' => 'select', + '#title' => $this->t('Media type'), + '#default_value' => $this->configuration['media_type'], + '#options' => $media_type_options, + ]; + } + + return $form; + } + +} diff --git a/web/modules/entity_browser/src/Plugin/views/display/EntityBrowser.php b/web/modules/entity_browser/src/Plugin/views/display/EntityBrowser.php index f4f7fbe7f9940af407221edd3677e0f94f016c8a..5c65a15a9639cd374665afdd51bf150d3818b6bf 100644 --- a/web/modules/entity_browser/src/Plugin/views/display/EntityBrowser.php +++ b/web/modules/entity_browser/src/Plugin/views/display/EntityBrowser.php @@ -3,6 +3,7 @@ namespace Drupal\entity_browser\Plugin\views\display; use Drupal\Core\Form\FormStateInterface; +use Drupal\Core\Security\TrustedCallbackInterface; use Drupal\views\Plugin\views\display\DisplayPluginBase; /** @@ -23,7 +24,7 @@ * entity_browser_display = TRUE * ) */ -class EntityBrowser extends DisplayPluginBase { +class EntityBrowser extends DisplayPluginBase implements TrustedCallbackInterface { /** * {@inheritdoc} @@ -221,4 +222,11 @@ public static function postRender($content, array $element) { return $content; } + /** + * {@inheritdoc} + */ + public static function trustedCallbacks() { + return ['preRenderAddFieldsetMarkup', 'postRender', 'elementPreRender']; + } + } diff --git a/web/modules/entity_browser/src/WidgetManager.php b/web/modules/entity_browser/src/WidgetManager.php index 7dc33f764c8d2f7a7d41b8ef8bc95a7a72610bc6..04557a00521335839a49b92daf02b1c199908e84 100644 --- a/web/modules/entity_browser/src/WidgetManager.php +++ b/web/modules/entity_browser/src/WidgetManager.php @@ -29,4 +29,19 @@ public function __construct(\Traversable $namespaces, CacheBackendInterface $cac $this->setCacheBackend($cache_backend, 'entity_browser_widget_plugins'); } + /** + * {@inheritdoc} + */ + protected function findDefinitions() { + $definitions = parent::findDefinitions(); + + // Our own "media_image_upload" widget should only be available if the + // "Media" module is enabled. + if (!$this->moduleHandler->moduleExists('media')) { + unset($definitions['media_image_upload']); + } + + return $definitions; + } + } diff --git a/web/modules/entity_browser/tests/modules/entity_browser_entity_embed_test/entity_browser_entity_embed_test.info.yml b/web/modules/entity_browser/tests/modules/entity_browser_entity_embed_test/entity_browser_entity_embed_test.info.yml index d6537966dd4487bd2aa58da461b4ba4e1e814c8d..84db40104d24eed2cbe457c72aa24c8d6ce9c500 100644 --- a/web/modules/entity_browser/tests/modules/entity_browser_entity_embed_test/entity_browser_entity_embed_test.info.yml +++ b/web/modules/entity_browser/tests/modules/entity_browser_entity_embed_test/entity_browser_entity_embed_test.info.yml @@ -4,7 +4,7 @@ description: 'Test Entity Embed Integration' core_version_requirement: ^8.7.7 || ^9 package: Testing dependencies: - - media_entity:media_entity + - drupal:media - drupal:ckeditor - drupal:node - drupal:views @@ -17,7 +17,7 @@ dependencies: - entity_browser:entity_browser - entity_browser_test:entity_browser_test -# Information added by Drupal.org packaging script on 2020-01-20 -version: '8.x-1.10' +# Information added by Drupal.org packaging script on 2021-06-22 +version: '8.x-2.6' project: 'entity_browser' -datestamp: 1579563796 +datestamp: 1624401308 diff --git a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/core.entity_form_display.media.ief_media_bundle.default.yml b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/core.entity_form_display.media.ief_media_type.default.yml similarity index 76% rename from web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/core.entity_form_display.media.ief_media_bundle.default.yml rename to web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/core.entity_form_display.media.ief_media_type.default.yml index f2ab144332a53aa771064b1a2e2cd9357ec0533f..a89f545b6bcb3b19f027a9dd17082662a6a75a80 100644 --- a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/core.entity_form_display.media.ief_media_bundle.default.yml +++ b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/core.entity_form_display.media.ief_media_type.default.yml @@ -2,16 +2,16 @@ langcode: en status: true dependencies: config: - - field.field.media.ief_media_bundle.ief_media_bundle_file_field - - media_entity.bundle.ief_media_bundle + - field.field.media.ief_media_type.ief_media_type_file_field + - media.type.ief_media_type module: - entity_browser -id: media.ief_media_bundle.default +id: media.ief_media_type.default targetEntityType: media -bundle: ief_media_bundle +bundle: ief_media_type mode: default content: - ief_media_bundle_file_field: + ief_media_type_file_field: weight: 11 settings: entity_browser: ief_entity_browser_file diff --git a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/core.entity_view_display.media.ief_media_bundle.default.yml b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/core.entity_view_display.media.ief_media_type.default.yml similarity index 81% rename from web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/core.entity_view_display.media.ief_media_bundle.default.yml rename to web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/core.entity_view_display.media.ief_media_type.default.yml index f42a8511c2baf9e0fe0e66a3ed3fb4b9699b586e..8cac3a62802125763b267d31356c9a4b2e1cb11b 100644 --- a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/core.entity_view_display.media.ief_media_bundle.default.yml +++ b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/core.entity_view_display.media.ief_media_type.default.yml @@ -2,15 +2,15 @@ langcode: en status: true dependencies: config: - - field.field.media.ief_media_bundle.ief_media_bundle_file_field + - field.field.media.ief_media_type.ief_media_type_file_field - image.style.thumbnail - - media_entity.bundle.ief_media_bundle + - media.type.ief_media_type module: - image - user -id: media.ief_media_bundle.default +id: media.ief_media_type.default targetEntityType: media -bundle: ief_media_bundle +bundle: ief_media_type mode: default content: created: @@ -22,7 +22,7 @@ content: custom_date_format: '' timezone: '' third_party_settings: { } - ief_media_bundle_file_field: + ief_media_type_file_field: weight: 2 label: above settings: diff --git a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.field.media.ief_media_bundle.ief_media_bundle_file_field.yml b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.field.media.ief_media_type.ief_media_type_file_field.yml similarity index 61% rename from web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.field.media.ief_media_bundle.ief_media_bundle_file_field.yml rename to web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.field.media.ief_media_type.ief_media_type_file_field.yml index b6c18468fd66056bb647d5ad1b4d7429d0ed1846..888d68e39fa6baac8712096efc6097ef3c6dbef5 100644 --- a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.field.media.ief_media_bundle.ief_media_bundle_file_field.yml +++ b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.field.media.ief_media_type.ief_media_type_file_field.yml @@ -2,12 +2,12 @@ langcode: en status: true dependencies: config: - - field.storage.media.ief_media_bundle_file_field - - media_entity.bundle.ief_media_bundle -id: media.ief_media_bundle.ief_media_bundle_file_field -field_name: ief_media_bundle_file_field + - field.storage.media.ief_media_type_file_field + - media.type.ief_media_type +id: media.ief_media_type.ief_media_type_file_field +field_name: ief_media_type_file_field entity_type: media -bundle: ief_media_bundle +bundle: ief_media_type label: files description: '' required: false diff --git a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.field.node.ief_content.ief_media_field.yml b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.field.node.ief_content.ief_media_field.yml index 656a830dccd672b5701b28802f1c359e5c0842b8..3f215dd1bef2e5faa1de784f37718dda1809329a 100644 --- a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.field.node.ief_content.ief_media_field.yml +++ b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.field.node.ief_content.ief_media_field.yml @@ -3,7 +3,7 @@ status: true dependencies: config: - field.storage.node.ief_media_field - - media_entity.bundle.ief_media_bundle + - media.type.ief_media_type - node.type.ief_content id: node.ief_content.ief_media_field field_name: ief_media_field @@ -19,7 +19,7 @@ settings: handler: 'default:media' handler_settings: target_bundles: - ief_media_bundle: ief_media_bundle + ief_media_type: ief_media_type sort: field: _none auto_create: false diff --git a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.storage.media.ief_media_bundle_file_field.yml b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.storage.media.ief_media_type_file_field.yml similarity index 72% rename from web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.storage.media.ief_media_bundle_file_field.yml rename to web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.storage.media.ief_media_type_file_field.yml index b8bcb3103c3a89347b7cd76ff7437c5fb4e3e70e..ab322c90f9d24ed275700737a0e2a75f319b5f50 100644 --- a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.storage.media.ief_media_bundle_file_field.yml +++ b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.storage.media.ief_media_type_file_field.yml @@ -3,9 +3,9 @@ status: true dependencies: module: - file - - media_entity -id: media.ief_media_bundle_file_field -field_name: ief_media_bundle_file_field + - media +id: media.ief_media_type_file_field +field_name: ief_media_type_file_field entity_type: media type: entity_reference settings: diff --git a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.storage.node.ief_media_field.yml b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.storage.node.ief_media_field.yml index bf54bd1bc2f674dce05c39ab5a53d647c24e24d2..172afdc5292f02704c16c9b409dbb673dab6a4ef 100644 --- a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.storage.node.ief_media_field.yml +++ b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/field.storage.node.ief_media_field.yml @@ -2,7 +2,7 @@ langcode: en status: true dependencies: module: - - media_entity + - media - node id: node.ief_media_field field_name: ief_media_field diff --git a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/media_entity.bundle.ief_media_bundle.yml b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/media.type.ief_media_type.yml similarity index 52% rename from web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/media_entity.bundle.ief_media_bundle.yml rename to web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/media.type.ief_media_type.yml index 8bbfb682519eb44f79c2f975cd1f370b5c595528..e9a4941ba4e7eafd026cac6379029a7dc0677e14 100644 --- a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/media_entity.bundle.ief_media_bundle.yml +++ b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/config/install/media.type.ief_media_type.yml @@ -1,11 +1,12 @@ langcode: en status: true dependencies: { } -id: ief_media_bundle -label: 'Test File Bundle' +id: ief_media_type +label: 'Test File Type' description: '' -type: generic +source: file queue_thumbnail_downloads: false new_revision: false -type_configuration: { } +source_configuration: + source_field: ief_media_type_file_field field_map: { } diff --git a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/entity_browser_ief_test.info.yml b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/entity_browser_ief_test.info.yml index a9831a60ad5b87c016e55c65aa84e8a5d846c5c8..a52717ca4af3bfeac0ce383d3b921674fcbee955 100644 --- a/web/modules/entity_browser/tests/modules/entity_browser_ief_test/entity_browser_ief_test.info.yml +++ b/web/modules/entity_browser/tests/modules/entity_browser_ief_test/entity_browser_ief_test.info.yml @@ -8,11 +8,11 @@ dependencies: - entity_browser:entity_browser - entity_browser_entity_form:entity_browser_entity_form - entity_browser_test:entity_browser_test - - media_entity:media_entity + - drupal:media - inline_entity_form:inline_entity_form - drupal:views -# Information added by Drupal.org packaging script on 2020-01-20 -version: '8.x-1.10' +# Information added by Drupal.org packaging script on 2021-06-22 +version: '8.x-2.6' project: 'entity_browser' -datestamp: 1579563796 +datestamp: 1624401308 diff --git a/web/modules/entity_browser/tests/modules/entity_browser_test/config/install/views.view.test_deprecated_field.yml b/web/modules/entity_browser/tests/modules/entity_browser_test/config/install/views.view.test_deprecated_field.yml index cbfab7bf5c8df7665764dbb549e9d9dd75b90808..fb23995228da443803b2da4fc68a1a2055fea301 100644 --- a/web/modules/entity_browser/tests/modules/entity_browser_test/config/install/views.view.test_deprecated_field.yml +++ b/web/modules/entity_browser/tests/modules/entity_browser_test/config/install/views.view.test_deprecated_field.yml @@ -12,7 +12,6 @@ description: 'Contains a deprecated "Entity browser bulk select form" field.' tag: '' base_table: node_field_data base_field: nid -core: 8.x display: default: display_plugin: default diff --git a/web/modules/entity_browser/tests/modules/entity_browser_test/entity_browser_test.info.yml b/web/modules/entity_browser/tests/modules/entity_browser_test/entity_browser_test.info.yml index 6f46268d696fff3786b7f5997fa98bf3258b2c5a..b02578a5a00e9f368d9cd31c6ebefc4dbb3f4016 100644 --- a/web/modules/entity_browser/tests/modules/entity_browser_test/entity_browser_test.info.yml +++ b/web/modules/entity_browser/tests/modules/entity_browser_test/entity_browser_test.info.yml @@ -10,7 +10,7 @@ dependencies: - drupal:node - drupal:views -# Information added by Drupal.org packaging script on 2020-01-20 -version: '8.x-1.10' +# Information added by Drupal.org packaging script on 2021-06-22 +version: '8.x-2.6' project: 'entity_browser' -datestamp: 1579563796 +datestamp: 1624401308 diff --git a/web/modules/entity_browser/tests/modules/entity_browser_test_configuration/entity_browser_test_configuration.info.yml b/web/modules/entity_browser/tests/modules/entity_browser_test_configuration/entity_browser_test_configuration.info.yml index cca2b7b136bfa83dfbe08878e1523053ad8a6a19..dc2b9e651235c907f8b86ba30f4d4fbf81670a7a 100644 --- a/web/modules/entity_browser/tests/modules/entity_browser_test_configuration/entity_browser_test_configuration.info.yml +++ b/web/modules/entity_browser/tests/modules/entity_browser_test_configuration/entity_browser_test_configuration.info.yml @@ -10,7 +10,7 @@ dependencies: - drupal:views - drupal:user -# Information added by Drupal.org packaging script on 2020-01-20 -version: '8.x-1.10' +# Information added by Drupal.org packaging script on 2021-06-22 +version: '8.x-2.6' project: 'entity_browser' -datestamp: 1579563796 +datestamp: 1624401308 diff --git a/web/modules/entity_browser/tests/modules/entity_browser_test_entityqueue/config/install/entityqueue.entity_queue.nodes.yml b/web/modules/entity_browser/tests/modules/entity_browser_test_entityqueue/config/install/entityqueue.entity_queue.nodes.yml index 748929857470eb0569f1223f5c854a4d13b11e0b..f1dcdab7d252cd704dee138cf5f52a90d62a3964 100644 --- a/web/modules/entity_browser/tests/modules/entity_browser_test_entityqueue/config/install/entityqueue.entity_queue.nodes.yml +++ b/web/modules/entity_browser/tests/modules/entity_browser_test_entityqueue/config/install/entityqueue.entity_queue.nodes.yml @@ -24,4 +24,4 @@ queue_settings: min_size: 0 max_size: 0 act_as_queue: false - reverse_in_admin: false + reverse: false diff --git a/web/modules/entity_browser/tests/modules/entity_browser_test_entityqueue/entity_browser_test_entityqueue.info.yml b/web/modules/entity_browser/tests/modules/entity_browser_test_entityqueue/entity_browser_test_entityqueue.info.yml index 2588f92c43b6dbc88a3ded3b1356ab12f7e10a20..329e37d0140afce71d82ea9429ee339bff57d377 100644 --- a/web/modules/entity_browser/tests/modules/entity_browser_test_entityqueue/entity_browser_test_entityqueue.info.yml +++ b/web/modules/entity_browser/tests/modules/entity_browser_test_entityqueue/entity_browser_test_entityqueue.info.yml @@ -10,7 +10,7 @@ dependencies: - entity_browser:entity_browser - entity_browser_test:entity_browser_test -# Information added by Drupal.org packaging script on 2020-01-20 -version: '8.x-1.10' +# Information added by Drupal.org packaging script on 2021-06-22 +version: '8.x-2.6' project: 'entity_browser' -datestamp: 1579563796 +datestamp: 1624401308 diff --git a/web/modules/entity_browser/tests/modules/entity_browser_test_paragraphs/entity_browser_test_paragraphs.info.yml b/web/modules/entity_browser/tests/modules/entity_browser_test_paragraphs/entity_browser_test_paragraphs.info.yml index 715fb75db6a4640e96d04a9f548a5b401bb80e18..df491c484bb5f4c0298621233a3ead58b192e657 100644 --- a/web/modules/entity_browser/tests/modules/entity_browser_test_paragraphs/entity_browser_test_paragraphs.info.yml +++ b/web/modules/entity_browser/tests/modules/entity_browser_test_paragraphs/entity_browser_test_paragraphs.info.yml @@ -13,7 +13,7 @@ dependencies: - drupal:views - drupal:user -# Information added by Drupal.org packaging script on 2020-01-20 -version: '8.x-1.10' +# Information added by Drupal.org packaging script on 2021-06-22 +version: '8.x-2.6' project: 'entity_browser' -datestamp: 1579563796 +datestamp: 1624401308 diff --git a/web/modules/entity_browser/tests/src/Functional/EntityBrowserUpdateHookTest.php b/web/modules/entity_browser/tests/src/Functional/EntityBrowserUpdateHookTest.php index 8851bd6bb25a59b3f6fc0c1be7ecd891b8f0cbfa..34041f31b2218f59067d956ea0bc5a095ac37bcd 100644 --- a/web/modules/entity_browser/tests/src/Functional/EntityBrowserUpdateHookTest.php +++ b/web/modules/entity_browser/tests/src/Functional/EntityBrowserUpdateHookTest.php @@ -21,7 +21,7 @@ class EntityBrowserUpdateHookTest extends UpdatePathTestBase { */ protected function setDatabaseDumpFiles() { $this->databaseDumpFiles = [ - DRUPAL_ROOT . '/core/modules/system/tests/fixtures/update/drupal-8.bare.standard.php.gz', + DRUPAL_ROOT . '/core/modules/system/tests/fixtures/update/drupal-8.8.0.bare.standard.php.gz', __DIR__ . '/../../fixtures/update/entity_browser.update-hook-test.php', ]; } diff --git a/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityBrowserJavascriptTestBase.php b/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityBrowserJavascriptTestBase.php deleted file mode 100644 index bece7379b66d4c285e45664258456af8778f0caf..0000000000000000000000000000000000000000 --- a/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityBrowserJavascriptTestBase.php +++ /dev/null @@ -1,240 +0,0 @@ -<?php - -namespace Drupal\Tests\entity_browser\FunctionalJavascript; - -use Drupal\Component\Utility\NestedArray; -use Drupal\Core\Field\FieldStorageDefinitionInterface; -use Drupal\file\Entity\File; -use Drupal\field\Entity\FieldConfig; -use Drupal\field\Entity\FieldStorageConfig; -use Drupal\FunctionalJavascriptTests\JavascriptTestBase; - -/** - * Base class for Entity browser Javascript functional tests. - * - * @package Drupal\Tests\entity_browser\FunctionalJavascript - * - * @deprecated in Drupal 8.6.x, will be removed before Drupal 9.0.0. - * Use \Drupal\Tests\entity_browser\FunctionalJavascript\EntityBrowserWebDriverTestBase instead - * - * @see \Drupal\FunctionalJavascriptTests\JavascriptTestBase for more info. - */ -abstract class EntityBrowserJavascriptTestBase extends JavascriptTestBase { - - /** - * Modules to enable. - * - * @var array - */ - public static $modules = [ - 'entity_browser_test', - 'views', - 'block', - 'node', - 'file', - 'image', - 'field_ui', - 'views_ui', - 'system', - ]; - - /** - * Permissions for user that will be logged-in for test. - * - * @var array - */ - protected static $userPermissions = [ - 'access test_entity_browser_file entity browser pages', - 'create article content', - 'access content', - ]; - - /** - * {@inheritdoc} - */ - protected function setUp() { - parent::setUp(); - - FieldStorageConfig::create([ - 'field_name' => 'field_reference', - 'type' => 'entity_reference', - 'entity_type' => 'node', - 'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, - 'settings' => [ - 'target_type' => 'file', - ], - ])->save(); - - FieldConfig::create([ - 'field_name' => 'field_reference', - 'entity_type' => 'node', - 'bundle' => 'article', - 'label' => 'Reference', - 'settings' => [], - ])->save(); - - /** @var \Drupal\Core\Entity\Display\EntityFormDisplayInterface $form_display */ - $form_display = $this->container->get('entity_type.manager') - ->getStorage('entity_form_display') - ->load('node.article.default'); - - $form_display->setComponent('field_reference', [ - 'type' => 'entity_browser_entity_reference', - 'settings' => [ - 'entity_browser' => 'test_entity_browser_file', - 'field_widget_display' => 'label', - 'open' => TRUE, - ], - ])->save(); - - $account = $this->drupalCreateUser(static::$userPermissions); - $this->drupalLogin($account); - } - - /** - * Return an entity browser if it exists or creates a new one. - * - * @param string $browser_name - * The entity browser name. - * @param string $display_id - * The display plugin id. - * @param string $widget_selector_id - * The widget selector id. - * @param string $selection_display_id - * The selection display id. - * @param array $display_configuration - * The display plugin configuration. - * @param array $widget_selector_configuration - * The widget selector configuration. - * @param array $selection_display_configuration - * The selection display configuration. - * @param array $widget_configurations - * Widget configurations. Have be provided with widget UUIDs. - * - * @return \Drupal\entity_browser\EntityBrowserInterface - * Returns an Entity Browser. - */ - protected function getEntityBrowser($browser_name, $display_id, $widget_selector_id, $selection_display_id, array $display_configuration = [], array $widget_selector_configuration = [], array $selection_display_configuration = [], array $widget_configurations = []) { - /** @var \Drupal\Core\Entity\EntityStorageInterface $storage */ - $storage = $this->container->get('entity_type.manager') - ->getStorage('entity_browser'); - - /** @var \Drupal\entity_browser\EntityBrowserInterface $browser */ - $browser = $storage->load($browser_name) ?: $storage->create(['name' => $browser_name]); - - $browser->setDisplay($display_id); - if ($display_configuration) { - $browser->getDisplay()->setConfiguration($display_configuration); - } - - $browser->setWidgetSelector($widget_selector_id); - if ($widget_selector_configuration) { - $browser->getSelectionDisplay() - ->setConfiguration($widget_selector_configuration); - } - - $browser->setSelectionDisplay($selection_display_id); - if ($selection_display_configuration) { - $browser->getSelectionDisplay() - ->setConfiguration($selection_display_configuration); - } - - // Apply custom widget configurations. - if ($widget_configurations) { - foreach ($widget_configurations as $widget_uuid => $widget_config) { - $view_widget = $browser->getWidget($widget_uuid); - $view_widget->setConfiguration(NestedArray::mergeDeep($view_widget->getConfiguration(), $widget_config)); - } - } - - $browser->save(); - - // Clear caches after new browser is saved to remove old cached states. - drupal_flush_all_caches(); - - return $browser; - } - - /** - * Creates an image. - * - * @param string $name - * The name of the image. - * @param string $extension - * File extension. - * - * @return \Drupal\file\FileInterface - * Returns an image. - */ - protected function createFile($name, $extension = 'jpg') { - file_put_contents('public://' . $name . '.' . $extension, $this->randomMachineName()); - - $image = File::create([ - 'filename' => $name . '.' . $extension, - 'uri' => 'public://' . $name . '.' . $extension, - ]); - $image->setPermanent(); - $image->save(); - - return $image; - } - - /** - * Waits for jQuery to become ready and animations to complete. - */ - protected function waitForAjaxToFinish() { - $this->assertSession()->assertWaitOnAjaxRequest(); - } - - /** - * Waits and asserts that a given element is visible. - * - * @param string $selector - * The CSS selector. - * @param int $timeout - * (Optional) Timeout in milliseconds, defaults to 1000. - * @param string $message - * (Optional) Message to pass to assertJsCondition(). - */ - protected function waitUntilVisible($selector, $timeout = 1000, $message = '') { - $condition = "jQuery('" . $selector . ":visible').length > 0"; - $this->assertJsCondition($condition, $timeout, $message); - } - - /** - * Click on element found by xpath selector. - * - * @param string $xpathSelector - * Xpath selector for element that will be used to trigger click on it. - * @param bool $waitAfterAction - * Flag to wait after click is executed. - */ - protected function clickXpathSelector($xpathSelector, $waitAfterAction = TRUE) { - $this->getSession()->getPage()->find('xpath', $xpathSelector)->click(); - - if ($waitAfterAction) { - $this->waitForAjaxToFinish(); - } - } - - /** - * Debugger method to save additional HTML output. - * - * The base class will only save browser output when accessing page using - * ::drupalGet and providing a printer class to PHPUnit. This method - * is intended for developers to help debug browser test failures and capture - * more verbose output. - */ - protected function saveHtmlOutput() { - $out = $this->getSession()->getPage()->getContent(); - // Ensure that any changes to variables in the other thread are picked up. - $this->refreshVariables(); - if ($this->htmlOutputEnabled) { - $html_output = '<hr />Ending URL: ' . $this->getSession()->getCurrentUrl(); - $html_output .= '<hr />' . $out; - $html_output .= $this->getHtmlOutputHeaders(); - $this->htmlOutput($html_output); - } - } - -} diff --git a/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityReferenceWidgetTest.php b/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityReferenceWidgetTest.php index 9129e090601f7be4305c914b4de8c3be7d41e35c..53f309eec2e2b8c6794e880166b855134c70ef8f 100644 --- a/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityReferenceWidgetTest.php +++ b/web/modules/entity_browser/tests/src/FunctionalJavascript/EntityReferenceWidgetTest.php @@ -6,6 +6,7 @@ use Drupal\entity_browser\Element\EntityBrowserElement; use Drupal\field\Entity\FieldConfig; use Drupal\field\Entity\FieldStorageConfig; +use Drupal\FunctionalJavascriptTests\SortableTestTrait; use Drupal\node\Entity\Node; use Drupal\user\Entity\Role; @@ -16,6 +17,8 @@ */ class EntityReferenceWidgetTest extends EntityBrowserWebDriverTestBase { + use SortableTestTrait; + /** * {@inheritdoc} */ @@ -102,7 +105,7 @@ public function testEntityReferenceWidget() { $this->assertSession()->buttonExists('Save')->press(); $this->assertSession()->pageTextContains('Article Referencing node 1 has been created.'); - $nid = $this->container->get('entity.query')->get('node')->condition('title', 'Referencing node 1')->execute(); + $nid = \Drupal::entityQuery('node')->condition('title', 'Referencing node 1')->execute(); $nid = reset($nid); // Assert correct translation appears. @@ -208,6 +211,7 @@ public function testEntityReferenceWidget() { 'auto_open' => FALSE, ]); $browser->save(); + // We'll need a third node to be able to make a new selection. $target_node2 = Node::create([ 'title' => 'Target example node 2', @@ -337,14 +341,41 @@ public function testEntityReferenceWidget() { * Tests that drag and drop functions properly. */ public function testDragAndDrop() { + $assert_session = $this->assertSession(); - $gatsby = $this->createNode(['type' => 'shark', 'title' => 'Gatsby']); - $daisy = $this->createNode(['type' => 'jet', 'title' => 'Daisy']); - $nick = $this->createNode(['type' => 'article', 'title' => 'Nick']); + $time = time(); - $santa = $this->createNode(['type' => 'shark', 'title' => 'Santa Claus']); - $easter_bunny = $this->createNode(['type' => 'jet', 'title' => 'Easter Bunny']); - $pumpkin_king = $this->createNode(['type' => 'article', 'title' => 'Pumpkin King']); + $gatsby = $this->createNode([ + 'type' => 'shark', + 'title' => 'Gatsby', + 'created' => $time--, + ]); + $daisy = $this->createNode([ + 'type' => 'jet', + 'title' => 'Daisy', + 'created' => $time--, + ]); + $nick = $this->createNode([ + 'type' => 'article', + 'title' => 'Nick', + 'created' => $time--, + ]); + + $santa = $this->createNode([ + 'type' => 'shark', + 'title' => 'Santa Claus', + 'created' => $time--, + ]); + $easter_bunny = $this->createNode([ + 'type' => 'jet', + 'title' => 'Easter Bunny', + 'created' => $time--, + ]); + $pumpkin_king = $this->createNode([ + 'type' => 'article', + 'title' => 'Pumpkin King', + 'created' => $time--, + ]); $field1_storage_config = [ 'field_name' => 'field_east_egg', @@ -490,8 +521,12 @@ public function testDragAndDrop() { // Open details 1. $this->assertSession()->elementExists('xpath', '(//summary)[1]')->click(); - $first_item = $this->assertSession()->elementExists('xpath', "(//div[contains(@class, 'item-container')])[1]"); - $this->dragDropElement($first_item, 160, 0); + // In the first set of selections, drag the first item into the second + // position. + $list_selector = '[data-drupal-selector="edit-field-east-egg-current"]'; + $item_selector = "$list_selector .item-container"; + $assert_session->elementsCount('css', $item_selector, 3); + $this->sortableAfter("$item_selector:first-child", "$item_selector:nth-child(2)", $list_selector); $this->waitForAjaxToFinish(); $this->assertSession()->fieldExists('title[0][value]')->setValue('Hello World'); @@ -513,8 +548,12 @@ public function testDragAndDrop() { ->elementContains('xpath', "(//div[contains(@class, 'item-container')])[" . $key . "]", $value); } - $fourth = $this->assertSession()->elementExists('xpath', "(//div[contains(@class, 'item-container')])[4]"); - $this->dragDropElement($fourth, 160, 0); + // In the second set of selections, drag the first item into the second + // position. + $list_selector = '[data-drupal-selector="edit-field-east-egg2-current"]'; + $item_selector = "$list_selector .item-container"; + $assert_session->elementsCount('css', $item_selector, 3); + $this->sortableAfter("$item_selector:first-child", "$item_selector:nth-child(2)", $list_selector); $correct_order = [ 4 => 'Easter Bunny', @@ -544,4 +583,16 @@ public function testDragAndDrop() { } } + /** + * {@inheritdoc} + */ + protected function sortableUpdate($item, $from, $to = NULL) { + list ($container) = explode(' ', $item, 2); + + $js = <<<END +Drupal.entityBrowserEntityReference.entitiesReordered(document.querySelector("$container")); +END; + $this->getSession()->executeScript($js); + } + } diff --git a/web/modules/entity_browser/tests/src/FunctionalJavascript/ImageFieldTest.php b/web/modules/entity_browser/tests/src/FunctionalJavascript/ImageFieldTest.php index 03cd9e1b7950f808e2975a2d3fef7f9cebc3c63f..07ab5d24a8c1e64323ccbd4dfba1beca9d1acdae 100644 --- a/web/modules/entity_browser/tests/src/FunctionalJavascript/ImageFieldTest.php +++ b/web/modules/entity_browser/tests/src/FunctionalJavascript/ImageFieldTest.php @@ -165,6 +165,7 @@ public function testImageFieldUsage() { // Image filename should not be present. $this->assertSession()->pageTextNotContains('example.jpg'); $this->assertSession()->linkExists('Select entities'); + // Test the Replace functionality. $test_files = $this->getTestFiles('image'); foreach ($test_files as $test_file) { @@ -251,7 +252,7 @@ public function testImageFieldSettings() { /** @var \Drupal\file\Entity\File $file */ $fid = explode(':', $entity_id)[1]; $file = File::load($fid); - $this->assertContains('entity-browser-test', $file->getFileUri()); + $this->assertStringContainsString('entity-browser-test', $file->getFileUri()); } } diff --git a/web/modules/entity_browser/tests/src/FunctionalJavascript/InlineEntityFormTest.php b/web/modules/entity_browser/tests/src/FunctionalJavascript/InlineEntityFormTest.php index c2f36352c48a9de65f9ca8eb80602d337656da05..ef43ad35fc80c59e727c93902b940eaac69386bb 100644 --- a/web/modules/entity_browser/tests/src/FunctionalJavascript/InlineEntityFormTest.php +++ b/web/modules/entity_browser/tests/src/FunctionalJavascript/InlineEntityFormTest.php @@ -2,6 +2,8 @@ namespace Drupal\Tests\entity_browser\FunctionalJavascript; +use Drupal\FunctionalJavascriptTests\SortableTestTrait; + /** * Test for integration of entity browser and inline entity form. * @@ -11,6 +13,8 @@ */ class InlineEntityFormTest extends EntityBrowserWebDriverTestBase { + use SortableTestTrait; + /** * {@inheritdoc} */ @@ -68,7 +72,7 @@ public function testEntityBrowserInsideInlineEntityForm() { $this->assertSession()->assertWaitOnAjaxRequest(); - $page->fillField('Media name', 'Test Bundle Media'); + $page->fillField('Name', 'Test Bundle Media'); $page->clickLink('Select entities'); $this->getSession() @@ -95,8 +99,9 @@ public function testEntityBrowserInsideInlineEntityForm() { $this->assertSession()->assertWaitOnAjaxRequest(); // Test reorder of elements. - $dragged = $this->xpath("//div[@data-drupal-selector='edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-bundle-file-field-current-items-0']")[0]; - $this->dragDropElement($dragged, 150, 0); + $list_selector = '[data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-type-file-field-current"]'; + $item_selector = "$list_selector .item-container"; + $this->sortableAfter("$item_selector:first-child", "$item_selector:last-child", $list_selector); $this->assertSession()->assertWaitOnAjaxRequest(); $page->pressButton('Update Test File Media'); @@ -106,14 +111,14 @@ public function testEntityBrowserInsideInlineEntityForm() { $this->assertSession()->assertWaitOnAjaxRequest(); // Check that element on second position is test_file1 (file:1). - $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-bundle-file-field-current"]/div[2]'); + $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-type-file-field-current"]/div[2]'); if (empty($secondElement)) { throw new \Exception('Element is not found.'); } $this->assertSame('file:1', $secondElement->getAttribute('data-entity-id')); // Test remove of element. - $this->click('input[name*="ief_media_bundle_file_field_remove_1_1"]'); + $this->click('input[name*="ief_media_type_file_field_remove_1_1"]'); $this->assertSession()->assertWaitOnAjaxRequest(); $page->pressButton('Update Test File Media'); @@ -124,7 +129,7 @@ public function testEntityBrowserInsideInlineEntityForm() { // Check that remote button does not exist for already removed entity. $this->assertSession() - ->elementNotExists('css', '[name*="ief_media_bundle_file_field_remove_1_1"]'); + ->elementNotExists('css', '[name*="ief_media_type_file_field_remove_1_1"]'); // Test add inside Entity Browser. $page->clickLink('Select entities'); @@ -147,7 +152,7 @@ public function testEntityBrowserInsideInlineEntityForm() { $this->assertSession()->assertWaitOnAjaxRequest(); // Check that element on second position is test_file3 (file:3). - $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-bundle-file-field-current"]/div[2]'); + $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-type-file-field-current"]/div[2]'); if (empty($secondElement)) { throw new \Exception('Element is not found.'); } @@ -159,8 +164,9 @@ public function testEntityBrowserInsideInlineEntityForm() { $this->getSession() ->switchToIFrame('entity_browser_iframe_ief_entity_browser_file'); - $dragged = $this->xpath("//div[@data-drupal-selector='edit-selected-items-2-0']")[0]; - $this->dragDropElement($dragged, 150, 0); + $list_selector = '[data-drupal-selector="edit-selected"]'; + $item_selector = "$list_selector .item-container"; + $this->sortableAfter("$item_selector:first-child", "$item_selector:last-child", $list_selector); $this->assertSession()->assertWaitOnAjaxRequest(); $page->pressButton('Use selected'); @@ -174,7 +180,7 @@ public function testEntityBrowserInsideInlineEntityForm() { $this->assertSession()->assertWaitOnAjaxRequest(); // Check that element on second position is test_file2 (file:2). - $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-bundle-file-field-current"]/div[2]'); + $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-type-file-field-current"]/div[2]'); if (empty($secondElement)) { throw new \Exception('Element is not found.'); } @@ -201,7 +207,7 @@ public function testEntityBrowserInsideInlineEntityForm() { $this->assertSession()->assertWaitOnAjaxRequest(); // Check that element on first position is test_file2 (file:2). - $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-bundle-file-field-current"]/div[1]'); + $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-type-file-field-current"]/div[1]'); if (empty($secondElement)) { throw new \Exception('Element is not found.'); } @@ -407,8 +413,20 @@ public function testEntityFormReferenceFormValidate() { $ief_table = $this->assertSession()->elementExists('xpath', '//table[contains(@id, "ief-entity-table-edit-field-nodes-entities")]'); $table_text = $ief_table->getText(); - $this->assertContains('Boxer', $table_text); - $this->assertContains('Napoleon', $table_text); + $this->assertStringContainsString('Boxer', $table_text); + $this->assertStringContainsString('Napoleon', $table_text); + } + + /** + * {@inheritdoc} + */ + protected function sortableUpdate($item, $from, $to = NULL) { + list ($container) = explode(' ', $item, 2); + + $js = <<<END +(Drupal.entityBrowserEntityReference || Drupal.entityBrowserMultiStepDisplay).entitiesReordered(document.querySelector("$container")); +END; + $this->getSession()->executeScript($js); } } diff --git a/web/modules/entity_browser/tests/src/Kernel/Extension/EntityBrowserTest.php b/web/modules/entity_browser/tests/src/Kernel/Extension/EntityBrowserTest.php index fbc4d105ce46e019135a31fb6e14b2ed6a6995f2..a21bcef59321e2b889854e4b27b0e767e53914f8 100644 --- a/web/modules/entity_browser/tests/src/Kernel/Extension/EntityBrowserTest.php +++ b/web/modules/entity_browser/tests/src/Kernel/Extension/EntityBrowserTest.php @@ -14,6 +14,7 @@ use Drupal\entity_browser\SelectionDisplayInterface; use Drupal\KernelTests\KernelTestBase; use Drupal\views\Entity\View; +use Symfony\Component\Routing\RouteCollection; /** * Tests the entity_browser config entity. @@ -69,7 +70,7 @@ protected function setUp() { $this->widgetUUID = $this->container->get('uuid')->generate(); $this->routeProvider = $this->container->get('router.route_provider'); - $this->installSchema('system', ['router', 'key_value_expire', 'sequences']); + $this->installSchema('system', ['key_value_expire', 'sequences']); View::create(['id' => 'test_view'])->save(); } @@ -127,7 +128,7 @@ protected function createTests() { $this->fail('An entity browser without required ' . $plugin_type . ' created with no exception thrown.'); } catch (PluginException $e) { - $this->assertContains('The "" plugin does not exist.', $e->getMessage(), 'An exception was thrown when an entity_browser was created without a ' . $plugin_type . ' plugin.'); + $this->assertStringContainsString('The "" plugin does not exist.', $e->getMessage(), 'An exception was thrown when an entity_browser was created without a ' . $plugin_type . ' plugin.'); } } @@ -193,7 +194,7 @@ protected function createTests() { // Ensure that rebuilding routes works. $route = $this->routeProvider->getRoutesByPattern('/test-browser-test'); - $this->assertTrue($route, 'Route exists.'); + $this->assertInstanceOf(RouteCollection::class, $route); } /** @@ -207,7 +208,7 @@ protected function loadTests() { // Verify several properties of the entity browser. $this->assertEquals($entity->label(), 'Testing entity browser instance'); - $this->assertTrue($entity->uuid()); + $this->assertNotEmpty($entity->uuid()); $plugin = $entity->getDisplay(); $this->assertTrue($plugin instanceof DisplayInterface, 'Testing display plugin.'); $this->assertEquals($plugin->getPluginId(), 'standalone');