Issue #2948068 by drpal, dawehner, borisson_, ethomas08, lauriii, yoroy, tedbow: Placing and then removing a block appends incorrect query string destination parameter

8.7.x
Alex Pott 2018-11-21 16:26:04 +00:00
parent 53c24728fb
commit 44664acfa3
No known key found for this signature in database
GPG Key ID: 31905460D4A69276
4 changed files with 44 additions and 2 deletions

View File

@ -93,7 +93,8 @@
*/
Drupal.behaviors.blockHighlightPlacement = {
attach(context, settings) {
if (settings.blockPlacement) {
// Ensure that the block we are attempting to scroll to actually exists.
if (settings.blockPlacement && $('.js-block-placed').length) {
$(context)
.find('[data-drupal-selector="edit-blocks"]')
.once('block-highlight')

View File

@ -41,7 +41,7 @@
Drupal.behaviors.blockHighlightPlacement = {
attach: function attach(context, settings) {
if (settings.blockPlacement) {
if (settings.blockPlacement && $('.js-block-placed').length) {
$(context).find('[data-drupal-selector="edit-blocks"]').once('block-highlight').each(function () {
var $container = $(this);

View File

@ -354,6 +354,23 @@ class BlockListBuilder extends ConfigEntityListBuilder implements FormInterface
if (isset($operations['delete'])) {
$operations['delete']['title'] = $this->t('Remove');
// Block operation links should have the `block-placement` query string
// parameter removed to ensure that JavaScript does not receive a block
// name that has been recently removed.
foreach ($operations as $operation) {
/** @var \Drupal\Core\Url $url */
$url = $operation['url'];
$query = $url->getOption('query');
$destination = $query['destination'];
$destinationUrl = Url::fromUserInput($destination);
$destinationQuery = $destinationUrl->getOption('query');
unset($destinationQuery['block-placement']);
$destinationUrl->setOption('query', $destinationQuery);
$query['destination'] = $destinationUrl->toString();
$url->setOption('query', $query);
}
}
return $operations;
}

View File

@ -238,6 +238,30 @@ class BlockTest extends BlockTestBase {
$this->assertNoRaw($block->id());
}
/**
* Tests the block operation links.
*/
public function testBlockOperationLinks() {
$this->drupalGet('admin/structure/block');
// Go to the select block form.
$this->clickLink('Place block');
// Select the first available block.
$this->clickLink('Place block');
// Finally place the block
$this->submitForm([], 'Save block');
$url = $this->getUrl();
$parsed = parse_url($url);
$this->assertContains('block-placement', $parsed['query']);
$this->clickLink('Remove');
$this->submitForm([], 'Remove');
$url = $this->getUrl();
$parsed = parse_url($url);
$this->assertTrue(empty($parsed['query']));
}
/**
* Tests that the block form has a theme selector when not passed via the URL.
*/