1/* 2 * Toastr 3 * Copyright 2012-2015 4 * Authors: John Papa, Hans Fjällemark, and Tim Ferrell. 5 * All Rights Reserved. 6 * Use, reproduction, distribution, and modification of this code is subject to the terms and 7 * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php 8 * 9 * ARIA Support: Greta Krafsig 10 * 11 * Project: https://github.com/CodeSeven/toastr 12 */ 13/* global define */ 14(function (define) { 15 define(['jquery'], function ($) { 16 return (function () { 17 var $container; 18 var listener; 19 var toastId = 0; 20 var toastType = { 21 error: 'error', 22 info: 'info', 23 success: 'success', 24 warning: 'warning' 25 }; 26 27 var toastr = { 28 clear: clear, 29 remove: remove, 30 error: error, 31 getContainer: getContainer, 32 info: info, 33 options: {}, 34 subscribe: subscribe, 35 success: success, 36 version: '2.1.3', 37 warning: warning 38 }; 39 40 var previousToast; 41 42 return toastr; 43
vendor: 16,959 bytes, lines 44-477
44 //////////////// 45 46 function error(message, title, optionsOverride) { 47 return notify({ 48 type: toastType.error, 49 iconClass: getOptions().iconClasses.error, 50 message: message, 51 optionsOverride: optionsOverride, 52 title: title 53 }); 54 } 55 56 function getContainer(options, create) { 57 if (!options) { options = getOptions(); } 58 $container = $('#' + options.containerId); 59 if ($container.length) { 60 return $container; 61 } 62 if (create) { 63 $container = createContainer(options); 64 } 65 return $container; 66 } 67 68 function info(message, title, optionsOverride) { 69 return notify({ 70 type: toastType.info, 71 iconClass: getOptions().iconClasses.info, 72 message: message, 73 optionsOverride: optionsOverride, 74 title: title 75 }); 76 } 77 78 function subscribe(callback) { 79 listener = callback; 80 } 81 82 function success(message, title, optionsOverride) { 83 return notify({ 84 type: toastType.success, 85 iconClass: getOptions().iconClasses.success, 86 message: message, 87 optionsOverride: optionsOverride, 88 title: title 89 }); 90 } 91 92 function warning(message, title, optionsOverride) { 93 return notify({ 94 type: toastType.warning, 95 iconClass: getOptions().iconClasses.warning, 96 message: message, 97 optionsOverride: optionsOverride, 98 title: title 99 }); 100 } 101 102 function clear($toastElement, clearOptions) { 103 var options = getOptions(); 104 if (!$container) { getContainer(options); } 105 if (!clearToast($toastElement, options, clearOptions)) { 106 clearContainer(options); 107 } 108 } 109 110 function remove($toastElement) { 111 var options = getOptions(); 112 if (!$container) { getContainer(options); } 113 if ($toastElement && $(':focus', $toastElement).length === 0) { 114 removeToast($toastElement); 115 return; 116 } 117 if ($container.children().length) { 118 $container.remove(); 119 } 120 } 121 122 // internal functions 123 124 function clearContainer(options) { 125 var toastsToClear = $container.children(); 126 for (var i = toastsToClear.length - 1; i >= 0; i--) { 127 clearToast($(toastsToClear[i]), options); 128 } 129 } 130 131 function clearToast($toastElement, options, clearOptions) { 132 var force = clearOptions && clearOptions.force ? clearOptions.force : false; 133 if ($toastElement && (force || $(':focus', $toastElement).length === 0)) { 134 $toastElement[options.hideMethod]({ 135 duration: options.hideDuration, 136 easing: options.hideEasing, 137 complete: function () { removeToast($toastElement); } 138 }); 139 return true; 140 } 141 return false; 142 } 143 144 function createContainer(options) { 145 $container = $('<div/>') 146 .attr('id', options.containerId) 147 .addClass(options.positionClass); 148 149 $container.appendTo($(options.target)); 150 return $container; 151 } 152 153 function getDefaults() { 154 return { 155 tapToDismiss: true, 156 toastClass: 'toast', 157 containerId: 'toast-container', 158 debug: false, 159 160 showMethod: 'fadeIn', //fadeIn, slideDown, and show are built into jQuery 161 showDuration: 300, 162 showEasing: 'swing', //swing and linear are built into jQuery 163 onShown: undefined, 164 hideMethod: 'fadeOut', 165 hideDuration: 1000, 166 hideEasing: 'swing', 167 onHidden: undefined, 168 closeMethod: false, 169 closeDuration: false, 170 closeEasing: false, 171 closeOnHover: true, 172 173 extendedTimeOut: 1000, 174 iconClasses: { 175 error: 'toast-error', 176 info: 'toast-info', 177 success: 'toast-success', 178 warning: 'toast-warning' 179 }, 180 iconClass: 'toast-info', 181 positionClass: 'toast-top-right', 182 timeOut: 5000, // Set timeOut and extendedTimeOut to 0 to make it sticky 183 titleClass: 'toast-title', 184 messageClass: 'toast-message', 185 escapeHtml: false, 186 target: 'body', 187 closeHtml: '<button type="button">×</button>', 188 closeClass: 'toast-close-button', 189 newestOnTop: true, 190 preventDuplicates: false, 191 progressBar: false, 192 progressClass: 'toast-progress', 193 rtl: false 194 }; 195 } 196 197 function publish(args) { 198 if (!listener) { return; } 199 listener(args); 200 } 201 202 function notify(map) { 203 var options = getOptions(); 204 var iconClass = map.iconClass || options.iconClass; 205 206 if (typeof (map.optionsOverride) !== 'undefined') { 207 options = $.extend(options, map.optionsOverride); 208 iconClass = map.optionsOverride.iconClass || iconClass; 209 } 210 211 if (shouldExit(options, map)) { return; } 212 213 toastId++; 214 215 $container = getContainer(options, true); 216 217 var intervalId = null; 218 var $toastElement = $('<div/>'); 219 var $titleElement = $('<div/>'); 220 var $messageElement = $('<div/>'); 221 var $progressElement = $('<div/>'); 222 var $closeElement = $(options.closeHtml); 223 var progressBar = { 224 intervalId: null, 225 hideEta: null, 226 maxHideTime: null 227 }; 228 var response = { 229 toastId: toastId, 230 state: 'visible', 231 startTime: new Date(), 232 options: options, 233 map: map 234 }; 235 236 personalizeToast(); 237 238 displayToast(); 239 240 handleEvents(); 241 242 publish(response); 243 244 if (options.debug && console) { 245 console.log(response); 246 } 247 248 return $toastElement; 249 250 function escapeHtml(source) { 251 if (source == null) { 252 source = ''; 253 } 254 255 return source 256 .replace(/&/g, '&') 257 .replace(/"/g, '"') 258 .replace(/'/g, ''') 259 .replace(/</g, '<') 260 .replace(/>/g, '>'); 261 } 262 263 function personalizeToast() { 264 setIcon(); 265 setTitle(); 266 setMessage(); 267 setCloseButton(); 268 setProgressBar(); 269 setRTL(); 270 setSequence(); 271 setAria(); 272 } 273 274 function setAria() { 275 var ariaValue = ''; 276 switch (map.iconClass) { 277 case 'toast-success': 278 case 'toast-info': 279 ariaValue = 'polite'; 280 break; 281 default: 282 ariaValue = 'assertive'; 283 } 284 $toastElement.attr('aria-live', ariaValue); 285 } 286 287 function handleEvents() { 288 if (options.closeOnHover) { 289 $toastElement.hover(stickAround, delayedHideToast); 290 } 291 292 if (!options.onclick && options.tapToDismiss) { 293 $toastElement.click(hideToast); 294 } 295 296 if (options.closeButton && $closeElement) { 297 $closeElement.click(function (event) { 298 if (event.stopPropagation) { 299 event.stopPropagation(); 300 } else if (event.cancelBubble !== undefined && event.cancelBubble !== true) { 301 event.cancelBubble = true; 302 } 303 304 if (options.onCloseClick) { 305 options.onCloseClick(event); 306 } 307 308 hideToast(true); 309 }); 310 } 311 312 if (options.onclick) { 313 $toastElement.click(function (event) { 314 options.onclick(event); 315 hideToast(); 316 }); 317 } 318 } 319 320 function displayToast() { 321 $toastElement.hide(); 322 323 $toastElement[options.showMethod]( 324 { duration: options.showDuration, easing: options.showEasing, complete: options.onShown } 325 ); 326 327 if (options.timeOut > 0) { 328 intervalId = setTimeout(hideToast, options.timeOut); 329 progressBar.maxHideTime = parseFloat(options.timeOut); 330 progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime; 331 if (options.progressBar) { 332 progressBar.intervalId = setInterval(updateProgress, 10); 333 } 334 } 335 } 336 337 function setIcon() { 338 if (map.iconClass) { 339 $toastElement.addClass(options.toastClass).addClass(iconClass); 340 } 341 } 342 343 function setSequence() { 344 if (options.newestOnTop) { 345 $container.prepend($toastElement); 346 } else { 347 $container.append($toastElement); 348 } 349 } 350 351 function setTitle() { 352 if (map.title) { 353 var suffix = map.title; 354 if (options.escapeHtml) { 355 suffix = escapeHtml(map.title); 356 } 357 $titleElement.append(suffix).addClass(options.titleClass); 358 $toastElement.append($titleElement); 359 } 360 } 361 362 function setMessage() { 363 if (map.message) { 364 var suffix = map.message; 365 if (options.escapeHtml) { 366 suffix = escapeHtml(map.message); 367 } 368 $messageElement.append(suffix).addClass(options.messageClass); 369 $toastElement.append($messageElement); 370 } 371 } 372 373 function setCloseButton() { 374 if (options.closeButton) { 375 $closeElement.addClass(options.closeClass).attr('role', 'button'); 376 $toastElement.prepend($closeElement); 377 } 378 } 379 380 function setProgressBar() { 381 if (options.progressBar) { 382 $progressElement.addClass(options.progressClass); 383 $toastElement.prepend($progressElement); 384 } 385 } 386 387 function setRTL() { 388 if (options.rtl) { 389 $toastElement.addClass('rtl'); 390 } 391 } 392 393 function shouldExit(options, map) { 394 if (options.preventDuplicates) { 395 if (map.message === previousToast) { 396 return true; 397 } else { 398 previousToast = map.message; 399 } 400 } 401 return false; 402 } 403 404 function hideToast(override) { 405 var method = override && options.closeMethod !== false ? options.closeMethod : options.hideMethod; 406 var duration = override && options.closeDuration !== false ? 407 options.closeDuration : options.hideDuration; 408 var easing = override && options.closeEasing !== false ? options.closeEasing : options.hideEasing; 409 if ($(':focus', $toastElement).length && !override) { 410 return; 411 } 412 clearTimeout(progressBar.intervalId); 413 return $toastElement[method]({ 414 duration: duration, 415 easing: easing, 416 complete: function () { 417 removeToast($toastElement); 418 clearTimeout(intervalId); 419 if (options.onHidden && response.state !== 'hidden') { 420 options.onHidden(); 421 } 422 response.state = 'hidden'; 423 response.endTime = new Date(); 424 publish(response); 425 } 426 }); 427 } 428 429 function delayedHideToast() { 430 if (options.timeOut > 0 || options.extendedTimeOut > 0) { 431 intervalId = setTimeout(hideToast, options.extendedTimeOut); 432 progressBar.maxHideTime = parseFloat(options.extendedTimeOut); 433 progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime; 434 } 435 } 436 437 function stickAround() { 438 clearTimeout(intervalId); 439 progressBar.hideEta = 0; 440 $toastElement.stop(true, true)[options.showMethod]( 441 { duration: options.showDuration, easing: options.showEasing } 442 ); 443 } 444 445 function updateProgress() { 446 var percentage = ((progressBar.hideEta - (new Date().getTime())) / progressBar.maxHideTime) * 100; 447 $progressElement.width(percentage + '%'); 448 } 449 } 450 451 function getOptions() { 452 return $.extend({}, getDefaults(), toastr.options); 453 } 454 455 function removeToast($toastElement) { 456 if (!$container) { $container = getContainer(); } 457 if ($toastElement.is(':visible')) { 458 return; 459 } 460 $toastElement.remove(); 461 $toastElement = null; 462 if ($container.children().length === 0) { 463 $container.remove(); 464 previousToast = undefined; 465 } 466 } 467 468 })(); 469 }); 470}(typeof define === 'function' && define.amd ? define : function (deps, factory) { 471 if (typeof module !== 'undefined' && module.exports) { //Node 472 module.exports = factory(require('jquery')); 473 } else { 474 window.toastr = factory(window.jQuery); 475 } 476})); 477
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.