annotate core/modules/layout_builder/js/layout-builder.js @ 19:fa3358dc1485 tip

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