Chris@0: /** Chris@0: * DO NOT EDIT THIS FILE. Chris@0: * See the following change record for more information, Chris@0: * https://www.drupal.org/node/2815083 Chris@0: * @preserve Chris@0: **/ Chris@0: Chris@0: (function ($, Drupal, drupalSettings, _, Backbone, JSON, storage) { Chris@0: var options = $.extend(drupalSettings.contextual, { Chris@0: strings: { Chris@0: open: Drupal.t('Open'), Chris@0: close: Drupal.t('Close') Chris@0: } Chris@0: }); Chris@0: Chris@0: var cachedPermissionsHash = storage.getItem('Drupal.contextual.permissionsHash'); Chris@0: var permissionsHash = drupalSettings.user.permissionsHash; Chris@0: if (cachedPermissionsHash !== permissionsHash) { Chris@0: if (typeof permissionsHash === 'string') { Chris@0: _.chain(storage).keys().each(function (key) { Chris@0: if (key.substring(0, 18) === 'Drupal.contextual.') { Chris@0: storage.removeItem(key); Chris@0: } Chris@0: }); Chris@0: } Chris@0: storage.setItem('Drupal.contextual.permissionsHash', permissionsHash); Chris@0: } Chris@0: Chris@0: function initContextual($contextual, html) { Chris@0: var $region = $contextual.closest('.contextual-region'); Chris@0: var contextual = Drupal.contextual; Chris@0: Chris@0: $contextual.html(html).addClass('contextual').prepend(Drupal.theme('contextualTrigger')); Chris@0: Chris@0: var destination = 'destination=' + Drupal.encodePath(drupalSettings.path.currentPath); Chris@0: $contextual.find('.contextual-links a').each(function () { Chris@0: var url = this.getAttribute('href'); Chris@0: var glue = url.indexOf('?') === -1 ? '?' : '&'; Chris@0: this.setAttribute('href', url + glue + destination); Chris@0: }); Chris@0: Chris@0: var model = new contextual.StateModel({ Chris@0: title: $region.find('h2').eq(0).text().trim() Chris@0: }); Chris@0: var viewOptions = $.extend({ el: $contextual, model: model }, options); Chris@0: contextual.views.push({ Chris@0: visual: new contextual.VisualView(viewOptions), Chris@0: aural: new contextual.AuralView(viewOptions), Chris@0: keyboard: new contextual.KeyboardView(viewOptions) Chris@0: }); Chris@0: contextual.regionViews.push(new contextual.RegionView($.extend({ el: $region, model: model }, options))); Chris@0: Chris@0: contextual.collection.add(model); Chris@0: Chris@0: $(document).trigger('drupalContextualLinkAdded', { Chris@0: $el: $contextual, Chris@0: $region: $region, Chris@0: model: model Chris@0: }); Chris@0: Chris@0: adjustIfNestedAndOverlapping($contextual); Chris@0: } Chris@0: Chris@0: function adjustIfNestedAndOverlapping($contextual) { Chris@0: var $contextuals = $contextual.parents('.contextual-region').eq(-1).find('.contextual'); Chris@0: Chris@0: if ($contextuals.length <= 1) { Chris@0: return; Chris@0: } Chris@0: Chris@0: var firstTop = $contextuals.eq(0).offset().top; Chris@0: var secondTop = $contextuals.eq(1).offset().top; Chris@0: if (firstTop === secondTop) { Chris@0: var $nestedContextual = $contextuals.eq(1); Chris@0: Chris@0: var height = 0; Chris@0: var $trigger = $nestedContextual.find('.trigger'); Chris@0: Chris@0: $trigger.removeClass('visually-hidden'); Chris@0: height = $nestedContextual.height(); Chris@0: $trigger.addClass('visually-hidden'); Chris@0: Chris@0: $nestedContextual.css({ top: $nestedContextual.position().top + height }); Chris@0: } Chris@0: } Chris@0: Chris@0: Drupal.behaviors.contextual = { Chris@0: attach: function attach(context) { Chris@0: var $context = $(context); Chris@0: Chris@0: var $placeholders = $context.find('[data-contextual-id]').once('contextual-render'); Chris@0: if ($placeholders.length === 0) { Chris@0: return; Chris@0: } Chris@0: Chris@0: var ids = []; Chris@0: $placeholders.each(function () { Chris@0: ids.push($(this).attr('data-contextual-id')); Chris@0: }); Chris@0: Chris@0: var uncachedIDs = _.filter(ids, function (contextualID) { Chris@0: var html = storage.getItem('Drupal.contextual.' + contextualID); Chris@0: if (html && html.length) { Chris@0: window.setTimeout(function () { Chris@0: initContextual($context.find('[data-contextual-id="' + contextualID + '"]'), html); Chris@0: }); Chris@0: return false; Chris@0: } Chris@0: return true; Chris@0: }); Chris@0: Chris@0: if (uncachedIDs.length > 0) { Chris@0: $.ajax({ Chris@0: url: Drupal.url('contextual/render'), Chris@0: type: 'POST', Chris@0: data: { 'ids[]': uncachedIDs }, Chris@0: dataType: 'json', Chris@0: success: function success(results) { Chris@0: _.each(results, function (html, contextualID) { Chris@0: storage.setItem('Drupal.contextual.' + contextualID, html); Chris@0: Chris@0: if (html.length > 0) { Chris@0: $placeholders = $context.find('[data-contextual-id="' + contextualID + '"]'); Chris@0: Chris@0: for (var i = 0; i < $placeholders.length; i++) { Chris@0: initContextual($placeholders.eq(i), html); Chris@0: } Chris@0: } Chris@0: }); Chris@0: } Chris@0: }); Chris@0: } Chris@0: } Chris@0: }; Chris@0: Chris@0: Drupal.contextual = { Chris@0: views: [], Chris@0: Chris@0: regionViews: [] Chris@0: }; Chris@0: Chris@0: Drupal.contextual.collection = new Backbone.Collection([], { model: Drupal.contextual.StateModel }); Chris@0: Chris@0: Drupal.theme.contextualTrigger = function () { Chris@0: return ''; Chris@0: }; Chris@0: })(jQuery, Drupal, drupalSettings, _, Backbone, window.JSON, window.sessionStorage);