diff -u b/core/misc/message.js b/core/misc/message.js --- b/core/misc/message.js +++ b/core/misc/message.js @@ -6,39 +6,34 @@ 'use strict'; - var messages = []; - var debouncedProcessMessages; - var defaultMessageWrapperSelector = '[data-drupal-messages]'; - - - // Debounce the function in case Drupal.message() is used in a loop. - debouncedProcessMessages = debounce(processMessages, 100); + function Messages() { + this.messages = []; + this.defaultMessageWrapperSelector = '[data-drupal-messages]'; + this.texts = {}; + } /** * Displays all queued messages in one pass instead of one after the other. * @see debouncedProcessMessages */ - function processMessages() { - var texts = {}; - - messages.reverse().forEach(function (message) { - if (!texts.hasOwnProperty(message.wrapperSelector)) { - texts[message.wrapperSelector] = []; + Messages.prototype.debouncedProcessMessages = debounce(function () { + this.messages.reverse().forEach(function (message) { + if (!this.texts.hasOwnProperty(message.wrapperSelector)) { + this.texts[message.wrapperSelector] = []; } - texts[message.wrapperSelector].unshift(Drupal.theme('message', message)); - }); - for (var wrapperSelector in texts) { + this.texts[message.wrapperSelector].unshift(Drupal.theme('message', message)); + }.bind(this)); + for (var wrapperSelector in this.texts) { // skip loop if the property is from prototype - if (texts.hasOwnProperty(wrapperSelector)) { - $(wrapperSelector)[0].innerHTML += texts[wrapperSelector].join(''); + if (this.texts.hasOwnProperty(wrapperSelector)) { + $(wrapperSelector)[0].innerHTML += this.texts[wrapperSelector].join(''); } } // Reset the messages array after the messages are processed. - messages = []; - - } - - Drupal.message = {}; + this.messages = []; + // Reset texts object after messages are printed. + this.texts = {}; + }, 100); /** * Displays a message on the page. @@ -53,21 +48,21 @@ * @param {string} wrapperSelector * The CSS selector for the messages wrapper div. */ - Drupal.message.add = function (message, type, context, wrapperSelector) { - wrapperSelector = wrapperSelector || defaultMessageWrapperSelector; + Messages.prototype.add = function (message, type, context, wrapperSelector) { + wrapperSelector = wrapperSelector || this.defaultMessageWrapperSelector; if (!$(wrapperSelector).length) { throw new Error(Drupal.t('There is message element is not valid.')); } if (typeof message === 'string') { // Save the text and priority into a closure variable. Multiple simultaneous // announcements will be concatenated and read in sequence. - messages.push({ + this.messages.push({ context: context || 'default', text: message, type: type || 'status', wrapperSelector: wrapperSelector }); - debouncedProcessMessages(); + this.debouncedProcessMessages(); } }; @@ -79,7 +74,7 @@ * @param {string} type * Message type, can be either 'status', 'error' or 'warning'. */ - Drupal.message.remove = function (context, type) { + Messages.prototype.remove = function (context, type) { var selector = '.js-messages-context--' + (context || 'default'); if (type) { selector = '.messages--' + (type || 'status') + selector; @@ -87,6 +82,8 @@ $(selector).remove(); }; + Drupal.message = new Messages(); + /** * Theme function for a message. *