lixin-web
Version:
vue and bootstrap
1,240 lines (1,118 loc) • 46.3 kB
JavaScript
import defaultParams from "./utils/params.js";
import { swalClasses, iconTypes } from "./utils/classes.js";
// import { colorLuminance } from "./utils/utils.js";
import * as dom from "./utils/dom.js";
let modalParams = Object.assign({}, defaultParams);
let queue = [];
let swal2Observer;
/*
* Set type, text and actions on modal
*/
const setParameters = params => {
const modal = dom.getModal() || dom.init(params);
for (let param in params) {
if (!defaultParams.hasOwnProperty(param) && param !== "extraParams") {
console.warn(`SweetAlert2: Unknown parameter "${param}"`);
}
}
// Set modal width
modal.style.width = typeof params.width === "number" ?
params.width + "px" :
params.width;
modal.style.padding = params.padding + "px";
modal.style.background = params.background;
const successIconParts = modal.querySelectorAll(
"[class^=swal2-success-circular-line], .swal2-success-fix"
);
for (let i = 0; i < successIconParts.length; i++) {
successIconParts[i].style.background = params.background;
}
const title = dom.getTitle();
const content = dom.getContent();
const buttonsWrapper = dom.getButtonsWrapper();
const confirmButton = dom.getConfirmButton();
const cancelButton = dom.getCancelButton();
const closeButton = dom.getCloseButton();
// Title
if (params.titleText) {
title.innerText = params.titleText;
} else {
title.innerHTML = params.title.split("\n").join("<br>");
}
// Content
if (params.text || params.html) {
if (typeof params.html === "object") {
content.innerHTML = "";
if (0 in params.html) {
for (let i = 0; i in params.html; i++) {
content.appendChild(params.html[i].cloneNode(true));
}
} else {
content.appendChild(params.html.cloneNode(true));
}
} else if (params.html) {
content.innerHTML = params.html;
} else if (params.text) {
content.textContent = params.text;
}
dom.show(content);
} else {
dom.hide(content);
}
// Close button
if (params.showCloseButton) {
dom.show(closeButton);
} else {
dom.hide(closeButton);
}
// Custom Class
modal.className = swalClasses.modal;
if (params.customClass) {
dom.addClass(modal, params.customClass);
}
// Progress steps
// let progressStepsContainer = dom.getProgressSteps()
// let currentProgressStep = parseInt(params.currentProgressStep === null ? sweetAlert.getQueueStep() : params.currentProgressStep, 10)
// if (params.progressSteps.length) {
// dom.show(progressStepsContainer)
// dom.empty(progressStepsContainer)
// if (currentProgressStep >= params.progressSteps.length) {
// console.warn(
// 'SweetAlert2: Invalid currentProgressStep parameter, it should be less than progressSteps.length ' +
// '(currentProgressStep like JS arrays starts from 0)'
// )
// }
// params.progressSteps.forEach((step, index) => {
// let circle = document.createElement('li')
// dom.addClass(circle, swalClasses.progresscircle)
// circle.innerHTML = step
// if (index === currentProgressStep) {
// dom.addClass(circle, swalClasses.activeprogressstep)
// }
// progressStepsContainer.appendChild(circle)
// if (index !== params.progressSteps.length - 1) {
// let line = document.createElement('li')
// dom.addClass(line, swalClasses.progressline)
// line.style.width = params.progressStepsDistance
// progressStepsContainer.appendChild(line)
// }
// })
// } else {
// dom.hide(progressStepsContainer)
// }
// Icon
const icons = dom.getIcons();
for (let i = 0; i < icons.length; i++) {
dom.hide(icons[i]);
}
if (params.type) {
let validType = false;
for (let iconType in iconTypes) {
if (params.type === iconType) {
validType = true;
break;
}
}
if (!validType) {
console.error(`SweetAlert2: Unknown alert type: ${params.type}`);
return false;
}
const icon = modal.querySelector(
`.${swalClasses.icon}.${iconTypes[params.type]}`
);
dom.show(icon);
// Animate icon
if (params.animation) {
switch (params.type) {
case "success":
dom.addClass(icon, "swal2-animate-success-icon");
dom.addClass(
icon.querySelector(".swal2-success-line-tip"),
"swal2-animate-success-line-tip"
);
dom.addClass(
icon.querySelector(".swal2-success-line-long"),
"swal2-animate-success-line-long"
);
break;
case "error":
dom.addClass(icon, "swal2-animate-error-icon");
dom.addClass(
icon.querySelector(".swal2-x-mark"),
"swal2-animate-x-mark"
);
break;
default:
break;
}
}
}
// Custom image
// const image = dom.getImage()
// if (params.imageUrl) {
// image.setAttribute('src', params.imageUrl)
// dom.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) {
// dom.addClass(image, params.imageClass)
// }
// } else {
// dom.hide(image)
// }
// Cancel button
if (params.showCancelButton) {
cancelButton.style.display = "inline-block";
} else {
dom.hide(cancelButton);
}
// Confirm button
if (params.showConfirmButton) {
dom.removeStyleProperty(confirmButton, "display");
} else {
dom.hide(confirmButton);
}
// Buttons wrapper
if (!params.showConfirmButton && !params.showCancelButton) {
dom.hide(buttonsWrapper);
} else {
dom.show(buttonsWrapper);
}
// Edit text on cancel and confirm buttons
confirmButton.innerHTML = params.confirmButtonText;
cancelButton.innerHTML = params.cancelButtonText;
// Set buttons to selected background colors
// if (params.buttonsStyling) {
// confirmButton.style.backgroundColor = params.confirmButtonColor;
// cancelButton.style.backgroundColor = params.cancelButtonColor;
// }
// Add buttons custom classes
confirmButton.className = swalClasses.confirm;
dom.addClass(confirmButton, params.confirmButtonClass);
cancelButton.className = swalClasses.cancel;
dom.addClass(cancelButton, params.cancelButtonClass);
// Buttons styling
if (params.buttonsStyling) {
dom.addClass(confirmButton, swalClasses.styled + ' btn');
dom.addClass(cancelButton, swalClasses.styled + ' btn');
} else {
// dom.removeClass(confirmButton, swalClasses.styled);
// dom.removeClass(cancelButton, swalClasses.styled);
//
// confirmButton.style.backgroundColor = confirmButton.style.borderLeftColor = confirmButton.style.borderRightColor =
// "";
// cancelButton.style.backgroundColor = cancelButton.style.borderLeftColor = cancelButton.style.borderRightColor =
// "";
}
// CSS animation
if (params.animation === true) {
dom.removeClass(modal, swalClasses.noanimation);
} else {
dom.addClass(modal, swalClasses.noanimation);
}
};
/*
* Animations
*/
const openModal = (animation, onComplete) => {
const container = dom.getContainer();
const modal = dom.getModal();
if (animation) {
dom.addClass(modal, swalClasses.show);
dom.addClass(container, swalClasses.fade);
dom.removeClass(modal, swalClasses.hide);
} else {
dom.removeClass(modal, swalClasses.fade);
}
dom.show(modal);
// scrolling is 'hidden' until animation is done, after that 'auto'
container.style.overflowY = "hidden";
if (dom.animationEndEvent && !dom.hasClass(modal, swalClasses.noanimation)) {
modal.addEventListener(
dom.animationEndEvent,
function swalCloseEventFinished() {
modal.removeEventListener(
dom.animationEndEvent,
swalCloseEventFinished
);
container.style.overflowY = "auto";
}
);
} else {
container.style.overflowY = "auto";
}
dom.addClass(document.documentElement, swalClasses.shown);
dom.addClass(document.body, swalClasses.shown);
dom.addClass(container, swalClasses.shown);
fixScrollbar();
iOSfix();
dom.states.previousActiveElement = document.activeElement;
if (onComplete !== null && typeof onComplete === "function") {
setTimeout(function() {
onComplete(modal);
});
}
};
const getFixedElements = () => ['.bar','.navbar-top'].map(i => document.querySelector(i)).filter(i => i)
export const fixScrollbar = () => {
// for queues, do not do this more than once
//aviod v-modal fixScrollbar conflict
if (dom.states.previousBodyPadding !== null || dom.states.previousPaddingDone) {
return;
}
// if the body has overflow
if (document.body.scrollHeight > window.innerHeight) {
// add padding so the content doesn't shift after removal of scrollbar
dom.states.previousBodyPadding = document.body.style.paddingRight;
document.body.style.paddingRight = dom.measureScrollbar() + "px";
let fixElements = getFixedElements()
fixElements.length && fixElements.forEach(i => i.style.paddingRight = dom.measureScrollbar() + "px")
}
};
export const undoScrollbar = () => {
if (dom.states.previousBodyPadding !== null && !dom.states.previousPaddingDone) {
document.body.style.paddingRight = dom.states.previousBodyPadding;
let fixElements = getFixedElements()
fixElements.length && fixElements.forEach(i => i.style.paddingRight = dom.states.previousBodyPadding)
dom.states.previousBodyPadding = null;
}
};
// Fix iOS scrolling http://stackoverflow.com/q/39626302/1331425
const iOSfix = () => {
const iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
if (iOS && !dom.hasClass(document.body, swalClasses.iosfix)) {
const offset = document.body.scrollTop;
document.body.style.top = offset * -1 + "px";
dom.addClass(document.body, swalClasses.iosfix);
}
};
const undoIOSfix = () => {
if (dom.hasClass(document.body, swalClasses.iosfix)) {
const offset = parseInt(document.body.style.top, 10);
dom.removeClass(document.body, swalClasses.iosfix);
document.body.style.top = "";
document.body.scrollTop = offset * -1;
}
};
// SweetAlert entry point
const sweetAlert = (...args) => {
if (args[0] === undefined) {
console.error("SweetAlert2 expects at least 1 attribute!");
return false;
}
let params = Object.assign({}, modalParams);
switch (typeof args[0]) {
case "string":
[params.title, params.html, params.type] = args;
break;
case "object":
Object.assign(params, args[0]);
params.extraParams = args[0].extraParams;
// if (params.input === 'email' && params.inputValidator === null) {
// params.inputValidator = (email) => {
// return new Promise((resolve, reject) => {
// const emailRegex = /^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/
// if (emailRegex.test(email)) {
// resolve()
// } else {
// reject('Invalid email address')
// }
// })
// }
// }
// if (params.input === 'url' && params.inputValidator === null) {
// params.inputValidator = (url) => {
// return new Promise((resolve, reject) => {
// const 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')
// }
// })
// }
// }
break;
default:
console.error(
'SweetAlert2: Unexpected type of argument! Expected "string" or "object", got ' +
typeof args[0]
);
return false;
}
setParameters(params);
const container = dom.getContainer();
const modal = dom.getModal();
return new Promise((resolve, reject) => {
// Close on timer
if (params.timer) {
modal.timeout = setTimeout(() => {
sweetAlert.closeModal(params.onClose);
if (params.useRejections) {
reject('timer')
} else {
resolve({dismiss: 'timer'})
}
}, params.timer);
}
// Get input element by specified type or, if type isn't specified, by params.input
// const getInput = (inputType) => {
// inputType = inputType || params.input
// if (!inputType) {
// return null
// }
// switch (inputType) {
// case 'select':
// case 'textarea':
// case 'file':
// return dom.getChildByClass(modal, swalClasses[inputType])
// case 'checkbox':
// return modal.querySelector(`.${swalClasses.checkbox} input`)
// case 'radio':
// return modal.querySelector(`.${swalClasses.radio} input:checked`) ||
// modal.querySelector(`.${swalClasses.radio} input:first-child`)
// case 'range':
// return modal.querySelector(`.${swalClasses.range} input`)
// default:
// return dom.getChildByClass(modal, swalClasses.input)
// }
// }
// // Get the value of the modal input
// const getInputValue = () => {
// const 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(() => {
// const input = getInput()
// if (input) {
// dom.focusInput(input)
// }
// }, 0)
// }
const confirm = value => {
// if (params.showLoaderOnConfirm) {
// sweetAlert.showLoading();
// }
if (params.preConfirm) {
params.preConfirm(value, params.extraParams).then(
preConfirmValue => {
sweetAlert.closeModal(params.onClose);
resolve(preConfirmValue || value);
},
error => {
// sweetAlert.hideLoading();
// if (error) {
// sweetAlert.showValidationError(error);
// }
}
);
} else {
sweetAlert.closeModal(params.onClose);
if (params.useRejections) {
resolve(value)
} else {
resolve({value: value})
}
}
};
// Mouse interactions
const onButtonEvent = event => {
const e = event || window.event;
const target = e.target || e.srcElement;
const confirmButton = dom.getConfirmButton();
const cancelButton = dom.getCancelButton();
const targetedConfirm =
confirmButton &&
(confirmButton === target || confirmButton.contains(target));
const targetedCancel =
cancelButton &&
(cancelButton === target || cancelButton.contains(target));
switch (e.type) {
case "mouseover":
case "mouseup":
// if (params.buttonsStyling) {
// if (targetedConfirm) {
// confirmButton.style.backgroundColor = colorLuminance(
// params.confirmButtonColor, -0.1
// );
// } else if (targetedCancel) {
// cancelButton.style.backgroundColor = colorLuminance(
// params.cancelButtonColor, -0.1
// );
// }
// }
break;
case "mouseout":
// if (params.buttonsStyling) {
// if (targetedConfirm) {
// confirmButton.style.backgroundColor = params.confirmButtonColor;
// } else if (targetedCancel) {
// cancelButton.style.backgroundColor = params.cancelButtonColor;
// }
// }
break;
case "mousedown":
// if (params.buttonsStyling) {
// if (targetedConfirm) {
// confirmButton.style.backgroundColor = colorLuminance(
// params.confirmButtonColor, -0.2
// );
// } else if (targetedCancel) {
// cancelButton.style.backgroundColor = colorLuminance(
// params.cancelButtonColor, -0.2
// );
// }
// }
break;
case "click":
// Clicked 'confirm'
if (targetedConfirm && sweetAlert.isVisible()) {
sweetAlert.disableButtons();
// if (params.input) {
// const inputValue = getInputValue()
// if (params.inputValidator) {
// sweetAlert.disableInput()
// params.inputValidator(inputValue, params.extraParams).then(
// () => {
// sweetAlert.enableButtons()
// sweetAlert.enableInput()
// confirm(inputValue)
// },
// (error) => {
// sweetAlert.enableButtons()
// sweetAlert.enableInput()
// if (error) {
// sweetAlert.showValidationError(error)
// }
// }
// )
// } else {
// confirm(inputValue)
// }
// } else {
confirm(true);
// }
// Clicked 'cancel'
} else if (targetedCancel && sweetAlert.isVisible()) {
sweetAlert.disableButtons();
sweetAlert.closeModal(params.onClose);
if (params.useRejections) {
reject('cancel')
} else {
resolve({dismiss: 'cancel'})
}
}
break;
default:
}
};
const buttons = modal.querySelectorAll("button");
for (let i = 0; i < buttons.length; i++) {
buttons[i].onclick = onButtonEvent;
buttons[i].onmouseover = onButtonEvent;
buttons[i].onmouseout = onButtonEvent;
buttons[i].onmousedown = onButtonEvent;
}
// Closing modal by close button
dom.getCloseButton().onclick = () => {
sweetAlert.closeModal(params.onClose);
if (params.useRejections) {
reject('close')
} else {
resolve({dismiss: 'close'})
}
};
// Closing modal by overlay click
container.onclick = e => {
if (e.target !== container) {
return;
}
if (params.allowOutsideClick) {
sweetAlert.closeModal(params.onClose);
if (params.useRejections) {
reject('overlay')
} else {
resolve({dismiss: 'overlay'})
}
}
};
const buttonsWrapper = dom.getButtonsWrapper();
const confirmButton = dom.getConfirmButton();
const cancelButton = dom.getCancelButton();
// Reverse buttons (Confirm on the right side)
if (params.reverseButtons) {
confirmButton.parentNode.insertBefore(cancelButton, confirmButton);
} else {
confirmButton.parentNode.insertBefore(confirmButton, cancelButton);
}
// Focus handling
const setFocus = (index, increment) => {
const focusableElements = dom.getFocusableElements(params.focusCancel);
// search for visible elements and select the next possible match
for (let i = 0; i < focusableElements.length; i++) {
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
const el = focusableElements[index];
if (dom.isVisible(el)) {
return el.focus();
}
}
};
const handleKeyDown = event => {
const e = event || window.event;
const keyCode = e.keyCode || e.which;
if ([9, 13, 32, 27, 37, 38, 39, 40].indexOf(keyCode) === -1) {
// Don't do work on keys we don't care about.
return;
}
const targetElement = e.target || e.srcElement;
const focusableElements = dom.getFocusableElements(params.focusCancel);
let btnIndex = -1; // Find the button - note, this is a nodelist, not an array.
for (let i = 0; i < focusableElements.length; i++) {
if (targetElement === focusableElements[i]) {
btnIndex = i;
break;
}
}
// TAB
if (keyCode === 9) {
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 (
keyCode === 37 ||
keyCode === 38 ||
keyCode === 39 ||
keyCode === 40
) {
// focus Cancel button if Confirm button is currently focused
if (
document.activeElement === confirmButton &&
dom.isVisible(cancelButton)
) {
cancelButton.focus();
// and vice versa
} else if (
document.activeElement === cancelButton &&
dom.isVisible(confirmButton)
) {
confirmButton.focus();
}
// ENTER/SPACE
} else if (keyCode === 13 || keyCode === 32) {
if (btnIndex === -1 && params.allowEnterKey) {
// ENTER/SPACE clicked outside of a button.
if (params.focusCancel) {
dom.fireClick(cancelButton, e);
} else {
dom.fireClick(confirmButton, e);
}
e.stopPropagation();
e.preventDefault();
}
// ESC
} else if (keyCode === 27 && params.allowEscapeKey === true) {
sweetAlert.closeModal(params.onClose);
if (params.useRejections) {
reject('esc')
} else {
resolve({dismiss: 'esc'})
}
}
};
if (!window.onkeydown || window.onkeydown.toString() !== handleKeyDown.toString()) {
dom.states.previousWindowKeyDown = window.onkeydown
window.onkeydown = handleKeyDown
}
// Loading state
// if (params.buttonsStyling) {
// confirmButton.style.borderLeftColor = params.confirmButtonColor;
// confirmButton.style.borderRightColor = params.confirmButtonColor;
// }
/**
* Show spinner instead of Confirm button and disable Cancel button
*/
// sweetAlert.showLoading = sweetAlert.enableLoading = function () {
// var modal = getModal();
// if (!modal) {
// sweetAlert('');
// }
// var buttonsWrapper = getButtonsWrapper();
// var confirmButton = getConfirmButton();
// var cancelButton = getCancelButton();
//
// show(buttonsWrapper);
// show(confirmButton, 'inline-block');
// addClass(buttonsWrapper, swalClasses.loading);
// addClass(modal, swalClasses.loading);
// confirmButton.disabled = true;
// cancelButton.disabled = true;
// };
/**
* Show spinner instead of Confirm button and disable Cancel button
*/
// sweetAlert.hideLoading = sweetAlert.disableLoading = () => {
// if (!params.showConfirmButton) {
// dom.hide(confirmButton);
// if (!params.showCancelButton) {
// dom.hide(dom.getButtonsWrapper());
// }
// }
// dom.removeClass(buttonsWrapper, swalClasses.loading);
// dom.removeClass(modal, swalClasses.loading);
// confirmButton.disabled = false;
// cancelButton.disabled = false;
// };
sweetAlert.getTitle = () => dom.getTitle();
sweetAlert.getContent = () => dom.getContent();
// sweetAlert.getInput = () => getInput()
// sweetAlert.getImage = () => dom.getImage()
sweetAlert.getButtonsWrapper = () => dom.getButtonsWrapper()
sweetAlert.getConfirmButton = () => dom.getConfirmButton()
sweetAlert.getCancelButton = () => dom.getCancelButton()
sweetAlert.enableButtons = () => {
confirmButton.disabled = false;
cancelButton.disabled = false;
};
sweetAlert.disableButtons = () => {
confirmButton.disabled = true;
cancelButton.disabled = true;
dom.addClass(confirmButton,'is-loading')
confirmButton.innerHTML = '<i class="el-icon-loading"></i>加载中'
};
sweetAlert.enableConfirmButton = () => {
confirmButton.disabled = false;
};
sweetAlert.disableConfirmButton = () => {
confirmButton.disabled = true;
};
// sweetAlert.enableInput = () => {
// const input = getInput()
// if (!input) {
// return false
// }
// if (input.type === 'radio') {
// const radiosContainer = input.parentNode.parentNode
// const radios = radiosContainer.querySelectorAll('input')
// for (let i = 0; i < radios.length; i++) {
// radios[i].disabled = false
// }
// } else {
// input.disabled = false
// }
// }
// sweetAlert.disableInput = () => {
// const input = getInput()
// if (!input) {
// return false
// }
// if (input && input.type === 'radio') {
// const radiosContainer = input.parentNode.parentNode
// const radios = radiosContainer.querySelectorAll('input')
// for (let i = 0; i < radios.length; i++) {
// radios[i].disabled = true
// }
// } else {
// input.disabled = true
// }
// }
// Set modal min-height to disable scrolling inside the modal
sweetAlert.recalculateHeight = dom.debounce(() => {
const modal = dom.getModal();
if (!modal) {
return;
}
const prevState = modal.style.display;
modal.style.minHeight = "";
dom.show(modal);
modal.style.minHeight = modal.scrollHeight + 1 + "px";
modal.style.display = prevState;
}, 50);
// Show block with validation error
// sweetAlert.showValidationError = error => {
// const validationError = dom.getValidationError();
// validationError.innerHTML = error;
// dom.show(validationError);
//
// // const input = getInput()
// // if (input) {
// // dom.focusInput(input)
// // dom.addClass(input, swalClasses.inputerror)
// // }
// };
// Hide block with validation error
// sweetAlert.resetValidationError = () => {
// const validationError = dom.getValidationError();
// dom.hide(validationError);
// sweetAlert.recalculateHeight();
// const input = getInput()
// if (input) {
// dom.removeClass(input, swalClasses.inputerror)
// }
// };
// sweetAlert.getProgressSteps = () => {
// return params.progressSteps
// }
// sweetAlert.setProgressSteps = (progressSteps) => {
// params.progressSteps = progressSteps
// setParameters(params)
// }
// sweetAlert.showProgressSteps = () => {
// dom.show(dom.getProgressSteps())
// }
// sweetAlert.hideProgressSteps = () => {
// dom.hide(dom.getProgressSteps())
// }
sweetAlert.enableButtons();
// sweetAlert.hideLoading();
// sweetAlert.resetValidationError();
// inputs
// const inputTypes = ['input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea']
// let input
// for (let i = 0; i < inputTypes.length; i++) {
// const inputClass = swalClasses[inputTypes[i]]
// const inputContainer = dom.getChildByClass(modal, inputClass)
// input = getInput(inputTypes[i])
// // set attributes
// if (input) {
// for (let j in input.attributes) {
// if (input.attributes.hasOwnProperty(j)) {
// const attrName = input.attributes[j].name
// if (attrName !== 'type' && attrName !== 'value') {
// input.removeAttribute(attrName)
// }
// }
// }
// for (let attr in params.inputAttributes) {
// input.setAttribute(attr, params.inputAttributes[attr])
// }
// }
// // set class
// inputContainer.className = inputClass
// if (params.inputClass) {
// dom.addClass(inputContainer, params.inputClass)
// }
// dom.hide(inputContainer)
// }
// let populateInputOptions
// switch (params.input) {
// case 'text':
// case 'email':
// case 'password':
// case 'number':
// case 'tel':
// case 'url':
// input = dom.getChildByClass(modal, swalClasses.input)
// input.value = params.inputValue
// input.placeholder = params.inputPlaceholder
// input.type = params.input
// dom.show(input)
// break
// case 'file':
// input = dom.getChildByClass(modal, swalClasses.file)
// input.placeholder = params.inputPlaceholder
// input.type = params.input
// dom.show(input)
// break
// case 'range':
// const range = dom.getChildByClass(modal, swalClasses.range)
// const rangeInput = range.querySelector('input')
// const rangeOutput = range.querySelector('output')
// rangeInput.value = params.inputValue
// rangeInput.type = params.input
// rangeOutput.value = params.inputValue
// dom.show(range)
// break
// case 'select':
// const select = dom.getChildByClass(modal, swalClasses.select)
// select.innerHTML = ''
// if (params.inputPlaceholder) {
// const placeholder = document.createElement('option')
// placeholder.innerHTML = params.inputPlaceholder
// placeholder.value = ''
// placeholder.disabled = true
// placeholder.selected = true
// select.appendChild(placeholder)
// }
// populateInputOptions = (inputOptions) => {
// for (let optionValue in inputOptions) {
// const option = document.createElement('option')
// option.value = optionValue
// option.innerHTML = inputOptions[optionValue]
// if (params.inputValue === optionValue) {
// option.selected = true
// }
// select.appendChild(option)
// }
// dom.show(select)
// select.focus()
// }
// break
// case 'radio':
// const radio = dom.getChildByClass(modal, swalClasses.radio)
// radio.innerHTML = ''
// populateInputOptions = (inputOptions) => {
// for (let radioValue in inputOptions) {
// const radioInput = document.createElement('input')
// const radioLabel = document.createElement('label')
// const radioLabelSpan = document.createElement('span')
// radioInput.type = 'radio'
// radioInput.name = swalClasses.radio
// radioInput.value = radioValue
// if (params.inputValue === radioValue) {
// radioInput.checked = true
// }
// radioLabelSpan.innerHTML = inputOptions[radioValue]
// radioLabel.appendChild(radioInput)
// radioLabel.appendChild(radioLabelSpan)
// radioLabel.for = radioInput.id
// radio.appendChild(radioLabel)
// }
// dom.show(radio)
// const radios = radio.querySelectorAll('input')
// if (radios.length) {
// radios[0].focus()
// }
// }
// break
// case 'checkbox':
// const checkbox = dom.getChildByClass(modal, swalClasses.checkbox)
// const checkboxInput = getInput('checkbox')
// checkboxInput.type = 'checkbox'
// checkboxInput.value = 1
// checkboxInput.id = swalClasses.checkbox
// checkboxInput.checked = Boolean(params.inputValue)
// let label = checkbox.getElementsByTagName('span')
// if (label.length) {
// checkbox.removeChild(label[0])
// }
// label = document.createElement('span')
// label.innerHTML = params.inputPlaceholder
// checkbox.appendChild(label)
// dom.show(checkbox)
// break
// case 'textarea':
// const textarea = dom.getChildByClass(modal, swalClasses.textarea)
// textarea.value = params.inputValue
// textarea.placeholder = params.inputPlaceholder
// dom.show(textarea)
// break
// case null:
// break
// default:
// console.error(`SweetAlert2: Unexpected type of input! Expected "text", "email", "password", "number", "tel", "select", "radio", "checkbox", "textarea", "file" or "url", got "${params.input}"`)
// break
// }
// if (params.input === 'select' || params.input === 'radio') {
// if (params.inputOptions instanceof Promise) {
// sweetAlert.showLoading()
// params.inputOptions.then((inputOptions) => {
// sweetAlert.hideLoading()
// populateInputOptions(inputOptions)
// })
// } else if (typeof params.inputOptions === 'object') {
// populateInputOptions(params.inputOptions)
// } else {
// console.error('SweetAlert2: Unexpected type of inputOptions! Expected object or Promise, got ' + typeof params.inputOptions)
// }
// }
openModal(params.animation, params.onOpen);
// Focus the first element (input or button)
if (params.allowEnterKey) {
setFocus(-1, 1);
} else {
if (document.activeElement) {
document.activeElement.blur();
}
}
// fix scroll
dom.getContainer().scrollTop = 0;
// Observe changes inside the modal and adjust height
if (typeof MutationObserver !== "undefined" && !swal2Observer) {
swal2Observer = new MutationObserver(sweetAlert.recalculateHeight);
swal2Observer.observe(modal, {
childList: true,
characterData: true,
subtree: true
});
}
});
};
/*
* Global function to determine if swal2 modal is shown
*/
sweetAlert.isVisible = () => {
return !!dom.getModal();
};
/*
* Global function for chaining sweetAlert modals
*/
sweetAlert.queue = steps => {
queue = steps;
const resetQueue = () => {
queue = [];
document.body.removeAttribute("data-swal2-queue-step");
};
let queueResult = [];
return new Promise((resolve, reject) => {
(function step(i, callback) {
if (i < queue.length) {
document.body.setAttribute("data-swal2-queue-step", i);
sweetAlert(queue[i]).then(
result => {
queueResult.push(result);
step(i + 1, callback);
},
dismiss => {
resetQueue();
reject(dismiss);
}
);
} else {
resetQueue();
resolve(queueResult);
}
})(0);
});
};
/*
* Global function for getting the index of current modal in queue
*/
sweetAlert.getQueueStep = () =>
document.body.getAttribute("data-swal2-queue-step");
/*
* Global function for inserting a modal to the queue
*/
sweetAlert.insertQueueStep = (step, index) => {
if (index && index < queue.length) {
return queue.splice(index, 0, step);
}
return queue.push(step);
};
/*
* Global function for deleting a modal from the queue
*/
sweetAlert.deleteQueueStep = index => {
if (typeof queue[index] !== "undefined") {
queue.splice(index, 1);
}
};
/*
* Global function to close sweetAlert
*/
sweetAlert.close = sweetAlert.closeModal = onComplete => {
const container = dom.getContainer();
const modal = dom.getModal();
if (!modal) {
return;
}
dom.removeClass(modal, swalClasses.show);
dom.addClass(modal, swalClasses.hide);
clearTimeout(modal.timeout);
dom.resetPrevState();
const removeModalAndResetState = () => {
if (container.parentNode) {
container.parentNode.removeChild(container);
}
dom.removeClass(document.documentElement, swalClasses.shown);
dom.removeClass(document.body, swalClasses.shown);
undoScrollbar();
undoIOSfix();
};
// If animation is supported, animate
if (dom.animationEndEvent && !dom.hasClass(modal, swalClasses.noanimation)) {
modal.addEventListener(
dom.animationEndEvent,
function swalCloseEventFinished() {
modal.removeEventListener(
dom.animationEndEvent,
swalCloseEventFinished
);
if (dom.hasClass(modal, swalClasses.hide)) {
removeModalAndResetState();
}
}
);
} else {
// Otherwise, remove immediately
removeModalAndResetState();
}
if (onComplete !== null && typeof onComplete === "function") {
setTimeout(function() {
onComplete(modal);
});
}
};
/*
* Global function to click 'Confirm' button
*/
sweetAlert.clickConfirm = () => dom.getConfirmButton().click();
/*
* Global function to click 'Cancel' button
*/
sweetAlert.clickCancel = () => dom.getCancelButton().click();
/**
* Set default params for each popup
* @param {Object} userParams
*/
sweetAlert.setDefaults = userParams => {
if (!userParams || typeof userParams !== "object") {
return console.error(
"SweetAlert2: the argument for setDefaults() is required and has to be a object"
);
}
for (let param in userParams) {
if (!defaultParams.hasOwnProperty(param) && param !== "extraParams") {
console.warn(`SweetAlert2: Unknown parameter "${param}"`);
delete userParams[param];
}
}
Object.assign(modalParams, userParams);
};
/**
* Reset default params for each popup
*/
sweetAlert.resetDefaults = () => {
modalParams = Object.assign({}, defaultParams);
};
sweetAlert.noop = () => {};
sweetAlert.version = "";
sweetAlert.default = sweetAlert;
export default sweetAlert;