123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- /* global varienEvents */
- /* eslint-disable strict */
- define([
- 'Magento_Ui/js/modal/alert',
- 'prototype'
- ], function (alert) {
- // from http://www.someelement.com/2007/03/eventpublisher-custom-events-la-pubsub.html
- window.varienEvents = Class.create();
- varienEvents.prototype = {
- /**
- * Initialize.
- */
- initialize: function () {
- this.arrEvents = {};
- this.eventPrefix = '';
- },
- /**
- * Attaches a {handler} function to the publisher's {eventName} event for execution upon the event firing
- * @param {String} eventName
- * @param {Function} handler
- * @param {Boolean} [asynchFlag] - Defaults to false if omitted.
- * Indicates whether to execute {handler} asynchronously (true) or not (false).
- */
- attachEventHandler: function (eventName, handler) {
- var asynchVar, handlerObj;
- if (typeof handler == 'undefined' || handler == null) {
- return;
- }
- eventName += this.eventPrefix;
- // using an event cache array to track all handlers for proper cleanup
- if (this.arrEvents[eventName] == null) {
- this.arrEvents[eventName] = [];
- }
- //create a custom object containing the handler method and the asynch flag
- asynchVar = arguments.length > 2 ? arguments[2] : false;
- handlerObj = {
- method: handler,
- asynch: asynchVar
- };
- this.arrEvents[eventName].push(handlerObj);
- },
- /**
- * Removes a single handler from a specific event
- * @param {String} eventName - The event name to clear the handler from
- * @param {Function} handler - A reference to the handler function to un-register from the event
- */
- removeEventHandler: function (eventName, handler) {
- eventName += this.eventPrefix;
- if (this.arrEvents[eventName] != null) {
- this.arrEvents[eventName] = this.arrEvents[eventName].reject(function (obj) {
- return obj.method == handler; //eslint-disable-line eqeqeq
- });
- }
- },
- /**
- * Removes all handlers from a single event
- * @param {String} eventName - The event name to clear handlers from
- */
- clearEventHandlers: function (eventName) {
- eventName += this.eventPrefix;
- this.arrEvents[eventName] = null;
- },
- /**
- * Removes all handlers from ALL events
- */
- clearAllEventHandlers: function () {
- this.arrEvents = {};
- },
- /**
- * Collect and modify value of arg synchronously in succession and return its new value.
- * In order to use, call attachEventHandler and add function handlers with eventName.
- * Then call fireEventReducer with eventName and any argument to have its value accumulatively modified.
- * Event handlers will be applied to argument in order of first attached to last attached.
- * @param {String} eventName
- * @param {*} arg
- */
- fireEventReducer: function (eventName, arg) {
- var evtName = eventName + this.eventPrefix,
- result = arg,
- len,
- i;
- if (!this.arrEvents[evtName]) {
- return result;
- }
- len = this.arrEvents[evtName].length; //optimization
- for (i = 0; i < len; i++) {
- /* eslint-disable max-depth */
- try {
- result = this.arrEvents[evtName][i].method(result);
- } catch (e) {
- if (this.id) {
- alert({
- content: 'error: error in ' + this.id + '.fireEventReducer():\n\nevent name: ' +
- eventName + '\n\nerror message: ' + e.message
- });
- } else {
- alert({
- content: 'error: error in [unknown object].fireEventReducer():\n\nevent name: ' +
- eventName + '\n\nerror message: ' + e.message
- });
- }
- }
- /* eslint-disable max-depth */
- }
- return result;
- },
- /**
- * Fires the event {eventName}, resulting in all registered handlers to be executed.
- * It also collects and returns results of all non-asynchronous handlers
- * @param {String} eventName - The name of the event to fire
- * @param {Object} [args] - Any object, will be passed into the handler function as the only argument
- * @return {Array}
- */
- fireEvent: function (eventName) {
- var evtName = eventName + this.eventPrefix,
- results = [],
- result, len, i, eventArgs, method, eventHandler;
- if (this.arrEvents[evtName] != null) {
- len = this.arrEvents[evtName].length; //optimization
- for (i = 0; i < len; i++) {
- /* eslint-disable max-depth */
- try {
- if (arguments.length > 1) {
- if (this.arrEvents[evtName][i].asynch) {
- eventArgs = arguments[1];
- method = this.arrEvents[evtName][i].method.bind(this);
- setTimeout(function () { //eslint-disable-line no-loop-func
- method(eventArgs);
- }, 10);
- } else {
- result = this.arrEvents[evtName][i].method(arguments[1]);
- }
- } else {
- if (this.arrEvents[evtName][i].asynch) { //eslint-disable-line no-lonely-if
- eventHandler = this.arrEvents[evtName][i].method;
- setTimeout(eventHandler, 1);
- } else if (
- this.arrEvents &&
- this.arrEvents[evtName] &&
- this.arrEvents[evtName][i] &&
- this.arrEvents[evtName][i].method
- ) {
- result = this.arrEvents[evtName][i].method();
- }
- }
- results.push(result);
- }
- catch (e) {
- if (this.id) {
- alert({
- content: 'error: error in ' + this.id + '.fireEvent():\n\nevent name: ' +
- eventName + '\n\nerror message: ' + e.message
- });
- } else {
- alert({
- content: 'error: error in [unknown object].fireEvent():\n\nevent name: ' +
- eventName + '\n\nerror message: ' + e.message
- });
- }
- }
- /* eslint-enable max-depth */
- }
- }
- return results;
- }
- };
- window.varienGlobalEvents = new varienEvents(); //jscs:ignore requireCapitalizedConstructors
- return window.varienGlobalEvents;
- });
|