123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- /**
- * DO NOT EDIT THIS FILE.
- * See the following change record for more information,
- * https://www.drupal.org/node/2815083
- * @preserve
- **/
- (function ($, _, Backbone, Drupal, drupalSettings, JSON, storage) {
- var options = $.extend(drupalSettings.quickedit, {
- strings: {
- quickEdit: Drupal.t('Quick edit')
- }
- });
- var fieldsMetadataQueue = [];
- var fieldsAvailableQueue = [];
- var contextualLinksQueue = [];
- 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();
- Drupal.quickedit.app = new Drupal.quickedit.AppView({
- el: bodyElement,
- model: new Drupal.quickedit.AppModel(),
- entitiesCollection: Drupal.quickedit.collections.entities,
- fieldsCollection: Drupal.quickedit.collections.fields
- });
- }
- function processEntity(entityElement) {
- var entityID = entityElement.getAttribute('data-quickedit-entity-id');
- if (!entityInstancesTracker.hasOwnProperty(entityID)) {
- entityInstancesTracker[entityID] = 0;
- } else {
- entityInstancesTracker[entityID]++;
- }
- var entityInstanceID = entityInstancesTracker[entityID];
- 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,
- entityInstanceID: entityInstanceID
- });
- $(fieldElement).addClass('quickedit-field');
- var field = new Drupal.quickedit.FieldModel({
- el: fieldElement,
- fieldID: fieldID,
- id: fieldID + '[' + entity.get('entityInstanceID') + ']',
- entity: entity,
- metadata: Drupal.quickedit.metadata.get(fieldID),
- acceptStateChange: _.bind(Drupal.quickedit.app.acceptEditorStateChange, Drupal.quickedit.app)
- });
- 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 = [];
- Drupal.quickedit.collections.fields.each(function (fieldModel) {
- var metadata = Drupal.quickedit.metadata.get(fieldModel.get('fieldID'));
- if (metadata.access && _.indexOf(loadedEditors, metadata.editor) === -1) {
- missingEditors.push(metadata.editor);
- Drupal.quickedit.editors[metadata.editor] = false;
- }
- });
- missingEditors = _.uniq(missingEditors);
- if (missingEditors.length === 0) {
- callback();
- return;
- }
- var loadEditorsAjax = Drupal.ajax({
- url: Drupal.url('quickedit/attachments'),
- submit: { 'editors[]': missingEditors }
- });
- var realInsert = Drupal.AjaxCommands.prototype.insert;
- loadEditorsAjax.commands.insert = function (ajax, response, status) {
- _.defer(callback);
- realInsert(ajax, response, status);
- };
- loadEditorsAjax.execute();
- }
- function initializeEntityContextualLink(contextualLink) {
- var metadata = Drupal.quickedit.metadata;
- function hasFieldWithPermission(fieldIDs) {
- for (var i = 0; i < fieldIDs.length; i++) {
- var fieldID = fieldIDs[i];
- if (metadata.get(fieldID, 'access') === true) {
- return true;
- }
- }
- return false;
- }
- function allMetadataExists(fieldIDs) {
- return fieldIDs.length === metadata.intersection(fieldIDs).length;
- }
- var fields = _.where(fieldsAvailableQueue, {
- entityID: contextualLink.entityID,
- entityInstanceID: contextualLink.entityInstanceID
- });
- var fieldIDs = _.pluck(fields, 'fieldID');
- 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);
- _.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);
- });
- loadMissingEditors(initContextualLink);
- return true;
- } else if (allMetadataExists(fieldIDs)) {
- return true;
- }
- return false;
- }
- 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 });
- if (entityModel) {
- var contextualLinkView = entityModel.get('contextualLinkView');
- contextualLinkView.undelegateEvents();
- contextualLinkView.remove();
- entityModel.get('entityDecorationView').remove();
- entityModel.destroy();
- }
- function hasOtherRegion(contextualLink) {
- return contextualLink.region !== entityElement;
- }
- contextualLinksQueue = _.filter(contextualLinksQueue, hasOtherRegion);
- });
- $context.find('[data-quickedit-field-id]').addBack('[data-quickedit-field-id]').each(function (index, fieldElement) {
- Drupal.quickedit.collections.fields.chain().filter(function (fieldModel) {
- return fieldModel.get('el') === fieldElement;
- }).invoke('destroy');
- function hasOtherFieldElement(field) {
- return field.el !== fieldElement;
- }
- fieldsMetadataQueue = _.filter(fieldsMetadataQueue, hasOtherFieldElement);
- fieldsAvailableQueue = _.filter(fieldsAvailableQueue, hasOtherFieldElement);
- });
- }
- })(jQuery, _, Backbone, Drupal, drupalSettings, window.JSON, window.sessionStorage);
|