Verified Commit 291d8a2f authored by Lauri Timmanee's avatar Lauri Timmanee
Browse files

Issue #3394220 by claudiu.cristea, catch: Dialog options are not honoured when...

Issue #3394220 by claudiu.cristea, catch: Dialog options are not honoured when open a dialog using GET
parent 9d4f46c0
Loading
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -61,7 +61,7 @@ public function renderResponse(array $main_content, Request $request, RouteMatch
    $title = $main_content['#title'] ?? $this->titleResolver->getTitle($request, $route_match->getRouteObject());

    // Determine the dialog options and the target for the OpenDialogCommand.
    $options = $request->request->all('dialogOptions');
    $options = $this->getDialogOptions($request);
    $target = $this->determineTargetSelector($options, $route_match);

    $response->addCommand(new OpenDialogCommand($target, $title, $content, $options));
@@ -100,4 +100,20 @@ protected function determineTargetSelector(array &$options, RouteMatchInterface
    return $target;
  }

  /**
   * Returns the dialog options from request.
   *
   * @param \Symfony\Component\HttpFoundation\Request $request
   *   The HTTP request.
   *
   * @return array
   *   The dialog options used for OpenDialogCommand.
   */
  protected function getDialogOptions(Request $request): array {
    if ($request->getMethod() === 'GET') {
      return $request->query->all('dialogOptions');
    }
    return $request->request->all('dialogOptions');
  }

}
+2 −3
Original line number Diff line number Diff line
@@ -29,9 +29,8 @@ public function renderResponse(array $main_content, Request $request, RouteMatch
    // If the main content doesn't provide a title, use the title resolver.
    $title = $main_content['#title'] ?? $this->titleResolver->getTitle($request, $route_match->getRouteObject());

    // Determine the title: use the title provided by the main content if any,
    // otherwise get it from the routing information.
    $options = $request->request->all('dialogOptions');
    // Determine the dialog options for the OpenDialogCommand.
    $options = $this->getDialogOptions($request);

    $response->addCommand(new OpenModalDialogCommand($title, $content, $options));
    return $response;
+16 −0
Original line number Diff line number Diff line
@@ -129,3 +129,19 @@ ajax_test.throw_exception:
    _controller: '\Drupal\ajax_test\Controller\AjaxTestController::throwException'
  requirements:
    _access: 'TRUE'

ajax_test.http_methods:
  path: '/ajax-test/http-methods'
  defaults:
    _controller: Drupal\ajax_test\Controller\AjaxTestController::httpMethods
  requirements:
    _access: 'TRUE'
  options:
    no_cache: TRUE

ajax_test.http_methods.dialog:
  path: '/ajax-test/http-methods-dialog'
  defaults:
    _controller: Drupal\ajax_test\Controller\AjaxTestController::httpMethodsDialog
  requirements:
    _access: 'TRUE'
+38 −0
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@

namespace Drupal\ajax_test\Controller;

use Drupal\Component\Serialization\Json;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\AlertCommand;
use Drupal\Core\Ajax\CloseDialogCommand;
@@ -419,4 +420,41 @@ public function exceptionLink() {
    ];
  }

  /**
   * Provides an Ajax link used with different HTTP methods.
   *
   * @return array
   *   The AJAX link.
   */
  public function httpMethods(): array {
    return [
      '#type' => 'link',
      '#title' => 'Link',
      '#url' => Url::fromRoute('ajax_test.http_methods.dialog'),
      '#attributes' => [
        'class' => ['use-ajax'],
        'data-dialog-type' => 'modal',
        'data-dialog-options' => Json::encode(['width' => 800]),
        // Use this state var to change the HTTP method in tests.
        // @see \Drupal\FunctionalJavascriptTests\Ajax\DialogTest::testHttpMethod()
        'data-ajax-http-method' => \Drupal::state()->get('ajax_test.http_method', 'POST'),
      ],
      '#attached' => [
        'library' => [
          'core/drupal.dialog.ajax',
        ],
      ],
    ];
  }

  /**
   * Provides a modal dialog to test links with different HTTP methods.
   *
   * @return array
   *   The render array.
   */
  public function httpMethodsDialog(): array {
    return ['#markup' => 'Modal dialog contents'];
  }

}
+34 −0
Original line number Diff line number Diff line
@@ -188,4 +188,38 @@ public function testDialog() {
    $this->assertNotNull($form_title, 'The add form title is as expected.');
  }

  /**
   * Tests dialog link opener with different HTTP methods.
   */
  public function testHttpMethod(): void {
    $assert = $this->assertSession();
    $script = <<<SCRIPT
      (function() {
        return document.querySelector('div[aria-describedby="drupal-modal"]').offsetWidth;
      }())
      SCRIPT;

    // Open the modal dialog with POST HTTP method.
    $this->drupalGet('/ajax-test/http-methods');
    $this->clickLink('Link');
    $assert->assertWaitOnAjaxRequest();
    $assert->pageTextContains('Modal dialog contents');
    $width = $this->getSession()->getDriver()->evaluateScript($script);
    // The theme is adding 4px as padding and border on each side.
    $this->assertSame(808, $width);

    // Switch to GET HTTP method.
    // @see \Drupal\ajax_test\Controller\AjaxTestController::httpMethods()
    \Drupal::state()->set('ajax_test.http_method', 'GET');

    // Open the modal dialog with GET HTTP method.
    $this->drupalGet('/ajax-test/http-methods');
    $this->clickLink('Link');
    $assert->assertWaitOnAjaxRequest();
    $assert->pageTextContains('Modal dialog contents');
    $width = $this->getSession()->getDriver()->evaluateScript($script);
    // The theme is adding 4px as padding and border on each side.
    $this->assertSame(808, $width);
  }

}