├── composer.json
├── etc
└── module.xml
├── registration.php
└── view
└── frontend
├── layout
└── default.xml
├── requirejs-config.js
└── web
├── css
└── toastr.min.css
└── js
├── subscriber.js
└── toastr.js
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "codilar/magento2-messages",
3 | "description": "Show all the session messages in a better way.",
4 | "require": {
5 | "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
6 | "magento/framework": ">=100.0.0",
7 | "magento/module-theme": ">=100.0.0"
8 | },
9 | "type": "magento2-module",
10 | "version": "1.0.1",
11 | "license": [
12 | "OSL-3.0",
13 | "AFL-3.0"
14 | ],
15 | "authors": [
16 | {
17 | "name": "Codilar Technologies",
18 | "email": "support@codilar.com",
19 | "homepage": "https://www.codilar.com",
20 | "role": "Support"
21 | }
22 | ],
23 | "autoload": {
24 | "files": [
25 | "registration.php"
26 | ],
27 | "psr-4": {
28 | "Codilar\\Messages\\": ""
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/etc/module.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/registration.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/view/frontend/requirejs-config.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright © Magento, Inc. All rights reserved.
3 | * See COPYING.txt for license details.
4 | */
5 |
6 | var config = {
7 | map: {
8 | '*': {
9 | 'toastr': 'Codilar_Messages/js/toastr'
10 | }
11 | }
12 | };
13 |
--------------------------------------------------------------------------------
/view/frontend/web/css/toastr.min.css:
--------------------------------------------------------------------------------
1 | .toast-title{font-weight:700}.toast-message{-ms-word-wrap:break-word;word-wrap:break-word}.toast-message a,.toast-message label{color:#FFF}.toast-message a:hover{color:#CCC;text-decoration:none}.toast-close-button{position:relative;right:-.3em;top:-.3em;float:right;font-size:20px;font-weight:700;color:#FFF;-webkit-text-shadow:0 1px 0 #fff;text-shadow:0 1px 0 #fff;opacity:.8;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80);line-height:1}.toast-close-button:focus,.toast-close-button:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40)}.rtl .toast-close-button{left:-.3em;float:left;right:.3em}button.toast-close-button{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.toast-top-center{top:0;right:0;width:100%}.toast-bottom-center{bottom:0;right:0;width:100%}.toast-top-full-width{top:0;right:0;width:100%}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{top:12px;left:12px}.toast-top-right{top:12px;right:12px}.toast-bottom-right{right:12px;bottom:12px}.toast-bottom-left{bottom:12px;left:12px}#toast-container{position:fixed;z-index:999999;pointer-events:none}#toast-container *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#toast-container>div{position:relative;pointer-events:auto;overflow:hidden;margin:0 0 6px;padding:15px 15px 15px 50px;width:300px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-position:15px center;background-repeat:no-repeat;-moz-box-shadow:0 0 12px #999;-webkit-box-shadow:0 0 12px #999;box-shadow:0 0 12px #999;color:#FFF;opacity:.8;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80)}#toast-container>div.rtl{direction:rtl;padding:15px 50px 15px 15px;background-position:right 15px center}#toast-container>div:hover{-moz-box-shadow:0 0 12px #000;-webkit-box-shadow:0 0 12px #000;box-shadow:0 0 12px #000;opacity:1;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);filter:alpha(opacity=100);cursor:pointer}#toast-container>.toast-info{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=)!important}#toast-container>.toast-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=)!important}#toast-container>.toast-success{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==)!important}#toast-container>.toast-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=)!important}#toast-container.toast-bottom-center>div,#toast-container.toast-top-center>div{width:300px;margin-left:auto;margin-right:auto}#toast-container.toast-bottom-full-width>div,#toast-container.toast-top-full-width>div{width:96%;margin-left:auto;margin-right:auto}.toast{background-color:#030303}.toast-success{background-color:#51A351}.toast-error{background-color:#BD362F}.toast-info{background-color:#2F96B4}.toast-warning{background-color:#F89406}.toast-progress{position:absolute;left:0;bottom:0;height:4px;background-color:#000;opacity:.4;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40)}@media all and (max-width:240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em}#toast-container>div.rtl{padding:8px 50px 8px 8px}#toast-container .toast-close-button{right:-.2em;top:-.2em}#toast-container .rtl .toast-close-button{left:-.2em;right:.2em}}@media all and (min-width:241px) and (max-width:480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em}#toast-container>div.rtl{padding:8px 50px 8px 8px}#toast-container .toast-close-button{right:-.2em;top:-.2em}#toast-container .rtl .toast-close-button{left:-.2em;right:.2em}}@media all and (min-width:481px) and (max-width:768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}#toast-container>div.rtl{padding:15px 50px 15px 15px}}
--------------------------------------------------------------------------------
/view/frontend/web/js/subscriber.js:
--------------------------------------------------------------------------------
1 | requirejs([
2 | 'jquery',
3 | 'Magento_Customer/js/customer-data',
4 | 'toastr'
5 | ], function($, customerData, toastr){
6 | var observableObject = customerData.get('messages');
7 |
8 | toastr.options = {
9 | "closeButton": false,
10 | "debug": false,
11 | "newestOnTop": true,
12 | "progressBar": false,
13 | "positionClass": "toast-bottom-left",
14 | "preventDuplicates": false,
15 | "onclick": null,
16 | "showDuration": "300",
17 | "hideDuration": "2000",
18 | "timeOut": "5000",
19 | "extendedTimeOut": "2000",
20 | "showEasing": "swing",
21 | "hideEasing": "linear",
22 | "showMethod": "fadeIn",
23 | "hideMethod": "fadeOut"
24 | };
25 |
26 | var showToastMessage = function(data){
27 | try{
28 | data.messages.forEach(function(message){
29 | switch(message.type){
30 | case "success":
31 | toastr.success(message.text, "");
32 | break;
33 | case "error":
34 | toastr.error(message.text, "");
35 | break;
36 | default:
37 | toastr.info(message.text, "");
38 | }
39 | })
40 | }catch(e){}
41 | };
42 |
43 | /* Show initial messages */
44 | var previousMessages = $.cookieStorage.get('mage-messages');
45 | $.cookieStorage.set('mage-messages', '');
46 | showToastMessage({'messages' : previousMessages});
47 |
48 | observableObject.subscribe(showToastMessage);
49 | });
--------------------------------------------------------------------------------
/view/frontend/web/js/toastr.js:
--------------------------------------------------------------------------------
1 | define(['jquery'], function ($) {
2 | return (function () {
3 | var $container;
4 | var listener;
5 | var toastId = 0;
6 | var toastType = {
7 | error: 'error',
8 | info: 'info',
9 | success: 'success',
10 | warning: 'warning'
11 | };
12 |
13 | var toastr = {
14 | clear: clear,
15 | remove: remove,
16 | error: error,
17 | getContainer: getContainer,
18 | info: info,
19 | options: {},
20 | subscribe: subscribe,
21 | success: success,
22 | version: '2.1.4',
23 | warning: warning
24 | };
25 |
26 | var previousToast;
27 |
28 | return toastr;
29 |
30 | ////////////////
31 |
32 | function error(message, title, optionsOverride) {
33 | return notify({
34 | type: toastType.error,
35 | iconClass: getOptions().iconClasses.error,
36 | message: message,
37 | optionsOverride: optionsOverride,
38 | title: title
39 | });
40 | }
41 |
42 | function getContainer(options, create) {
43 | if (!options) { options = getOptions(); }
44 | $container = $('#' + options.containerId);
45 | if ($container.length) {
46 | return $container;
47 | }
48 | if (create) {
49 | $container = createContainer(options);
50 | }
51 | return $container;
52 | }
53 |
54 | function info(message, title, optionsOverride) {
55 | return notify({
56 | type: toastType.info,
57 | iconClass: getOptions().iconClasses.info,
58 | message: message,
59 | optionsOverride: optionsOverride,
60 | title: title
61 | });
62 | }
63 |
64 | function subscribe(callback) {
65 | listener = callback;
66 | }
67 |
68 | function success(message, title, optionsOverride) {
69 | return notify({
70 | type: toastType.success,
71 | iconClass: getOptions().iconClasses.success,
72 | message: message,
73 | optionsOverride: optionsOverride,
74 | title: title
75 | });
76 | }
77 |
78 | function warning(message, title, optionsOverride) {
79 | return notify({
80 | type: toastType.warning,
81 | iconClass: getOptions().iconClasses.warning,
82 | message: message,
83 | optionsOverride: optionsOverride,
84 | title: title
85 | });
86 | }
87 |
88 | function clear($toastElement, clearOptions) {
89 | var options = getOptions();
90 | if (!$container) { getContainer(options); }
91 | if (!clearToast($toastElement, options, clearOptions)) {
92 | clearContainer(options);
93 | }
94 | }
95 |
96 | function remove($toastElement) {
97 | var options = getOptions();
98 | if (!$container) { getContainer(options); }
99 | if ($toastElement && $(':focus', $toastElement).length === 0) {
100 | removeToast($toastElement);
101 | return;
102 | }
103 | if ($container.children().length) {
104 | $container.remove();
105 | }
106 | }
107 |
108 | // internal functions
109 |
110 | function clearContainer (options) {
111 | var toastsToClear = $container.children();
112 | for (var i = toastsToClear.length - 1; i >= 0; i--) {
113 | clearToast($(toastsToClear[i]), options);
114 | }
115 | }
116 |
117 | function clearToast ($toastElement, options, clearOptions) {
118 | var force = clearOptions && clearOptions.force ? clearOptions.force : false;
119 | if ($toastElement && (force || $(':focus', $toastElement).length === 0)) {
120 | $toastElement[options.hideMethod]({
121 | duration: options.hideDuration,
122 | easing: options.hideEasing,
123 | complete: function () { removeToast($toastElement); }
124 | });
125 | return true;
126 | }
127 | return false;
128 | }
129 |
130 | function createContainer(options) {
131 | $container = $('
')
132 | .attr('id', options.containerId)
133 | .addClass(options.positionClass);
134 |
135 | $container.appendTo($(options.target));
136 | return $container;
137 | }
138 |
139 | function getDefaults() {
140 | return {
141 | tapToDismiss: true,
142 | toastClass: 'toast',
143 | containerId: 'toast-container',
144 | debug: false,
145 |
146 | showMethod: 'fadeIn', //fadeIn, slideDown, and show are built into jQuery
147 | showDuration: 300,
148 | showEasing: 'swing', //swing and linear are built into jQuery
149 | onShown: undefined,
150 | hideMethod: 'fadeOut',
151 | hideDuration: 1000,
152 | hideEasing: 'swing',
153 | onHidden: undefined,
154 | closeMethod: false,
155 | closeDuration: false,
156 | closeEasing: false,
157 | closeOnHover: true,
158 |
159 | extendedTimeOut: 1000,
160 | iconClasses: {
161 | error: 'toast-error',
162 | info: 'toast-info',
163 | success: 'toast-success',
164 | warning: 'toast-warning'
165 | },
166 | iconClass: 'toast-info',
167 | positionClass: 'toast-top-right',
168 | timeOut: 5000, // Set timeOut and extendedTimeOut to 0 to make it sticky
169 | titleClass: 'toast-title',
170 | messageClass: 'toast-message',
171 | escapeHtml: false,
172 | target: 'body',
173 | closeHtml: '',
174 | closeClass: 'toast-close-button',
175 | newestOnTop: true,
176 | preventDuplicates: false,
177 | progressBar: false,
178 | progressClass: 'toast-progress',
179 | rtl: false
180 | };
181 | }
182 |
183 | function publish(args) {
184 | if (!listener) { return; }
185 | listener(args);
186 | }
187 |
188 | function notify(map) {
189 | var options = getOptions();
190 | var iconClass = map.iconClass || options.iconClass;
191 |
192 | if (typeof (map.optionsOverride) !== 'undefined') {
193 | options = $.extend(options, map.optionsOverride);
194 | iconClass = map.optionsOverride.iconClass || iconClass;
195 | }
196 |
197 | if (shouldExit(options, map)) { return; }
198 |
199 | toastId++;
200 |
201 | $container = getContainer(options, true);
202 |
203 | var intervalId = null;
204 | var $toastElement = $('');
205 | var $titleElement = $('');
206 | var $messageElement = $('');
207 | var $progressElement = $('');
208 | var $closeElement = $(options.closeHtml);
209 | var progressBar = {
210 | intervalId: null,
211 | hideEta: null,
212 | maxHideTime: null
213 | };
214 | var response = {
215 | toastId: toastId,
216 | state: 'visible',
217 | startTime: new Date(),
218 | options: options,
219 | map: map
220 | };
221 |
222 | personalizeToast();
223 |
224 | displayToast();
225 |
226 | handleEvents();
227 |
228 | publish(response);
229 |
230 | if (options.debug && console) {
231 | console.log(response);
232 | }
233 |
234 | return $toastElement;
235 |
236 | function escapeHtml(source) {
237 | if (source == null) {
238 | source = '';
239 | }
240 |
241 | return source
242 | .replace(/&/g, '&')
243 | .replace(/"/g, '"')
244 | .replace(/'/g, ''')
245 | .replace(//g, '>');
247 | }
248 |
249 | function personalizeToast() {
250 | setIcon();
251 | setTitle();
252 | setMessage();
253 | setCloseButton();
254 | setProgressBar();
255 | setRTL();
256 | setSequence();
257 | setAria();
258 | }
259 |
260 | function setAria() {
261 | var ariaValue = '';
262 | switch (map.iconClass) {
263 | case 'toast-success':
264 | case 'toast-info':
265 | ariaValue = 'polite';
266 | break;
267 | default:
268 | ariaValue = 'assertive';
269 | }
270 | $toastElement.attr('aria-live', ariaValue);
271 | }
272 |
273 | function handleEvents() {
274 | if (options.closeOnHover) {
275 | $toastElement.hover(stickAround, delayedHideToast);
276 | }
277 |
278 | if (!options.onclick && options.tapToDismiss) {
279 | $toastElement.click(hideToast);
280 | }
281 |
282 | if (options.closeButton && $closeElement) {
283 | $closeElement.click(function (event) {
284 | if (event.stopPropagation) {
285 | event.stopPropagation();
286 | } else if (event.cancelBubble !== undefined && event.cancelBubble !== true) {
287 | event.cancelBubble = true;
288 | }
289 |
290 | if (options.onCloseClick) {
291 | options.onCloseClick(event);
292 | }
293 |
294 | hideToast(true);
295 | });
296 | }
297 |
298 | if (options.onclick) {
299 | $toastElement.click(function (event) {
300 | options.onclick(event);
301 | hideToast();
302 | });
303 | }
304 | }
305 |
306 | function displayToast() {
307 | $toastElement.hide();
308 |
309 | $toastElement[options.showMethod](
310 | {duration: options.showDuration, easing: options.showEasing, complete: options.onShown}
311 | );
312 |
313 | if (options.timeOut > 0) {
314 | intervalId = setTimeout(hideToast, options.timeOut);
315 | progressBar.maxHideTime = parseFloat(options.timeOut);
316 | progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime;
317 | if (options.progressBar) {
318 | progressBar.intervalId = setInterval(updateProgress, 10);
319 | }
320 | }
321 | }
322 |
323 | function setIcon() {
324 | if (map.iconClass) {
325 | $toastElement.addClass(options.toastClass).addClass(iconClass);
326 | }
327 | }
328 |
329 | function setSequence() {
330 | if (options.newestOnTop) {
331 | $container.prepend($toastElement);
332 | } else {
333 | $container.append($toastElement);
334 | }
335 | }
336 |
337 | function setTitle() {
338 | if (map.title) {
339 | var suffix = map.title;
340 | if (options.escapeHtml) {
341 | suffix = escapeHtml(map.title);
342 | }
343 | $titleElement.append(suffix).addClass(options.titleClass);
344 | $toastElement.append($titleElement);
345 | }
346 | }
347 |
348 | function setMessage() {
349 | if (map.message) {
350 | var suffix = map.message;
351 | if (options.escapeHtml) {
352 | suffix = escapeHtml(map.message);
353 | }
354 | $messageElement.append(suffix).addClass(options.messageClass);
355 | $toastElement.append($messageElement);
356 | }
357 | }
358 |
359 | function setCloseButton() {
360 | if (options.closeButton) {
361 | $closeElement.addClass(options.closeClass).attr('role', 'button');
362 | $toastElement.prepend($closeElement);
363 | }
364 | }
365 |
366 | function setProgressBar() {
367 | if (options.progressBar) {
368 | $progressElement.addClass(options.progressClass);
369 | $toastElement.prepend($progressElement);
370 | }
371 | }
372 |
373 | function setRTL() {
374 | if (options.rtl) {
375 | $toastElement.addClass('rtl');
376 | }
377 | }
378 |
379 | function shouldExit(options, map) {
380 | if (options.preventDuplicates) {
381 | if (map.message === previousToast) {
382 | return true;
383 | } else {
384 | previousToast = map.message;
385 | }
386 | }
387 | return false;
388 | }
389 |
390 | function hideToast(override) {
391 | var method = override && options.closeMethod !== false ? options.closeMethod : options.hideMethod;
392 | var duration = override && options.closeDuration !== false ?
393 | options.closeDuration : options.hideDuration;
394 | var easing = override && options.closeEasing !== false ? options.closeEasing : options.hideEasing;
395 | if ($(':focus', $toastElement).length && !override) {
396 | return;
397 | }
398 | clearTimeout(progressBar.intervalId);
399 | return $toastElement[method]({
400 | duration: duration,
401 | easing: easing,
402 | complete: function () {
403 | removeToast($toastElement);
404 | clearTimeout(intervalId);
405 | if (options.onHidden && response.state !== 'hidden') {
406 | options.onHidden();
407 | }
408 | response.state = 'hidden';
409 | response.endTime = new Date();
410 | publish(response);
411 | }
412 | });
413 | }
414 |
415 | function delayedHideToast() {
416 | if (options.timeOut > 0 || options.extendedTimeOut > 0) {
417 | intervalId = setTimeout(hideToast, options.extendedTimeOut);
418 | progressBar.maxHideTime = parseFloat(options.extendedTimeOut);
419 | progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime;
420 | }
421 | }
422 |
423 | function stickAround() {
424 | clearTimeout(intervalId);
425 | progressBar.hideEta = 0;
426 | $toastElement.stop(true, true)[options.showMethod](
427 | {duration: options.showDuration, easing: options.showEasing}
428 | );
429 | }
430 |
431 | function updateProgress() {
432 | var percentage = ((progressBar.hideEta - (new Date().getTime())) / progressBar.maxHideTime) * 100;
433 | $progressElement.width(percentage + '%');
434 | }
435 | }
436 |
437 | function getOptions() {
438 | return $.extend({}, getDefaults(), toastr.options);
439 | }
440 |
441 | function removeToast($toastElement) {
442 | if (!$container) { $container = getContainer(); }
443 | if ($toastElement.is(':visible')) {
444 | return;
445 | }
446 | $toastElement.remove();
447 | $toastElement = null;
448 | if ($container.children().length === 0) {
449 | $container.remove();
450 | previousToast = undefined;
451 | }
452 | }
453 |
454 | })();
455 | });
--------------------------------------------------------------------------------