1/*! 2 * sweetalert2 v7.2.0 3 * Released under the MIT License. 4 */ 5(function (global, factory) { 6 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : 7 typeof define === 'function' && define.amd ? define(factory) : 8 (global.Sweetalert2 = factory()); 9}(this, (function () { 'use strict'; 10 11var defaultParams = { 12 title: '', 13 titleText: '', 14 text: '', 15 html: '', 16 type: null, 17 toast: false, 18 customClass: '', 19 target: 'body', 20 backdrop: true, 21 animation: true, 22 allowOutsideClick: true, 23 allowEscapeKey: true, 24 allowEnterKey: true, 25 showConfirmButton: true, 26 showCancelButton: false, 27 preConfirm: null, 28 confirmButtonText: 'OK', 29 confirmButtonAriaLabel: '', 30 confirmButtonColor: '#3085d6', 31 confirmButtonClass: null, 32 cancelButtonText: 'Cancel', 33 cancelButtonAriaLabel: '', 34 cancelButtonColor: '#aaa', 35 cancelButtonClass: null, 36 buttonsStyling: true, 37 reverseButtons: false, 38 focusConfirm: true, 39 focusCancel: false, 40 showCloseButton: false, 41 closeButtonAriaLabel: 'Close this dialog', 42 showLoaderOnConfirm: false, 43 imageUrl: null, 44 imageWidth: null, 45 imageHeight: null, 46 imageAlt: '', 47 imageClass: null, 48 timer: null, 49 width: 500, 50 padding: 20, 51 background: '#fff', 52 input: null, 53 inputPlaceholder: '', 54 inputValue: '', 55 inputOptions: {}, 56 inputAutoTrim: true, 57 inputClass: null, 58 inputAttributes: {}, 59 inputValidator: null, 60 grow: false, 61 position: 'center', 62 progressSteps: [], 63 currentProgressStep: null, 64 progressStepsDistance: '40px', 65 onBeforeOpen: null, 66 onOpen: null, 67 onClose: null, 68 useRejections: false, 69 expectRejections: false 70}; 71 72var deprecatedParams = ['useRejections', 'expectRejections']; 73 74var swalPrefix = 'swal2-'; 75 76var prefix = function prefix(items) { 77 var result = {}; 78 for (var i in items) { 79 result[items[i]] = swalPrefix + items[i]; 80 } 81 return result; 82}; 83 84var swalClasses = prefix(['container', 'shown', 'iosfix', 'popup', 'modal', 'no-backdrop', 'toast', 'toast-shown', 'overlay', 'fade', 'show', 'hide', 'noanimation', 'close', 'title', 'content', 'contentwrapper', 'buttonswrapper', 'confirm', 'cancel', 'icon', 'image', 'input', 'has-input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea', 'inputerror', 'validationerror', 'progresssteps', 'activeprogressstep', 'progresscircle', 'progressline', 'loading', 'styled', 'top', 'top-start', 'top-end', 'top-left', 'top-right', 'center', 'center-start', 'center-end', 'center-left', 'center-right', 'bottom', 'bottom-start', 'bottom-end', 'bottom-left', 'bottom-right', 'grow-row', 'grow-column', 'grow-fullscreen']); 85 86var iconTypes = prefix(['success', 'warning', 'info', 'question', 'error']); 87 88var consolePrefix = 'SweetAlert2:'; 89 90/* 91 * Set hover, active and focus-states for buttons (source: http://www.sitepoint.com/javascript-generate-lighter-darker-color) 92 */ 93var colorLuminance = function colorLuminance(hex, lum) { 94 // Validate hex string 95 hex = String(hex).replace(/[^0-9a-f]/gi, ''); 96 if (hex.length < 6) { 97 hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; 98 } 99 lum = lum || 0; 100 101 // Convert to decimal and change luminosity 102 var rgb = '#'; 103 for (var i = 0; i < 3; i++) { 104 var c = parseInt(hex.substr(i * 2, 2), 16); 105 c = Math.round(Math.min(Math.max(0, c + c * lum), 255)).toString(16); 106 rgb += ('00' + c).substr(c.length); 107 } 108 109 return rgb; 110}; 111 112/** 113 * Filter the unique values into a new array 114 * @param arr 115 */ 116var uniqueArray = function uniqueArray(arr) { 117 var result = []; 118 for (var i in arr) { 119 if (result.indexOf(arr[i]) === -1) { 120 result.push(arr[i]); 121 } 122 } 123 return result; 124}; 125 126/** 127 * Standardise console warnings 128 * @param message 129 */ 130var warn = function warn(message) { 131 console.warn(consolePrefix + ' ' + message); 132}; 133 134/** 135 * Standardise console errors 136 * @param message 137 */ 138var error = function error(message) { 139 console.error(consolePrefix + ' ' + message); 140}; 141 142/** 143 * Private global state for `warnOnce` 144 * @type {Array} 145 * @private 146 */ 147var previousWarnOnceMessages = []; 148 149/** 150 * Show a console warning, but only if it hasn't already been shown 151 * @param message 152 */ 153var warnOnce = function warnOnce(message) { 154 if (!(previousWarnOnceMessages.indexOf(message) !== -1)) { 155 previousWarnOnceMessages.push(message); 156 warn(message); 157 } 158}; 159 160// Remember state in cases where opening and handling a modal will fiddle with it. 161var states = { 162 previousActiveElement: null, 163 previousBodyPadding: null 164 165 // Detect Node env 166};var isNodeEnv = function isNodeEnv() { 167 return typeof window === 'undefined' || typeof document === 'undefined'; 168}; 169 170/* 171 * Add modal + overlay to DOM 172 */ 173var init = function init(params) {
174 // Clean up the old popup if it exists 175 var c = getContainer(); 176 if (c) { 177 c.parentNode.removeChild(c); 178 removeClass([document.documentElement, document.body], [swalClasses['no-backdrop'], swalClasses['has-input'], swalClasses['toast-shown']]); 179 } 180 181 if (isNodeEnv()) { 182 error('SweetAlert2 requires document to initialize'); 183 return; 184 } 185 186 var container = document.createElement('div'); 187 container.className = swalClasses.container; 188 container.innerHTML = sweetHTML; 189 190 var targetElement = typeof params.target === 'string' ? document.querySelector(params.target) : params.target; 191 targetElement.appendChild(container); 192 193 var popup = getPopup(); 194 var input = getChildByClass(popup, swalClasses.input); 195 var file = getChildByClass(popup, swalClasses.file); 196 var range = popup.querySelector('.' + swalClasses.range + ' input'); 197 var rangeOutput = popup.querySelector('.' + swalClasses.range + ' output'); 198 var select = getChildByClass(popup, swalClasses.select); 199 var checkbox = popup.querySelector('.' + swalClasses.checkbox + ' input'); 200 var textarea = getChildByClass(popup, swalClasses.textarea); 201 202 // a11y 203 popup.setAttribute('aria-live', params.toast ? 'polite' : 'assertive'); 204 205 var resetValidationError = function resetValidationError() { 206 sweetAlert.isVisible() && sweetAlert.resetValidationError(); 207 }; 208 209 input.oninput = resetValidationError; 210 file.onchange = resetValidationError; 211 select.onchange = resetValidationError; 212 checkbox.onchange = resetValidationError; 213 textarea.oninput = resetValidationError; 214 215 range.oninput = function () { 216 resetValidationError(); 217 rangeOutput.value = range.value; 218 }; 219 220 range.onchange = function () { 221 resetValidationError(); 222 range.previousSibling.value = range.value; 223 }; 224 225 return popup; 226}; 227 228/* 229 * Manipulate DOM 230 */ 231 232var sweetHTML = ('\n <div role="dialog" aria-modal="true" aria-labelledby="' + swalClasses.title + '" aria-describedby="' + swalClasses.content + '" class="' + swalClasses.popup + '" tabindex="-1">\n <ul class="' + swalClasses.progresssteps + '"></ul>\n <div class="' + swalClasses.icon + ' ' + iconTypes.error + '">\n <span class="swal2-x-mark"><span class="swal2-x-mark-line-left"></span><span class="swal2-x-mark-line-right"></span></span>\n </div>\n <div class="' + swalClasses.icon + ' ' + iconTypes.question + '">?</div>\n <div class="' + swalClasses.icon + ' ' + iconTypes.warning + '">!</div>\n <div class="' + swalClasses.icon + ' ' + iconTypes.info + '">i</div>\n <div class="' + swalClasses.icon + ' ' + iconTypes.success + '">\n <div class="swal2-success-circular-line-left"></div>\n <span class="swal2-success-line-tip"></span> <span class="swal2-success-line-long"></span>\n <div class="swal2-success-ring"></div> <div class="swal2-success-fix"></div>\n <div class="swal2-success-circular-line-right"></div>\n </div>\n <img class="' + swalClasses.image + '" />\n <div class="' + swalClasses.contentwrapper + '">\n <h2 class="' + swalClasses.title + '" id="' + swalClasses.title + '"></h2>\n <div id="' + swalClasses.content + '" class="' + swalClasses.content + '"></div>\n </div>\n <input class="' + swalClasses.input + '" />\n <input type="file" class="' + swalClasses.file + '" />\n <div class="' + swalClasses.range + '">\n <output></output>\n <input type="range" />\n </div>\n <select class="' + swalClasses.select + '"></select>\n <div class="' + swalClasses.radio + '"></div>\n <label for="' + swalClasses.checkbox + '" class="' + swalClasses.checkbox + '">\n <input type="checkbox" />\n </label>\n <textarea class="' + swalClasses.textarea + '"></textarea>\n <div class="' + swalClasses.validationerror + '" id="' + swalClasses.validationerror + '"></div>\n <div class="' + swalClasses.buttonswrapper + '">\n <button type="button" class="' + swalClasses.confirm + '">OK</button>\n <button type="button" class="' + swalClasses.cancel + '">Cancel</button>\n </div>\n <button type="button" class="' + swalClasses.close + '">\xD7</button>\n </div>\n').replace(/(^|\n)\s*/g, ''); 233 234var getContainer = function getContainer() { 235 return document.body.querySelector('.' + swalClasses.container); 236}; 237 238var getPopup = function getPopup() { 239 return getContainer() ? getContainer().querySelector('.' + swalClasses.popup) : null; 240}; 241 242var getIcons = function getIcons() { 243 var popup = getPopup(); 244 return popup.querySelectorAll('.' + swalClasses.icon); 245}; 246 247var elementByClass = function elementByClass(className) { 248 return getContainer() ? getContainer().querySelector('.' + className) : null; 249}; 250 251var getTitle = function getTitle() { 252 return elementByClass(swalClasses.title); 253}; 254 255var getContent = function getContent() { 256 return elementByClass(swalClasses.content); 257}; 258 259var getImage = function getImage() { 260 return elementByClass(swalClasses.image); 261}; 262 263var getProgressSteps = function getProgressSteps() { 264 return elementByClass(swalClasses.progresssteps); 265}; 266 267var getValidationError = function getValidationError() { 268 return elementByClass(swalClasses.validationerror); 269}; 270 271var getConfirmButton = function getConfirmButton() { 272 return elementByClass(swalClasses.confirm); 273}; 274 275var getCancelButton = function getCancelButton() { 276 return elementByClass(swalClasses.cancel); 277}; 278 279var getButtonsWrapper = function getButtonsWrapper() { 280 return elementByClass(swalClasses.buttonswrapper); 281}; 282 283var getCloseButton = function getCloseButton() { 284 return elementByClass(swalClasses.close); 285}; 286 287var getFocusableElements = function getFocusableElements() { 288 var focusableElementsWithTabindex = Array.from(getPopup().querySelectorAll('[tabindex]:not
288([tabindex="-1"]):not([tabindex="0"])')) 289 // sort according to tabindex 290 .sort(function (a, b) { 291 a = parseInt(a.getAttribute('tabindex')); 292 b = parseInt(b.getAttribute('tabindex')); 293 if (a > b) { 294 return 1; 295 } else if (a < b) { 296 return -1; 297 } 298 return 0; 299 }); 300 301 var otherFocusableElements = Array.prototype.slice.call(getPopup().querySelectorAll('button, input:not([type=hidden]), textarea, select, a, [tabindex="0"]')); 302 303 return uniqueArray(focusableElementsWithTabindex.concat(otherFocusableElements)); 304}; 305 306var isModal = function isModal() { 307 return !document.body.classList.contains(swalClasses['toast-shown']); 308}; 309 310var isToast = function isToast() { 311 return document.body.classList.contains(swalClasses['toast-shown']); 312}; 313 314var hasClass = function hasClass(elem, className) { 315 if (elem.classList) { 316 return elem.classList.contains(className); 317 } 318 return false; 319}; 320 321var focusInput = function focusInput(input) { 322 input.focus(); 323 324 // place cursor at end of text in text input 325 if (input.type !== 'file') { 326 // http://stackoverflow.com/a/2345915/1331425 327 var val = input.value; 328 input.value = ''; 329 input.value = val; 330 } 331}; 332 333var addOrRemoveClass = function addOrRemoveClass(target, classList, add) { 334 if (!target || !classList) { 335 return; 336 } 337 if (typeof classList === 'string') { 338 classList = classList.split(/\s+/).filter(Boolean); 339 } 340 classList.forEach(function (className) { 341 if (target.forEach) { 342 target.forEach(function (elem) { 343 add ? elem.classList.add(className) : elem.classList.remove(className); 344 }); 345 } else { 346 add ? target.classList.add(className) : target.classList.remove(className); 347 } 348 }); 349}; 350 351var addClass = function addClass(target, classList) { 352 addOrRemoveClass(target, classList, true); 353}; 354 355var removeClass = function removeClass(target, classList) { 356 addOrRemoveClass(target, classList, false); 357}; 358 359var getChildByClass = function getChildByClass(elem, className) { 360 for (var i = 0; i < elem.childNodes.length; i++) { 361 if (hasClass(elem.childNodes[i], className)) { 362 return elem.childNodes[i]; 363 } 364 } 365}; 366 367var show = function show(elem, display) { 368 if (!display) { 369 display = elem === getPopup() || elem === getButtonsWrapper() ? 'flex' : 'block'; 370 } 371 elem.style.opacity = ''; 372 elem.style.display = display; 373}; 374 375var hide = function hide(elem) { 376 elem.style.opacity = ''; 377 elem.style.display = 'none'; 378}; 379 380var empty = function empty(elem) { 381 while (elem.firstChild) { 382 elem.removeChild(elem.firstChild); 383 } 384}; 385 386// borrowed from jquery $(elem).is(':visible') implementation 387var isVisible = function isVisible(elem) { 388 return elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length; 389}; 390 391var removeStyleProperty = function removeStyleProperty(elem, property) { 392 if (elem.style.removeProperty) { 393 elem.style.removeProperty(property); 394 } else { 395 elem.style.removeAttribute(property); 396 } 397}; 398 399var animationEndEvent = function () { 400 // Prevent run in Node env 401 if (isNodeEnv()) { 402 return false; 403 } 404 405 var testEl = document.createElement('div'); 406 var transEndEventNames = { 407 'WebkitAnimation': 'webkitAnimationEnd', 408 'OAnimation': 'oAnimationEnd oanimationend', 409 'animation': 'animationend' 410 }; 411 for (var i in transEndEventNames) { 412 if (transEndEventNames.hasOwnProperty(i) && typeof testEl.style[i] !== 'undefined') { 413 return transEndEventNames[i]; 414 } 415 } 416 417 return false; 418}(); 419 420// Reset previous window keydown handler and focued element 421var resetPrevState = function resetPrevState() { 422 if (states.previousActiveElement && states.previousActiveElement.focus) { 423 var x = window.scrollX; 424 var y = window.scrollY; 425 states.previousActiveElement.focus(); 426 if (typeof x !== 'undefined' && typeof y !== 'undefined') { 427 // IE doesn't have scrollX/scrollY support 428 window.scrollTo(x, y); 429 } 430 } 431}; 432 433// Measure width of scrollbar 434// https://github.com/twbs/bootstrap/blob/master/js/modal.js#L279-L286 435var measureScrollbar = function measureScrollbar() { 436 var supportsTouch = 'ontouchstart' in window || navigator.msMaxTouchPoints; 437 if (supportsTouch) { 438 return 0; 439 } 440 var scrollDiv = document.createElement('div'); 441 scrollDiv.style.width = '50px'; 442 scrollDiv.style.height = '50px'; 443 scrollDiv.style.overflow = 'scroll'; 444 document.body.appendChild(scrollDiv); 445 var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth; 446 document.body.removeChild(scrollDiv); 447 return scrollbarWidth; 448}; 449 450/** 451 * Inject a string of CSS into the page header 452 * 453 * @param {String} css 454 */ 455 456var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { 457 return typeof obj; 458} : function (obj) { 459 return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; 460}; 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482var _extends = Object.assign || function (target) { 483 for (var i = 1; i < arguments.length; i++) { 484 var source = arguments[i]; 485 486 for (var key in source) { 487 if (Object.prototype.hasOwnProperty.call(source, key)) { 488 target[key] = source[key]; 489 } 490 } 491 } 492 493 return target; 494}; 495 496var popupParams = _extends({}, defaultParams); 497var queue = []; 498 499var previousWindowKeyDown = void 0;
500var windowOnkeydownOverridden = void 0; 501 502/* 503 * Check for the existence of Promise 504 * Hopefully to avoid many github issues 505 */ 506if (typeof Promise === 'undefined') { 507 error('This package requires a Promise library, please include a shim to enable it in this browser (See: https://github.com/limonte/sweetalert2/wiki/Migration-from-SweetAlert-to-SweetAlert2#1-ie-support)'); 508} 509 510/** 511 * Show relevant warnings for given params 512 * 513 * @param params 514 */ 515var showWarningsForParams = function showWarningsForParams(params) { 516 for (var param in params) { 517 if (!sweetAlert.isValidParameter(param)) { 518 warn('Unknown parameter "' + param + '"'); 519 } 520 if (sweetAlert.isDeprecatedParameter(param)) { 521 warnOnce('The parameter "' + param + '" is deprecated and will be removed in the next major release.'); 522 } 523 } 524}; 525 526/** 527 * Set type, text and actions on popup 528 * 529 * @param params 530 * @returns {boolean} 531 */ 532var setParameters = function setParameters(params) { 533 // If a custom element is set, determine if it is valid 534 if (typeof params.target === 'string' && !document.querySelector(params.target) || typeof params.target !== 'string' && !params.target.appendChild) { 535 warn('Target parameter is not valid, defaulting to "body"'); 536 params.target = 'body'; 537 } 538 539 var popup = void 0; 540 var oldPopup = getPopup(); 541 var targetElement = typeof params.target === 'string' ? document.querySelector(params.target) : params.target; 542 // If the model target has changed, refresh the popup 543 if (oldPopup && targetElement && oldPopup.parentNode !== targetElement.parentNode) { 544 popup = init(params); 545 } else { 546 popup = oldPopup || init(params); 547 } 548 549 // Set popup width 550 var popupWidth = params.width === defaultParams.width && params.toast ? 'auto' : params.width; 551 popup.style.width = typeof popupWidth === 'number' ? popupWidth + 'px' : popupWidth; 552 553 var popupPadding = params.padding === defaultParams.padding && params.toast ? 'inherit' : params.padding; 554 popup.style.padding = typeof popupPadding === 'number' ? popupPadding + 'px' : popupPadding; 555 popup.style.background = params.background; 556 var successIconParts = popup.querySelectorAll('[class^=swal2-success-circular-line], .swal2-success-fix'); 557 for (var i = 0; i < successIconParts.length; i++) { 558 successIconParts[i].style.background = params.background; 559 } 560 561 var container = getContainer(); 562 var title = getTitle(); 563 var content = getContent(); 564 var buttonsWrapper = getButtonsWrapper(); 565 var confirmButton = getConfirmButton(); 566 var cancelButton = getCancelButton(); 567 var closeButton = getCloseButton(); 568 569 // Title 570 if (params.titleText) { 571 title.innerText = params.titleText; 572 } else { 573 title.innerHTML = params.title.split('\n').join('<br />'); 574 } 575 576 if (!params.backdrop) { 577 addClass([document.documentElement, document.body], swalClasses['no-backdrop']); 578 } 579 580 // Content 581 if (params.text || params.html) { 582 if (_typeof(params.html) === 'object') { 583 content.innerHTML = ''; 584 if (0 in params.html) { 585 for (var _i = 0; _i in params.html; _i++) { 586 content.appendChild(params.html[_i].cloneNode(true)); 587 } 588 } else { 589 content.appendChild(params.html.cloneNode(true)); 590 } 591 } else if (params.html) { 592 content.innerHTML = params.html; 593 } else if (params.text) { 594 content.textContent = params.text; 595 } 596 show(content); 597 } else { 598 hide(content); 599 } 600 601 // Position 602 if (params.position in swalClasses) { 603 addClass(container, swalClasses[params.position]); 604 } 605 606 // Grow 607 if (params.grow && typeof params.grow === 'string') { 608 var growClass = 'grow-' + params.grow; 609 if (growClass in swalClasses) { 610 addClass(container, swalClasses[growClass]); 611 } 612 } 613 614 // Close button 615 if (params.showCloseButton) { 616 closeButton.setAttribute('aria-label', params.closeButtonAriaLabel); 617 show(closeButton); 618 } else { 619 hide(closeButton); 620 } 621 622 // Default Class 623 popup.className = swalClasses.popup; 624 if (params.toast) { 625 addClass([document.documentElement, document.body], swalClasses['toast-shown']); 626 addClass(popup, swalClasses.toast); 627 } else { 628 addClass(popup, swalClasses.modal); 629 } 630 631 // Custom Class 632 if (params.customClass) { 633 addClass(popup, params.customClass); 634 } 635 636 // Progress steps 637 var progressStepsContainer = getProgressSteps(); 638 var currentProgressStep = parseInt(params.currentProgressStep === null ? sweetAlert.getQueueStep() : params.currentProgressStep, 10); 639 if (params.progressSteps.length) { 640 show(progressStepsContainer); 641 empty(progressStepsContainer); 642 if (currentProgressStep >= params.progressSteps.length) { 643 warn('Invalid currentProgressStep parameter, it should be less than progressSteps.length ' + '(currentProgressStep like JS arrays starts from 0)'); 644 } 645 params.progressSteps.forEach(function (step, index) { 646 var circle = document.createElement('li'); 647 addClass(circle, swalClasses.progresscircle); 648 circle.innerHTML = step; 649 if (index === currentProgressStep) { 650 addClass(circle, swalClasses.activeprogressstep); 651 } 652 progressStepsContainer.appendChild(circle); 653 if (index !== params.progressSteps.length - 1) { 654 var line = document.createElement('li'); 655 addClass(line, swalClasses.progressline); 656 line.style.width = params.progressStepsDistance; 657 progressStepsContainer.appendChild(line); 658 } 659 }); 660 } else { 661 hide(progressStepsContainer); 662 } 663 664 // Icon 665 var icons = getIcons(); 666 for (var _i2 = 0; _i2 < icons.length; _i2++) { 667 hide(icons[_i2]); 668 } 669 if (params.type) {
670 var validType = false; 671 for (var iconType in iconTypes) { 672 if (params.type === iconType) { 673 validType = true; 674 break; 675 } 676 } 677 if (!validType) { 678 error('Unknown alert type: ' + params.type); 679 return false; 680 } 681 var icon = popup.querySelector('.' + swalClasses.icon + '.' + iconTypes[params.type]); 682 show(icon); 683 684 // Animate icon 685 if (params.animation) { 686 switch (params.type) { 687 case 'success': 688 addClass(icon, 'swal2-animate-success-icon'); 689 addClass(icon.querySelector('.swal2-success-line-tip'), 'swal2-animate-success-line-tip'); 690 addClass(icon.querySelector('.swal2-success-line-long'), 'swal2-animate-success-line-long'); 691 break; 692 case 'error': 693 addClass(icon, 'swal2-animate-error-icon'); 694 addClass(icon.querySelector('.swal2-x-mark'), 'swal2-animate-x-mark'); 695 break; 696 default: 697 break; 698 } 699 } 700 } 701 702 // Custom image 703 var image = getImage(); 704 if (params.imageUrl) { 705 image.setAttribute('src', params.imageUrl); 706 image.setAttribute('alt', params.imageAlt); 707 show(image); 708 709 if (params.imageWidth) { 710 image.setAttribute('width', params.imageWidth); 711 } else { 712 image.removeAttribute('width'); 713 } 714 715 if (params.imageHeight) { 716 image.setAttribute('height', params.imageHeight); 717 } else { 718 image.removeAttribute('height'); 719 } 720 721 image.className = swalClasses.image; 722 if (params.imageClass) { 723 addClass(image, params.imageClass); 724 } 725 } else { 726 hide(image); 727 } 728 729 // Cancel button 730 if (params.showCancelButton) { 731 cancelButton.style.display = 'inline-block'; 732 } else { 733 hide(cancelButton); 734 } 735 736 // Confirm button 737 if (params.showConfirmButton) { 738 removeStyleProperty(confirmButton, 'display'); 739 } else { 740 hide(confirmButton); 741 } 742 743 // Buttons wrapper 744 if (!params.showConfirmButton && !params.showCancelButton) { 745 hide(buttonsWrapper); 746 } else { 747 show(buttonsWrapper); 748 } 749 750 // Edit text on confirm and cancel buttons 751 confirmButton.innerHTML = params.confirmButtonText; 752 cancelButton.innerHTML = params.cancelButtonText; 753 754 // ARIA labels for confirm and cancel buttons 755 confirmButton.setAttribute('aria-label', params.confirmButtonAriaLabel); 756 cancelButton.setAttribute('aria-label', params.cancelButtonAriaLabel); 757 758 // Set buttons to selected background colors 759 if (params.buttonsStyling) { 760 confirmButton.style.backgroundColor = params.confirmButtonColor; 761 cancelButton.style.backgroundColor = params.cancelButtonColor; 762 } 763 764 // Add buttons custom classes 765 confirmButton.className = swalClasses.confirm; 766 addClass(confirmButton, params.confirmButtonClass); 767 cancelButton.className = swalClasses.cancel; 768 addClass(cancelButton, params.cancelButtonClass); 769 770 // Buttons styling 771 if (params.buttonsStyling) { 772 addClass([confirmButton, cancelButton], swalClasses.styled); 773 } else { 774 removeClass([confirmButton, cancelButton], swalClasses.styled); 775 776 confirmButton.style.backgroundColor = confirmButton.style.borderLeftColor = confirmButton.style.borderRightColor = ''; 777 cancelButton.style.backgroundColor = cancelButton.style.borderLeftColor = cancelButton.style.borderRightColor = ''; 778 } 779 780 // CSS animation 781 if (params.animation === true) { 782 removeClass(popup, swalClasses.noanimation); 783 } else { 784 addClass(popup, swalClasses.noanimation); 785 } 786 787 // showLoaderOnConfirm && preConfirm 788 if (params.showLoaderOnConfirm && !params.preConfirm) { 789 warn('showLoaderOnConfirm is set to true, but preConfirm is not defined.\n' + 'showLoaderOnConfirm should be used together with preConfirm, see usage example:\n' + 'https://limonte.github.io/sweetalert2/#ajax-request'); 790 } 791}; 792 793/** 794 * Animations 795 * 796 * @param animation 797 * @param onBeforeOpen 798 * @param onComplete 799 */ 800var openPopup = function openPopup(animation, onBeforeOpen, onComplete) { 801 var container = getContainer(); 802 var popup = getPopup(); 803 804 if (onBeforeOpen !== null && typeof onBeforeOpen === 'function') { 805 onBeforeOpen(popup); 806 } 807 808 if (animation) { 809 addClass(popup, swalClasses.show); 810 addClass(container, swalClasses.fade); 811 removeClass(popup, swalClasses.hide); 812 } else { 813 removeClass(popup, swalClasses.fade); 814 } 815 show(popup); 816 817 // scrolling is 'hidden' until animation is done, after that 'auto' 818 container.style.overflowY = 'hidden'; 819 if (animationEndEvent && !hasClass(popup, swalClasses.noanimation)) { 820 popup.addEventListener(animationEndEvent, function swalCloseEventFinished() { 821 popup.removeEventListener(animationEndEvent, swalCloseEventFinished); 822 container.style.overflowY = 'auto'; 823 }); 824 } else { 825 container.style.overflowY = 'auto'; 826 } 827 828 addClass([document.documentElement, document.body, container], swalClasses.shown); 829 if (isModal()) { 830 fixScrollbar(); 831 iOSfix(); 832 } 833 states.previousActiveElement = document.activeElement; 834 if (onComplete !== null && typeof onComplete === 'function') { 835 setTimeout(function () { 836 onComplete(popup); 837 }); 838 } 839}; 840 841var fixScrollbar = function fixScrollbar() { 842 // for queues, do not do this more than once 843 if (states.previousBodyPadding !== null) { 844 return; 845 } 846 // if the body has overflow 847 if (document.body.scrollHeight > window.innerHeight) { 848 // add padding so the content doesn't shift after removal of scrollbar 849 states.previousBodyPadding = document.body.style.paddingRight; 850 document.body.style.paddingRight = measureScrollbar() + 'px'; 851 } 852}; 853 854var undoScrollbar = function undoScrollbar() { 855 if (states.previousBodyPadding !== null) { 856 document.body.style.paddingRight = states.previousBodyPadding; 857 states.previousBodyPadding = null; 858 } 859}; 860 861// Fix iOS scrolling http://stackoverflow.com/q/39626302/1331425 862var iOSfix = function iOSfix() { 863 var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; 864 if (iOS && !hasClass(document.body, swalClasses.iosfix)) { 865 var offset = document.body.scrollTop; 866 document.body.style.top = offset * -1 + 'px'; 867 addClass(document.body, swalClasses.iosfix); 868 } 869}; 870 871var undoIOSfix = function undoIOSfix() { 872 if (hasClass(document.body, swalClasses.iosfix)) { 873 var offset = parseInt(document.body.style.top, 10); 874 removeClass(document.body, swalClasses.iosfix); 875 document.body.style.top = ''; 876 document.body.scrollTop = offset * -1; 877 } 878}; 879 880// SweetAlert entry point 881var sweetAlert = function sweetAlert() { 882 for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { 883 args[_key] = arguments[_key]; 884 } 885 886 // Prevent run in Node env 887 if (typeof window === 'undefined') { 888 return; 889 } 890 891 if (typeof args[0] === 'undefined') { 892 error('SweetAlert2 expects at least 1 attribute!'); 893 return false;
894 } 895 896 var params = _extends({}, popupParams); 897 898 switch (_typeof(args[0])) { 899 case 'string': 900 params.title = args[0]; 901 params.html = args[1]; 902 params.type = args[2]; 903 904 break; 905 906 case 'object': 907 showWarningsForParams(args[0]); 908 _extends(params, args[0]); 909 params.extraParams = args[0].extraParams; 910 911 if (params.input === 'email' && params.inputValidator === null) { 912 var inputValidator = function inputValidator(email) { 913 return new Promise(function (resolve, reject) { 914 var emailRegex = /^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]{2,24}$/; 915 if (emailRegex.test(email)) { 916 resolve(); 917 } else { 918 reject('Invalid email address'); 919 } 920 }); 921 }; 922 params.inputValidator = params.expectRejections ? inputValidator : sweetAlert.adaptInputValidator(inputValidator); 923 } 924 925 if (params.input === 'url' && params.inputValidator === null) { 926 var _inputValidator = function _inputValidator(url) { 927 return new Promise(function (resolve, reject) { 928 // taken from https://stackoverflow.com/a/3809435/1331425 929 var urlRegex = /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_+.~#?&//=]*)$/; 930 if (urlRegex.test(url)) { 931 resolve(); 932 } else { 933 reject('Invalid URL'); 934 } 935 }); 936 }; 937 params.inputValidator = params.expectRejections ? _inputValidator : sweetAlert.adaptInputValidator(_inputValidator); 938 } 939 break; 940 941 default: 942 error('Unexpected type of argument! Expected "string" or "object", got ' + _typeof(args[0])); 943 return false; 944 } 945 946 setParameters(params); 947 948 var container = getContainer(); 949 var popup = getPopup(); 950 951 return new Promise(function (resolve, reject) { 952 // functions to handle all resolving/rejecting/settling 953 var succeedWith = function succeedWith(value) { 954 sweetAlert.closePopup(params.onClose); 955 if (params.useRejections) { 956 resolve(value); 957 } else { 958 resolve({ value: value }); 959 } 960 }; 961 var dismissWith = function dismissWith(dismiss) { 962 sweetAlert.closePopup(params.onClose); 963 if (params.useRejections) { 964 reject(dismiss); 965 } else { 966 resolve({ dismiss: dismiss }); 967 } 968 }; 969 var errorWith = function errorWith(error$$1) { 970 sweetAlert.closePopup(params.onClose); 971 reject(error$$1); 972 }; 973 974 // Close on timer 975 if (params.timer) { 976 popup.timeout = setTimeout(function () { 977 return dismissWith('timer'); 978 }, params.timer); 979 } 980 981 // Get input element by specified type or, if type isn't specified, by params.input 982 var getInput = function getInput(inputType) { 983 inputType = inputType || params.input; 984 if (!inputType) { 985 return null; 986 } 987 switch (inputType) { 988 case 'select': 989 case 'textarea': 990 case 'file': 991 return getChildByClass(popup, swalClasses[inputType]); 992 case 'checkbox': 993 return popup.querySelector('.' + swalClasses.checkbox + ' input'); 994 case 'radio': 995 return popup.querySelector('.' + swalClasses.radio + ' input:checked') || popup.querySelector('.' + swalClasses.radio + ' input:first-child'); 996 case 'range': 997 return popup.querySelector('.' + swalClasses.range + ' input'); 998 default: 999 return getChildByClass(popup, swalClasses.input); 1000 } 1001 }; 1002 1003 // Get the value of the popup input 1004 var getInputValue = function getInputValue() { 1005 var input = getInput(); 1006 if (!input) { 1007 return null; 1008 } 1009 switch (params.input) { 1010 case 'checkbox': 1011 return input.checked ? 1 : 0; 1012 case 'radio': 1013 return input.checked ? input.value : null; 1014 case 'file': 1015 return input.files.length ? input.files[0] : null; 1016 default: 1017 return params.inputAutoTrim ? input.value.trim() : input.value; 1018 } 1019 }; 1020 1021 // input autofocus 1022 if (params.input) { 1023 setTimeout(function () { 1024 var input = getInput(); 1025 if (input) { 1026 focusInput(input); 1027 } 1028 }, 0); 1029 } 1030 1031 var confirm = function confirm(value) { 1032 if (params.showLoaderOnConfirm) { 1033 sweetAlert.showLoading(); 1034 } 1035 1036 if (params.preConfirm) { 1037 sweetAlert.resetValidationError(); 1038 var preConfirmPromise = Promise.resolve().then(function () { 1039 return params.preConfirm(value, params.extraParams); 1040 }); 1041 if (params.expectRejections) { 1042 preConfirmPromise.then(function (preConfirmValue) { 1043 return succeedWith(preConfirmValue || value); 1044 }, function (validationError) { 1045 sweetAlert.hideLoading(); 1046 if (validationError) { 1047 sweetAlert.showValidationError(validationError); 1048 } 1049 }); 1050 } else { 1051 preConfirmPromise.then(function (preConfirmValue) { 1052 if (isVisible(getValidationError())) { 1053 sweetAlert.hideLoading(); 1054 } else { 1055 succeedWith(preConfirmValue || value); 1056 } 1057 }, function (error$$1) { 1058 return errorWith(error$$1); 1059 }); 1060 } 1061 } else { 1062 succeedWith(value); 1063 } 1064 }; 1065 1066 // Mouse interactions 1067 var onButtonEvent = function onButtonEvent(event) { 1068 var e = event || window.event; 1069 var target = e.target || e.srcElement; 1070 var confirmButton = getConfirmButton(); 1071 var cancelButton = getCancelButton(); 1072 var targetedConfirm = confirmButton && (confirmButton === target || confirmButton.contains(target)); 1073 var targetedCancel = cancelButton && (cancelButton === target || cancelButton.contains(target)); 1074 1075 switch (e.type) { 1076 case 'mouseover': 1077 case 'mouseup': 1078 if (params.buttonsStyling) { 1079 if (targetedConfirm) { 1080 confirmButton.style.backgroundColor = colorLuminance(params.confirmButtonColor, -0.1); 1081 } else if (targetedCancel) { 1082 cancelButton.style.backgroundColor = colorLuminance(params.cancelButtonColor, -0.1); 1083 } 1084 } 1085 break; 1086 case 'mouseout': 1087 if (params.buttonsStyling) { 1088 if (targetedConfirm) { 1089 confirmButton.style.backgroundColor = params.confirmButtonColor; 1090 } else if (targetedCancel) { 1091 cancelButton.style.backgroundColor = params.cancelButtonColor; 1092 } 1093 } 1094 break; 1095 case 'mousedown': 1096 if (params.buttonsStyling) { 1097 if (targetedConfirm) { 1098 confirmButton.style.backgroundColor = colorLuminance(params.confirmButtonColor, -0.2); 1099 } else if (targetedCancel) { 1100 cancelButton.style.backgroundColor = colorLuminance(params.cancelButtonColor, -0.2); 1101 } 1102 } 1103 break; 1104 case 'click': 1105 // Clicked 'confirm' 1106 if (targetedConfirm && sweetAlert.isVisible()) { 1107 sweetAlert.disableButtons(); 1108 if (params.input) { 1109 var inputValue = getInputValue(); 1110 1111 if (params.inputValidator) { 1112 sweetAlert.disableInput();
1113 var validationPromise = Promise.resolve().then(function () { 1114 return params.inputValidator(inputValue, params.extraParams); 1115 }); 1116 if (params.expectRejections) { 1117 validationPromise.then(function () { 1118 sweetAlert.enableButtons(); 1119 sweetAlert.enableInput(); 1120 confirm(inputValue); 1121 }, function (validationError) { 1122 sweetAlert.enableButtons(); 1123 sweetAlert.enableInput(); 1124 if (validationError) { 1125 sweetAlert.showValidationError(validationError); 1126 } 1127 }); 1128 } else { 1129 validationPromise.then(function (validationError) { 1130 sweetAlert.enableButtons(); 1131 sweetAlert.enableInput(); 1132 if (validationError) { 1133 sweetAlert.showValidationError(validationError); 1134 } else { 1135 confirm(inputValue); 1136 } 1137 }, function (error$$1) { 1138 return errorWith(error$$1); 1139 }); 1140 } 1141 } else { 1142 confirm(inputValue); 1143 } 1144 } else { 1145 confirm(true); 1146 } 1147 1148 // Clicked 'cancel' 1149 } else if (targetedCancel && sweetAlert.isVisible()) { 1150 sweetAlert.disableButtons(); 1151 dismissWith('cancel'); 1152 } 1153 break; 1154 default: 1155 } 1156 }; 1157 1158 var buttons = popup.querySelectorAll('button'); 1159 for (var i = 0; i < buttons.length; i++) { 1160 buttons[i].onclick = onButtonEvent; 1161 buttons[i].onmouseover = onButtonEvent; 1162 buttons[i].onmouseout = onButtonEvent; 1163 buttons[i].onmousedown = onButtonEvent; 1164 } 1165 1166 // Closing popup by close button 1167 getCloseButton().onclick = function () { 1168 dismissWith('close'); 1169 }; 1170 1171 if (params.toast) { 1172 // Closing popup by overlay click 1173 popup.onclick = function (e) { 1174 if (e.target !== popup || params.showConfirmButton || params.showCancelButton) { 1175 return; 1176 } 1177 if (params.allowOutsideClick) { 1178 sweetAlert.closePopup(params.onClose); 1179 dismissWith('overlay'); 1180 } 1181 }; 1182 } else { 1183 var ignoreOutsideClick = false; 1184 1185 // Ignore click events that had mousedown on the popup but mouseup on the container 1186 // This can happen when the user drags a slider 1187 popup.onmousedown = function () { 1188 container.onmouseup = function (e) { 1189 container.onmouseup = undefined; 1190 // We only check if the mouseup target is the container because usually it doesn't 1191 // have any other direct children aside of the popup 1192 if (e.target === container) { 1193 ignoreOutsideClick = true; 1194 } 1195 }; 1196 }; 1197 1198 // Ignore click events that had mousedown on the container but mouseup on the popup 1199 container.onmousedown = function () { 1200 popup.onmouseup = function (e) { 1201 popup.onmouseup = undefined; 1202 // We also need to check if the mouseup target is a child of the popup 1203 if (e.target === popup || popup.contains(e.target)) { 1204 ignoreOutsideClick = true; 1205 } 1206 }; 1207 }; 1208 1209 container.onclick = function (e) { 1210 if (ignoreOutsideClick) { 1211 ignoreOutsideClick = false; 1212 return; 1213 } 1214 if (e.target !== container) { 1215 return; 1216 } 1217 if (params.allowOutsideClick) { 1218 dismissWith('overlay'); 1219 } 1220 }; 1221 } 1222 1223 var buttonsWrapper = getButtonsWrapper(); 1224 var confirmButton = getConfirmButton(); 1225 var cancelButton = getCancelButton(); 1226 1227 // Reverse buttons (Confirm on the right side) 1228 if (params.reverseButtons) { 1229 confirmButton.parentNode.insertBefore(cancelButton, confirmButton); 1230 } else { 1231 confirmButton.parentNode.insertBefore(confirmButton, cancelButton); 1232 } 1233 1234 // Focus handling 1235 var setFocus = function setFocus(index, increment) { 1236 var focusableElements = getFocusableElements(params.focusCancel); 1237 // search for visible elements and select the next possible match 1238 for (var _i3 = 0; _i3 < focusableElements.length; _i3++) { 1239 index = index + increment; 1240 1241 // rollover to first item 1242 if (index === focusableElements.length) { 1243 index = 0; 1244 1245 // go to last item 1246 } else if (index === -1) { 1247 index = focusableElements.length - 1; 1248 } 1249 1250 // determine if element is visible 1251 var el = focusableElements[index]; 1252 if (isVisible(el)) { 1253 return el.focus(); 1254 } 1255 } 1256 }; 1257 1258 var handleKeyDown = function handleKeyDown(event) { 1259 var e = event || window.event; 1260 1261 var arrowKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down' // IE11 1262 ]; 1263 1264 if (e.key === 'Enter' && !e.isComposing) {
1265 if (e.target === getInput()) { 1266 if (e.target.tagName.toLowerCase() === 'textarea') { 1267 return; // do not submit 1268 } 1269 1270 sweetAlert.clickConfirm(); 1271 e.preventDefault(); 1272 } 1273 1274 // TAB 1275 } else if (e.key === 'Tab') { 1276 var targetElement = e.target || e.srcElement; 1277 1278 var focusableElements = getFocusableElements(params.focusCancel); 1279 var btnIndex = -1; // Find the button - note, this is a nodelist, not an array. 1280 for (var _i4 = 0; _i4 < focusableElements.length; _i4++) { 1281 if (targetElement === focusableElements[_i4]) { 1282 btnIndex = _i4; 1283 break; 1284 } 1285 } 1286 1287 if (!e.shiftKey) { 1288 // Cycle to the next button 1289 setFocus(btnIndex, 1); 1290 } else { 1291 // Cycle to the prev button 1292 setFocus(btnIndex, -1); 1293 } 1294 e.stopPropagation(); 1295 e.preventDefault(); 1296 1297 // ARROWS - switch focus between buttons 1298 } else if (arrowKeys.indexOf(e.key) !== -1) { 1299 // focus Cancel button if Confirm button is currently focused 1300 if (document.activeElement === confirmButton && isVisible(cancelButton)) { 1301 cancelButton.focus(); 1302 // and vice versa 1303 } else if (document.activeElement === cancelButton && isVisible(confirmButton)) { 1304 confirmButton.focus(); 1305 } 1306 1307 // ESC 1308 } else if ((e.key === 'Escape' || e.key === 'Esc') && params.allowEscapeKey === true) { 1309 dismissWith('esc'); 1310 } 1311 }; 1312
1313 if (params.toast && windowOnkeydownOverridden) { 1314 window.onkeydown = previousWindowKeyDown; 1315 windowOnkeydownOverridden = false; 1316 } 1317 1318 if (!params.toast && !windowOnkeydownOverridden) { 1319 previousWindowKeyDown = window.onkeydown; 1320 windowOnkeydownOverridden = true; 1321 window.onkeydown = handleKeyDown; 1322 } 1323 1324 // Loading state 1325 if (params.buttonsStyling) { 1326 confirmButton.style.borderLeftColor = params.confirmButtonColor; 1327 confirmButton.style.borderRightColor = params.confirmButtonColor; 1328 } 1329 1330 /** 1331 * Show spinner instead of Confirm button and disable Cancel button 1332 */ 1333 sweetAlert.hideLoading = sweetAlert.disableLoading = function () { 1334 if (!params.showConfirmButton) { 1335 hide(confirmButton); 1336 if (!params.showCancelButton) { 1337 hide(getButtonsWrapper()); 1338 } 1339 } 1340 removeClass([popup, buttonsWrapper], swalClasses.loading); 1341 popup.removeAttribute('aria-busy'); 1342 confirmButton.disabled = false; 1343 cancelButton.disabled = false; 1344 }; 1345 1346 sweetAlert.getTitle = function () { 1347 return getTitle(); 1348 }; 1349 sweetAlert.getContent = function () { 1350 return getContent(); 1351 }; 1352 sweetAlert.getInput = function () { 1353 return getInput(); 1354 }; 1355 sweetAlert.getImage = function () { 1356 return getImage(); 1357 }; 1358 sweetAlert.getButtonsWrapper = function () { 1359 return getButtonsWrapper(); 1360 }; 1361 sweetAlert.getConfirmButton = function () { 1362 return getConfirmButton(); 1363 }; 1364 sweetAlert.getCancelButton = function () { 1365 return getCancelButton(); 1366 }; 1367 1368 sweetAlert.enableButtons = function () { 1369 confirmButton.disabled = false; 1370 cancelButton.disabled = false; 1371 }; 1372 1373 sweetAlert.disableButtons = function () { 1374 confirmButton.disabled = true; 1375 cancelButton.disabled = true; 1376 }; 1377 1378 sweetAlert.enableConfirmButton = function () { 1379 confirmButton.disabled = false; 1380 }; 1381 1382 sweetAlert.disableConfirmButton = function () { 1383 confirmButton.disabled = true; 1384 }; 1385 1386 sweetAlert.enableInput = function () { 1387 var input = getInput(); 1388 if (!input) { 1389 return false; 1390 } 1391 if (input.type === 'radio') { 1392 var radiosContainer = input.parentNode.parentNode; 1393 var radios = radiosContainer.querySelectorAll('input'); 1394 for (var _i5 = 0; _i5 < radios.length; _i5++) { 1395 radios[_i5].disabled = false; 1396 } 1397 } else { 1398 input.disabled = false; 1399 } 1400 }; 1401 1402 sweetAlert.disableInput = function () { 1403 var input = getInput(); 1404 if (!input) { 1405 return false; 1406 } 1407 if (input && input.type === 'radio') { 1408 var radiosContainer = input.parentNode.parentNode; 1409 var radios = radiosContainer.querySelectorAll('input'); 1410 for (var _i6 = 0; _i6 < radios.length; _i6++) { 1411 radios[_i6].disabled = true; 1412 } 1413 } else { 1414 input.disabled = true; 1415 } 1416 }; 1417 1418 // Show block with validation error 1419 sweetAlert.showValidationError = function (error$$1) { 1420 var validationError = getValidationError(); 1421 validationError.innerHTML = error$$1; 1422 show(validationError); 1423 1424 var input = getInput(); 1425 if (input) { 1426 input.setAttribute('aria-invalid', true); 1427 input.setAttribute('aria-describedBy', swalClasses.validationerror); 1428 focusInput(input); 1429 addClass(input, swalClasses.inputerror); 1430 } 1431 }; 1432 1433 // Hide block with validation error 1434 sweetAlert.resetValidationError = function () { 1435 var validationError = getValidationError(); 1436 hide(validationError); 1437 1438 var input = getInput(); 1439 if (input) { 1440 input.removeAttribute('aria-invalid'); 1441 input.removeAttribute('aria-describedBy'); 1442 removeClass(input, swalClasses.inputerror); 1443 } 1444 }; 1445 1446 sweetAlert.getProgressSteps = function () { 1447 return params.progressSteps; 1448 }; 1449 1450 sweetAlert.setProgressSteps = function (progressSteps) { 1451 params.progressSteps = progressSteps; 1452 setParameters(params); 1453 }; 1454 1455 sweetAlert.showProgressSteps = function () { 1456 show(getProgressSteps()); 1457 }; 1458 1459 sweetAlert.hideProgressSteps = function () { 1460 hide(getProgressSteps()); 1461 }; 1462 1463 sweetAlert.enableButtons(); 1464 sweetAlert.hideLoading(); 1465 sweetAlert.resetValidationError(); 1466 1467 if (params.input) { 1468 addClass(document.body, swalClasses['has-input']); 1469 } 1470 1471 // inputs 1472 var inputTypes = ['input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea']; 1473 var input = void 0; 1474 for (var _i7 = 0; _i7 < inputTypes.length; _i7++) { 1475 var inputClass = swalClasses[inputTypes[_i7]]; 1476 var inputContainer = getChildByClass(popup, inputClass); 1477 input = getInput(inputTypes[_i7]); 1478 1479 // set attributes 1480 if (input) { 1481 for (var j in input.attributes) { 1482 if (input.attributes.hasOwnProperty(j)) { 1483 var attrName = input.attributes[j].name; 1484 if (attrName !== 'type' && attrName !== 'value') { 1485 input.removeAttribute(attrName); 1486 } 1487 } 1488 } 1489 for (var attr in params.inputAttributes) { 1490 input.setAttribute(attr, params.inputAttributes[attr]); 1491 } 1492 } 1493 1494 // set class 1495 inputContainer.className = inputClass; 1496 if (params.inputClass) { 1497 addClass(inputContainer, params.inputClass); 1498 } 1499 1500 hide(inputContainer); 1501 } 1502 1503 var populateInputOptions = void 0; 1504 switch (params.input) { 1505 case 'text': 1506 case 'email': 1507 case 'password': 1508 case 'number': 1509 case 'tel': 1510 case 'url': 1511 input = getChildByClass(popup, swalClasses.input); 1512 input.value = params.inputValue; 1513 input.placeholder = params.inputPlaceholder; 1514 input.type = params.input; 1515 show(input); 1516 break; 1517 case 'file': 1518 input = getChildByClass(popup, swalClasses.file); 1519 input.placeholder = params.inputPlaceholder; 1520 input.type = params.input; 1521 show(input); 1522 break; 1523 case 'range': 1524 var range = getChildByClass(popup, swalClasses.range); 1525 var rangeInput = range.querySelector('input'); 1526 var rangeOutput = range.querySelector('output'); 1527 rangeInput.value = params.inputValue; 1528 rangeInput.type = params.input; 1529 rangeOutput.value = params.inputValue; 1530 show(range); 1531 break; 1532 case 'select': 1533 var select = getChildByClass(popup, swalClasses.select); 1534 select.innerHTML = ''; 1535 if (params.inputPlaceholder) { 1536 var placeholder = document.createElement('option'); 1537 placeholder.innerHTML = params.inputPlaceholder; 1538 placeholder.value = ''; 1539 placeholder.disabled = true; 1540 placeholder.selected = true; 1541 select.appendChild(placeholder); 1542 } 1543 populateInputOptions = function populateInputOptions(inputOptions) { 1544 for (var optionValue in inputOptions) { 1545 var option = document.createElement('option'); 1546 option.value = optionValue; 1547 option.innerHTML = inputOptions[optionValue]; 1548 if (params.inputValue.toString() === optionValue) { 1549 option.selected = true; 1550 } 1551 select.appendChild(option); 1552 } 1553 show(select); 1554 select.focus(); 1555 }; 1556 break; 1557 case 'radio': 1558 var radio = getChildByClass(popup, swalClasses.radio); 1559 radio.innerHTML = ''; 1560 populateInputOptions = function populateInputOptions(inputOptions) { 1561 for (var radioValue in inputOptions) { 1562 var radioInput = document.createElement('input'); 1563 var radioLabel = document.createElement('label'); 1564 var radioLabelSpan = document.createElement('span'); 1565 radioInput.type = 'radio'; 1566 radioInput.name = swalClasses.radio; 1567 radioInput.value = radioValue; 1568 if (params.inputValue.toString() === radioValue) { 1569 radioInput.checked = true; 1570 } 1571 radioLabelSpan.innerHTML = inputOptions[radioValue]; 1572 radioLabel.appendChild(radioInput); 1573 radioLabel.appendChild(radioLabelSpan); 1574 radioLabel.for = radioInput.id; 1575 radio.appendChild(radioLabel); 1576 } 1577 show(radio); 1578 var radios = radio.querySelectorAll('input'); 1579 if (radios.length) { 1580 radios[0].focus(); 1581 } 1582 }; 1583 break; 1584 case 'checkbox': 1585 var checkbox = getChildByClass(popup, swalClasses.checkbox); 1586 var checkboxInput = getInput('checkbox'); 1587 checkboxInput.type = 'checkbox'; 1588 checkboxInput.value = 1; 1589 checkboxInput.id = swalClasses.checkbox; 1590 checkboxInput.checked = Boolean(params.inputValue); 1591 var label = checkbox.getElementsByTagName('span'); 1592 if (label.length) { 1593 checkbox.removeChild(label[0]); 1594 } 1595 label = document.createElement('span'); 1596 label.innerHTML = params.inputPlaceholder; 1597 checkbox.appendChild(label); 1598 show(checkbox); 1599 break; 1600 case 'textarea': 1601 var textarea = getChildByClass(popup, swalClasses.textarea); 1602 textarea.value = params.inputValue; 1603 textarea.placeholder = params.inputPlaceholder; 1604 show(textarea); 1605 break; 1606 case null: 1607 break; 1608 default: 1609 error('Unexpected type of input! Expected "text", "email", "password", "number", "tel", "select", "radio", "checkbox", "textarea", "file" or "url", got "' + params.input + '"'); 1610 break; 1611 } 1612 1613 if (params.input === 'select' || params.input === 'radio') { 1614 if (params.inputOptions instanceof Promise) { 1615 sweetAlert.showLoading(); 1616 params.inputOptions.then(function (inputOptions) { 1617 sweetAlert.hideLoading(); 1618 populateInputOptions(inputOptions); 1619 }); 1620 } else if (_typeof(params.inputOptions) === 'object') { 1621 populateInputOptions(params.inputOptions); 1622 } else { 1623 error('Unexpected type of inputOptions! Expected object or Promise, got ' + _typeof(params.inputOptions)); 1624 } 1625 } 1626 1627 openPopup(params.animation, params.onBeforeOpen, params.onOpen); 1628 1629 if (!params.toast) { 1630 if (!params.allowEnterKey) { 1631 if (document.activeElement) { 1632 document.activeElement.blur(); 1633 } 1634 } else if (params.focusCancel && isVisible(cancelButton)) { 1635 cancelButton.focus(); 1636 } else if (params.focusConfirm && isVisible(confirmButton)) { 1637 confirmButton.focus(); 1638 } else { 1639 setFocus(-1, 1); 1640 } 1641 } 1642 1643 // fix scroll 1644 getContainer().scrollTop = 0; 1645 }); 1646}; 1647 1648/* 1649 * Global function to determine if swal2 popup is shown 1650 */ 1651sweetAlert.isVisible = function () { 1652 return !!getPopup(); 1653}; 1654 1655/* 1656 * Global function for chaining sweetAlert popups 1657 */ 1658sweetAlert.queue = function (steps) { 1659 queue = steps; 1660 var resetQueue = function resetQueue() { 1661 queue = []; 1662 document.body.removeAttribute('data-swal2-queue-step'); 1663 }; 1664 var queueResult = []; 1665 return new Promise(function (resolve, reject) { 1666 (function step(i, callback) { 1667 if (i < queue.length) { 1668 document.body.setAttribute('data-swal2-queue-step', i); 1669 1670 sweetAlert(queue[i]).then(function (result) { 1671 if (typeof result.value !== 'undefined') { 1672 queueResult.push(result.value); 1673 step(i + 1, callback); 1674 } else { 1675 resetQueue(); 1676 resolve({ dismiss: result.dismiss }); 1677 } 1678 }); 1679 } else { 1680 resetQueue(); 1681 resolve({ value: queueResult }); 1682 } 1683 })(0); 1684 }); 1685}; 1686 1687/* 1688 * Global function for getting the index of current popup in queue 1689 */ 1690sweetAlert.getQueueStep = function () { 1691 return document.body.getAttribute('data-swal2-queue-step'); 1692}; 1693 1694/* 1695 * Global function for inserting a popup to the queue 1696 */ 1697sweetAlert.insertQueueStep = function (step, index) { 1698 if (index && index < queue.length) { 1699 return queue.splice(index, 0, step); 1700 } 1701 return queue.push(step); 1702}; 1703 1704/* 1705 * Global function for deleting a popup from the queue 1706 */ 1707sweetAlert.deleteQueueStep = function (index) { 1708 if (typeof queue[index] !== 'undefined') { 1709 queue.splice(index, 1); 1710 } 1711}; 1712 1713/* 1714 * Global function to close sweetAlert 1715 */ 1716sweetAlert.close = sweetAlert.closePopup = sweetAlert.closeModal = sweetAlert.closeToast = function (onComplete) { 1717 var container = getContainer(); 1718 var popup = getPopup(); 1719 if (!popup) { 1720 return; 1721 } 1722 removeClass(popup, swalClasses.show); 1723 addClass(popup, swalClasses.hide); 1724 clearTimeout(popup.timeout); 1725 1726 if (!isToast()) { 1727 resetPrevState(); 1728 window.onkeydown = previousWindowKeyDown;
1729 windowOnkeydownOverridden = false; 1730 } 1731 1732 var removePopupAndResetState = function removePopupAndResetState() { 1733 if (container.parentNode) { 1734 container.parentNode.removeChild(container); 1735 } 1736 removeClass([document.documentElement, document.body], [swalClasses.shown, swalClasses['no-backdrop'], swalClasses['has-input'], swalClasses['toast-shown']]); 1737 1738 if (isModal()) { 1739 undoScrollbar(); 1740 undoIOSfix(); 1741 } 1742 }; 1743 1744 // If animation is supported, animate 1745 if (animationEndEvent && !hasClass(popup, swalClasses.noanimation)) { 1746 popup.addEventListener(animationEndEvent, function swalCloseEventFinished() { 1747 popup.removeEventListener(animationEndEvent, swalCloseEventFinished); 1748 if (hasClass(popup, swalClasses.hide)) { 1749 removePopupAndResetState(); 1750 } 1751 }); 1752 } else { 1753 // Otherwise, remove immediately 1754 removePopupAndResetState(); 1755 } 1756 if (onComplete !== null && typeof onComplete === 'function') { 1757 setTimeout(function () { 1758 onComplete(popup); 1759 }); 1760 } 1761}; 1762 1763/* 1764 * Global function to click 'Confirm' button 1765 */ 1766sweetAlert.clickConfirm = function () { 1767 return getConfirmButton().click(); 1768}; 1769 1770/* 1771 * Global function to click 'Cancel' button 1772 */ 1773sweetAlert.clickCancel = function () { 1774 return getCancelButton().click(); 1775}; 1776 1777/** 1778 * Show spinner instead of Confirm button and disable Cancel button 1779 */ 1780sweetAlert.showLoading = sweetAlert.enableLoading = function () { 1781 var popup = getPopup(); 1782 if (!popup) { 1783 sweetAlert(''); 1784 } 1785 popup = getPopup(); 1786 var buttonsWrapper = getButtonsWrapper(); 1787 var confirmButton = getConfirmButton(); 1788 var cancelButton = getCancelButton(); 1789 1790 show(buttonsWrapper); 1791 show(confirmButton, 'inline-block'); 1792 addClass([popup, buttonsWrapper], swalClasses.loading); 1793 confirmButton.disabled = true; 1794 cancelButton.disabled = true; 1795 1796 popup.setAttribute('aria-busy', true); 1797 popup.focus(); 1798}; 1799 1800/** 1801 * Is valid parameter 1802 * @param {String} paramName 1803 */ 1804sweetAlert.isValidParameter = function (paramName) { 1805 return defaultParams.hasOwnProperty(paramName) || paramName === 'extraParams'; 1806}; 1807 1808/** 1809 * Is deprecated parameter 1810 * @param {String} paramName 1811 */ 1812sweetAlert.isDeprecatedParameter = function (paramName) { 1813 return deprecatedParams.indexOf(paramName) !== -1; 1814}; 1815 1816/** 1817 * Set default params for each popup 1818 * @param {Object} userParams 1819 */ 1820sweetAlert.setDefaults = function (userParams) { 1821 if (!userParams || (typeof userParams === 'undefined' ? 'undefined' : _typeof(userParams)) !== 'object') { 1822 return error('the argument for setDefaults() is required and has to be a object'); 1823 } 1824 1825 showWarningsForParams(userParams); 1826 1827 // assign valid params from userParams to popupParams 1828 for (var param in userParams) { 1829 if (sweetAlert.isValidParameter(param)) { 1830 popupParams[param] = userParams[param]; 1831 } 1832 } 1833}; 1834 1835/** 1836 * Reset default params for each popup 1837 */ 1838sweetAlert.resetDefaults = function () { 1839 popupParams = _extends({}, defaultParams); 1840}; 1841 1842/** 1843 * Adapt a legacy inputValidator for use with expectRejections=false 1844 */ 1845sweetAlert.adaptInputValidator = function (legacyValidator) { 1846 return function adaptedInputValidator(inputValue, extraParams) { 1847 return legacyValidator.call(this, inputValue, extraParams).then(function () { 1848 return undefined; 1849 }, function (validationError) { 1850 return validationError; 1851 }); 1852 }; 1853}; 1854 1855sweetAlert.noop = function () {}; 1856 1857sweetAlert.version = '7.2.0'; 1858 1859sweetAlert.default = sweetAlert; 1860 1861/** 1862 * Set default params if `window._swalDefaults` is an object 1863 */ 1864if (typeof window !== 'undefined' && _typeof(window._swalDefaults) === 'object') { 1865 sweetAlert.setDefaults(window._swalDefaults); 1866} 1867 1868return sweetAlert; 1869 1870}))); 1871if (typeof window !== 'undefined' && window.Sweetalert2) window.sweetAlert = window.swal = window.Sweetalert2;
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.