@obatfr/sweetalert2
Version:
A beautiful, responsive, customizable and accessible (WAI-ARIA) replacement for JavaScript's popup boxes, supported fork of sweetalert
180 lines (151 loc) • 5.28 kB
JavaScript
import { swalClasses } from '../../classes.js'
import { warn, error, isPromise } from '../../utils.js'
import * as dom from '../../dom/index.js'
import privateProps from '../../../privateProps.js'
const inputTypes = ['input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea']
export const renderInput = (instance, params) => {
const content = dom.getContent()
const innerParams = privateProps.innerParams.get(instance)
const rerender = !innerParams || params.input !== innerParams.input
inputTypes.forEach((inputType) => {
const inputClass = swalClasses[inputType]
const inputContainer = dom.getChildByClass(content, inputClass)
// set attributes
setAttributes(inputType, params.inputAttributes)
// set class
inputContainer.className = inputClass
if (rerender) {
dom.hide(inputContainer)
}
})
if (params.input) {
if (rerender) {
showInput(params)
}
// set custom class
setCustomClass(params)
}
}
const showInput = (params) => {
if (!renderInputType[params.input]) {
return error(`Unexpected type of input! Expected "text", "email", "password", "number", "tel", "select", "radio", "checkbox", "textarea", "file" or "url", got "${params.input}"`)
}
const inputContainer = getInputContainer(params.input)
const input = renderInputType[params.input](inputContainer, params)
dom.show(input)
// input autofocus
setTimeout(() => {
dom.focusInput(input)
})
}
const removeAttributes = (input) => {
for (let i = 0; i < input.attributes.length; i++) {
const attrName = input.attributes[i].name
if (!['type', 'value', 'style'].includes(attrName)) {
input.removeAttribute(attrName)
}
}
}
const setAttributes = (inputType, inputAttributes) => {
const input = dom.getInput(dom.getContent(), inputType)
if (!input) {
return
}
removeAttributes(input)
for (const attr in inputAttributes) {
// Do not set a placeholder for <input type="range">
// it'll crash Edge, #1298
if (inputType === 'range' && attr === 'placeholder') {
continue
}
input.setAttribute(attr, inputAttributes[attr])
}
}
const setCustomClass = (params) => {
const inputContainer = getInputContainer(params.input)
if (params.customClass) {
dom.addClass(inputContainer, params.customClass.input)
}
}
const setInputPlaceholder = (input, params) => {
if (!input.placeholder || params.inputPlaceholder) {
input.placeholder = params.inputPlaceholder
}
}
const getInputContainer = (inputType) => {
const inputClass = swalClasses[inputType] ? swalClasses[inputType] : swalClasses.input
return dom.getChildByClass(dom.getContent(), inputClass)
}
const renderInputType = {}
renderInputType.text =
renderInputType.email =
renderInputType.password =
renderInputType.number =
renderInputType.tel =
renderInputType.url = (input, params) => {
if (typeof params.inputValue === 'string' || typeof params.inputValue === 'number') {
input.value = params.inputValue
} else if (!isPromise(params.inputValue)) {
warn(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof params.inputValue}"`)
}
setInputPlaceholder(input, params)
input.type = params.input
return input
}
renderInputType.file = (input, params) => {
setInputPlaceholder(input, params)
return input
}
renderInputType.range = (range, params) => {
const rangeInput = range.querySelector('input')
const rangeOutput = range.querySelector('output')
rangeInput.value = params.inputValue
rangeInput.type = params.input
rangeOutput.value = params.inputValue
return range
}
renderInputType.select = (select, params) => {
select.textContent = ''
if (params.inputPlaceholder) {
const placeholder = document.createElement('option')
dom.setInnerHtml(placeholder, params.inputPlaceholder)
placeholder.value = ''
placeholder.disabled = true
placeholder.selected = true
select.appendChild(placeholder)
}
return select
}
renderInputType.radio = (radio) => {
radio.textContent = ''
return radio
}
renderInputType.checkbox = (checkboxContainer, params) => {
const checkbox = dom.getInput(dom.getContent(), 'checkbox')
checkbox.value = 1
checkbox.id = swalClasses.checkbox
checkbox.checked = Boolean(params.inputValue)
const label = checkboxContainer.querySelector('span')
dom.setInnerHtml(label, params.inputPlaceholder)
return checkboxContainer
}
renderInputType.textarea = (textarea, params) => {
textarea.value = params.inputValue
setInputPlaceholder(textarea, params)
if ('MutationObserver' in window) { // #1699
const initialPopupWidth = parseInt(window.getComputedStyle(dom.getPopup()).width)
const popupPadding = parseInt(window.getComputedStyle(dom.getPopup()).paddingLeft) + parseInt(window.getComputedStyle(dom.getPopup()).paddingRight)
const outputsize = () => {
const contentWidth = textarea.offsetWidth + popupPadding
if (contentWidth > initialPopupWidth) {
dom.getPopup().style.width = `${contentWidth}px`
} else {
dom.getPopup().style.width = null
}
}
new MutationObserver(outputsize).observe(textarea, {
attributes: true, attributeFilter: ['style']
})
}
return textarea
}