quasar
Version:
Build high-performance VueJS user interfaces (SPA, PWA, SSR, Mobile and Desktop) in record time
75 lines (57 loc) • 1.55 kB
JavaScript
import { globalConfig } from '../private.config/instance-config.js'
const nodesList = []
const portalTypeList = []
let portalIndex = 1
let target = __QUASAR_SSR_SERVER__
? void 0
: document.body
export function createGlobalNode (id, portalType) {
const el = document.createElement('div')
el.id = portalType !== void 0
? `q-portal--${ portalType }--${ portalIndex++ }`
: id
if (globalConfig.globalNodes !== void 0) {
const cls = globalConfig.globalNodes.class
if (cls !== void 0) {
el.className = cls
}
}
target.appendChild(el)
nodesList.push(el)
portalTypeList.push(portalType)
return el
}
export function removeGlobalNode (el) {
const nodeIndex = nodesList.indexOf(el)
nodesList.splice(nodeIndex, 1)
portalTypeList.splice(nodeIndex, 1)
el.remove()
}
export function changeGlobalNodesTarget (newTarget) {
if (newTarget === target) {
return
}
target = newTarget
if (
target === document.body
// or we have less than 2 dialogs:
|| portalTypeList.reduce((acc, type) => (type === 'dialog' ? acc + 1 : acc), 0) < 2
) {
nodesList.forEach(node => {
if (node.contains(target) === false) {
target.appendChild(node)
}
})
return
}
const lastDialogIndex = portalTypeList.lastIndexOf('dialog')
for (let i = 0; i < nodesList.length; i++) {
const el = nodesList[ i ]
if (
(i === lastDialogIndex || portalTypeList[ i ] !== 'dialog')
&& el.contains(target) === false
) {
target.appendChild(el)
}
}
}