quasar
Version:
Build high-performance VueJS user interfaces (SPA, PWA, SSR, Mobile and Desktop) in record time
96 lines (77 loc) • 1.82 kB
JavaScript
import Vue from 'vue'
import { isSSR } from '../plugins/Platform.js'
const ssrAPI = {
onOk: () => ssrAPI,
okCancel: () => ssrAPI,
hide: () => ssrAPI
}
export default function (DefaultComponent) {
return ({ className, class: klass, style, component, root, parent, ...props }) => {
if (isSSR === true) { return ssrAPI }
klass !== void 0 && (props.cardClass = klass)
style !== void 0 && (props.cardStyle = style)
const
okFns = [],
cancelFns = [],
API = {
onOk (fn) {
okFns.push(fn)
return API
},
onCancel (fn) {
cancelFns.push(fn)
return API
},
onDismiss (fn) {
okFns.push(fn)
cancelFns.push(fn)
return API
},
hide () {
vm.$refs.dialog.hide()
return API
}
}
const node = document.createElement('div')
document.body.appendChild(node)
let emittedOK = false
const on = {
ok: data => {
emittedOK = true
okFns.forEach(fn => { fn(data) })
},
hide: () => {
vm.$destroy()
vm.$el.remove()
vm = null
if (emittedOK !== true) {
cancelFns.forEach(fn => { fn() })
}
}
}
Vue.observable(props)
const DialogComponent = component !== void 0
? component
: DefaultComponent
const attrs = component === void 0
? props
: void 0
let vm = new Vue({
name: 'QGlobalDialog',
el: node,
parent: parent === void 0 ? root : parent,
render (h) {
return h(DialogComponent, {
ref: 'dialog',
props,
attrs,
on
})
},
mounted () {
this.$refs.dialog.show()
}
})
return API
}
}