Chris@14: /** Chris@14: * DO NOT EDIT THIS FILE. Chris@14: * See the following change record for more information, Chris@14: * https://www.drupal.org/node/2815083 Chris@14: * @preserve Chris@14: **/ Chris@14: Chris@18: (function ($, Drupal) { Chris@18: var ajax = Drupal.ajax, Chris@18: behaviors = Drupal.behaviors, Chris@18: debounce = Drupal.debounce, Chris@18: announce = Drupal.announce, Chris@18: formatPlural = Drupal.formatPlural; Chris@14: Chris@18: var layoutBuilderBlocksFiltered = false; Chris@18: Chris@18: behaviors.layoutBuilderBlockFilter = { Chris@14: attach: function attach(context) { Chris@18: var $categories = $('.js-layout-builder-categories', context); Chris@18: var $filterLinks = $categories.find('.js-layout-builder-block-link'); Chris@18: Chris@18: var filterBlockList = function filterBlockList(e) { Chris@18: var query = $(e.target).val().toLowerCase(); Chris@18: Chris@18: var toggleBlockEntry = function toggleBlockEntry(index, link) { Chris@18: var $link = $(link); Chris@18: var textMatch = $link.text().toLowerCase().indexOf(query) !== -1; Chris@18: $link.toggle(textMatch); Chris@18: }; Chris@18: Chris@18: if (query.length >= 2) { Chris@18: $categories.find('.js-layout-builder-category:not([open])').attr('remember-closed', ''); Chris@18: Chris@18: $categories.find('.js-layout-builder-category').attr('open', ''); Chris@18: Chris@18: $filterLinks.each(toggleBlockEntry); Chris@18: Chris@18: $categories.find('.js-layout-builder-category:not(:has(.js-layout-builder-block-link:visible))').hide(); Chris@18: Chris@18: 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: layoutBuilderBlocksFiltered = true; Chris@18: } else if (layoutBuilderBlocksFiltered) { Chris@18: layoutBuilderBlocksFiltered = false; Chris@18: Chris@18: $categories.find('.js-layout-builder-category[remember-closed]').removeAttr('open').removeAttr('remember-closed'); Chris@18: $categories.find('.js-layout-builder-category').show(); Chris@18: $filterLinks.show(); Chris@18: announce(Drupal.t('All available blocks are listed.')); Chris@18: } Chris@18: }; Chris@18: Chris@18: $('input.js-layout-builder-filter', context).once('block-filter-text').on('keyup', debounce(filterBlockList, 200)); Chris@18: } Chris@18: }; Chris@18: Chris@18: behaviors.layoutBuilderBlockDrag = { Chris@18: attach: function attach(context) { Chris@18: $(context).find('.js-layout-builder-region').sortable({ Chris@18: items: '> .js-layout-builder-block', Chris@18: connectWith: '.js-layout-builder-region', Chris@16: placeholder: 'ui-state-drop', Chris@14: Chris@14: update: function update(event, ui) { Chris@18: var itemRegion = ui.item.closest('.js-layout-builder-region'); Chris@14: if (event.target === itemRegion[0]) { Chris@14: var deltaTo = ui.item.closest('[data-layout-delta]').data('layout-delta'); Chris@14: Chris@14: var deltaFrom = ui.sender ? ui.sender.closest('[data-layout-delta]').data('layout-delta') : deltaTo; Chris@14: ajax({ Chris@14: 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: return element !== undefined; Chris@14: }).join('/') Chris@14: }).execute(); Chris@14: } Chris@14: } Chris@14: }); Chris@14: } Chris@14: }; Chris@18: Chris@18: behaviors.layoutBuilderDisableInteractiveElements = { Chris@18: attach: function attach() { Chris@18: var $blocks = $('#layout-builder [data-layout-block-uuid]'); Chris@18: $blocks.find('input, textarea, select').prop('disabled', true); Chris@18: $blocks.find('a').not(function (index, element) { Chris@18: return $(element).closest('[data-contextual-id]').length > 0; Chris@18: }).on('click mouseup touchstart', function (e) { Chris@18: e.preventDefault(); Chris@18: e.stopPropagation(); Chris@18: }); Chris@18: Chris@18: $blocks.find('button, [href], input, select, textarea, iframe, [tabindex]:not([tabindex="-1"]):not(.tabbable)').not(function (index, element) { Chris@18: return $(element).closest('[data-contextual-id]').length > 0; Chris@18: }).attr('tabindex', -1); Chris@18: } Chris@18: }; Chris@18: Chris@18: $(window).on('dialog:aftercreate', function (event, dialog, $element) { Chris@18: if (Drupal.offCanvas.isOffCanvas($element)) { Chris@18: $('.is-layout-builder-highlighted').removeClass('is-layout-builder-highlighted'); Chris@18: Chris@18: var id = $element.find('[data-layout-builder-target-highlight-id]').attr('data-layout-builder-target-highlight-id'); Chris@18: if (id) { Chris@18: $('[data-layout-builder-highlight-id="' + id + '"]').addClass('is-layout-builder-highlighted'); Chris@18: } Chris@18: Chris@18: $('#layout-builder').removeClass('layout-builder--move-blocks-active'); Chris@18: Chris@18: var layoutBuilderWrapperValue = $element.find('[data-add-layout-builder-wrapper]').attr('data-add-layout-builder-wrapper'); Chris@18: if (layoutBuilderWrapperValue) { Chris@18: $('#layout-builder').addClass(layoutBuilderWrapperValue); Chris@18: } Chris@18: } Chris@18: }); Chris@18: Chris@18: if (document.querySelector('[data-off-canvas-main-canvas]')) { Chris@18: var mainCanvas = document.querySelector('[data-off-canvas-main-canvas]'); Chris@18: Chris@18: mainCanvas.addEventListener('transitionend', function () { Chris@18: var $target = $('.is-layout-builder-highlighted'); Chris@18: Chris@18: if ($target.length > 0) { Chris@18: var targetTop = $target.offset().top; Chris@18: var targetBottom = targetTop + $target.outerHeight(); Chris@18: var viewportTop = $(window).scrollTop(); Chris@18: var viewportBottom = viewportTop + $(window).height(); Chris@18: Chris@18: if (targetBottom < viewportTop || targetTop > viewportBottom) { Chris@18: var viewportMiddle = (viewportBottom + viewportTop) / 2; Chris@18: var scrollAmount = targetTop - viewportMiddle; Chris@18: Chris@18: if ('scrollBehavior' in document.documentElement.style) { Chris@18: window.scrollBy({ Chris@18: top: scrollAmount, Chris@18: left: 0, Chris@18: behavior: 'smooth' Chris@18: }); Chris@18: } else { Chris@18: window.scrollBy(0, scrollAmount); Chris@18: } Chris@18: } Chris@18: } Chris@18: }); Chris@18: } Chris@18: Chris@18: $(window).on('dialog:afterclose', function (event, dialog, $element) { Chris@18: if (Drupal.offCanvas.isOffCanvas($element)) { Chris@18: $('.is-layout-builder-highlighted').removeClass('is-layout-builder-highlighted'); Chris@18: Chris@18: $('#layout-builder').removeClass('layout-builder--move-blocks-active'); Chris@18: } Chris@18: }); Chris@18: Chris@18: behaviors.layoutBuilderToggleContentPreview = { Chris@18: attach: function attach(context) { Chris@18: var $layoutBuilder = $('#layout-builder'); Chris@18: Chris@18: var $layoutBuilderContentPreview = $('#layout-builder-content-preview'); Chris@18: Chris@18: var contentPreviewId = $layoutBuilderContentPreview.data('content-preview-id'); Chris@18: Chris@18: var isContentPreview = JSON.parse(localStorage.getItem(contentPreviewId)) !== false; Chris@18: Chris@18: var disableContentPreview = function disableContentPreview() { Chris@18: $layoutBuilder.addClass('layout-builder--content-preview-disabled'); Chris@18: Chris@18: $('[data-layout-content-preview-placeholder-label]', context).each(function (i, element) { Chris@18: var $element = $(element); Chris@18: Chris@18: $element.children(':not([data-contextual-id])').hide(0); Chris@18: Chris@18: var contentPreviewPlaceholderText = $element.attr('data-layout-content-preview-placeholder-label'); Chris@18: Chris@18: var contentPreviewPlaceholderLabel = Drupal.theme('layoutBuilderPrependContentPreviewPlaceholderLabel', contentPreviewPlaceholderText); Chris@18: $element.prepend(contentPreviewPlaceholderLabel); Chris@18: }); Chris@18: }; Chris@18: Chris@18: var enableContentPreview = function enableContentPreview() { Chris@18: $layoutBuilder.removeClass('layout-builder--content-preview-disabled'); Chris@18: Chris@18: $('.js-layout-builder-content-preview-placeholder-label').remove(); Chris@18: Chris@18: $('[data-layout-content-preview-placeholder-label]').each(function (i, element) { Chris@18: $(element).children().show(); Chris@18: }); Chris@18: }; Chris@18: Chris@18: $('#layout-builder-content-preview', context).on('change', function (event) { Chris@18: var isChecked = $(event.currentTarget).is(':checked'); Chris@18: Chris@18: localStorage.setItem(contentPreviewId, JSON.stringify(isChecked)); Chris@18: Chris@18: if (isChecked) { Chris@18: enableContentPreview(); Chris@18: announce(Drupal.t('Block previews are visible. Block labels are hidden.')); Chris@18: } else { Chris@18: disableContentPreview(); Chris@18: announce(Drupal.t('Block previews are hidden. Block labels are visible.')); Chris@18: } Chris@18: }); Chris@18: Chris@18: if (!isContentPreview) { Chris@18: $layoutBuilderContentPreview.attr('checked', false); Chris@18: disableContentPreview(); Chris@18: } Chris@18: } Chris@18: }; Chris@18: Chris@18: Drupal.theme.layoutBuilderPrependContentPreviewPlaceholderLabel = function (contentPreviewPlaceholderText) { Chris@18: var contentPreviewPlaceholderLabel = document.createElement('div'); Chris@18: contentPreviewPlaceholderLabel.className = 'layout-builder-block__content-preview-placeholder-label js-layout-builder-content-preview-placeholder-label'; Chris@18: contentPreviewPlaceholderLabel.innerHTML = contentPreviewPlaceholderText; Chris@18: Chris@18: return '