entity_browser-8.x-2.x-dev/js/entity_browser.common.js
js/entity_browser.common.js
/** * @file entity_browser.common.js * * Common helper functions used by various parts of entity browser. */ (function ($, Drupal, drupalSettings) { 'use strict'; Drupal.entityBrowser = {}; /** * Command to refresh an entity_browser_entity_reference field widget. * * @param {Drupal.Ajax} [ajax] * The ajax object. * @param {object} response * Object holding the server response. * @param {string} response.details_id * The ID for the details element. * @param {number} [status] * The HTTP status code. */ Drupal.AjaxCommands.prototype.entity_browser_value_updated = function (ajax, response, status) { $('#' + response.details_id) .find('input[type="hidden"][name$="[target_id]"]') .trigger('entity_browser_value_updated'); }; /** * Reacts on "entities selected" event. * * @param {object} event * Event object. * @param {string} uuid * Entity browser UUID. * @param {array} entities * Array of selected entities. */ Drupal.entityBrowser.selectionCompleted = function (event, uuid, entities) { var selected_entities = $.map(entities, function (item) { return item[2] + ':' + item[0]; }); // @todo Use uuid here. But for this to work we need to move eb uuid // generation from display to eb directly. When we do this, we can change // \Drupal\entity_browser\Plugin\Field\FieldWidget\EntityReferenceBrowserWidget::formElement // also. // Checking if cardinality is set - assume unlimited. var cardinality = isNaN(parseInt(drupalSettings['entity_browser'][uuid]['cardinality'])) ? -1 : parseInt(drupalSettings['entity_browser'][uuid]['cardinality']); // Get field widget selection mode. var selection_mode = drupalSettings['entity_browser'][uuid]['selection_mode']; // Update value form element with new entity IDs. var selector = drupalSettings['entity_browser'][uuid]['selector'] ? $(drupalSettings['entity_browser'][uuid]['selector']) : $(this).parent().parent().find('input[type*=hidden]'); var entity_ids = selector.val(); var existing_entities = (entity_ids.length !== 0) ? entity_ids.split(' ') : []; entity_ids = Drupal.entityBrowser.updateEntityIds( existing_entities, selected_entities, selection_mode, cardinality ); selector.val(entity_ids); selector.trigger('entity_browser_value_updated'); }; /** * Updates the list of selected entities. * * It uses existing selection and selected entities in entity browser. Also * considers cardinality and used selection mode. * * Note: Selection modes are defined in EntityBrowserElement class and same * options should be used here to determine what action will be performed. * Default action is append ('selection_append'). * * @param {Array} existing_entities * List of existing entity IDs. * @param {Array} selected_entities * The entities that are selected and entity browser. * @param {string} selection_mode * Selection mode defined by entity browser field widget. * @param {int} cardinality * The maximal amount of items the field can store. * * @return {string} * List of entities as a string, separated by space. */ Drupal.entityBrowser.updateEntityIds = function (existing_entities, selected_entities, selection_mode, cardinality) { var combined_entities; if (selection_mode === 'selection_edit') { // Propagate new selected entities. combined_entities = selected_entities; } else if (selection_mode === 'selection_prepend') { // Prepend selected entities to existing list of entities. combined_entities = selected_entities.concat(existing_entities); } else { // Append selected entities to existing list of entities. combined_entities = existing_entities.concat(selected_entities); } // Ensure unique entities are selected. combined_entities = [...new Set(combined_entities)]; // Having more elements than cardinality should never happen, because // server side authentication should prevent it, but we handle it here // anyway. if (cardinality > 0 && combined_entities.length > cardinality) { combined_entities = combined_entities.slice(0, cardinality); } return combined_entities.join(' '); }; /** * Reacts on "entities selected" event. * * @param {object} element * Element to bind on. * @param {array} callbacks * List of callbacks. * @param {string} event_name * Name of event to bind to. */ Drupal.entityBrowser.registerJsCallbacks = function (element, callbacks, event_name) { // JS callbacks are registered as strings. We need to split their names and // find actual functions. for (var i = 0; i < callbacks.length; i++) { var callback = callbacks[i].split('.'); var fn = window; for (var j = 0; j < callback.length; j++) { fn = fn[callback[j]]; } if (typeof fn === 'function') { $(element).bind(event_name, fn); } } }; }(jQuery, Drupal, drupalSettings));