sweetalert2
Version:
A beautiful, responsive, customizable and accessible (WAI-ARIA) replacement for JavaScript's popup boxes, supported fork of sweetalert
1,640 lines (1,379 loc) • 121 kB
JavaScript
/*!
* sweetalert2 v7.26.28
* Released under the MIT License.
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.Sweetalert2 = factory());
}(this, (function () { 'use strict';
function _typeof(obj) {
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
_typeof = function (obj) {
return typeof obj;
};
} else {
_typeof = function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
};
}
return _typeof(obj);
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _extends() {
_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;
};
return _extends.apply(this, arguments);
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function");
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
writable: true,
configurable: true
}
});
if (superClass) _setPrototypeOf(subClass, superClass);
}
function _getPrototypeOf(o) {
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
return o.__proto__ || Object.getPrototypeOf(o);
};
return _getPrototypeOf(o);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
function isNativeReflectConstruct() {
if (typeof Reflect === "undefined" || !Reflect.construct) return false;
if (Reflect.construct.sham) return false;
if (typeof Proxy === "function") return true;
try {
Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
return true;
} catch (e) {
return false;
}
}
function _construct(Parent, args, Class) {
if (isNativeReflectConstruct()) {
_construct = Reflect.construct;
} else {
_construct = function _construct(Parent, args, Class) {
var a = [null];
a.push.apply(a, args);
var Constructor = Function.bind.apply(Parent, a);
var instance = new Constructor();
if (Class) _setPrototypeOf(instance, Class.prototype);
return instance;
};
}
return _construct.apply(null, arguments);
}
function _assertThisInitialized(self) {
if (self === void 0) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return self;
}
function _possibleConstructorReturn(self, call) {
if (call && (typeof call === "object" || typeof call === "function")) {
return call;
}
return _assertThisInitialized(self);
}
function _superPropBase(object, property) {
while (!Object.prototype.hasOwnProperty.call(object, property)) {
object = _getPrototypeOf(object);
if (object === null) break;
}
return object;
}
function _get(target, property, receiver) {
if (typeof Reflect !== "undefined" && Reflect.get) {
_get = Reflect.get;
} else {
_get = function _get(target, property, receiver) {
var base = _superPropBase(target, property);
if (!base) return;
var desc = Object.getOwnPropertyDescriptor(base, property);
if (desc.get) {
return desc.get.call(receiver);
}
return desc.value;
};
}
return _get(target, property, receiver || target);
}
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;
};
/**
* Convert NodeList to Array
* @param nodeList
*/
var toArray = function toArray(nodeList) {
return Array.prototype.slice.call(nodeList);
};
/**
* Converts `inputOptions` into an array of `[value, label]`s
* @param inputOptions
*/
var formatInputOptions = function formatInputOptions(inputOptions) {
var result = [];
if (typeof Map !== 'undefined' && 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("".concat(consolePrefix, " ").concat(message));
};
/**
* Standardise console errors
* @param message
*/
var error = function error(message) {
console.error("".concat(consolePrefix, " ").concat(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 isThenable = function isThenable(arg) {
return _typeof(arg) === 'object' && typeof arg.then === 'function';
};
var DismissReason = Object.freeze({
cancel: 'cancel',
backdrop: 'overlay',
close: 'close',
esc: 'esc',
timer: 'timer'
});
var version = "7.26.28";
var argsToParams = function argsToParams(args) {
var params = {};
switch (_typeof(args[0])) {
case 'object':
_extends(params, args[0]);
break;
default:
['title', 'html', 'type'].forEach(function (name, index) {
switch (_typeof(args[index])) {
case 'string':
params[name] = args[index];
break;
case 'undefined':
break;
default:
error("Unexpected type of ".concat(name, "! Expected \"string\", got ").concat(_typeof(args[index])));
}
});
}
return params;
};
/**
* Adapt a legacy inputValidator for use with expectRejections=false
*/
var adaptInputValidator = function adaptInputValidator(legacyValidator) {
return function adaptedInputValidator(inputValue, extraParams) {
return legacyValidator.call(this, inputValue, extraParams).then(function () {
return undefined;
}, function (validationError) {
return validationError;
});
};
};
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', 'height-auto', 'iosfix', 'popup', 'modal', 'no-backdrop', 'toast', 'toast-shown', 'toast-column', 'fade', 'show', 'hide', 'noanimation', 'close', 'title', 'header', 'content', 'actions', 'confirm', 'cancel', 'footer', 'icon', 'icon-text', 'image', 'input', 'file', 'range', 'select', 'radio', 'checkbox', 'label', '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 states = {
previousBodyPadding: null
};
var hasClass = function hasClass(elem, className) {
return elem.classList.contains(className);
};
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';
}; // 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 getContainer = function getContainer() {
return document.body.querySelector('.' + swalClasses.container);
};
var elementByClass = function elementByClass(className) {
var container = getContainer();
return container ? container.querySelector('.' + className) : null;
};
var getPopup = function getPopup() {
return elementByClass(swalClasses.popup);
};
var getIcons = function getIcons() {
var popup = getPopup();
return toArray(popup.querySelectorAll('.' + swalClasses.icon));
};
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);
};
/* @deprecated */
/* istanbul ignore next */
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 = toArray(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;
}); // https://github.com/jkup/focusable/blob/master/index.js
var otherFocusableElements = toArray(getPopup().querySelectorAll('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex="0"], [contenteditable], audio[controls], video[controls]')).filter(function (el) {
return el.getAttribute('tabindex') !== '-1';
});
return uniqueArray(focusableElementsWithTabindex.concat(otherFocusableElements)).filter(function (el) {
return isVisible(el);
});
};
var isModal = function isModal() {
return !isToast() && !document.body.classList.contains(swalClasses['no-backdrop']);
};
var isToast = function isToast() {
return document.body.classList.contains(swalClasses['toast-shown']);
};
var isLoading = function isLoading() {
return getPopup().hasAttribute('data-loading');
};
// Detect Node env
var isNodeEnv = function isNodeEnv() {
return typeof window === 'undefined' || typeof document === 'undefined';
};
var sweetHTML = "\n <div aria-labelledby=\"".concat(swalClasses.title, "\" aria-describedby=\"").concat(swalClasses.content, "\" class=\"").concat(swalClasses.popup, "\" tabindex=\"-1\">\n <div class=\"").concat(swalClasses.header, "\">\n <ul class=\"").concat(swalClasses.progresssteps, "\"></ul>\n <div class=\"").concat(swalClasses.icon, " ").concat(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=\"").concat(swalClasses.icon, " ").concat(iconTypes.question, "\">\n <span class=\"").concat(swalClasses['icon-text'], "\">?</span>\n </div>\n <div class=\"").concat(swalClasses.icon, " ").concat(iconTypes.warning, "\">\n <span class=\"").concat(swalClasses['icon-text'], "\">!</span>\n </div>\n <div class=\"").concat(swalClasses.icon, " ").concat(iconTypes.info, "\">\n <span class=\"").concat(swalClasses['icon-text'], "\">i</span>\n </div>\n <div class=\"").concat(swalClasses.icon, " ").concat(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=\"").concat(swalClasses.image, "\" />\n <h2 class=\"").concat(swalClasses.title, "\" id=\"").concat(swalClasses.title, "\"></h2>\n <button type=\"button\" class=\"").concat(swalClasses.close, "\">\xD7</button>\n </div>\n <div class=\"").concat(swalClasses.content, "\">\n <div id=\"").concat(swalClasses.content, "\"></div>\n <input class=\"").concat(swalClasses.input, "\" />\n <input type=\"file\" class=\"").concat(swalClasses.file, "\" />\n <div class=\"").concat(swalClasses.range, "\">\n <input type=\"range\" />\n <output></output>\n </div>\n <select class=\"").concat(swalClasses.select, "\"></select>\n <div class=\"").concat(swalClasses.radio, "\"></div>\n <label for=\"").concat(swalClasses.checkbox, "\" class=\"").concat(swalClasses.checkbox, "\">\n <input type=\"checkbox\" />\n <span class=\"").concat(swalClasses.label, "\"></span>\n </label>\n <textarea class=\"").concat(swalClasses.textarea, "\"></textarea>\n <div class=\"").concat(swalClasses.validationerror, "\" id=\"").concat(swalClasses.validationerror, "\"></div>\n </div>\n <div class=\"").concat(swalClasses.actions, "\">\n <button type=\"button\" class=\"").concat(swalClasses.confirm, "\">OK</button>\n <button type=\"button\" class=\"").concat(swalClasses.cancel, "\">Cancel</button>\n </div>\n <div class=\"").concat(swalClasses.footer, "\">\n </div>\n </div>\n").replace(/(^|\n)\s*/g, '');
/*
* 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['toast-shown'], swalClasses['has-column']]);
}
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(".".concat(swalClasses.range, " input"));
var rangeOutput = content.querySelector(".".concat(swalClasses.range, " output"));
var select = getChildByClass(content, swalClasses.select);
var checkbox = content.querySelector(".".concat(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 oldInputVal; // IE11 workaround, see #1109 for details
var resetValidationError = function resetValidationError(e) {
if (Swal.isVisible() && oldInputVal !== e.target.value) {
Swal.resetValidationError();
}
oldInputVal = e.target.value;
};
input.oninput = resetValidationError;
file.onchange = resetValidationError;
select.onchange = resetValidationError;
checkbox.onchange = resetValidationError;
textarea.oninput = resetValidationError;
range.oninput = function (e) {
resetValidationError(e);
rangeOutput.value = range.value;
};
range.onchange = function (e) {
resetValidationError(e);
range.nextSibling.value = range.value;
};
return popup;
};
var parseHtmlToContainer = function parseHtmlToContainer(param, target) {
if (!param) {
return hide(target);
}
if (_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;
}
show(target);
};
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;
}();
// 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 renderActions = function renderActions(params) {
var actions = getActions();
var confirmButton = getConfirmButton();
var cancelButton = getCancelButton(); // Actions (buttons) wrapper
if (!params.showConfirmButton && !params.showCancelButton) {
hide(actions);
} else {
show(actions);
} // Cancel button
if (params.showCancelButton) {
cancelButton.style.display = 'inline-block';
} else {
hide(cancelButton);
} // Confirm button
if (params.showConfirmButton) {
removeStyleProperty(confirmButton, 'display');
} else {
hide(confirmButton);
} // 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 = '';
}
};
var renderContent = function renderContent(params) {
var content = getContent().querySelector('#' + swalClasses.content); // 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);
}
};
var renderIcon = function renderIcon(params) {
var icons = getIcons();
for (var i = 0; i < icons.length; i++) {
hide(icons[i]);
}
if (params.type) {
if (Object.keys(iconTypes).indexOf(params.type) !== -1) {
var icon = Swal.getPopup().querySelector(".".concat(swalClasses.icon, ".").concat(iconTypes[params.type]));
show(icon); // Animate icon
if (params.animation) {
addClass(icon, "swal2-animate-".concat(params.type, "-icon"));
}
} else {
error("Unknown type! Expected \"success\", \"error\", \"warning\", \"info\" or \"question\", got \"".concat(params.type, "\""));
}
}
};
var renderImage = function renderImage(params) {
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);
}
};
var renderProgressSteps = function renderProgressSteps(params) {
var progressStepsContainer = getProgressSteps();
var currentProgressStep = parseInt(params.currentProgressStep === null ? Swal.getQueueStep() : params.currentProgressStep, 10);
if (params.progressSteps && params.progressSteps.length) {
show(progressStepsContainer);
progressStepsContainer.innerHTML = '';
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);
}
};
var renderTitle = function renderTitle(params) {
var title = getTitle();
if (params.titleText) {
title.innerText = params.titleText;
} else if (params.title) {
if (typeof params.title === 'string') {
params.title = params.title.split('\n').join('<br />');
}
parseHtmlToContainer(params.title, title);
}
};
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 = parseInt(window.getComputedStyle(document.body).getPropertyValue('padding-right'));
document.body.style.paddingRight = states.previousBodyPadding + measureScrollbar() + 'px';
}
};
var undoScrollbar = function undoScrollbar() {
if (states.previousBodyPadding !== null) {
document.body.style.paddingRight = states.previousBodyPadding;
states.previousBodyPadding = null;
}
};
/* istanbul ignore next */
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);
}
};
/* istanbul ignore next */
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;
}
};
// Adding aria-hidden="true" to elements outside of the active modal dialog ensures that
// elements not within the active modal dialog will not be surfaced if a user opens a screen
// reader’s list of elements (headings, form controls, landmarks, etc.) in the document.
var setAriaHidden = function setAriaHidden() {
var bodyChildren = toArray(document.body.children);
bodyChildren.forEach(function (el) {
if (el === getContainer() || el.contains(getContainer())) {
return;
}
if (el.hasAttribute('aria-hidden')) {
el.setAttribute('data-previous-aria-hidden', el.getAttribute('aria-hidden'));
}
el.setAttribute('aria-hidden', 'true');
});
};
var unsetAriaHidden = function unsetAriaHidden() {
var bodyChildren = toArray(document.body.children);
bodyChildren.forEach(function (el) {
if (el.hasAttribute('data-previous-aria-hidden')) {
el.setAttribute('aria-hidden', el.getAttribute('data-previous-aria-hidden'));
el.removeAttribute('data-previous-aria-hidden');
} else {
el.removeAttribute('aria-hidden');
}
});
};
var RESTORE_FOCUS_TIMEOUT = 100;
var globalState = {};
var restoreActiveElement = function restoreActiveElement() {
var x = window.scrollX;
var y = window.scrollY;
globalState.restoreFocusTimeout = setTimeout(function () {
if (globalState.previousActiveElement && globalState.previousActiveElement.focus) {
globalState.previousActiveElement.focus();
globalState.previousActiveElement = null;
} else if (document.body) {
document.body.focus();
}
}, RESTORE_FOCUS_TIMEOUT); // issues/900
if (typeof x !== 'undefined' && typeof y !== 'undefined') {
// IE doesn't have scrollX/scrollY support
window.scrollTo(x, y);
}
};
/*
* Global function to close sweetAlert
*/
var close = function close(onClose, onAfterClose) {
var container = getContainer();
var popup = getPopup();
if (!popup) {
return;
}
if (onClose !== null && typeof onClose === 'function') {
onClose(popup);
}
removeClass(popup, swalClasses.show);
addClass(popup, swalClasses.hide);
var removePopupAndResetState = function removePopupAndResetState() {
if (!isToast()) {
restoreActiveElement();
globalState.keydownTarget.removeEventListener('keydown', globalState.keydownHandler, {
capture: globalState.keydownListenerCapture
});
globalState.keydownHandlerAdded = false;
}
if (container.parentNode) {
container.parentNode.removeChild(container);
}
removeClass([document.documentElement, document.body], [swalClasses.shown, swalClasses['height-auto'], swalClasses['no-backdrop'], swalClasses['toast-shown'], swalClasses['toast-column']]);
if (isModal()) {
undoScrollbar();
undoIOSfix();
unsetAriaHidden();
}
if (onAfterClose !== null && typeof onAfterClose === 'function') {
setTimeout(function () {
onAfterClose();
});
}
}; // If animation is supported, animate
if (animationEndEvent && !hasClass(popup, swalClasses.noanimation)) {
popup.addEventListener(animationEndEvent, function swalCloseEventFinished() {
popup.removeEventListener(animationEndEvent, swalCloseEventFinished);
if (hasClass(popup, swalClasses.hide)) {
removePopupAndResetState();
}
});
} else {
// Otherwise, remove immediately
removePopupAndResetState();
}
};
/*
* Global function to determine if swal2 popup is shown
*/
var isVisible$1 = function isVisible() {
return !!getPopup();
};
/*
* Global function to click 'Confirm' button
*/
var clickConfirm = function clickConfirm() {
return getConfirmButton().click();
};
/*
* Global function to click 'Cancel' button
*/
var clickCancel = function clickCancel() {
return getCancelButton().click();
};
function fire() {
var Swal = this;
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _construct(Swal, args);
}
/**
* Extends a Swal class making it able to be instantiated without the `new` keyword (and thus without `Swal.fire`)
* @param ParentSwal
* @returns {NoNewKeywordSwal}
*/
function withNoNewKeyword(ParentSwal) {
var NoNewKeywordSwal = function NoNewKeywordSwal() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
if (!(this instanceof NoNewKeywordSwal)) {
return _construct(NoNewKeywordSwal, args);
}
Object.getPrototypeOf(NoNewKeywordSwal).apply(this, args);
};
NoNewKeywordSwal.prototype = _extends(Object.create(ParentSwal.prototype), {
constructor: NoNewKeywordSwal
});
if (typeof Object.setPrototypeOf === 'function') {
Object.setPrototypeOf(NoNewKeywordSwal, ParentSwal);
} else {
// Android 4.4
// eslint-disable-next-line
NoNewKeywordSwal.__proto__ = ParentSwal;
}
return NoNewKeywordSwal;
}
var defaultParams = {
title: '',
titleText: '',
text: '',
html: '',
footer: '',
type: null,
toast: false,
customClass: '',
target: 'body',
backdrop: true,
animation: true,
heightAuto: true,
allowOutsideClick: true,
allowEscapeKey: true,
allowEnterKey: true,
stopKeydownPropagation: true,
keydownListenerCapture: false,
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,
onAfterClose: null,
onOpen: null,
onClose: null,
useRejections: false,
expectRejections: false
};
var deprecatedParams = ['useRejections', 'expectRejections'];
var toastIncompatibleParams = ['allowOutsideClick', 'allowEnterKey', 'backdrop', 'focusConfirm', 'focusCancel', 'heightAuto', 'keydownListenerCapture'];
/**
* Is valid parameter
* @param {String} paramName
*/
var isValidParameter = function isValidParameter(paramName) {
return defaultParams.hasOwnProperty(paramName) || paramName === 'extraParams';
};
/**
* Is deprecated parameter
* @param {String} paramName
*/
var isDeprecatedParameter = function isDeprecatedParameter(paramName) {
return deprecatedParams.indexOf(paramName) !== -1;
};
/**
* Show relevant warnings for given params
*
* @param params
*/
var showWarningsForParams = function showWarningsForParams(params) {
for (var param in params) {
if (!isValidParameter(param)) {
warn("Unknown parameter \"".concat(param, "\""));
}
if (params.toast && toastIncompatibleParams.indexOf(param) !== -1) {
warn("The parameter \"".concat(param, "\" is incompatible with toasts"));
}
if (isDeprecatedParameter(param)) {
warnOnce("The parameter \"".concat(param, "\" is deprecated and will be removed in the next major release."));
}
}
};
var deprecationWarning = "\"setDefaults\" & \"resetDefaults\" methods are deprecated in favor of \"mixin\" method and will be removed in the next major release. For new projects, use \"mixin\". For past projects already using \"setDefaults\", support will be provided through an additional package.";
var defaults = {};
function withGlobalDefaults(ParentSwal) {
var SwalWithGlobalDefaults =
/*#__PURE__*/
function (_ParentSwal) {
_inherits(SwalWithGlobalDefaults, _ParentSwal);
function SwalWithGlobalDefaults() {
_classCallCheck(this, SwalWithGlobalDefaults);
return _possibleConstructorReturn(this, _getPrototypeOf(SwalWithGlobalDefaults).apply(this, arguments));
}
_createClass(SwalWithGlobalDefaults, [{
key: "_main",
value: function _main(params) {
return _get(_getPrototypeOf(SwalWithGlobalDefaults.prototype), "_main", this).call(this, _extends({}, defaults, params));
}
}], [{
key: "setDefaults",
value: function setDefaults(params) {
warnOnce(deprecationWarning);
if (!params || _typeof(params) !== 'object') {
throw new TypeError('SweetAlert2: The argument for setDefaults() is required and has to be a object');
}
showWarningsForParams(params); // assign valid params from `params` to `defaults`
Object.keys(params).forEach(function (param) {
if (ParentSwal.isValidParameter(param)) {
defaults[param] = params[param];
}
});
}
}, {
key: "resetDefaults",
value: function resetDefaults() {
warnOnce(deprecationWarning);
defaults = {};
}
}]);
return SwalWithGlobalDefaults;
}(ParentSwal); // Set default params if `window._swalDefaults` is an object
if (typeof window !== 'undefined' && _typeof(window._swalDefaults) === 'object') {
SwalWithGlobalDefaults.setDefaults(window._swalDefaults);
}
return SwalWithGlobalDefaults;
}
/**
* Returns an extended version of `Swal` containing `params` as defaults.
* Useful for reusing Swal configuration.
*
* For example:
*
* Before:
* const textPromptOptions = { input: 'text', showCancelButton: true }
* const {value: firstName} = await Swal({ ...textPromptOptions, title: 'What is your first name?' })
* const {value: lastName} = await Swal({ ...textPromptOptions, title: 'What is your last name?' })
*
* After:
* const TextPrompt = Swal.mixin({ input: 'text', showCancelButton: true })
* const {value: firstName} = await TextPrompt('What is your first name?')
* const {value: lastName} = await TextPrompt('What is your last name?')
*
* @param mixinParams
*/
function mixin(mixinParams) {
return withNoNewKeyword(
/*#__PURE__*/
function (_this) {
_inherits(MixinSwal, _this);
function MixinSwal() {
_classCallCheck(this, MixinSwal);
return _possibleConstructorReturn(this, _getPrototypeOf(MixinSwal).apply(this, arguments));
}
_createClass(MixinSwal, [{
key: "_main",
value: function _main(params) {
return _get(_getPrototypeOf(MixinSwal.prototype), "_main", this).call(this, _extends({}, mixinParams, params));
}
}]);
return MixinSwal;
}(this));
}
// private global state for the queue feature
var currentSteps = [];
/*
* Global function for chaining sweetAlert popups
*/
var queue = function queue(steps) {
var swal = this;
currentSteps = steps;
var resetQueue = function resetQueue() {
currentSteps = [];
document.body.removeAttribute('data-swal2-queue-step');
};
var queueResult = [];
return new Promise(function (resolve) {
(function step(i, callback) {
if (i < currentSteps.length) {
document.body.setAttribute('data-swal2-queue-step', i);
swal(currentSteps[i]).then(function (result) {
if (typeof result.value !== 'undefined') {
queueResult.push(result.value);
step(i + 1, callback);
} else {
resetQueue();
resolve({
dismiss: result.dismiss
});
}
});
} else {
resetQueue();
resolve({
value: queueResult
});
}
})(0);
});
};
/*
* Global function for getting the index of current popup in queue
*/
var getQueueStep = function getQueueStep() {
return document.body.getAttribute('data-swal2-queue-step');
};
/*
* Global function for inserting a popup to the queue
*/
var insertQueueStep = function insertQueueStep(step, index) {
if (index && index < currentSteps.length) {
return currentSteps.splice(index, 0, step);
}
return currentSteps.push(step);
};
/*
* Global function for deleting a popup from the queue
*/
var deleteQueueStep = function deleteQueueStep(index) {
if (typeof currentSteps[index] !== 'undefined') {
currentSteps.splice(index, 1);
}
};
/**
* Show spinner instead of Confirm button and disable Cancel button
*/
var showLoading = function showLoading() {
var popup = getPopup();
if (!popup) {
Swal('');
}
popup = getPopup();
var actions = getActions();
var confirmButton = getConfirmButton();
var cancelButton = getCancelButton();
show(actions);
show(confirmButton);
addClass([popup, actions], swalClasses.loading);
confirmButton.disabled = true;
cancelButton.disabled = true;
popup.setAttribute('data-loading', true);
popup.setAttribute('aria-busy', true);
popup.focus();
};
/**
* If `timer` parameter is set, returns number os milliseconds of timer remained.
* Otherwise, returns null.
*/
var getTimerLeft = function getTimerLeft() {
return globalState.timeout && globalState.timeout.getTimerLeft();
};
var staticMethods = Object.freeze({
isValidParameter: isValidParameter,
isDeprecatedParameter: isDeprecatedParameter,
argsToParams: argsToParams,
adaptInputValidator: adaptInputValidator,
close: close,
closePopup: close,
closeModal: close,
closeToast: close,
isVisible: isVisible$1,
clickConfirm: clickConfirm,
clickCancel: clickCancel,
getContainer: getContainer,
getPopup: getPopup,
getTitle: getTitle,
getContent: getContent,
getImage: getImage,
getIcons: getIcons,
getCloseButton: getCloseButton,
getButtonsWrapper: getButtonsWrapper,
getActions: getActions,
getConfirmButton: getConfirmButton,
getCancelButton: getCancelButton,
getFooter: getFooter,
getFocusableElements: getFocusableElements,
isLoading: isLoading,
fire: fire,
mixin: mixin,
queue: queue,
getQueueStep: getQueueStep,
insertQueueStep: insertQueueStep,
deleteQueueStep: deleteQueueStep,
showLoading: showLoading,
enableLoading: showLoading,
getTimerLeft: getTimerLeft
});
// https://github.com/Riim/symbol-polyfill/blob/master/index.js
/* istanbul ignore next */
var _Symbol = typeof Symbol === 'function' ? Symbol : function () {
var idCounter = 0;
function _Symbol(key) {
return '__' + key + '_' + Math.floor(Math.random() * 1e9) + '_' + ++idCounter + '__';
}
_Symbol.iterator = _Symbol('Symbol.iterator');
return _Symbol;
}();
// WeakMap polyfill, needed for Android 4.4
// Related issue: https://github.com/sweetalert2/sweetalert2/issues/1071
// http://webreflection.blogspot.fi/2015/04/a-weakmap-polyfill-in-20-lines-of-code.html
/* istanbul ignore next */
var WeakMap$1 = typeof WeakMap === 'function' ? WeakMap : function (s, dP, hOP) {
function WeakMap() {
dP(this, s, {
value: _Symbol('WeakMap')
});
}
WeakMap.prototype = {
'delete': function del(o) {
delete o[this[s]];
},
get: function get(o) {
return o[this[s]];
},
has: function has(o) {
return hOP.call(o, this[s]);
},
set: function set(o, v) {
dP(o, this[s], {
configurable: true,
value: v
});
}
};
return WeakMap;
}(_Symbol('WeakMap'), Object.defineProperty, {}.hasOwnProperty);
/**
* This module containts `WeakMap`s for each effectively-"private property" that a `swal` has.
* For example, to set the private property "foo" of `this` to "bar", you can `privateProps.foo.set(this, 'bar')`
* This is the approach that Babel will probably take to implement private methods/fields
* https://github.com/tc39/proposal-private-methods
* https://github.com/babel/babel/pull/7555
* Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module*
* then we can use that language feature.
*/
var privateProps = {
promise: new WeakMap$1(),
innerParams: new WeakMap$1(),
domCache: new WeakMap$1()
};
/**
* Enables buttons and hide loader.
*/
function hideLoading() {
var innerParams = privateProps.innerParams.get(this);
var domCache = privateProps.domCache.get(this);
if (!innerParams.showConfirmButton) {
hide(domCache.confirmButton);
if (!innerParams.showCancelButton) {
hide(domCache.actions);
}
}
removeClass([domCache.popup, domCache.actions], swalClasses.loading);
domCache.popup.removeAttribute('aria-busy');
domCache.popup.removeAttribute('data-loading');
domCache.confirmButton.disabled = false;
domCache.cancelButton.disabled = false;
}
function getInput(inputType) {
var innerParams = privateProps.innerParams.get(this);
var domCache = privateProps.domCache.get(this);
inputType = inputType || innerParams.input;
if (!inputType) {
return null;
}
switch (inputType) {
case 'select':
case 'textarea':
case 'file':
return getChildByClass(domCache.content, swalClasses[inputType]);
case 'checkbox':
return domCache.popup.querySelector(".".concat(swalClasses.checkbox, " input"));
case 'radio':
return domCache.popup.querySelector(".".concat(swalClasses.radio, " input:checked")) || domCache.popup.querySelector(".".concat(swalClasses.radio, " input:first-child"));
case 'range':
return domCache.popup.querySelector(".".concat(swalClasses.range, " input"));
default:
return getChildByClass(domCache.content, swalClasses.input);
}
}
function enableButtons() {
var domCache = privateProps.domCache.get(this);
domCache.confirmButton.disabled = false;
domCache.cancelButton.disabled = false;
}
function disableButtons() {
var domCache = privateProps.domCache.get(this);
domCache.confirmButton.disabled = true;
domCache.cancelButton.disabled = true;
}
function enableConfirmButton() {
var domCache = privateProps.domCache.get(this);
domCache.confirmButton.disabled = false;
}
function disableConfirmButton() {
var domCache = privateProps.domCache.get(this);
domCache.confirmButton.disabled = true;
}
function enableInput() {
var input = this.getInput();
if (!input) {
return false;
}
if (input.type === 'radio') {
var radiosContainer = input.parentNode.parentNode;
var radios = radiosContainer.querySelectorAll('input');
for (var i = 0; i < radios.length; i++) {
radios[i].disabled = false;
}
} else {
input.disabled = false;
}
}
function disableInput() {
var input = this.getInput();
if (!input) {
return false;
}
if (input && input.type === 'radio') {
var radiosContainer = input.parentNode.parentNode;
var radios = radiosContainer.querySelectorAll('input');
for (var i = 0; i < radios.length; i++) {
radios[i].disabled = true;
}
} else {
input.disabled = true;
}
}
function showValidationError(error) {
var domCache = privateProps.domCache.get(this);
domCache.validationError.innerHTML = error;
var popupComputedStyle = window.getComputedStyle(domCache.popup);
domCache.validationError.style.marginLeft = "-".concat(popupComputedStyle.getPropertyValue('padding-left'));
domCache.validationError.style.marginRight = "-".concat(popupComputedStyle.getPropertyValue('padding-right'));
show(domCache.validationError);
var input = this.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
function resetValidationError() {
var domCache = privateProps.domCache.get(this);
if (domCache.validationError) {
hide(domCache.validationError);
}
var input = this.getInput();
if (input) {
input.removeAttribute('aria-invalid');
input.removeAttribute('aria-describedBy');
removeClass(input, swalClasses.inputerror);
}
}
function getProgressSteps$1() {
var innerParams = privateProps.innerParams.get(this);
return innerParams.progressSteps;
}
function setProgressSteps(progressSteps) {
var innerParams = privateProps.innerParams.get(this);
var updatedParams = _extends({}, innerParams, {
progressSteps: progressSteps
});
privateProps.innerParams.set(this, updatedParams);
renderProgressSteps(updatedParams);
}
function showProgressSteps() {
var domCache = privateProps.domCache.get(this);
show(domCache.progressSteps);
}
function hideProgressSteps() {
var domCache = privateProps.domCache.get(this);
hide(domCache.progressSteps);
}
var Timer = function Timer(callback, delay) {
_classCallCheck(this, Timer);
var id, started, running;
var remaining = delay;
this.start = function () {
running = true;
started = new Date();
id = setTimeout(callback, remaining);
};
this.stop = function () {
running = false;
clearTimeout(id);
remaining -= new Date() - started;
};
this.getTimerLeft = function () {
if (running) {
this.stop();
this.start();
}
return remaining;
};
this.start();
};
var defaultInputValidators = {
email: function email(string, extraParams) {
return /^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]{2,24}$/.test(string) ? Promise.resolve() : Promise.reject(extraParams && extraParams.validationMessage ? extraParams.validationMessage : 'Invalid email address');
},
url: function url(string, extraParams) {
// taken from https://stackoverflow.com/a/3809435/1331425
return /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_+.~#?&//=]*)$/.test(string) ? Promise.resolve() : Promise.reject(extraParams && extraParams.validationMessage ? extraParams.validationMessage : 'Invalid URL');
}
};
/**
* Set type, text and actions on popup
*
* @param params
* @returns {boolean}
*/
function setParameters(params) {
// Use default `inputValidator` for supported input types if not provided
if (!params.inputValidator) {
Object.keys(defaultInputValidators).forEach(function (key) {
if (params.input === key) {
params.inputValidator = params.expectRejections ? defaultInputValidators[key] : Swal.adaptInputValidator(defaultInputValidators[key]);
}
});
} // Determine if the cu