annotate core/modules/layout_builder/js/layout-builder.js @ 5:12f9dff5fda9 tip

Update to Drupal core 8.7.1
author Chris Cannam
date Thu, 09 May 2019 15:34:47 +0100
parents c75dbcec494b
children
rev   line source
Chris@0 1 /**
Chris@0 2 * DO NOT EDIT THIS FILE.
Chris@0 3 * See the following change record for more information,
Chris@0 4 * https://www.drupal.org/node/2815083
Chris@0 5 * @preserve
Chris@0 6 **/
Chris@0 7
Chris@5 8 (function ($, Drupal) {
Chris@5 9 var ajax = Drupal.ajax,
Chris@5 10 behaviors = Drupal.behaviors,
Chris@5 11 debounce = Drupal.debounce,
Chris@5 12 announce = Drupal.announce,
Chris@5 13 formatPlural = Drupal.formatPlural;
Chris@0 14
Chris@5 15 var layoutBuilderBlocksFiltered = false;
Chris@5 16
Chris@5 17 behaviors.layoutBuilderBlockFilter = {
Chris@0 18 attach: function attach(context) {
Chris@5 19 var $categories = $('.js-layout-builder-categories', context);
Chris@5 20 var $filterLinks = $categories.find('.js-layout-builder-block-link');
Chris@5 21
Chris@5 22 var filterBlockList = function filterBlockList(e) {
Chris@5 23 var query = $(e.target).val().toLowerCase();
Chris@5 24
Chris@5 25 var toggleBlockEntry = function toggleBlockEntry(index, link) {
Chris@5 26 var $link = $(link);
Chris@5 27 var textMatch = $link.text().toLowerCase().indexOf(query) !== -1;
Chris@5 28 $link.toggle(textMatch);
Chris@5 29 };
Chris@5 30
Chris@5 31 if (query.length >= 2) {
Chris@5 32 $categories.find('.js-layout-builder-category:not([open])').attr('remember-closed', '');
Chris@5 33
Chris@5 34 $categories.find('.js-layout-builder-category').attr('open', '');
Chris@5 35
Chris@5 36 $filterLinks.each(toggleBlockEntry);
Chris@5 37
Chris@5 38 $categories.find('.js-layout-builder-category:not(:has(.js-layout-builder-block-link:visible))').hide();
Chris@5 39
Chris@5 40 announce(formatPlural($categories.find('.js-layout-builder-block-link:visible').length, '1 block is available in the modified list.', '@count blocks are available in the modified list.'));
Chris@5 41 layoutBuilderBlocksFiltered = true;
Chris@5 42 } else if (layoutBuilderBlocksFiltered) {
Chris@5 43 layoutBuilderBlocksFiltered = false;
Chris@5 44
Chris@5 45 $categories.find('.js-layout-builder-category[remember-closed]').removeAttr('open').removeAttr('remember-closed');
Chris@5 46 $categories.find('.js-layout-builder-category').show();
Chris@5 47 $filterLinks.show();
Chris@5 48 announce(Drupal.t('All available blocks are listed.'));
Chris@5 49 }
Chris@5 50 };
Chris@5 51
Chris@5 52 $('input.js-layout-builder-filter', context).once('block-filter-text').on('keyup', debounce(filterBlockList, 200));
Chris@5 53 }
Chris@5 54 };
Chris@5 55
Chris@5 56 behaviors.layoutBuilderBlockDrag = {
Chris@5 57 attach: function attach(context) {
Chris@5 58 $(context).find('.js-layout-builder-region').sortable({
Chris@5 59 items: '> .js-layout-builder-block',
Chris@5 60 connectWith: '.js-layout-builder-region',
Chris@0 61 placeholder: 'ui-state-drop',
Chris@0 62
Chris@0 63 update: function update(event, ui) {
Chris@5 64 var itemRegion = ui.item.closest('.js-layout-builder-region');
Chris@0 65 if (event.target === itemRegion[0]) {
Chris@0 66 var deltaTo = ui.item.closest('[data-layout-delta]').data('layout-delta');
Chris@0 67
Chris@0 68 var deltaFrom = ui.sender ? ui.sender.closest('[data-layout-delta]').data('layout-delta') : deltaTo;
Chris@0 69 ajax({
Chris@0 70 url: [ui.item.closest('[data-layout-update-url]').data('layout-update-url'), deltaFrom, deltaTo, itemRegion.data('region'), ui.item.data('layout-block-uuid'), ui.item.prev('[data-layout-block-uuid]').data('layout-block-uuid')].filter(function (element) {
Chris@0 71 return element !== undefined;
Chris@0 72 }).join('/')
Chris@0 73 }).execute();
Chris@0 74 }
Chris@0 75 }
Chris@0 76 });
Chris@0 77 }
Chris@0 78 };
Chris@5 79
Chris@5 80 behaviors.layoutBuilderDisableInteractiveElements = {
Chris@5 81 attach: function attach() {
Chris@5 82 var $blocks = $('#layout-builder [data-layout-block-uuid]');
Chris@5 83 $blocks.find('input, textarea, select').prop('disabled', true);
Chris@5 84 $blocks.find('a').not(function (index, element) {
Chris@5 85 return $(element).closest('[data-contextual-id]').length > 0;
Chris@5 86 }).on('click mouseup touchstart', function (e) {
Chris@5 87 e.preventDefault();
Chris@5 88 e.stopPropagation();
Chris@5 89 });
Chris@5 90
Chris@5 91 $blocks.find('button, [href], input, select, textarea, iframe, [tabindex]:not([tabindex="-1"]):not(.tabbable)').not(function (index, element) {
Chris@5 92 return $(element).closest('[data-contextual-id]').length > 0;
Chris@5 93 }).attr('tabindex', -1);
Chris@5 94 }
Chris@5 95 };
Chris@5 96
Chris@5 97 $(window).on('dialog:aftercreate', function (event, dialog, $element) {
Chris@5 98 if (Drupal.offCanvas.isOffCanvas($element)) {
Chris@5 99 $('.is-layout-builder-highlighted').removeClass('is-layout-builder-highlighted');
Chris@5 100
Chris@5 101 var id = $element.find('[data-layout-builder-target-highlight-id]').attr('data-layout-builder-target-highlight-id');
Chris@5 102 if (id) {
Chris@5 103 $('[data-layout-builder-highlight-id="' + id + '"]').addClass('is-layout-builder-highlighted');
Chris@5 104 }
Chris@5 105
Chris@5 106 $('#layout-builder').removeClass('layout-builder--move-blocks-active');
Chris@5 107
Chris@5 108 var layoutBuilderWrapperValue = $element.find('[data-add-layout-builder-wrapper]').attr('data-add-layout-builder-wrapper');
Chris@5 109 if (layoutBuilderWrapperValue) {
Chris@5 110 $('#layout-builder').addClass(layoutBuilderWrapperValue);
Chris@5 111 }
Chris@5 112 }
Chris@5 113 });
Chris@5 114
Chris@5 115 if (document.querySelector('[data-off-canvas-main-canvas]')) {
Chris@5 116 var mainCanvas = document.querySelector('[data-off-canvas-main-canvas]');
Chris@5 117
Chris@5 118 mainCanvas.addEventListener('transitionend', function () {
Chris@5 119 var $target = $('.is-layout-builder-highlighted');
Chris@5 120
Chris@5 121 if ($target.length > 0) {
Chris@5 122 var targetTop = $target.offset().top;
Chris@5 123 var targetBottom = targetTop + $target.outerHeight();
Chris@5 124 var viewportTop = $(window).scrollTop();
Chris@5 125 var viewportBottom = viewportTop + $(window).height();
Chris@5 126
Chris@5 127 if (targetBottom < viewportTop || targetTop > viewportBottom) {
Chris@5 128 var viewportMiddle = (viewportBottom + viewportTop) / 2;
Chris@5 129 var scrollAmount = targetTop - viewportMiddle;
Chris@5 130
Chris@5 131 if ('scrollBehavior' in document.documentElement.style) {
Chris@5 132 window.scrollBy({
Chris@5 133 top: scrollAmount,
Chris@5 134 left: 0,
Chris@5 135 behavior: 'smooth'
Chris@5 136 });
Chris@5 137 } else {
Chris@5 138 window.scrollBy(0, scrollAmount);
Chris@5 139 }
Chris@5 140 }
Chris@5 141 }
Chris@5 142 });
Chris@5 143 }
Chris@5 144
Chris@5 145 $(window).on('dialog:afterclose', function (event, dialog, $element) {
Chris@5 146 if (Drupal.offCanvas.isOffCanvas($element)) {
Chris@5 147 $('.is-layout-builder-highlighted').removeClass('is-layout-builder-highlighted');
Chris@5 148
Chris@5 149 $('#layout-builder').removeClass('layout-builder--move-blocks-active');
Chris@5 150 }
Chris@5 151 });
Chris@5 152
Chris@5 153 behaviors.layoutBuilderToggleContentPreview = {
Chris@5 154 attach: function attach(context) {
Chris@5 155 var $layoutBuilder = $('#layout-builder');
Chris@5 156
Chris@5 157 var $layoutBuilderContentPreview = $('#layout-builder-content-preview');
Chris@5 158
Chris@5 159 var contentPreviewId = $layoutBuilderContentPreview.data('content-preview-id');
Chris@5 160
Chris@5 161 var isContentPreview = JSON.parse(localStorage.getItem(contentPreviewId)) !== false;
Chris@5 162
Chris@5 163 var disableContentPreview = function disableContentPreview() {
Chris@5 164 $layoutBuilder.addClass('layout-builder--content-preview-disabled');
Chris@5 165
Chris@5 166 $('[data-layout-content-preview-placeholder-label]', context).each(function (i, element) {
Chris@5 167 var $element = $(element);
Chris@5 168
Chris@5 169 $element.children(':not([data-contextual-id])').hide(0);
Chris@5 170
Chris@5 171 var contentPreviewPlaceholderText = $element.attr('data-layout-content-preview-placeholder-label');
Chris@5 172
Chris@5 173 var contentPreviewPlaceholderLabel = Drupal.theme('layoutBuilderPrependContentPreviewPlaceholderLabel', contentPreviewPlaceholderText);
Chris@5 174 $element.prepend(contentPreviewPlaceholderLabel);
Chris@5 175 });
Chris@5 176 };
Chris@5 177
Chris@5 178 var enableContentPreview = function enableContentPreview() {
Chris@5 179 $layoutBuilder.removeClass('layout-builder--content-preview-disabled');
Chris@5 180
Chris@5 181 $('.js-layout-builder-content-preview-placeholder-label').remove();
Chris@5 182
Chris@5 183 $('[data-layout-content-preview-placeholder-label]').each(function (i, element) {
Chris@5 184 $(element).children().show();
Chris@5 185 });
Chris@5 186 };
Chris@5 187
Chris@5 188 $('#layout-builder-content-preview', context).on('change', function (event) {
Chris@5 189 var isChecked = $(event.currentTarget).is(':checked');
Chris@5 190
Chris@5 191 localStorage.setItem(contentPreviewId, JSON.stringify(isChecked));
Chris@5 192
Chris@5 193 if (isChecked) {
Chris@5 194 enableContentPreview();
Chris@5 195 announce(Drupal.t('Block previews are visible. Block labels are hidden.'));
Chris@5 196 } else {
Chris@5 197 disableContentPreview();
Chris@5 198 announce(Drupal.t('Block previews are hidden. Block labels are visible.'));
Chris@5 199 }
Chris@5 200 });
Chris@5 201
Chris@5 202 if (!isContentPreview) {
Chris@5 203 $layoutBuilderContentPreview.attr('checked', false);
Chris@5 204 disableContentPreview();
Chris@5 205 }
Chris@5 206 }
Chris@5 207 };
Chris@5 208
Chris@5 209 Drupal.theme.layoutBuilderPrependContentPreviewPlaceholderLabel = function (contentPreviewPlaceholderText) {
Chris@5 210 var contentPreviewPlaceholderLabel = document.createElement('div');
Chris@5 211 contentPreviewPlaceholderLabel.className = 'layout-builder-block__content-preview-placeholder-label js-layout-builder-content-preview-placeholder-label';
Chris@5 212 contentPreviewPlaceholderLabel.innerHTML = contentPreviewPlaceholderText;
Chris@5 213
Chris@5 214 return '<div class="layout-builder-block__content-preview-placeholder-label js-layout-builder-content-preview-placeholder-label">' + contentPreviewPlaceholderText + '</div>';
Chris@5 215 };
Chris@0 216 })(jQuery, Drupal);