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@17: function adjustIfNestedAndOverlapping($contextual) { Chris@17: var $contextuals = $contextual.parents('.contextual-region').eq(-1).find('.contextual'); Chris@17: Chris@17: if ($contextuals.length <= 1) { Chris@17: return; Chris@17: } Chris@17: Chris@17: var firstTop = $contextuals.eq(0).offset().top; Chris@17: var secondTop = $contextuals.eq(1).offset().top; Chris@17: if (firstTop === secondTop) { Chris@17: var $nestedContextual = $contextuals.eq(1); Chris@17: Chris@17: var height = 0; Chris@17: var $trigger = $nestedContextual.find('.trigger'); Chris@17: Chris@17: $trigger.removeClass('visually-hidden'); Chris@17: height = $nestedContextual.height(); Chris@17: $trigger.addClass('visually-hidden'); Chris@17: Chris@17: $nestedContextual.css({ top: $nestedContextual.position().top + height }); Chris@17: } Chris@17: } Chris@17: 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@17: var destination = 'destination=' + Drupal.encodePath(Drupal.url(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: 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@17: ids.push({ Chris@17: id: $(this).attr('data-contextual-id'), Chris@17: token: $(this).attr('data-contextual-token') Chris@17: }); Chris@0: }); Chris@0: Chris@17: var uncachedIDs = []; Chris@17: var uncachedTokens = []; Chris@17: ids.forEach(function (contextualID) { Chris@17: var html = storage.getItem('Drupal.contextual.' + contextualID.id); Chris@0: if (html && html.length) { Chris@0: window.setTimeout(function () { Chris@17: initContextual($context.find('[data-contextual-id="' + contextualID.id + '"]'), html); Chris@0: }); Chris@17: return; Chris@0: } Chris@17: uncachedIDs.push(contextualID.id); Chris@17: uncachedTokens.push(contextualID.token); 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@17: data: { 'ids[]': uncachedIDs, 'tokens[]': uncachedTokens }, 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@17: Drupal.contextual.collection = new Backbone.Collection([], { Chris@17: model: Drupal.contextual.StateModel Chris@17: }); Chris@0: Chris@0: Drupal.theme.contextualTrigger = function () { Chris@0: return ''; Chris@0: }; Chris@14: Chris@14: $(document).on('drupalContextualLinkAdded', function (event, data) { Chris@14: Drupal.ajax.bindAjaxLinks(data.$el[0]); Chris@14: }); Chris@0: })(jQuery, Drupal, drupalSettings, _, Backbone, window.JSON, window.sessionStorage);