Verified Commit 935757de authored by Théodore Biadala's avatar Théodore Biadala
Browse files

fix: #3474018 [regression] CSS class is not added to MediaLibrary dialog

By: herved
By: smustgrave
By: sourav_paul
By: rhovland
By: keiserjb
(cherry picked from commit 462ac972)
parent d2cd53a6
Loading
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -74,13 +74,20 @@ class OpenDialogCommand implements CommandInterface, CommandWithAttachedAssetsIn
   */
  public function __construct($selector, string|\Stringable|null $title, $content, array $dialog_options = [], $settings = NULL) {
    $title = PlainTextOutput::renderFromHtml($title);

    $dialog_options += ['title' => $title];

    $classes = [];
    if (isset($dialog_options['classes']['ui-dialog'])) {
      $classes[] = $dialog_options['classes']['ui-dialog'];
    }
    if (isset($dialog_options['dialogClass'])) {
      @trigger_error('Passing $dialog_options[\'dialogClass\'] to OpenDialogCommand::__construct() is deprecated in drupal:10.3.0 and will be removed in drupal:12.0.0. Use $dialog_options[\'classes\'] instead. See https://www.drupal.org/node/3440844', E_USER_DEPRECATED);
      $dialog_options['classes']['ui-dialog'] = $dialog_options['dialogClass'];
      $classes[] = $dialog_options['dialogClass'];
      unset($dialog_options['dialogClass']);
    }
    if ($classes) {
      $dialog_options['classes']['ui-dialog'] = implode(' ', $classes);
    }

    $this->selector = $selector;
    $this->content = $content;
+8 −10
Original line number Diff line number Diff line
@@ -38,21 +38,19 @@ class OpenOffCanvasDialogCommand extends OpenDialogCommand {
   *   (optional) The position to render the off-canvas dialog.
   */
  public function __construct(string|\Stringable|null $title, $content, array $dialog_options = [], $settings = NULL, $position = 'side') {
    $dialog_class = FALSE;
    $classes = [];
    if (isset($dialog_options['classes']['ui-dialog'])) {
      $dialog_class = $dialog_options['classes']['ui-dialog'];
      $classes[] = $dialog_options['classes']['ui-dialog'];
    }
    elseif (isset($dialog_options['dialogClass'])) {
    if (isset($dialog_options['dialogClass'])) {
      @trigger_error('Passing $dialog_options[\'dialogClass\'] to OpenOffCanvasDialogCommand::__construct() is deprecated in drupal:10.3.0 and will be removed in drupal:12.0.0. Use $dialog_options[\'classes\'] instead. See https://www.drupal.org/node/3440844', E_USER_DEPRECATED);
      $dialog_class = $dialog_options['dialogClass'];
      $classes[] = $dialog_options['dialogClass'];
      unset($dialog_options['dialogClass']);
    }
    if ($dialog_class) {
      $dialog_options['classes']['ui-dialog'] = $dialog_class . ' ' . "ui-dialog-off-canvas ui-dialog-position-$position";
    }
    else {
      $dialog_options['classes']['ui-dialog'] = "ui-dialog-off-canvas ui-dialog-position-$position";
    }
    $classes[] = 'ui-dialog-off-canvas';
    $classes[] = "ui-dialog-position-$position";
    $dialog_options['classes']['ui-dialog'] = implode(' ', $classes);

    parent::__construct('#drupal-off-canvas', $title, $content, $dialog_options, $settings);
    $this->dialogOptions['modal'] = FALSE;
    $this->dialogOptions['autoResize'] = FALSE;
+4 −3
Original line number Diff line number Diff line
@@ -598,11 +598,12 @@
     */
    openDialog(url, saveCallback, dialogSettings) {
      // Add a consistent dialog class.
      const classes = dialogSettings.dialogClass
        ? dialogSettings.dialogClass.split(' ')
      dialogSettings.classes = dialogSettings.classes || {};
      const classes = dialogSettings.classes['ui-dialog']
        ? dialogSettings.classes['ui-dialog'].split(' ')
        : [];
      classes.push('ui-dialog--narrow');
      dialogSettings.dialogClass = classes.join(' ');
      dialogSettings.classes['ui-dialog'] = classes.join(' ');
      dialogSettings.autoResize =
        window.matchMedia('(min-width: 600px)').matches;
      dialogSettings.width = 'auto';
+1 −0
Original line number Diff line number Diff line
@@ -169,6 +169,7 @@ public function testButton(): void {
    $assert_session = $this->assertSession();
    $page = $this->getSession()->getPage();
    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#drupal-modal #media-library-content'));
    $this->assertSession()->elementAttributeContains('css', '.ui-dialog', 'class', 'media-library-widget-modal');

    // Ensure that the tab order is correct.
    $tabs = $page->findAll('css', '.media-library-menu__link');
+73 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
use Drupal\Core\Ajax\InsertCommand;
use Drupal\Core\Ajax\InvokeCommand;
use Drupal\Core\Ajax\OpenDialogCommand;
use Drupal\Core\Ajax\OpenOffCanvasDialogCommand;
use Drupal\Core\Ajax\PrependCommand;
use Drupal\Core\Ajax\RedirectCommand;
use Drupal\Core\Ajax\RemoveCommand;
@@ -487,6 +488,78 @@ public function testOpenDialogCommand(): void {
    $this->assertEquals($expected, $command->render());
  }

  /**
   * Tests dialogClass for OpenDialogCommand and OpenOffCanvasDialogCommand.
   *
   * This is a regression test for https://www.drupal.org/node/3474018.
   *
   * @legacy-covers \Drupal\Core\Ajax\OpenDialogCommand
   * @legacy-covers \Drupal\Core\Ajax\OpenOffCanvasDialogCommand
   */
  #[Group('legacy')]
  #[DataProvider('dialogCommandProvider')]
  public function testOpenDialogCommandClass(string $class, array $args, array $expected): void {
    $short = (new \ReflectionClass($class))->getShortName();
    $this->expectDeprecation("Passing \$dialog_options['dialogClass'] to {$short}::__construct() is deprecated in drupal:10.3.0 and will be removed in drupal:12.0.0. Use \$dialog_options['classes'] instead. See https://www.drupal.org/node/3440844");
    $reflection = new \ReflectionClass($class);
    $command = $reflection->newInstanceArgs($args);
    $this->assertEquals($expected, $command->getDialogOptions());
  }

  /**
   * Data provider for testOpenDialogCommandClass.
   */
  public static function dialogCommandProvider(): array {
    return [
      'OpenDialogCommand with only dialogClass' => [
        OpenDialogCommand::class,
        ['#some-dialog', 'Title', '', ['dialogClass' => 'foo bar']],
        ['title' => 'Title', 'classes' => ['ui-dialog' => 'foo bar']],
      ],
      'OpenDialogCommand with dialogClass and classes' => [
        OpenDialogCommand::class,
        ['#some-dialog', 'Title', '', ['dialogClass' => 'foo bar', 'classes' => ['ui-dialog' => 'baz qux']]],
        ['title' => 'Title', 'classes' => ['ui-dialog' => 'baz qux foo bar']],
      ],
      'OpenOffCanvasDialogCommand with only dialogClass' => [
        OpenOffCanvasDialogCommand::class,
        ['Title', '', ['dialogClass' => 'foo bar']],
        [
          'title' => 'Title',
          'classes' => [
            'ui-dialog' => 'foo bar ui-dialog-off-canvas ui-dialog-position-side',
            'ui-dialog-content' => 'drupal-off-canvas-reset',
          ],
          'modal' => FALSE,
          'autoResize' => FALSE,
          'resizable' => 'w',
          'draggable' => FALSE,
          'drupalAutoButtons' => FALSE,
          'drupalOffCanvasPosition' => 'side',
          'width' => 300,
        ],
      ],
      'OpenOffCanvasDialogCommand with dialogClass and classes' => [
        OpenOffCanvasDialogCommand::class,
        ['Title', '', ['dialogClass' => 'foo bar', 'classes' => ['ui-dialog' => 'baz qux']]],
        [
          'title' => 'Title',
          'classes' => [
            'ui-dialog' => 'baz qux foo bar ui-dialog-off-canvas ui-dialog-position-side',
            'ui-dialog-content' => 'drupal-off-canvas-reset',
          ],
          'modal' => FALSE,
          'autoResize' => FALSE,
          'resizable' => 'w',
          'draggable' => FALSE,
          'drupalAutoButtons' => FALSE,
          'drupalOffCanvasPosition' => 'side',
          'width' => 300,
        ],
      ],
    ];
  }

  /**
   * Tests open modal dialog command.
   *