annotate core/modules/contextual/js/contextual.js @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
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@0 29 function initContextual($contextual, html) {
Chris@0 30 var $region = $contextual.closest('.contextual-region');
Chris@0 31 var contextual = Drupal.contextual;
Chris@0 32
Chris@0 33 $contextual.html(html).addClass('contextual').prepend(Drupal.theme('contextualTrigger'));
Chris@0 34
Chris@0 35 var destination = 'destination=' + Drupal.encodePath(drupalSettings.path.currentPath);
Chris@0 36 $contextual.find('.contextual-links a').each(function () {
Chris@0 37 var url = this.getAttribute('href');
Chris@0 38 var glue = url.indexOf('?') === -1 ? '?' : '&';
Chris@0 39 this.setAttribute('href', url + glue + destination);
Chris@0 40 });
Chris@0 41
Chris@0 42 var model = new contextual.StateModel({
Chris@0 43 title: $region.find('h2').eq(0).text().trim()
Chris@0 44 });
Chris@0 45 var viewOptions = $.extend({ el: $contextual, model: model }, options);
Chris@0 46 contextual.views.push({
Chris@0 47 visual: new contextual.VisualView(viewOptions),
Chris@0 48 aural: new contextual.AuralView(viewOptions),
Chris@0 49 keyboard: new contextual.KeyboardView(viewOptions)
Chris@0 50 });
Chris@0 51 contextual.regionViews.push(new contextual.RegionView($.extend({ el: $region, model: model }, options)));
Chris@0 52
Chris@0 53 contextual.collection.add(model);
Chris@0 54
Chris@0 55 $(document).trigger('drupalContextualLinkAdded', {
Chris@0 56 $el: $contextual,
Chris@0 57 $region: $region,
Chris@0 58 model: model
Chris@0 59 });
Chris@0 60
Chris@0 61 adjustIfNestedAndOverlapping($contextual);
Chris@0 62 }
Chris@0 63
Chris@0 64 function adjustIfNestedAndOverlapping($contextual) {
Chris@0 65 var $contextuals = $contextual.parents('.contextual-region').eq(-1).find('.contextual');
Chris@0 66
Chris@0 67 if ($contextuals.length <= 1) {
Chris@0 68 return;
Chris@0 69 }
Chris@0 70
Chris@0 71 var firstTop = $contextuals.eq(0).offset().top;
Chris@0 72 var secondTop = $contextuals.eq(1).offset().top;
Chris@0 73 if (firstTop === secondTop) {
Chris@0 74 var $nestedContextual = $contextuals.eq(1);
Chris@0 75
Chris@0 76 var height = 0;
Chris@0 77 var $trigger = $nestedContextual.find('.trigger');
Chris@0 78
Chris@0 79 $trigger.removeClass('visually-hidden');
Chris@0 80 height = $nestedContextual.height();
Chris@0 81 $trigger.addClass('visually-hidden');
Chris@0 82
Chris@0 83 $nestedContextual.css({ top: $nestedContextual.position().top + height });
Chris@0 84 }
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@0 98 ids.push($(this).attr('data-contextual-id'));
Chris@0 99 });
Chris@0 100
Chris@0 101 var uncachedIDs = _.filter(ids, function (contextualID) {
Chris@0 102 var html = storage.getItem('Drupal.contextual.' + contextualID);
Chris@0 103 if (html && html.length) {
Chris@0 104 window.setTimeout(function () {
Chris@0 105 initContextual($context.find('[data-contextual-id="' + contextualID + '"]'), html);
Chris@0 106 });
Chris@0 107 return false;
Chris@0 108 }
Chris@0 109 return true;
Chris@0 110 });
Chris@0 111
Chris@0 112 if (uncachedIDs.length > 0) {
Chris@0 113 $.ajax({
Chris@0 114 url: Drupal.url('contextual/render'),
Chris@0 115 type: 'POST',
Chris@0 116 data: { 'ids[]': uncachedIDs },
Chris@0 117 dataType: 'json',
Chris@0 118 success: function success(results) {
Chris@0 119 _.each(results, function (html, contextualID) {
Chris@0 120 storage.setItem('Drupal.contextual.' + contextualID, html);
Chris@0 121
Chris@0 122 if (html.length > 0) {
Chris@0 123 $placeholders = $context.find('[data-contextual-id="' + contextualID + '"]');
Chris@0 124
Chris@0 125 for (var i = 0; i < $placeholders.length; i++) {
Chris@0 126 initContextual($placeholders.eq(i), html);
Chris@0 127 }
Chris@0 128 }
Chris@0 129 });
Chris@0 130 }
Chris@0 131 });
Chris@0 132 }
Chris@0 133 }
Chris@0 134 };
Chris@0 135
Chris@0 136 Drupal.contextual = {
Chris@0 137 views: [],
Chris@0 138
Chris@0 139 regionViews: []
Chris@0 140 };
Chris@0 141
Chris@0 142 Drupal.contextual.collection = new Backbone.Collection([], { model: Drupal.contextual.StateModel });
Chris@0 143
Chris@0 144 Drupal.theme.contextualTrigger = function () {
Chris@0 145 return '<button class="trigger visually-hidden focusable" type="button"></button>';
Chris@0 146 };
Chris@0 147 })(jQuery, Drupal, drupalSettings, _, Backbone, window.JSON, window.sessionStorage);