notification.js 2.46 KB
Newer Older
Ketan's avatar
Ketan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

define([
    'jquery',
    'mage/template',
    'jquery/ui'
], function ($, mageTemplate) {
    'use strict';

    $.widget('mage.notification', {
        options: {
            templates: {
                global: '<div data-role="messages" id="messages">' +
                    '<div class="message <% if (data.error) { %>error<% } %>"><div><%- data.message %></div></div>' +
                '</div>',
                error: '<div data-role="messages" id="messages">' +
                    '<div class="messages"><div class="message message-error error">' +
                        '<div data-ui-id="messages-message-error"><%- data.message %></div></div>' +
                    '</div></div>'
            }
        },
        placeholder: '[data-role=messages]',

        /**
         * Notification creation
         * @protected
         */
        _create: function () {
            $(document).on('ajaxComplete ajaxError', $.proxy(this._add, this));
        },

        /**
         * Add new message
         * @protected
         * @param {Object} event - object
         * @param {Object} jqXHR - The jQuery XMLHttpRequest object returned by $.ajax()
         */
        _add: function (event, jqXHR) {
            var response;

            try {
                response = JSON.parse(jqXHR.responseText);

                if (response && response.error && response['html_message']) {
                    $(this.placeholder).html(response['html_message']);
                }
            } catch (e) {}
        },

        /**
         * Adds new message.
         *
         * @param {Object} data - Data with a message to be displayed.
         */
        add: function (data) {
            var template = data.error ? this.options.templates.error : this.options.templates.global,
                message = mageTemplate(template, {
                    data: data
                }),
                messageContainer;

            if (typeof data.insertMethod === 'function') {
                data.insertMethod(message);
            } else {
                messageContainer = data.messageContainer || this.placeholder;
                $(messageContainer).prepend(message);
            }

            return this;
        },

        /**
         * Removes error messages.
         */
        clear: function () {
            $(this.placeholder).html('');
        }
    });

    return $.mage.notification;
});