annotate core/modules/contextual/js/contextual.js @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
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@0 8 (function ($, Drupal, drupalSettings, _, Backbone, JSON, storage) {
Chris@0 9 var options = $.extend(drupalSettings.contextual, {
Chris@0 10 strings: {
Chris@0 11 open: Drupal.t('Open'),
Chris@0 12 close: Drupal.t('Close')
Chris@0 13 }
Chris@0 14 });
Chris@0 15
Chris@0 16 var cachedPermissionsHash = storage.getItem('Drupal.contextual.permissionsHash');
Chris@0 17 var permissionsHash = drupalSettings.user.permissionsHash;
Chris@0 18 if (cachedPermissionsHash !== permissionsHash) {
Chris@0 19 if (typeof permissionsHash === 'string') {
Chris@0 20 _.chain(storage).keys().each(function (key) {
Chris@0 21 if (key.substring(0, 18) === 'Drupal.contextual.') {
Chris@0 22 storage.removeItem(key);
Chris@0 23 }
Chris@0 24 });
Chris@0 25 }
Chris@0 26 storage.setItem('Drupal.contextual.permissionsHash', permissionsHash);
Chris@0 27 }
Chris@0 28
Chris@17 29 function adjustIfNestedAndOverlapping($contextual) {
Chris@17 30 var $contextuals = $contextual.parents('.contextual-region').eq(-1).find('.contextual');
Chris@17 31
Chris@17 32 if ($contextuals.length <= 1) {
Chris@17 33 return;
Chris@17 34 }
Chris@17 35
Chris@17 36 var firstTop = $contextuals.eq(0).offset().top;
Chris@17 37 var secondTop = $contextuals.eq(1).offset().top;
Chris@17 38 if (firstTop === secondTop) {
Chris@17 39 var $nestedContextual = $contextuals.eq(1);
Chris@17 40
Chris@17 41 var height = 0;
Chris@17 42 var $trigger = $nestedContextual.find('.trigger');
Chris@17 43
Chris@17 44 $trigger.removeClass('visually-hidden');
Chris@17 45 height = $nestedContextual.height();
Chris@17 46 $trigger.addClass('visually-hidden');
Chris@17 47
Chris@17 48 $nestedContextual.css({ top: $nestedContextual.position().top + height });
Chris@17 49 }
Chris@17 50 }
Chris@17 51
Chris@0 52 function initContextual($contextual, html) {
Chris@0 53 var $region = $contextual.closest('.contextual-region');
Chris@0 54 var contextual = Drupal.contextual;
Chris@0 55
Chris@0 56 $contextual.html(html).addClass('contextual').prepend(Drupal.theme('contextualTrigger'));
Chris@0 57
Chris@17 58 var destination = 'destination=' + Drupal.encodePath(Drupal.url(drupalSettings.path.currentPath));
Chris@0 59 $contextual.find('.contextual-links a').each(function () {
Chris@0 60 var url = this.getAttribute('href');
Chris@0 61 var glue = url.indexOf('?') === -1 ? '?' : '&';
Chris@0 62 this.setAttribute('href', url + glue + destination);
Chris@0 63 });
Chris@0 64
Chris@0 65 var model = new contextual.StateModel({
Chris@0 66 title: $region.find('h2').eq(0).text().trim()
Chris@0 67 });
Chris@0 68 var viewOptions = $.extend({ el: $contextual, model: model }, options);
Chris@0 69 contextual.views.push({
Chris@0 70 visual: new contextual.VisualView(viewOptions),
Chris@0 71 aural: new contextual.AuralView(viewOptions),
Chris@0 72 keyboard: new contextual.KeyboardView(viewOptions)
Chris@0 73 });
Chris@0 74 contextual.regionViews.push(new contextual.RegionView($.extend({ el: $region, model: model }, options)));
Chris@0 75
Chris@0 76 contextual.collection.add(model);
Chris@0 77
Chris@0 78 $(document).trigger('drupalContextualLinkAdded', {
Chris@0 79 $el: $contextual,
Chris@0 80 $region: $region,
Chris@0 81 model: model
Chris@0 82 });
Chris@0 83
Chris@0 84 adjustIfNestedAndOverlapping($contextual);
Chris@0 85 }
Chris@0 86
Chris@0 87 Drupal.behaviors.contextual = {
Chris@0 88 attach: function attach(context) {
Chris@0 89 var $context = $(context);
Chris@0 90
Chris@0 91 var $placeholders = $context.find('[data-contextual-id]').once('contextual-render');
Chris@0 92 if ($placeholders.length === 0) {
Chris@0 93 return;
Chris@0 94 }
Chris@0 95
Chris@0 96 var ids = [];
Chris@0 97 $placeholders.each(function () {
Chris@17 98 ids.push({
Chris@17 99 id: $(this).attr('data-contextual-id'),
Chris@17 100 token: $(this).attr('data-contextual-token')
Chris@17 101 });
Chris@0 102 });
Chris@0 103
Chris@17 104 var uncachedIDs = [];
Chris@17 105 var uncachedTokens = [];
Chris@17 106 ids.forEach(function (contextualID) {
Chris@17 107 var html = storage.getItem('Drupal.contextual.' + contextualID.id);
Chris@0 108 if (html && html.length) {
Chris@0 109 window.setTimeout(function () {
Chris@17 110 initContextual($context.find('[data-contextual-id="' + contextualID.id + '"]'), html);
Chris@0 111 });
Chris@17 112 return;
Chris@0 113 }
Chris@17 114 uncachedIDs.push(contextualID.id);
Chris@17 115 uncachedTokens.push(contextualID.token);
Chris@0 116 });
Chris@0 117
Chris@0 118 if (uncachedIDs.length > 0) {
Chris@0 119 $.ajax({
Chris@0 120 url: Drupal.url('contextual/render'),
Chris@0 121 type: 'POST',
Chris@17 122 data: { 'ids[]': uncachedIDs, 'tokens[]': uncachedTokens },
Chris@0 123 dataType: 'json',
Chris@0 124 success: function success(results) {
Chris@0 125 _.each(results, function (html, contextualID) {
Chris@0 126 storage.setItem('Drupal.contextual.' + contextualID, html);
Chris@0 127
Chris@0 128 if (html.length > 0) {
Chris@0 129 $placeholders = $context.find('[data-contextual-id="' + contextualID + '"]');
Chris@0 130
Chris@0 131 for (var i = 0; i < $placeholders.length; i++) {
Chris@0 132 initContextual($placeholders.eq(i), html);
Chris@0 133 }
Chris@0 134 }
Chris@0 135 });
Chris@0 136 }
Chris@0 137 });
Chris@0 138 }
Chris@0 139 }
Chris@0 140 };
Chris@0 141
Chris@0 142 Drupal.contextual = {
Chris@0 143 views: [],
Chris@0 144
Chris@0 145 regionViews: []
Chris@0 146 };
Chris@0 147
Chris@17 148 Drupal.contextual.collection = new Backbone.Collection([], {
Chris@17 149 model: Drupal.contextual.StateModel
Chris@17 150 });
Chris@0 151
Chris@0 152 Drupal.theme.contextualTrigger = function () {
Chris@0 153 return '<button class="trigger visually-hidden focusable" type="button"></button>';
Chris@0 154 };
Chris@14 155
Chris@14 156 $(document).on('drupalContextualLinkAdded', function (event, data) {
Chris@14 157 Drupal.ajax.bindAjaxLinks(data.$el[0]);
Chris@14 158 });
Chris@0 159 })(jQuery, Drupal, drupalSettings, _, Backbone, window.JSON, window.sessionStorage);