UNPKG

sweetalert2

Version:

A beautiful, responsive, customizable and accessible (WAI-ARIA) replacement for JavaScript's popup boxes, supported fork of sweetalert

1,575 lines (1,379 loc) 60.3 kB
/*! * sweetalert2 v7.12.15 * Released under the MIT License. */ 'use strict'; var defaultParams = { title: '', titleText: '', text: '', html: '', footer: '', type: null, toast: false, customClass: '', target: 'body', backdrop: true, animation: true, allowOutsideClick: true, allowEscapeKey: true, allowEnterKey: true, showConfirmButton: true, showCancelButton: false, preConfirm: null, confirmButtonText: 'OK', confirmButtonAriaLabel: '', confirmButtonColor: null, confirmButtonClass: null, cancelButtonText: 'Cancel', cancelButtonAriaLabel: '', cancelButtonColor: null, cancelButtonClass: null, buttonsStyling: true, reverseButtons: false, focusConfirm: true, focusCancel: false, showCloseButton: false, closeButtonAriaLabel: 'Close this dialog', showLoaderOnConfirm: false, imageUrl: null, imageWidth: null, imageHeight: null, imageAlt: '', imageClass: null, timer: null, width: null, padding: null, background: null, input: null, inputPlaceholder: '', inputValue: '', inputOptions: {}, inputAutoTrim: true, inputClass: null, inputAttributes: {}, inputValidator: null, grow: false, position: 'center', progressSteps: [], currentProgressStep: null, progressStepsDistance: null, onBeforeOpen: null, onOpen: null, onClose: null, useRejections: false, expectRejections: false }; var deprecatedParams = ['useRejections', 'expectRejections']; var swalPrefix = 'swal2-'; var prefix = function prefix(items) { var result = {}; for (var i in items) { result[items[i]] = swalPrefix + items[i]; } return result; }; var swalClasses = prefix(['container', 'shown', 'iosfix', 'popup', 'modal', 'no-backdrop', 'toast', 'toast-shown', 'fade', 'show', 'hide', 'noanimation', 'close', 'title', 'header', 'content', 'actions', 'confirm', 'cancel', 'footer', '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']); var iconTypes = prefix(['success', 'warning', 'info', 'question', 'error']); var consolePrefix = 'SweetAlert2:'; /** * Filter the unique values into a new array * @param arr */ var uniqueArray = function uniqueArray(arr) { var result = []; for (var i = 0; i < arr.length; i++) { if (result.indexOf(arr[i]) === -1) { result.push(arr[i]); } } return result; }; /** * Converts `inputOptions` into an array of `[value, label]`s * @param inputOptions */ var formatInputOptions = function formatInputOptions(inputOptions) { var result = []; if (inputOptions instanceof Map) { inputOptions.forEach(function (value, key) { result.push([key, value]); }); } else { Object.keys(inputOptions).forEach(function (key) { result.push([key, inputOptions[key]]); }); } return result; }; /** * Standardise console warnings * @param message */ var warn = function warn(message) { console.warn(consolePrefix + ' ' + message); }; /** * Standardise console errors * @param message */ var error = function error(message) { console.error(consolePrefix + ' ' + message); }; /** * Private global state for `warnOnce` * @type {Array} * @private */ var previousWarnOnceMessages = []; /** * Show a console warning, but only if it hasn't already been shown * @param message */ var warnOnce = function warnOnce(message) { if (!(previousWarnOnceMessages.indexOf(message) !== -1)) { previousWarnOnceMessages.push(message); warn(message); } }; /** * If `arg` is a function, call it (with no arguments or context) and return the result. * Otherwise, just pass the value through * @param arg */ var callIfFunction = function callIfFunction(arg) { return typeof arg === 'function' ? arg() : arg; }; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); // Remember state in cases where opening and handling a modal will fiddle with it. var states = { previousActiveElement: null, previousBodyPadding: null // Detect Node env };var isNodeEnv = function isNodeEnv() { return typeof window === 'undefined' || typeof document === 'undefined'; }; /* * Add modal + backdrop to DOM */ var init = function init(params) { // Clean up the old popup if it exists var c = getContainer(); if (c) { c.parentNode.removeChild(c); removeClass([document.documentElement, document.body], [swalClasses['no-backdrop'], swalClasses['has-input'], swalClasses['toast-shown']]); } if (isNodeEnv()) { error('SweetAlert2 requires document to initialize'); return; } var container = document.createElement('div'); container.className = swalClasses.container; container.innerHTML = sweetHTML; var targetElement = typeof params.target === 'string' ? document.querySelector(params.target) : params.target; targetElement.appendChild(container); var popup = getPopup(); var content = getContent(); var input = getChildByClass(content, swalClasses.input); var file = getChildByClass(content, swalClasses.file); var range = content.querySelector('.' + swalClasses.range + ' input'); var rangeOutput = content.querySelector('.' + swalClasses.range + ' output'); var select = getChildByClass(content, swalClasses.select); var checkbox = content.querySelector('.' + swalClasses.checkbox + ' input'); var textarea = getChildByClass(content, swalClasses.textarea); // a11y popup.setAttribute('role', params.toast ? 'alert' : 'dialog'); popup.setAttribute('aria-live', params.toast ? 'polite' : 'assertive'); if (!params.toast) { popup.setAttribute('aria-modal', 'true'); } var resetValidationError = function resetValidationError() { sweetAlert.isVisible() && sweetAlert.resetValidationError(); }; input.oninput = resetValidationError; file.onchange = resetValidationError; select.onchange = resetValidationError; checkbox.onchange = resetValidationError; textarea.oninput = resetValidationError; range.oninput = function () { resetValidationError(); rangeOutput.value = range.value; }; range.onchange = function () { resetValidationError(); range.nextSibling.value = range.value; }; return popup; }; /* * Manipulate DOM */ var sweetHTML = ('\n <div aria-labelledby="' + swalClasses.title + '" aria-describedby="' + swalClasses.content + '" class="' + swalClasses.popup + '" tabindex="-1">\n <div class="' + swalClasses.header + '">\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 <h2 class="' + swalClasses.title + '" id="' + swalClasses.title + '"></h2>\n <button type="button" class="' + swalClasses.close + '">\xD7</button>\n </div>\n <div class="' + swalClasses.content + '">\n <div id="' + swalClasses.content + '"></div>\n <input class="' + swalClasses.input + '" />\n <input type="file" class="' + swalClasses.file + '" />\n <div class="' + swalClasses.range + '">\n <input type="range" />\n <output></output>\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>\n <div class="' + swalClasses.actions + '">\n <button type="button" class="' + swalClasses.confirm + '">OK</button>\n <button type="button" class="' + swalClasses.cancel + '">Cancel</button>\n </div>\n <div class="' + swalClasses.footer + '">\n </div>\n </div>\n').replace(/(^|\n)\s*/g, ''); var getContainer = function getContainer() { return document.body.querySelector('.' + swalClasses.container); }; var getPopup = function getPopup() { return getContainer() ? getContainer().querySelector('.' + swalClasses.popup) : null; }; var getIcons = function getIcons() { var popup = getPopup(); return popup.querySelectorAll('.' + swalClasses.icon); }; var elementByClass = function elementByClass(className) { return getContainer() ? getContainer().querySelector('.' + className) : null; }; var getTitle = function getTitle() { return elementByClass(swalClasses.title); }; var getContent = function getContent() { return elementByClass(swalClasses.content); }; var getImage = function getImage() { return elementByClass(swalClasses.image); }; var getProgressSteps = function getProgressSteps() { return elementByClass(swalClasses.progresssteps); }; var getValidationError = function getValidationError() { return elementByClass(swalClasses.validationerror); }; var getConfirmButton = function getConfirmButton() { return elementByClass(swalClasses.confirm); }; var getCancelButton = function getCancelButton() { return elementByClass(swalClasses.cancel); }; var getButtonsWrapper = function getButtonsWrapper() { warnOnce('swal.getButtonsWrapper() is deprecated and will be removed in the next major release, use swal.getActions() instead'); return elementByClass(swalClasses.actions); }; var getActions = function getActions() { return elementByClass(swalClasses.actions); }; var getFooter = function getFooter() { return elementByClass(swalClasses.footer); }; var getCloseButton = function getCloseButton() { return elementByClass(swalClasses.close); }; var getFocusableElements = function getFocusableElements() { var focusableElementsWithTabindex = Array.prototype.slice.call(getPopup().querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])')) // sort according to tabindex .sort(function (a, b) { a = parseInt(a.getAttribute('tabindex')); b = parseInt(b.getAttribute('tabindex')); if (a > b) { return 1; } else if (a < b) { return -1; } return 0; }); var otherFocusableElements = Array.prototype.slice.call(getPopup().querySelectorAll('button, input:not([type=hidden]), textarea, select, a, [tabindex="0"]')); return uniqueArray(focusableElementsWithTabindex.concat(otherFocusableElements)); }; var parseHtmlToContainer = function parseHtmlToContainer(param, target) { if (!param) { return hide(target); } if ((typeof param === 'undefined' ? 'undefined' : _typeof(param)) === 'object') { target.innerHTML = ''; if (0 in param) { for (var i = 0; i in param; i++) { target.appendChild(param[i].cloneNode(true)); } } else { target.appendChild(param.cloneNode(true)); } } else if (param) { target.innerHTML = param; } else {} show(target); }; var isModal = function isModal() { return !document.body.classList.contains(swalClasses['toast-shown']); }; var isToast = function isToast() { return document.body.classList.contains(swalClasses['toast-shown']); }; var isLoading = function isLoading() { return getPopup().hasAttribute('data-loading'); }; var hasClass = function hasClass(elem, className) { if (elem.classList) { return elem.classList.contains(className); } return false; }; var focusInput = function focusInput(input) { input.focus(); // place cursor at end of text in text input if (input.type !== 'file') { // http://stackoverflow.com/a/2345915/1331425 var val = input.value; input.value = ''; input.value = val; } }; var addOrRemoveClass = function addOrRemoveClass(target, classList, add) { if (!target || !classList) { return; } if (typeof classList === 'string') { classList = classList.split(/\s+/).filter(Boolean); } classList.forEach(function (className) { if (target.forEach) { target.forEach(function (elem) { add ? elem.classList.add(className) : elem.classList.remove(className); }); } else { add ? target.classList.add(className) : target.classList.remove(className); } }); }; var addClass = function addClass(target, classList) { addOrRemoveClass(target, classList, true); }; var removeClass = function removeClass(target, classList) { addOrRemoveClass(target, classList, false); }; var getChildByClass = function getChildByClass(elem, className) { for (var i = 0; i < elem.childNodes.length; i++) { if (hasClass(elem.childNodes[i], className)) { return elem.childNodes[i]; } } }; var show = function show(elem) { elem.style.opacity = ''; elem.style.display = elem.id === swalClasses.content ? 'block' : 'flex'; }; var hide = function hide(elem) { elem.style.opacity = ''; elem.style.display = 'none'; }; var empty = function empty(elem) { while (elem.firstChild) { elem.removeChild(elem.firstChild); } }; // borrowed from jquery $(elem).is(':visible') implementation var isVisible = function isVisible(elem) { return elem && (elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length); }; var removeStyleProperty = function removeStyleProperty(elem, property) { if (elem.style.removeProperty) { elem.style.removeProperty(property); } else { elem.style.removeAttribute(property); } }; var animationEndEvent = function () { // Prevent run in Node env if (isNodeEnv()) { return false; } var testEl = document.createElement('div'); var transEndEventNames = { 'WebkitAnimation': 'webkitAnimationEnd', 'OAnimation': 'oAnimationEnd oanimationend', 'animation': 'animationend' }; for (var i in transEndEventNames) { if (transEndEventNames.hasOwnProperty(i) && typeof testEl.style[i] !== 'undefined') { return transEndEventNames[i]; } } return false; }(); // Reset previous window keydown handler and focued element var resetPrevState = function resetPrevState() { if (states.previousActiveElement && states.previousActiveElement.focus) { var x = window.scrollX; var y = window.scrollY; states.previousActiveElement.focus(); if (typeof x !== 'undefined' && typeof y !== 'undefined') { // IE doesn't have scrollX/scrollY support window.scrollTo(x, y); } } }; // Measure width of scrollbar // https://github.com/twbs/bootstrap/blob/master/js/modal.js#L279-L286 var measureScrollbar = function measureScrollbar() { var supportsTouch = 'ontouchstart' in window || navigator.msMaxTouchPoints; if (supportsTouch) { return 0; } var scrollDiv = document.createElement('div'); scrollDiv.style.width = '50px'; scrollDiv.style.height = '50px'; scrollDiv.style.overflow = 'scroll'; document.body.appendChild(scrollDiv); var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth; document.body.removeChild(scrollDiv); return scrollbarWidth; }; var popupParams = _extends({}, defaultParams); var queue = []; var previousWindowKeyDown = void 0, windowOnkeydownOverridden = void 0; /** * Show relevant warnings for given params * * @param params */ var showWarningsForParams = function showWarningsForParams(params) { for (var param in params) { if (!sweetAlert.isValidParameter(param)) { warn('Unknown parameter "' + param + '"'); } if (sweetAlert.isDeprecatedParameter(param)) { warnOnce('The parameter "' + param + '" is deprecated and will be removed in the next major release.'); } } }; /** * Set type, text and actions on popup * * @param params * @returns {boolean} */ var setParameters = function setParameters(params) { // Determine if the custom target element is valid if (!params.target || typeof params.target === 'string' && !document.querySelector(params.target) || typeof params.target !== 'string' && !params.target.appendChild) { warn('Target parameter is not valid, defaulting to "body"'); params.target = 'body'; } var popup = void 0; var oldPopup = getPopup(); var targetElement = typeof params.target === 'string' ? document.querySelector(params.target) : params.target; // If the model target has changed, refresh the popup if (oldPopup && targetElement && oldPopup.parentNode !== targetElement.parentNode) { popup = init(params); } else { popup = oldPopup || init(params); } // Set popup width if (params.width) { popup.style.width = typeof params.width === 'number' ? params.width + 'px' : params.width; } // Set popup padding if (params.padding) { popup.style.padding = typeof params.padding === 'number' ? params.padding + 'px' : params.padding; } // Set popup background if (params.background) { popup.style.background = params.background; } var popupBackgroundColor = window.getComputedStyle(popup).getPropertyValue('background-color'); var successIconParts = popup.querySelectorAll('[class^=swal2-success-circular-line], .swal2-success-fix'); for (var i = 0; i < successIconParts.length; i++) { successIconParts[i].style.backgroundColor = popupBackgroundColor; } var container = getContainer(); var title = getTitle(); var content = getContent().querySelector('#' + swalClasses.content); var actions = getActions(); var confirmButton = getConfirmButton(); var cancelButton = getCancelButton(); var closeButton = getCloseButton(); var footer = getFooter(); // Title if (params.titleText) { title.innerText = params.titleText; } else if (params.title) { title.innerHTML = params.title.split('\n').join('<br />'); } if (typeof params.backdrop === 'string') { getContainer().style.background = params.backdrop; } else if (!params.backdrop) { addClass([document.documentElement, document.body], swalClasses['no-backdrop']); } // Content as HTML if (params.html) { parseHtmlToContainer(params.html, content); // Content as plain text } else if (params.text) { content.textContent = params.text; show(content); } else { hide(content); } // Position if (params.position in swalClasses) { addClass(container, swalClasses[params.position]); } else { warn('The "position" parameter is not valid, defaulting to "center"'); addClass(container, swalClasses.center); } // Grow if (params.grow && typeof params.grow === 'string') { var growClass = 'grow-' + params.grow; if (growClass in swalClasses) { addClass(container, swalClasses[growClass]); } } // Animation if (typeof params.animation === 'function') { params.animation = params.animation.call(); } // Close button if (params.showCloseButton) { closeButton.setAttribute('aria-label', params.closeButtonAriaLabel); show(closeButton); } else { hide(closeButton); } // Default Class popup.className = swalClasses.popup; if (params.toast) { addClass([document.documentElement, document.body], swalClasses['toast-shown']); addClass(popup, swalClasses.toast); } else { addClass(popup, swalClasses.modal); } // Custom Class if (params.customClass) { addClass(popup, params.customClass); } // Progress steps var progressStepsContainer = getProgressSteps(); var currentProgressStep = parseInt(params.currentProgressStep === null ? sweetAlert.getQueueStep() : params.currentProgressStep, 10); if (params.progressSteps && params.progressSteps.length) { show(progressStepsContainer); empty(progressStepsContainer); if (currentProgressStep >= params.progressSteps.length) { warn('Invalid currentProgressStep parameter, it should be less than progressSteps.length ' + '(currentProgressStep like JS arrays starts from 0)'); } params.progressSteps.forEach(function (step, index) { var circle = document.createElement('li'); addClass(circle, swalClasses.progresscircle); circle.innerHTML = step; if (index === currentProgressStep) { addClass(circle, swalClasses.activeprogressstep); } progressStepsContainer.appendChild(circle); if (index !== params.progressSteps.length - 1) { var line = document.createElement('li'); addClass(line, swalClasses.progressline); if (params.progressStepsDistance) { line.style.width = params.progressStepsDistance; } progressStepsContainer.appendChild(line); } }); } else { hide(progressStepsContainer); } // Icon var icons = getIcons(); for (var _i = 0; _i < icons.length; _i++) { hide(icons[_i]); } if (params.type) { var validType = false; for (var iconType in iconTypes) { if (params.type === iconType) { validType = true; break; } } if (!validType) { error('Unknown alert type: ' + params.type); return false; } var icon = popup.querySelector('.' + swalClasses.icon + '.' + iconTypes[params.type]); show(icon); // Animate icon if (params.animation) { addClass(icon, 'swal2-animate-' + params.type + '-icon'); } } // Custom image var image = getImage(); if (params.imageUrl) { image.setAttribute('src', params.imageUrl); image.setAttribute('alt', params.imageAlt); show(image); if (params.imageWidth) { image.setAttribute('width', params.imageWidth); } else { image.removeAttribute('width'); } if (params.imageHeight) { image.setAttribute('height', params.imageHeight); } else { image.removeAttribute('height'); } image.className = swalClasses.image; if (params.imageClass) { addClass(image, params.imageClass); } } else { hide(image); } // Cancel button if (params.showCancelButton) { cancelButton.style.display = 'inline-block'; } else { hide(cancelButton); } // Confirm button if (params.showConfirmButton) { removeStyleProperty(confirmButton, 'display'); } else { hide(confirmButton); } // Actions (buttons) wrapper if (!params.showConfirmButton && !params.showCancelButton) { hide(actions); } else { show(actions); } // Edit text on confirm and cancel buttons confirmButton.innerHTML = params.confirmButtonText; cancelButton.innerHTML = params.cancelButtonText; // ARIA labels for confirm and cancel buttons confirmButton.setAttribute('aria-label', params.confirmButtonAriaLabel); cancelButton.setAttribute('aria-label', params.cancelButtonAriaLabel); // Add buttons custom classes confirmButton.className = swalClasses.confirm; addClass(confirmButton, params.confirmButtonClass); cancelButton.className = swalClasses.cancel; addClass(cancelButton, params.cancelButtonClass); // Buttons styling if (params.buttonsStyling) { addClass([confirmButton, cancelButton], swalClasses.styled); // Buttons background colors if (params.confirmButtonColor) { confirmButton.style.backgroundColor = params.confirmButtonColor; } if (params.cancelButtonColor) { cancelButton.style.backgroundColor = params.cancelButtonColor; } // Loading state var confirmButtonBackgroundColor = window.getComputedStyle(confirmButton).getPropertyValue('background-color'); confirmButton.style.borderLeftColor = confirmButtonBackgroundColor; confirmButton.style.borderRightColor = confirmButtonBackgroundColor; } else { removeClass([confirmButton, cancelButton], swalClasses.styled); confirmButton.style.backgroundColor = confirmButton.style.borderLeftColor = confirmButton.style.borderRightColor = ''; cancelButton.style.backgroundColor = cancelButton.style.borderLeftColor = cancelButton.style.borderRightColor = ''; } // Footer parseHtmlToContainer(params.footer, footer); // CSS animation if (params.animation === true) { removeClass(popup, swalClasses.noanimation); } else { addClass(popup, swalClasses.noanimation); } // showLoaderOnConfirm && preConfirm if (params.showLoaderOnConfirm && !params.preConfirm) { warn('showLoaderOnConfirm is set to true, but preConfirm is not defined.\n' + 'showLoaderOnConfirm should be used together with preConfirm, see usage example:\n' + 'https://sweetalert2.github.io/#ajax-request'); } }; /** * Animations * * @param animation * @param onBeforeOpen * @param onComplete */ var openPopup = function openPopup(animation, onBeforeOpen, onComplete) { var container = getContainer(); var popup = getPopup(); if (onBeforeOpen !== null && typeof onBeforeOpen === 'function') { onBeforeOpen(popup); } if (animation) { addClass(popup, swalClasses.show); addClass(container, swalClasses.fade); removeClass(popup, swalClasses.hide); } else { removeClass(popup, swalClasses.fade); } show(popup); // scrolling is 'hidden' until animation is done, after that 'auto' container.style.overflowY = 'hidden'; if (animationEndEvent && !hasClass(popup, swalClasses.noanimation)) { popup.addEventListener(animationEndEvent, function swalCloseEventFinished() { popup.removeEventListener(animationEndEvent, swalCloseEventFinished); container.style.overflowY = 'auto'; }); } else { container.style.overflowY = 'auto'; } addClass([document.documentElement, document.body, container], swalClasses.shown); if (isModal()) { fixScrollbar(); iOSfix(); } states.previousActiveElement = document.activeElement; if (onComplete !== null && typeof onComplete === 'function') { setTimeout(function () { onComplete(popup); }); } }; var fixScrollbar = function fixScrollbar() { // for queues, do not do this more than once if (states.previousBodyPadding !== null) { return; } // if the body has overflow if (document.body.scrollHeight > window.innerHeight) { // add padding so the content doesn't shift after removal of scrollbar states.previousBodyPadding = document.body.style.paddingRight; document.body.style.paddingRight = measureScrollbar() + 'px'; } }; var undoScrollbar = function undoScrollbar() { if (states.previousBodyPadding !== null) { document.body.style.paddingRight = states.previousBodyPadding; states.previousBodyPadding = null; } }; // Fix iOS scrolling http://stackoverflow.com/q/39626302/1331425 var iOSfix = function iOSfix() { var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; if (iOS && !hasClass(document.body, swalClasses.iosfix)) { var offset = document.body.scrollTop; document.body.style.top = offset * -1 + 'px'; addClass(document.body, swalClasses.iosfix); } }; var undoIOSfix = function undoIOSfix() { if (hasClass(document.body, swalClasses.iosfix)) { var offset = parseInt(document.body.style.top, 10); removeClass(document.body, swalClasses.iosfix); document.body.style.top = ''; document.body.scrollTop = offset * -1; } }; // SweetAlert entry point var sweetAlert = function sweetAlert() { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } // Prevent run in Node env if (typeof window === 'undefined') { return; } // Check for the existence of Promise if (typeof Promise === 'undefined') { error('This package requires a Promise library, please include a shim to enable it in this browser (See: https://github.com/sweetalert2/sweetalert2/wiki/Migration-from-SweetAlert-to-SweetAlert2#1-ie-support)'); } if (typeof args[0] === 'undefined') { error('SweetAlert2 expects at least 1 attribute!'); return false; } var params = _extends({}, popupParams); switch (_typeof(args[0])) { case 'string': params.title = args[0]; params.html = args[1]; params.type = args[2]; break; case 'object': showWarningsForParams(args[0]); _extends(params, args[0]); params.extraParams = args[0].extraParams; if (params.input === 'email' && params.inputValidator === null) { var inputValidator = function inputValidator(email) { return new Promise(function (resolve, reject) { var emailRegex = /^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]{2,24}$/; if (emailRegex.test(email)) { resolve(); } else { reject('Invalid email address'); } }); }; params.inputValidator = params.expectRejections ? inputValidator : sweetAlert.adaptInputValidator(inputValidator); } if (params.input === 'url' && params.inputValidator === null) { var _inputValidator = function _inputValidator(url) { return new Promise(function (resolve, reject) { // taken from https://stackoverflow.com/a/3809435/1331425 var urlRegex = /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_+.~#?&//=]*)$/; if (urlRegex.test(url)) { resolve(); } else { reject('Invalid URL'); } }); }; params.inputValidator = params.expectRejections ? _inputValidator : sweetAlert.adaptInputValidator(_inputValidator); } break; default: error('Unexpected type of argument! Expected "string" or "object", got ' + _typeof(args[0])); return false; } setParameters(params); var container = getContainer(); var popup = getPopup(); return new Promise(function (resolve, reject) { // functions to handle all resolving/rejecting/settling var succeedWith = function succeedWith(value) { sweetAlert.closePopup(params.onClose); if (params.useRejections) { resolve(value); } else { resolve({ value: value }); } }; var dismissWith = function dismissWith(dismiss) { sweetAlert.closePopup(params.onClose); if (params.useRejections) { reject(dismiss); } else { resolve({ dismiss: dismiss }); } }; var errorWith = function errorWith(error$$1) { sweetAlert.closePopup(params.onClose); reject(error$$1); }; // Close on timer if (params.timer) { popup.timeout = setTimeout(function () { return dismissWith('timer'); }, params.timer); } // Get input element by specified type or, if type isn't specified, by params.input var getInput = function getInput(inputType) { inputType = inputType || params.input; if (!inputType) { return null; } switch (inputType) { case 'select': case 'textarea': case 'file': return getChildByClass(content, swalClasses[inputType]); case 'checkbox': return popup.querySelector('.' + swalClasses.checkbox + ' input'); case 'radio': return popup.querySelector('.' + swalClasses.radio + ' input:checked') || popup.querySelector('.' + swalClasses.radio + ' input:first-child'); case 'range': return popup.querySelector('.' + swalClasses.range + ' input'); default: return getChildByClass(content, swalClasses.input); } }; // Get the value of the popup input var getInputValue = function getInputValue() { var input = getInput(); if (!input) { return null; } switch (params.input) { case 'checkbox': return input.checked ? 1 : 0; case 'radio': return input.checked ? input.value : null; case 'file': return input.files.length ? input.files[0] : null; default: return params.inputAutoTrim ? input.value.trim() : input.value; } }; // input autofocus if (params.input) { setTimeout(function () { var input = getInput(); if (input) { focusInput(input); } }, 0); } var confirm = function confirm(value) { if (params.showLoaderOnConfirm) { sweetAlert.showLoading(); } if (params.preConfirm) { sweetAlert.resetValidationError(); var preConfirmPromise = Promise.resolve().then(function () { return params.preConfirm(value, params.extraParams); }); if (params.expectRejections) { preConfirmPromise.then(function (preConfirmValue) { return succeedWith(preConfirmValue || value); }, function (validationError) { sweetAlert.hideLoading(); if (validationError) { sweetAlert.showValidationError(validationError); } }); } else { preConfirmPromise.then(function (preConfirmValue) { if (isVisible(getValidationError()) || preConfirmValue === false) { sweetAlert.hideLoading(); } else { succeedWith(preConfirmValue || value); } }, function (error$$1) { return errorWith(error$$1); }); } } else { succeedWith(value); } }; // Mouse interactions var onButtonEvent = function onButtonEvent(event) { var e = event || window.event; var target = e.target || e.srcElement; var confirmButton = getConfirmButton(); var cancelButton = getCancelButton(); var targetedConfirm = confirmButton && (confirmButton === target || confirmButton.contains(target)); var targetedCancel = cancelButton && (cancelButton === target || cancelButton.contains(target)); switch (e.type) { case 'click': // Clicked 'confirm' if (targetedConfirm && sweetAlert.isVisible()) { sweetAlert.disableButtons(); if (params.input) { var inputValue = getInputValue(); if (params.inputValidator) { sweetAlert.disableInput(); var validationPromise = Promise.resolve().then(function () { return params.inputValidator(inputValue, params.extraParams); }); if (params.expectRejections) { validationPromise.then(function () { sweetAlert.enableButtons(); sweetAlert.enableInput(); confirm(inputValue); }, function (validationError) { sweetAlert.enableButtons(); sweetAlert.enableInput(); if (validationError) { sweetAlert.showValidationError(validationError); } }); } else { validationPromise.then(function (validationError) { sweetAlert.enableButtons(); sweetAlert.enableInput(); if (validationError) { sweetAlert.showValidationError(validationError); } else { confirm(inputValue); } }, function (error$$1) { return errorWith(error$$1); }); } } else { confirm(inputValue); } } else { confirm(true); } // Clicked 'cancel' } else if (targetedCancel && sweetAlert.isVisible()) { sweetAlert.disableButtons(); dismissWith(sweetAlert.DismissReason.cancel); } break; default: } }; var buttons = popup.querySelectorAll('button'); for (var i = 0; i < buttons.length; i++) { buttons[i].onclick = onButtonEvent; buttons[i].onmouseover = onButtonEvent; buttons[i].onmouseout = onButtonEvent; buttons[i].onmousedown = onButtonEvent; } // Closing popup by close button getCloseButton().onclick = function () { dismissWith(sweetAlert.DismissReason.close); }; if (params.toast) { // Closing popup by backdrop click popup.onclick = function (e) { if (e.target !== popup || params.showConfirmButton || params.showCancelButton) { return; } if (params.allowOutsideClick) { sweetAlert.closePopup(params.onClose); dismissWith(sweetAlert.DismissReason.backdrop); } }; } else { var ignoreOutsideClick = false; // Ignore click events that had mousedown on the popup but mouseup on the container // This can happen when the user drags a slider popup.onmousedown = function () { container.onmouseup = function (e) { container.onmouseup = undefined; // We only check if the mouseup target is the container because usually it doesn't // have any other direct children aside of the popup if (e.target === container) { ignoreOutsideClick = true; } }; }; // Ignore click events that had mousedown on the container but mouseup on the popup container.onmousedown = function () { popup.onmouseup = function (e) { popup.onmouseup = undefined; // We also need to check if the mouseup target is a child of the popup if (e.target === popup || popup.contains(e.target)) { ignoreOutsideClick = true; } }; }; container.onclick = function (e) { if (ignoreOutsideClick) { ignoreOutsideClick = false; return; } if (e.target !== container) { return; } if (callIfFunction(params.allowOutsideClick)) { dismissWith(sweetAlert.DismissReason.backdrop); } }; } var content = getContent(); var actions = getActions(); var confirmButton = getConfirmButton(); var cancelButton = getCancelButton(); // Reverse buttons (Confirm on the right side) if (params.reverseButtons) { confirmButton.parentNode.insertBefore(cancelButton, confirmButton); } else { confirmButton.parentNode.insertBefore(confirmButton, cancelButton); } // Focus handling var setFocus = function setFocus(index, increment) { var focusableElements = getFocusableElements(params.focusCancel); // search for visible elements and select the next possible match for (var _i2 = 0; _i2 < focusableElements.length; _i2++) { index = index + increment; // rollover to first item if (index === focusableElements.length) { index = 0; // go to last item } else if (index === -1) { index = focusableElements.length - 1; } // determine if element is visible var el = focusableElements[index]; if (isVisible(el)) { return el.focus(); } } }; var handleKeyDown = function handleKeyDown(event) { var e = event || window.event; var arrowKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down' // IE11 ]; if (e.key === 'Enter' && !e.isComposing) { if (e.target === getInput()) { if (['textarea', 'file'].indexOf(params.input) !== -1) { return; // do not submit } sweetAlert.clickConfirm(); e.preventDefault(); } // TAB } else if (e.key === 'Tab') { var targetElement = e.target || e.srcElement; var focusableElements = getFocusableElements(params.focusCancel); var btnIndex = -1; // Find the button - note, this is a nodelist, not an array. for (var _i3 = 0; _i3 < focusableElements.length; _i3++) { if (targetElement === focusableElements[_i3]) { btnIndex = _i3; break; } } if (!e.shiftKey) { // Cycle to the next button setFocus(btnIndex, 1); } else { // Cycle to the prev button setFocus(btnIndex, -1); } e.stopPropagation(); e.preventDefault(); // ARROWS - switch focus between buttons } else if (arrowKeys.indexOf(e.key) !== -1) { // focus Cancel button if Confirm button is currently focused if (document.activeElement === confirmButton && isVisible(cancelButton)) { cancelButton.focus(); // and vice versa } else if (document.activeElement === cancelButton && isVisible(confirmButton)) { confirmButton.focus(); } // ESC } else if ((e.key === 'Escape' || e.key === 'Esc') && callIfFunction(params.allowEscapeKey) === true) { dismissWith(sweetAlert.DismissReason.esc); } }; if (params.toast && windowOnkeydownOverridden) { window.onkeydown = previousWindowKeyDown; windowOnkeydownOverridden = false; } if (!params.toast && !windowOnkeydownOverridden) { previousWindowKeyDown = window.onkeydown; windowOnkeydownOverridden = true; window.onkeydown = handleKeyDown; } /** * Show spinner instead of Confirm button and disable Cancel button */ sweetAlert.hideLoading = sweetAlert.disableLoading = function () { if (!params.showConfirmButton) { hide(confirmButton); if (!params.showCancelButton) { hide(getActions()); } } removeClass([popup, actions], swalClasses.loading); popup.removeAttribute('aria-busy'); popup.removeAttribute('data-loading'); confirmButton.disabled = false; cancelButton.disabled = false; }; sweetAlert.getTitle = function () { return getTitle(); }; sweetAlert.getContent = function () { return getContent(); }; sweetAlert.getInput = function () { return getInput(); }; sweetAlert.getImage = function () { return getImage(); }; sweetAlert.getButtonsWrapper = function () { return getButtonsWrapper(); }; sweetAlert.getActions = function () { return getActions(); }; sweetAlert.getConfirmButton = function () { return getConfirmButton(); }; sweetAlert.getCancelButton = function () { return getCancelButton(); }; sweetAlert.getFooter = function () { return getFooter(); }; sweetAlert.isLoading = function () { return isLoading(); }; sweetAlert.enableButtons = function () { confirmButton.disabled = false; cancelButton.disabled = false; }; sweetAlert.disableButtons = function () { confirmButton.disabled = true; cancelButton.disabled = true; }; sweetAlert.enableConfirmButton = function () { confirmButton.disabled = false; }; sweetAlert.disableConfirmButton = function () { confirmButton.disabled = true; }; sweetAlert.enableInput = function () { var input = getInput(); if (!input) { return false; } if (input.type === 'radio') { var radiosContainer = input.parentNode.parentNode; var radios = radiosContainer.querySelectorAll('input'); for (var _i4 = 0; _i4 < radios.length; _i4++) { radios[_i4].disabled = false; } } else { input.disabled = false; } }; sweetAlert.disableInput = function () { var input = getInput(); if (!input) { return false; } if (input && input.type === 'radio') { var radiosContainer = input.parentNode.parentNode; var radios = radiosContainer.querySelectorAll('input'); for (var _i5 = 0; _i5 < radios.length; _i5++) { radios[_i5].disabled = true; } } else { input.disabled = true; } }; // Show block with validation error sweetAlert.showValidationError = function (error$$1) { var validationError = getValidationError(); validationError.innerHTML = error$$1; var popupComputedStyle = window.getComputedStyle(popup); validationError.style.marginLeft = '-' + popupComputedStyle.getPropertyValue('padding-left'); validationError.style.marginRight = '-' + popupComputedStyle.getPropertyValue('padding-right'); show(validationError); var input = getInput(); if (input) { input.setAttribute('aria-invalid', true); input.setAttribute('aria-describedBy', swalClasses.validationerror); focusInput(input); addClass(input, swalClasses.inputerror); } }; // Hide block with validation error sweetAlert.resetValidationError = function () { var validationError = getValidationError(); hide(validationError); var input = getInput(); if (input) { input.removeAttribute('aria-invalid'); input.removeAttribute('aria-describedBy'); removeClass(input, swalClasses.inputerror); } }; sweetAlert.getProgressSteps = function () { return params.progressSteps; }; sweetAlert.setProgressSteps = function (progressSteps) { params.progressSteps = progressSteps; setParameters(params); }; sweetAlert.showProgressSteps = function () { show(getProgressSteps()); }; sweetAlert.hideProgressSteps = function () { hide(getProgressSteps()); }; sweetAlert.enableButtons(); sweetAlert.hideLoading(); sweetAlert.resetValidationError(); if (params.input) { addClass(document.body, swalClasses['has-input']); } // inputs var inputTypes = ['input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea']; var input = void 0; for (var _i6 = 0; _i6 < inputTypes.length; _i6++) { var inputClass = swalClasses[inputTypes[_i6]]; var inputContainer = getChildByClass(content, inputClass); input = getInput(inputTypes[_i6]); // set attributes if (input) { for (var j in input.attributes) { if (input.attributes.hasOwnProperty(j)) { var attrName = input.attributes[j].name; if (attrName !== 'type' && attrName !== 'value') { input.removeAttribute(attrName); } } } for (var attr in params.inputAttributes) { input.setAttribute(attr, params.inputAttributes[attr]); } } // set class inputContainer.className = inputClass; if (params.inputClass) { addClass(inputContainer, params.inputClass); } hide(inputContainer); } var populateInputOptions = void 0; switch (params.input) { case 'text': case 'email': case 'password': case 'number': case 'tel': case 'url': input = getChildByClass(content, swalClasses.input); input.value = params.inputValue; input.placeholder = params.inputPlaceholder; input.type = params.input; show(input); break; case 'file': input = getChildByClass(content, swalClasses.file); input.placeholder = params.inputPlaceholder; input.type = params.input; show(input); break; case 'range': var range = getChildByClass(content, swalClasses.range); var rangeInput = range.querySelector('input'); var rangeOutput = range.querySelector('output'); rangeInput.value = params.inputValue; rangeInput.type = params.input; rangeOutput.value = params.inputValue; show(range); break; case 'select': var select = getChildByClass(content, swalClasses.select); select.innerHTML = ''; if (params.inputPlaceholder) { var placeholder = document.createElement('option'); placeholder.innerHTML = params.inputPlaceholder; placeholder.value = ''; placeholder.dis