entity_browser-8.x-2.x-dev/js/entity_browser.multi_step_display.js
js/entity_browser.multi_step_display.js
/**
* @file entity_browser.multi_step_display.js
*/
(function ($, Drupal, Sortable, once) {
'use strict';
/**
* Registers behaviours related to selected entities.
*/
Drupal.behaviors.entityBrowserMultiStepDisplay = {
/**
* Counter for proxy elements when adding items to selection.
*
* @see Drupal.entityBrowserMultiStepDisplay.addEntities
*/
uuid: 1,
attach: function (context) {
var sortableSelector = context.querySelectorAll('.entities-list');
sortableSelector.forEach(function (widget) {
Sortable.create(widget, {
draggable: '.item-container',
onEnd: function onEnd() {
return Drupal.entityBrowserMultiStepDisplay.entitiesReordered(widget);
}
});
});
var $entities = $(context).find('.entities-list');
// Register add/remove entities event handlers.
$(once('register-add-entities', $entities))
.bind('add-entities', Drupal.entityBrowserMultiStepDisplay.addEntities);
$(once('register-remove-entities', $entities))
.bind('remove-entities', Drupal.entityBrowserMultiStepDisplay.removeEntities);
// Register event for remove button to use AJAX event.
$(once('register-click', $entities.find('.entity-browser-remove-selected-entity'))).on('click', function (event) {
event.preventDefault();
var button_element = $(event.target);
var remove_entity_id = button_element.attr('data-remove-entity') + '_' + button_element.attr('data-row-id');
$entities.trigger('remove-entities', [[remove_entity_id]]);
});
// Add a toggle button for the display of selected entities.
var $toggle = $('.entity-browser-show-selection');
function setToggleText() {
if($entities.css('display') == 'none') {
$toggle.val(Drupal.t('Show selected'));
} else {
$toggle.val(Drupal.t('Hide selected'));
}
}
if ($entities.length > 0) {
$(once('register-click', '.entity-browser-show-selection')).on('click', function (e) {
e.preventDefault();
$entities.slideToggle('fast', setToggleText);
});
setToggleText();
}
}
};
Drupal.entityBrowserMultiStepDisplay = {};
/**
* Reacts on sorting of the entities.
*
* @param {object} widget
* Object with the sortable area.
*/
Drupal.entityBrowserMultiStepDisplay.entitiesReordered = function (widget) {
var items = $(widget).find('.item-container');
for (var i = 0; i < items.length; i++) {
$(items[i]).find('.weight').val(i);
}
};
/**
* Remove entities from selection of multistep display.
*
* @param {object} event
* Event object.
* @param {Array} entity_ids
* Entity IDs that should be removed from selection.
*/
Drupal.entityBrowserMultiStepDisplay.removeEntities = function (event, entity_ids) {
var entities_list = $(this);
var i;
for (i = 0; i < entity_ids.length; i++) {
// Remove dom element, and queue entity for removal in backend.
var element_selector = '[data-drupal-selector="edit-selected-'.concat(entity_ids[i].replace(/_/g, '-'), '"]');
entities_list.find(element_selector).remove();
Drupal.entityBrowserCommandQueue.queueCommand(
'remove',
{
entity_id: entity_ids[i]
}
);
// Remove action buttons, if there are no more entities selected.
if (entities_list.children().length === 0) {
entities_list.siblings('.entity-browser-use-selected').remove();
entities_list.siblings('.entity-browser-show-selection').remove();
}
}
entities_list.siblings('[name=ajax_commands_handler]').trigger('execute-commands', [true]);
};
/**
* Add entities into selection of multistep display.
*
* @param {object} event
* Event object.
* @param {Array} entity_ids
* Entity ID that should be added to selection.
*/
Drupal.entityBrowserMultiStepDisplay.addEntities = function (event, entity_ids) {
var entities_list = $(this);
var i;
for (i = 0; i < entity_ids.length; i++) {
// Add proxy element that will be replaced with returned Ajax Command.
var proxy_element = $('<div></div>').attr("id", "ui-id-" + ( ++Drupal.behaviors.entityBrowserMultiStepDisplay.uuid ));
entities_list.append(proxy_element);
Drupal.entityBrowserCommandQueue.queueCommand(
'add',
{
entity_id: entity_ids[i],
proxy_id: proxy_element.attr('id')
}
);
}
entities_list.siblings('[name=ajax_commands_handler]').trigger('execute-commands', [true]);
};
}(jQuery, Drupal, Sortable, once));
