Version 1
[yaffs-website] / web / modules / contrib / entity_browser / js / entity_browser.command_queue.js
diff --git a/web/modules/contrib/entity_browser/js/entity_browser.command_queue.js b/web/modules/contrib/entity_browser/js/entity_browser.command_queue.js
new file mode 100644 (file)
index 0000000..48c4287
--- /dev/null
@@ -0,0 +1,108 @@
+/**
+ * @file entity_browser.command_queue.js
+ */
+
+(function ($, Drupal) {
+
+  'use strict';
+
+  /**
+   * Namespace for command queue functionality.
+   *
+   * Command queue provides functionality to queue ajax commands in front-end
+   * and execute them in one ajax request in backend. All commands triggered
+   * during ajax request execution, will be queue and executed after response
+   * from previous ajax request is received.
+   *
+   * @type {Object}
+   */
+  Drupal.entityBrowserCommandQueue = {};
+
+  /**
+   * Queue container for keeping commands for next queue execution. (protected)
+   *
+   * @type {Object}
+   */
+  var commandsQueue = {};
+
+  /**
+   * Registers behaviours related to Ajax commands execution.
+   */
+  Drupal.behaviors.entityBrowserCommandQueue = {
+    attach: function (context) {
+      var handler = $(context).find('[name="ajax_commands_handler"]');
+
+      handler.once('register-execute-commands')
+        .bind('execute-commands', Drupal.entityBrowserCommandQueue.executeCommands);
+    }
+  };
+
+  /**
+   * Action to queue command for future execution.
+   *
+   * @param {string} commandName
+   *   Command name, that will be executed.
+   * @param {Array} commandParam
+   *   Params for command. If command already exists in queue params will be
+   *   added to end of list.
+   */
+  Drupal.entityBrowserCommandQueue.queueCommand = function (commandName, commandParam) {
+    if (!commandsQueue[commandName]) {
+      commandsQueue[commandName] = [];
+    }
+
+    commandsQueue[commandName].push(commandParam);
+  };
+
+  /**
+   * Handler for executing queued commands over Ajax.
+   *
+   * @param {object} event
+   *   Event object.
+   * @param {boolean} addedCommand
+   *   Execution of queued commands is triggered after new command is added.
+   */
+  Drupal.entityBrowserCommandQueue.executeCommands = function (event, addedCommand) {
+    var handler = $(this);
+    var handlerElement = handler[0];
+    var runningAjax = Drupal.entityBrowserCommandQueue.isAjaxRunning(handlerElement, 'execute_js_commands');
+    var filledQueue = !$.isEmptyObject(commandsQueue);
+
+    if (!runningAjax && filledQueue) {
+      handler.val(JSON.stringify(commandsQueue));
+
+      // Clear Queue after command is set to handler element.
+      commandsQueue = {};
+
+      // Trigger event to execute event with defined command.
+      handler.trigger('execute_js_commands');
+    }
+    else if (!addedCommand && filledQueue) {
+      setTimeout($.proxy(Drupal.entityBrowserCommandQueue.executeCommands, handlerElement), 200);
+    }
+  };
+
+  /**
+   * Search is there current Ajax request executing for current event.
+   *
+   * @param {element} handlerElement
+   *   Element on what event is triggered.
+   * @param {string} eventName
+   *   Event name.
+   *
+   * @return {boolean}
+   *   Returns true if ajax event is still running for element.
+   */
+  Drupal.entityBrowserCommandQueue.isAjaxRunning = function (handlerElement, eventName) {
+    var ajax_list = Drupal.ajax.instances;
+
+    for (var i = 0; i < ajax_list.length; i++) {
+      if (ajax_list[i] && ajax_list[i].event === eventName && ajax_list[i].element === handlerElement && ajax_list[i].ajaxing) {
+        return true;
+      }
+    }
+
+    return false;
+  };
+
+}(jQuery, Drupal));