162 lines
4.8 KiB
JavaScript
162 lines
4.8 KiB
JavaScript
import defaultParams, { showWarningsForParams } from '../utils/params.js'
|
|
import * as dom from '../utils/dom/index.js'
|
|
import { swalClasses } from '../utils/classes.js'
|
|
import Timer from '../utils/Timer.js'
|
|
import { callIfFunction } from '../utils/utils.js'
|
|
import setParameters from '../utils/setParameters.js'
|
|
import globalState from '../globalState.js'
|
|
import { openPopup } from '../utils/openPopup.js'
|
|
import privateProps from '../privateProps.js'
|
|
import privateMethods from '../privateMethods.js'
|
|
import { handleInputOptionsAndValue } from '../utils/dom/inputUtils.js'
|
|
import { handleConfirmButtonClick, handleCancelButtonClick } from './buttons-handlers.js'
|
|
import { addKeydownHandler, setFocus } from './keydown-handler.js'
|
|
import { handlePopupClick } from './popup-click-handler.js'
|
|
import { DismissReason } from '../utils/DismissReason.js'
|
|
|
|
export function _main (userParams) {
|
|
showWarningsForParams(userParams)
|
|
|
|
if (globalState.currentInstance) {
|
|
globalState.currentInstance._destroy()
|
|
}
|
|
globalState.currentInstance = this
|
|
|
|
const innerParams = prepareParams(userParams)
|
|
setParameters(innerParams)
|
|
Object.freeze(innerParams)
|
|
|
|
// clear the previous timer
|
|
if (globalState.timeout) {
|
|
globalState.timeout.stop()
|
|
delete globalState.timeout
|
|
}
|
|
|
|
// clear the restore focus timeout
|
|
clearTimeout(globalState.restoreFocusTimeout)
|
|
|
|
const domCache = populateDomCache(this)
|
|
|
|
dom.render(this, innerParams)
|
|
|
|
privateProps.innerParams.set(this, innerParams)
|
|
|
|
return swalPromise(this, domCache, innerParams)
|
|
}
|
|
|
|
const prepareParams = (userParams) => {
|
|
const showClass = Object.assign({}, defaultParams.showClass, userParams.showClass)
|
|
const hideClass = Object.assign({}, defaultParams.hideClass, userParams.hideClass)
|
|
const params = Object.assign({}, defaultParams, userParams)
|
|
params.showClass = showClass
|
|
params.hideClass = hideClass
|
|
// @deprecated
|
|
if (userParams.animation === false) {
|
|
params.showClass = {
|
|
popup: 'swal2-noanimation',
|
|
backdrop: 'swal2-noanimation'
|
|
}
|
|
params.hideClass = {}
|
|
}
|
|
return params
|
|
}
|
|
|
|
const swalPromise = (instance, domCache, innerParams) => {
|
|
return new Promise((resolve) => {
|
|
// functions to handle all closings/dismissals
|
|
const dismissWith = (dismiss) => {
|
|
instance.closePopup({ dismiss })
|
|
}
|
|
|
|
privateMethods.swalPromiseResolve.set(instance, resolve)
|
|
|
|
domCache.confirmButton.onclick = () => handleConfirmButtonClick(instance, innerParams)
|
|
domCache.cancelButton.onclick = () => handleCancelButtonClick(instance, dismissWith)
|
|
|
|
domCache.closeButton.onclick = () => dismissWith(DismissReason.close)
|
|
|
|
handlePopupClick(instance, domCache, dismissWith)
|
|
|
|
addKeydownHandler(instance, globalState, innerParams, dismissWith)
|
|
|
|
if (innerParams.toast && (innerParams.input || innerParams.footer || innerParams.showCloseButton)) {
|
|
dom.addClass(document.body, swalClasses['toast-column'])
|
|
} else {
|
|
dom.removeClass(document.body, swalClasses['toast-column'])
|
|
}
|
|
|
|
handleInputOptionsAndValue(instance, innerParams)
|
|
|
|
openPopup(innerParams)
|
|
|
|
setupTimer(globalState, innerParams, dismissWith)
|
|
|
|
initFocus(domCache, innerParams)
|
|
|
|
// Scroll container to top on open (#1247)
|
|
domCache.container.scrollTop = 0
|
|
})
|
|
}
|
|
|
|
const populateDomCache = (instance) => {
|
|
const domCache = {
|
|
popup: dom.getPopup(),
|
|
container: dom.getContainer(),
|
|
content: dom.getContent(),
|
|
actions: dom.getActions(),
|
|
confirmButton: dom.getConfirmButton(),
|
|
cancelButton: dom.getCancelButton(),
|
|
closeButton: dom.getCloseButton(),
|
|
validationMessage: dom.getValidationMessage(),
|
|
progressSteps: dom.getProgressSteps()
|
|
}
|
|
privateProps.domCache.set(instance, domCache)
|
|
|
|
return domCache
|
|
}
|
|
|
|
const setupTimer = (globalState, innerParams, dismissWith) => {
|
|
const timerProgressBar = dom.getTimerProgressBar()
|
|
dom.hide(timerProgressBar)
|
|
if (innerParams.timer) {
|
|
globalState.timeout = new Timer(() => {
|
|
dismissWith('timer')
|
|
delete globalState.timeout
|
|
}, innerParams.timer)
|
|
if (innerParams.timerProgressBar) {
|
|
dom.show(timerProgressBar)
|
|
setTimeout(() => {
|
|
if (globalState.timeout.running) { // timer can be already stopped at this point
|
|
dom.animateTimerProgressBar(innerParams.timer)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
const initFocus = (domCache, innerParams) => {
|
|
if (innerParams.toast) {
|
|
return
|
|
}
|
|
|
|
if (!callIfFunction(innerParams.allowEnterKey)) {
|
|
return blurActiveElement()
|
|
}
|
|
|
|
if (innerParams.focusCancel && dom.isVisible(domCache.cancelButton)) {
|
|
return domCache.cancelButton.focus()
|
|
}
|
|
|
|
if (innerParams.focusConfirm && dom.isVisible(domCache.confirmButton)) {
|
|
return domCache.confirmButton.focus()
|
|
}
|
|
|
|
setFocus(innerParams, -1, 1)
|
|
}
|
|
|
|
const blurActiveElement = () => {
|
|
if (document.activeElement && typeof document.activeElement.blur === 'function') {
|
|
document.activeElement.blur()
|
|
}
|
|
}
|