diff -u b/core/modules/outside_in/js/outside_in.js b/core/modules/outside_in/js/outside_in.js --- b/core/modules/outside_in/js/outside_in.js +++ b/core/modules/outside_in/js/outside_in.js @@ -10,6 +10,7 @@ var blockConfigureSelector = '[data-dialog-renderer="offcanvas"]'; var toggleEditSelector = '[data-drupal-outsidein="toggle"]'; var itemsToToggleSelector = '#main-canvas, #toolbar-bar, [data-drupal-outsidein="editable"] a, [data-drupal-outsidein="editable"] button'; + var contextualItemsSelector = '[data-contextual-id] a, [data-contextual-id] button'; /** * Reacts to contextual links being added. @@ -45,8 +46,7 @@ * Items that should be toggled. */ function getItemsToToggle() { - return $(itemsToToggleSelector) - .not('[data-contextual-id] a, [data-contextual-id] button'); + return $(itemsToToggleSelector).not(contextualItemsSelector); } /** @@ -65,6 +65,10 @@ setEditModeState(!isInEditMode()); } + function preventClick(event) { + event.preventDefault(); + } + /** * Helper to switch edit mode state. * @@ -74,6 +78,7 @@ function setEditModeState(editMode) { editMode = !!editMode; var $editButton = $(toggleEditSelector); + var $editables; // Turn on edit mode. if (editMode) { $editButton.text(Drupal.t('Editing')); @@ -81,9 +86,34 @@ if ($('#toolbar-item-administration-tray').hasClass('is-active')) { $('#toolbar-item-administration').trigger('click'); } + + $editables = $('[data-drupal-outsidein="editable"]').once('outsidein'); + if ($editables.length) { + // Use event capture to prevent clicks on links. + document.addEventListener('click', preventClick, true); + + // When a click occurs try and find the outside-in edit link + // and click it. + $editables + .not(contextualItemsSelector) + .on('click.outsidein', function (e) { + // @todo check if we can't use currentTarget too. + if ($(e.target).parent().hasClass('contextual') || !localStorage.getItem('Drupal.contextualToolbar.isViewing')) { + return; + } + + $(e.currentTarget).find(blockConfigureSelector).trigger('click'); + }); + } } // Disable edit mode. else { + $editables = $('[data-drupal-outsidein="editable"]').removeOnce('outsidein'); + if ($editables.length) { + document.removeEventListener('click', preventClick, true); + $editables.off('.outsidein'); + } + $editButton.text(Drupal.t('Edit')); // Close/remove offcanvas. $('.ui-dialog-offcanvas .ui-dialog-titlebar-close').trigger('click'); @@ -123,29 +153,4 @@ $(toggleEditSelector).once('outsidein').on('click.outsidein', toggleEditMode); - var $editables = $('[data-drupal-outsidein="editable"]').once('outsidein'); - if ($editables.length) { - - // Bind an event listener to the editable div and stops default actions - // of those elements. - $editables.on('click.outsidein', '.js-outside-in-edit-mode', function (e) { - if (isInEditMode()) { - e.preventDefault(); - } - }); - - // When a click occurs try and find the outside-in edit link - // and click it. - $editables - .not('[data-contextual-id] a, [data-contextual-id] button') - .on('click.outsidein', function (e) { - // @todo check if we can't use currentTarget too. - if ($(e.target).parent().hasClass('contextual') || !localStorage.getItem('Drupal.contextualToolbar.isViewing')) { - return; - } - - $(e.currentTarget).find(blockConfigureSelector).trigger('click'); - }); - } - var search = Drupal.ajax.WRAPPER_FORMAT + '=drupal_dialog'; var replace = Drupal.ajax.WRAPPER_FORMAT + '=drupal_dialog_offcanvas';