160 lines
5.1 KiB
JavaScript
160 lines
5.1 KiB
JavaScript
/**
|
|
* @file entity_browser.modal.js
|
|
*
|
|
* Defines the behavior of the entity browser's modal display.
|
|
*/
|
|
|
|
(function ($, Drupal, drupalSettings, window, document) {
|
|
|
|
'use strict';
|
|
|
|
Drupal.entityBrowserModal = {};
|
|
|
|
Drupal.AjaxCommands.prototype.select_entities = function (ajax, response, status) {
|
|
var uuid = drupalSettings.entity_browser.modal.uuid;
|
|
|
|
$(':input[data-uuid="' + uuid + '"]').trigger('entities-selected', [uuid, response.entities])
|
|
.removeClass('entity-browser-processed').unbind('entities-selected');
|
|
};
|
|
|
|
/**
|
|
* Registers behaviours related to modal display.
|
|
*/
|
|
Drupal.behaviors.entityBrowserModal = {
|
|
attach: function (context) {
|
|
// Object.prototype.entries() isn't available in D9/IE11.
|
|
for (var modalId in drupalSettings.entity_browser.modal) {
|
|
var instance = drupalSettings.entity_browser.modal[modalId]
|
|
for (var jsCallbackKey in instance.js_callbacks) {
|
|
var callback = drupalSettings.entity_browser.modal[modalId].js_callbacks[jsCallbackKey];
|
|
// Get the callback.
|
|
callback = callback.split('.');
|
|
var fn = window;
|
|
|
|
for (var j = 0; j < callback.length; j++) {
|
|
fn = fn[callback[j]];
|
|
}
|
|
|
|
if (typeof fn === 'function') {
|
|
$(':input[data-uuid="' + instance.uuid + '"]').not('.entity-browser-processed')
|
|
.bind('entities-selected', fn).addClass('entity-browser-processed');
|
|
}
|
|
}
|
|
if (instance.auto_open) {
|
|
$('input[data-uuid="' + instance.uuid + '"]').click();
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Registers behaviours related to modal open and windows resize for fluid modal.
|
|
*/
|
|
Drupal.behaviors.fluidModal = {
|
|
attach: function (context) {
|
|
var $window = $(window);
|
|
|
|
// Be sure to run only once per window document.
|
|
if (once('fluid-modal', 'body').length) {
|
|
return;
|
|
}
|
|
|
|
// Recalculate dialog size on window resize.
|
|
$window.resize(function (event) {
|
|
Drupal.entityBrowserModal.fluidDialog();
|
|
});
|
|
|
|
// Catch dialog if opened within a viewport smaller than the dialog width
|
|
// and recalculate size of all open dialogs.
|
|
$(document).on('dialogopen', '.ui-dialog', function (event, ui) {
|
|
Drupal.entityBrowserModal.fluidDialog();
|
|
});
|
|
|
|
// Disable scrolling of the whole browser window to not interfere with the
|
|
// iframe scrollbar.
|
|
$window.on({
|
|
'dialog:aftercreate': function (event, dialog, $element, settings) {
|
|
$('body').css({overflow: 'hidden'});
|
|
},
|
|
'dialog:beforeclose': function (event, dialog, $element) {
|
|
$('body').css({overflow: 'inherit'});
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Registers behaviours for adding throbber on modal open.
|
|
*/
|
|
Drupal.behaviors.entityBrowserAddThrobber = {
|
|
attach: function (context) {
|
|
if (context === document) {
|
|
$(window).on({
|
|
'dialog:aftercreate': function (event, dialog, $element, settings) {
|
|
if ($element.find('iframe.entity-browser-modal-iframe').length) {
|
|
$element.append(Drupal.theme('ajaxProgressThrobber'));
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Recalculates size of the modal.
|
|
*/
|
|
Drupal.entityBrowserModal.fluidDialog = function () {
|
|
|
|
var $visible = $('.ui-dialog:visible');
|
|
// For each open dialog.
|
|
$visible.each(function () {
|
|
var $this = $(this);
|
|
var dialog = $this.find('.ui-dialog-content').data('ui-dialog');
|
|
// If fluid option == true.
|
|
if (dialog.options.fluid) {
|
|
var wWidth = $(window).width();
|
|
// Check window width against dialog width.
|
|
if (dialog.options.maxWidth && (wWidth > parseInt(dialog.options.maxWidth) + 50)) {
|
|
dialog.option('width', dialog.options.maxWidth);
|
|
}
|
|
else {
|
|
// If no maxWidth is defined, make it responsive.
|
|
dialog.option('width', '92%');
|
|
}
|
|
|
|
var vHeight = $(window).height();
|
|
// Check window width against dialog width.
|
|
if (dialog.options.maxHeight && vHeight > (parseInt(dialog.options.maxHeight) + 50)) {
|
|
dialog.option('height', dialog.options.maxHeight);
|
|
}
|
|
else {
|
|
// If no maxHeight is defined, make it responsive.
|
|
dialog.option('height', .92 * vHeight);
|
|
|
|
// Because there is no iframe height 100% in HTML 5, we have to set
|
|
// the height of the iframe as well.
|
|
var contentHeight = $this.find('.ui-dialog-content').height();
|
|
$this.find('iframe').css('height', contentHeight);
|
|
}
|
|
|
|
// Reposition dialog.
|
|
dialog.option('position', dialog.options.position);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Close modal popup on escape key press.
|
|
*/
|
|
Drupal.behaviors.closeModalOnEscapeKeyPress = {
|
|
attach: function (context) {
|
|
$(document).on('keydown', function (event) {
|
|
if (event.key == 'Escape') {
|
|
$(document).find('.entity-browser-modal-iframe').parents('.ui-dialog').eq(0).find('.ui-dialog-titlebar-close').click();
|
|
}
|
|
});
|
|
}
|
|
};
|
|
};
|
|
|
|
}(jQuery, Drupal, drupalSettings, window, document));
|