Updated Drupal to 8.6. This goes with the following updates because it's possible...
[yaffs-website] / web / core / modules / quickedit / js / quickedit.js
index 4548c013a33f2b8d7001dbb4738441e5d05cdce2..56bb74646a0ca47020a9fe8270f8aa4da4d017ce 100644 (file)
 
   var entityInstancesTracker = {};
 
-  Drupal.behaviors.quickedit = {
-    attach: function attach(context) {
-      $('body').once('quickedit-init').each(initQuickEdit);
-
-      var $fields = $(context).find('[data-quickedit-field-id]').once('quickedit');
-      if ($fields.length === 0) {
-        return;
-      }
-
-      $(context).find('[data-quickedit-entity-id]').once('quickedit').each(function (index, entityElement) {
-        processEntity(entityElement);
-      });
-
-      $fields.each(function (index, fieldElement) {
-        processField(fieldElement);
-      });
-
-      contextualLinksQueue = _.filter(contextualLinksQueue, function (contextualLink) {
-        return !initializeEntityContextualLink(contextualLink);
-      });
-
-      fetchMissingMetadata(function (fieldElementsWithFreshMetadata) {
-        _.each(fieldElementsWithFreshMetadata, processField);
-
-        contextualLinksQueue = _.filter(contextualLinksQueue, function (contextualLink) {
-          return !initializeEntityContextualLink(contextualLink);
-        });
-      });
-    },
-    detach: function detach(context, settings, trigger) {
-      if (trigger === 'unload') {
-        deleteContainedModelsAndQueues($(context));
-      }
-    }
-  };
-
-  Drupal.quickedit = {
-    app: null,
-
-    collections: {
-      entities: null,
-
-      fields: null
-    },
-
-    editors: {},
-
-    metadata: {
-      has: function has(fieldID) {
-        return storage.getItem(this._prefixFieldID(fieldID)) !== null;
-      },
-      add: function add(fieldID, metadata) {
-        storage.setItem(this._prefixFieldID(fieldID), JSON.stringify(metadata));
-      },
-      get: function get(fieldID, key) {
-        var metadata = JSON.parse(storage.getItem(this._prefixFieldID(fieldID)));
-        return typeof key === 'undefined' ? metadata : metadata[key];
-      },
-      _prefixFieldID: function _prefixFieldID(fieldID) {
-        return 'Drupal.quickedit.metadata.' + fieldID;
-      },
-      _unprefixFieldID: function _unprefixFieldID(fieldID) {
-        return fieldID.substring(26);
-      },
-      intersection: function intersection(fieldIDs) {
-        var prefixedFieldIDs = _.map(fieldIDs, this._prefixFieldID);
-        var intersection = _.intersection(prefixedFieldIDs, _.keys(sessionStorage));
-        return _.map(intersection, this._unprefixFieldID);
-      }
-    }
-  };
-
-  var permissionsHashKey = Drupal.quickedit.metadata._prefixFieldID('permissionsHash');
-  var permissionsHashValue = storage.getItem(permissionsHashKey);
-  var permissionsHash = drupalSettings.user.permissionsHash;
-  if (permissionsHashValue !== permissionsHash) {
-    if (typeof permissionsHash === 'string') {
-      _.chain(storage).keys().each(function (key) {
-        if (key.substring(0, 26) === 'Drupal.quickedit.metadata.') {
-          storage.removeItem(key);
-        }
-      });
-    }
-    storage.setItem(permissionsHashKey, permissionsHash);
-  }
-
-  $(document).on('drupalContextualLinkAdded', function (event, data) {
-    if (data.$region.is('[data-quickedit-entity-id]')) {
-      if (!data.$region.is('[data-quickedit-entity-instance-id]')) {
-        data.$region.once('quickedit');
-        processEntity(data.$region.get(0));
-      }
-      var contextualLink = {
-        entityID: data.$region.attr('data-quickedit-entity-id'),
-        entityInstanceID: data.$region.attr('data-quickedit-entity-instance-id'),
-        el: data.$el[0],
-        region: data.$region[0]
-      };
-
-      if (!initializeEntityContextualLink(contextualLink)) {
-        contextualLinksQueue.push(contextualLink);
-      }
-    }
-  });
-
-  function extractEntityID(fieldID) {
-    return fieldID.split('/').slice(0, 2).join('/');
-  }
-
   function initQuickEdit(bodyElement) {
     Drupal.quickedit.collections.entities = new Drupal.quickedit.EntityCollection();
     Drupal.quickedit.collections.fields = new Drupal.quickedit.FieldCollection();
     entityElement.setAttribute('data-quickedit-entity-instance-id', entityInstanceID);
   }
 
-  function processField(fieldElement) {
-    var metadata = Drupal.quickedit.metadata;
-    var fieldID = fieldElement.getAttribute('data-quickedit-field-id');
-    var entityID = extractEntityID(fieldID);
-
-    var entityElementSelector = '[data-quickedit-entity-id="' + entityID + '"]';
-    var $entityElement = $(entityElementSelector);
-
-    if (!$entityElement.length) {
-      throw new Error('Quick Edit could not associate the rendered entity field markup (with [data-quickedit-field-id="' + fieldID + '"]) with the corresponding rendered entity markup: no parent DOM node found with [data-quickedit-entity-id="' + entityID + '"]. This is typically caused by the theme\'s template for this entity type forgetting to print the attributes.');
-    }
-    var entityElement = $(fieldElement).closest($entityElement);
-
-    if (entityElement.length === 0) {
-      var $lowestCommonParent = $entityElement.parents().has(fieldElement).first();
-      entityElement = $lowestCommonParent.find($entityElement);
-    }
-    var entityInstanceID = entityElement.get(0).getAttribute('data-quickedit-entity-instance-id');
-
-    if (!metadata.has(fieldID)) {
-      fieldsMetadataQueue.push({
-        el: fieldElement,
-        fieldID: fieldID,
-        entityID: entityID,
-        entityInstanceID: entityInstanceID
-      });
-      return;
-    }
-
-    if (metadata.get(fieldID, 'access') !== true) {
-      return;
-    }
-
-    if (Drupal.quickedit.collections.entities.findWhere({ entityID: entityID, entityInstanceID: entityInstanceID })) {
-      initializeField(fieldElement, fieldID, entityID, entityInstanceID);
-    } else {
-        fieldsAvailableQueue.push({ el: fieldElement, fieldID: fieldID, entityID: entityID, entityInstanceID: entityInstanceID });
-      }
-  }
-
   function initializeField(fieldElement, fieldID, entityID, entityInstanceID) {
     var entity = Drupal.quickedit.collections.entities.findWhere({
       entityID: entityID,
     Drupal.quickedit.collections.fields.add(field);
   }
 
-  function fetchMissingMetadata(callback) {
-    if (fieldsMetadataQueue.length) {
-      var fieldIDs = _.pluck(fieldsMetadataQueue, 'fieldID');
-      var fieldElementsWithoutMetadata = _.pluck(fieldsMetadataQueue, 'el');
-      var entityIDs = _.uniq(_.pluck(fieldsMetadataQueue, 'entityID'), true);
-
-      entityIDs = _.difference(entityIDs, Drupal.quickedit.metadata.intersection(entityIDs));
-      fieldsMetadataQueue = [];
-
-      $.ajax({
-        url: Drupal.url('quickedit/metadata'),
-        type: 'POST',
-        data: {
-          'fields[]': fieldIDs,
-          'entities[]': entityIDs
-        },
-        dataType: 'json',
-        success: function success(results) {
-          _.each(results, function (fieldMetadata, fieldID) {
-            Drupal.quickedit.metadata.add(fieldID, fieldMetadata);
-          });
-
-          callback(fieldElementsWithoutMetadata);
-        }
-      });
-    }
-  }
-
   function loadMissingEditors(callback) {
     var loadedEditors = _.keys(Drupal.quickedit.editors);
     var missingEditors = [];
 
     if (fieldIDs.length === 0) {
       return false;
-    } else if (hasFieldWithPermission(fieldIDs)) {
-        var entityModel = new Drupal.quickedit.EntityModel({
-          el: contextualLink.region,
-          entityID: contextualLink.entityID,
-          entityInstanceID: contextualLink.entityInstanceID,
-          id: contextualLink.entityID + '[' + contextualLink.entityInstanceID + ']',
-          label: Drupal.quickedit.metadata.get(contextualLink.entityID, 'label')
-        });
-        Drupal.quickedit.collections.entities.add(entityModel);
+    }
 
-        var entityDecorationView = new Drupal.quickedit.EntityDecorationView({
-          el: contextualLink.region,
-          model: entityModel
-        });
-        entityModel.set('entityDecorationView', entityDecorationView);
+    if (hasFieldWithPermission(fieldIDs)) {
+      var entityModel = new Drupal.quickedit.EntityModel({
+        el: contextualLink.region,
+        entityID: contextualLink.entityID,
+        entityInstanceID: contextualLink.entityInstanceID,
+        id: contextualLink.entityID + '[' + contextualLink.entityInstanceID + ']',
+        label: Drupal.quickedit.metadata.get(contextualLink.entityID, 'label')
+      });
+      Drupal.quickedit.collections.entities.add(entityModel);
 
-        _.each(fields, function (field) {
-          initializeField(field.el, field.fieldID, contextualLink.entityID, contextualLink.entityInstanceID);
-        });
-        fieldsAvailableQueue = _.difference(fieldsAvailableQueue, fields);
-
-        var initContextualLink = _.once(function () {
-          var $links = $(contextualLink.el).find('.contextual-links');
-          var contextualLinkView = new Drupal.quickedit.ContextualLinkView($.extend({
-            el: $('<li class="quickedit"><a href="" role="button" aria-pressed="false"></a></li>').prependTo($links),
-            model: entityModel,
-            appModel: Drupal.quickedit.app.model
-          }, options));
-          entityModel.set('contextualLinkView', contextualLinkView);
-        });
+      var entityDecorationView = new Drupal.quickedit.EntityDecorationView({
+        el: contextualLink.region,
+        model: entityModel
+      });
+      entityModel.set('entityDecorationView', entityDecorationView);
 
-        loadMissingEditors(initContextualLink);
+      _.each(fields, function (field) {
+        initializeField(field.el, field.fieldID, contextualLink.entityID, contextualLink.entityInstanceID);
+      });
+      fieldsAvailableQueue = _.difference(fieldsAvailableQueue, fields);
+
+      var initContextualLink = _.once(function () {
+        var $links = $(contextualLink.el).find('.contextual-links');
+        var contextualLinkView = new Drupal.quickedit.ContextualLinkView($.extend({
+          el: $('<li class="quickedit"><a href="" role="button" aria-pressed="false"></a></li>').prependTo($links),
+          model: entityModel,
+          appModel: Drupal.quickedit.app.model
+        }, options));
+        entityModel.set('contextualLinkView', contextualLinkView);
+      });
 
-        return true;
-      } else if (allMetadataExists(fieldIDs)) {
-          return true;
-        }
+      loadMissingEditors(initContextualLink);
+
+      return true;
+    }
+
+    if (allMetadataExists(fieldIDs)) {
+      return true;
+    }
 
     return false;
   }
 
+  function extractEntityID(fieldID) {
+    return fieldID.split('/').slice(0, 2).join('/');
+  }
+
+  function processField(fieldElement) {
+    var metadata = Drupal.quickedit.metadata;
+    var fieldID = fieldElement.getAttribute('data-quickedit-field-id');
+    var entityID = extractEntityID(fieldID);
+
+    var entityElementSelector = '[data-quickedit-entity-id="' + entityID + '"]';
+    var $entityElement = $(entityElementSelector);
+
+    if (!$entityElement.length) {
+      throw new Error('Quick Edit could not associate the rendered entity field markup (with [data-quickedit-field-id="' + fieldID + '"]) with the corresponding rendered entity markup: no parent DOM node found with [data-quickedit-entity-id="' + entityID + '"]. This is typically caused by the theme\'s template for this entity type forgetting to print the attributes.');
+    }
+    var entityElement = $(fieldElement).closest($entityElement);
+
+    if (entityElement.length === 0) {
+      var $lowestCommonParent = $entityElement.parents().has(fieldElement).first();
+      entityElement = $lowestCommonParent.find($entityElement);
+    }
+    var entityInstanceID = entityElement.get(0).getAttribute('data-quickedit-entity-instance-id');
+
+    if (!metadata.has(fieldID)) {
+      fieldsMetadataQueue.push({
+        el: fieldElement,
+        fieldID: fieldID,
+        entityID: entityID,
+        entityInstanceID: entityInstanceID
+      });
+      return;
+    }
+
+    if (metadata.get(fieldID, 'access') !== true) {
+      return;
+    }
+
+    if (Drupal.quickedit.collections.entities.findWhere({
+      entityID: entityID,
+      entityInstanceID: entityInstanceID
+    })) {
+      initializeField(fieldElement, fieldID, entityID, entityInstanceID);
+    } else {
+        fieldsAvailableQueue.push({
+          el: fieldElement,
+          fieldID: fieldID,
+          entityID: entityID,
+          entityInstanceID: entityInstanceID
+        });
+      }
+  }
+
   function deleteContainedModelsAndQueues($context) {
     $context.find('[data-quickedit-entity-id]').addBack('[data-quickedit-entity-id]').each(function (index, entityElement) {
-      var entityModel = Drupal.quickedit.collections.entities.findWhere({ el: entityElement });
+      var entityModel = Drupal.quickedit.collections.entities.findWhere({
+        el: entityElement
+      });
       if (entityModel) {
         var contextualLinkView = entityModel.get('contextualLinkView');
         contextualLinkView.undelegateEvents();
       fieldsAvailableQueue = _.filter(fieldsAvailableQueue, hasOtherFieldElement);
     });
   }
+
+  function fetchMissingMetadata(callback) {
+    if (fieldsMetadataQueue.length) {
+      var fieldIDs = _.pluck(fieldsMetadataQueue, 'fieldID');
+      var fieldElementsWithoutMetadata = _.pluck(fieldsMetadataQueue, 'el');
+      var entityIDs = _.uniq(_.pluck(fieldsMetadataQueue, 'entityID'), true);
+
+      entityIDs = _.difference(entityIDs, Drupal.quickedit.metadata.intersection(entityIDs));
+      fieldsMetadataQueue = [];
+
+      $.ajax({
+        url: Drupal.url('quickedit/metadata'),
+        type: 'POST',
+        data: {
+          'fields[]': fieldIDs,
+          'entities[]': entityIDs
+        },
+        dataType: 'json',
+        success: function success(results) {
+          _.each(results, function (fieldMetadata, fieldID) {
+            Drupal.quickedit.metadata.add(fieldID, fieldMetadata);
+          });
+
+          callback(fieldElementsWithoutMetadata);
+        }
+      });
+    }
+  }
+
+  Drupal.behaviors.quickedit = {
+    attach: function attach(context) {
+      $('body').once('quickedit-init').each(initQuickEdit);
+
+      var $fields = $(context).find('[data-quickedit-field-id]').once('quickedit');
+      if ($fields.length === 0) {
+        return;
+      }
+
+      $(context).find('[data-quickedit-entity-id]').once('quickedit').each(function (index, entityElement) {
+        processEntity(entityElement);
+      });
+
+      $fields.each(function (index, fieldElement) {
+        processField(fieldElement);
+      });
+
+      contextualLinksQueue = _.filter(contextualLinksQueue, function (contextualLink) {
+        return !initializeEntityContextualLink(contextualLink);
+      });
+
+      fetchMissingMetadata(function (fieldElementsWithFreshMetadata) {
+        _.each(fieldElementsWithFreshMetadata, processField);
+
+        contextualLinksQueue = _.filter(contextualLinksQueue, function (contextualLink) {
+          return !initializeEntityContextualLink(contextualLink);
+        });
+      });
+    },
+    detach: function detach(context, settings, trigger) {
+      if (trigger === 'unload') {
+        deleteContainedModelsAndQueues($(context));
+      }
+    }
+  };
+
+  Drupal.quickedit = {
+    app: null,
+
+    collections: {
+      entities: null,
+
+      fields: null
+    },
+
+    editors: {},
+
+    metadata: {
+      has: function has(fieldID) {
+        return storage.getItem(this._prefixFieldID(fieldID)) !== null;
+      },
+      add: function add(fieldID, metadata) {
+        storage.setItem(this._prefixFieldID(fieldID), JSON.stringify(metadata));
+      },
+      get: function get(fieldID, key) {
+        var metadata = JSON.parse(storage.getItem(this._prefixFieldID(fieldID)));
+        return typeof key === 'undefined' ? metadata : metadata[key];
+      },
+      _prefixFieldID: function _prefixFieldID(fieldID) {
+        return 'Drupal.quickedit.metadata.' + fieldID;
+      },
+      _unprefixFieldID: function _unprefixFieldID(fieldID) {
+        return fieldID.substring(26);
+      },
+      intersection: function intersection(fieldIDs) {
+        var prefixedFieldIDs = _.map(fieldIDs, this._prefixFieldID);
+        var intersection = _.intersection(prefixedFieldIDs, _.keys(sessionStorage));
+        return _.map(intersection, this._unprefixFieldID);
+      }
+    }
+  };
+
+  var permissionsHashKey = Drupal.quickedit.metadata._prefixFieldID('permissionsHash');
+  var permissionsHashValue = storage.getItem(permissionsHashKey);
+  var permissionsHash = drupalSettings.user.permissionsHash;
+  if (permissionsHashValue !== permissionsHash) {
+    if (typeof permissionsHash === 'string') {
+      _.chain(storage).keys().each(function (key) {
+        if (key.substring(0, 26) === 'Drupal.quickedit.metadata.') {
+          storage.removeItem(key);
+        }
+      });
+    }
+    storage.setItem(permissionsHashKey, permissionsHash);
+  }
+
+  $(document).on('drupalContextualLinkAdded', function (event, data) {
+    if (data.$region.is('[data-quickedit-entity-id]')) {
+      if (!data.$region.is('[data-quickedit-entity-instance-id]')) {
+        data.$region.once('quickedit');
+        processEntity(data.$region.get(0));
+      }
+      var contextualLink = {
+        entityID: data.$region.attr('data-quickedit-entity-id'),
+        entityInstanceID: data.$region.attr('data-quickedit-entity-instance-id'),
+        el: data.$el[0],
+        region: data.$region[0]
+      };
+
+      if (!initializeEntityContextualLink(contextualLink)) {
+        contextualLinksQueue.push(contextualLink);
+      }
+    }
+  });
 })(jQuery, _, Backbone, Drupal, drupalSettings, window.JSON, window.sessionStorage);
\ No newline at end of file