package.src.popup-click-handler.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of sweetalert2 Show documentation
Show all versions of sweetalert2 Show documentation
A beautiful, responsive, customizable and accessible (WAI-ARIA) replacement for JavaScript's popup boxes, supported fork of sweetalert
The newest version!
import { DismissReason } from './utils/DismissReason.js'
import { callIfFunction } from './utils/utils.js'
/**
* @param {SweetAlertOptions} innerParams
* @param {DomCache} domCache
* @param {Function} dismissWith
*/
export const handlePopupClick = (innerParams, domCache, dismissWith) => {
if (innerParams.toast) {
handleToastClick(innerParams, domCache, dismissWith)
} else {
// Ignore click events that had mousedown on the popup but mouseup on the container
// This can happen when the user drags a slider
handleModalMousedown(domCache)
// Ignore click events that had mousedown on the container but mouseup on the popup
handleContainerMousedown(domCache)
handleModalClick(innerParams, domCache, dismissWith)
}
}
/**
* @param {SweetAlertOptions} innerParams
* @param {DomCache} domCache
* @param {Function} dismissWith
*/
const handleToastClick = (innerParams, domCache, dismissWith) => {
// Closing toast by internal click
domCache.popup.onclick = () => {
if (innerParams && (isAnyButtonShown(innerParams) || innerParams.timer || innerParams.input)) {
return
}
dismissWith(DismissReason.close)
}
}
/**
* @param {SweetAlertOptions} innerParams
* @returns {boolean}
*/
const isAnyButtonShown = (innerParams) => {
return !!(
innerParams.showConfirmButton ||
innerParams.showDenyButton ||
innerParams.showCancelButton ||
innerParams.showCloseButton
)
}
let ignoreOutsideClick = false
/**
* @param {DomCache} domCache
*/
const handleModalMousedown = (domCache) => {
domCache.popup.onmousedown = () => {
domCache.container.onmouseup = function (e) {
domCache.container.onmouseup = () => {}
// 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 === domCache.container) {
ignoreOutsideClick = true
}
}
}
}
/**
* @param {DomCache} domCache
*/
const handleContainerMousedown = (domCache) => {
domCache.container.onmousedown = (e) => {
// prevent the modal text from being selected on double click on the container (allowOutsideClick: false)
if (e.target === domCache.container) {
e.preventDefault()
}
domCache.popup.onmouseup = function (e) {
domCache.popup.onmouseup = () => {}
// We also need to check if the mouseup target is a child of the popup
if (e.target === domCache.popup || (e.target instanceof HTMLElement && domCache.popup.contains(e.target))) {
ignoreOutsideClick = true
}
}
}
}
/**
* @param {SweetAlertOptions} innerParams
* @param {DomCache} domCache
* @param {Function} dismissWith
*/
const handleModalClick = (innerParams, domCache, dismissWith) => {
domCache.container.onclick = (e) => {
if (ignoreOutsideClick) {
ignoreOutsideClick = false
return
}
if (e.target === domCache.container && callIfFunction(innerParams.allowOutsideClick)) {
dismissWith(DismissReason.backdrop)
}
}
}