{"version":3,"file":"modal.umd.cjs","sources":["../src/Triggerable.ts","../src/Modal.vue","../src/ModalFactory.ts","../src/ModalPlugin.ts"],"sourcesContent":["// import type { CSSUnits } from 'css-unit-converter';\n// import converter from 'css-unit-converter';\nimport { reactive, ref } from 'vue';\n\nexport type ResolveCallback = (status: boolean) => void;\n\nexport type ClickCallback = (e: Event, button: Button, modal: any, resolve: ResolveCallback) => void;\n\nexport interface Button {\n    class: null,\n    disabled: false,\n    size: 'md',\n    variant: 'primary',\n    onClick?: ClickCallback\n}\n\nexport default {\n\n    props: {\n\n        /**\n         * Custom buttons for the model.\n         *\n         * @type {Array}\n         */\n        buttons: {\n            type: [Boolean, Array],\n            default: undefined,\n            validate(value: any) {\n                return Array.isArray(value) || !value;\n            }\n        },\n\n        /**\n         * The cancel button callback function.\n         * \n         * @type {Function}\n         */\n        cancel: {\n            type: Function,\n            default(e: Event, button: Button, modal: any, resolve: Function) {\n                resolve(false);\n            }\n        },\n\n        /**\n         * The cancel button contextual object.\n         *\n         * @type {Object}\n         */\n        cancelButton: Object,\n\n        /**\n         * The confirm button callback function.\n         * \n         * @type {Function}\n         */\n        confirm: {\n            type: Function,\n            default(e: Event, button: Button, modal: any, resolve: Function) {\n                resolve(true);\n            }\n        },\n\n        /**\n         * The confirm button contextual object.\n         *\n         * @type {Object}\n         */\n        confirmButton: Object,\n\n        /**\n         * The default resolver.\n         * \n         * @property {Function}\n         */\n        resolve: {\n            type: Function,\n            default(e: Event, button: Button, modal: any) {\n                modal.close();\n            }\n        },\n\n        /**\n         * Is the triggerable element showing.\n         *\n         * @property {Boolean}\n         */\n        show: {\n            type: Boolean,\n            defaut: false\n        }\n    },\n\n    methods: {\n    \n        focus() {\n            this.$el.focus();\n        },\n\n        close(e: Event) {\n            return new Promise(resolve => {\n                e = e || new Event('close', {\n                    cancelable: true\n                });\n\n                const handler = () => {\n                    this.isClosing = true;\n                    this.isShowing = false;\n                    \n                    setTimeout(() => {\n                        this.isClosing = false;\n                        this.isDisplaying = false;\n                        this.$emit('closed', e);\n    \n                        resolve(this);\n                    }, 500);\n                };\n                \n                this.$emit('close', e, this.$refs.close, this, handler);\n\n                if(!e.defaultPrevented) {\n                    handler();\n                }\n            });\n        },\n\n        buttonAttributes(button: Button) {\n            return Object.assign({\n                class: null,\n                disabled: false,\n                size: 'md',\n                variant: 'primary',\n            }, Object.fromEntries(\n                Object.entries(button).filter(([key]) => {\n                    return !key.match(/^on[A-Z]/);\n                })\n            ));\n        },\n\n        open() {\n            return new Promise(resolve => {\n                const e = new Event('close', {\n                    cancelable: true\n                });\n\n                const handler = () => {\n                    this.isDisplaying = true;\n\n                    setTimeout(() => {\n                        this.isShowing = true;\n                        setTimeout(() => {\n                            this.$emit('opened');\n\n                            resolve(this);\n                        }, 500);\n                    });\n                };\n\n                this.$emit('open', e, handler);\n\n                if(!e.defaultPrevented) {\n                    handler();\n                }\n            });\n        },\n\n        // @todo - Replace this functionality with something else.\n        //         For now, use setTimeout() to replace this.\n        // transition(fn: Function) {\n        //     const styles = getComputedStyle(this.$refs.dialog);\n                \n        //     const value = styles.transitionDuration.split(',')\n        //         .map(value => {\n        //             const matches = value.trim().match(/^([\\d.]+)(\\w+)$/);\n\n        //             if(!matches) {\n        //                 return 0;\n        //             }\n\n        //             const number: number = parseFloat(matches[1]);\n        //             const unit: CSSUnits = <CSSUnits> matches[2];\n                    \n        //             return converter(number, unit, 'ms');\n        //         })\n        //         .sort((a, b) => {\n        //             return a - b;\n        //         })\n        //         .shift();\n            \n        //     return setTimeout(fn, value);\n        // },\n\n        toggle() {\n            if(!this.isShowing) {\n                this.open();\n            }\n            else {\n                this.close();\n            }\n        },\n\n    },\n\n    computed: {\n\n        triggerableClasses() {\n            return {\n                show: this.isShowing\n            };\n        },\n\n        computedCancelButton() {\n            const button = reactive({\n                variant: 'secondary',\n                label: 'Cancel',\n                name: 'confirm',\n                onClick: (e: Event) => {\n                    this.cancel(e, button, this, (...args: any[]) => {\n                        this.resolve(e, button, this, ...args);\n                    });\n                }\n            });\n\n            return this.cancelButton || button;\n        },\n\n        computedConfirmButton() {\n            const button = reactive({\n                variant: 'primary',\n                label: 'Confirm',\n                name: 'confirm',\n                onClick: (e: Event) => {\n                    this.confirm(e, button, this, (...args: any[]) => {\n                        this.resolve(e, button, this, ...args);\n                    });\n                }\n            });\n\n            return reactive(this.confirmButton) || button;\n        },\n\n        currentButtons() {\n            if(Array.isArray(this.buttons)) {\n                return ref(this.buttons).value.map((button: Button) => {\n                    const onClick = button.onClick || (() => undefined);\n\n                    return Object.assign(button, {\n                        onClick: (e: Event) => onClick(e, button, this, (...args: any) => {\n                            return this.resolve(e, button, this, ...args);\n                        })\n                    });\n                });\n            }\n            else if(this.type === 'alert') {\n                return [this.computedConfirmButton];\n            }\n            else if(this.type === 'confirm') {\n                return [\n                    this.computedConfirmButton,\n                    this.computedCancelButton\n                ];\n            }\n        }\n    },\n\n    watch: {\n        isShowing(value: boolean) {\n            if(value) {\n                this.focus();\n            }\n        },\n\n        show(value: boolean) {\n            if(value) {\n                this.open();\n            }\n        }\n    },\n\n    mounted() {\n        if(this.show) {\n            this.open();\n        }\n    },\n\n    data() {\n        return {\n            isClosing: false,\n            isShowing: false,\n            isDisplaying: false,\n        };\n    }\n\n};\n","<script lang=\"ts\">\nimport { Btn } from '@vue-interface/btn';\nimport { defineComponent } from 'vue';\nimport Triggerable from './Triggerable.js';\n\nexport default defineComponent({\n\n    name: 'Modal',\n\n    components: {\n        Btn\n    },\n\n    mixins: [\n        Triggerable\n    ],\n\n    // beforeRouteLeave() {\n    //     this.close();\n    // },\n\n    props: {\n        /**\n         * Show the modal with a backdrop.\n         *\n         * @type {Boolean}\n         */\n        backdrop: {\n            type: Boolean,\n            default: true\n        },\n\n        /**\n         * Is the modal centered in the screen.\n         *\n         * @type {Boolean}\n         */\n        center: Boolean,\n\n        /**\n         * Is the modal content fixed position\n         *\n         * @type {Boolean}\n         */\n        closeable: {\n            type: Boolean,\n            default: true\n        },\n\n        /**\n         * Should show the modal footer.\n         *\n         * @type {Boolean}\n         */\n        footer: {\n            type: Boolean,\n            default: true\n        },\n\n        /**\n         * Should show the modal footer.\n         *\n         * @type {Boolean}\n         */\n        indicator: {\n            type: Object,\n            default: undefined\n        },\n\n        /**\n         * The modal title.\n         *\n         * @type {String}\n         */\n        title: {\n            type: String,\n            default: undefined\n        },\n\n        /**\n         * Is the modal type.\n         *\n         * @type {Boolean}\n         */\n        type: {\n            type: [Boolean, String],\n            default: false,\n            validate(value: any) {\n                return ['alert', 'confirm'].indexOf(value) !== -1;\n            }\n        }\n    },\n\n    watch: {\n        isShowing(value) {            \n            document.querySelector('body')?.classList[value ? 'add' : 'remove']('modal-open');\n        }\n    }\n\n});\n</script>\n\n<template>\n    <div\n        class=\"modal fade\"\n        :class=\"{...triggerableClasses}\"\n        :style=\"{display: isDisplaying ? 'block' : 'none'}\"\n        tabindex=\"-1\"\n        @keydown.esc=\"close\">\n        <slot name=\"backdrop\">\n            <div\n                v-if=\"backdrop && isDisplaying\" \n                ref=\"backdrop\"\n                class=\"modal-backdrop fade\"\n                :class=\"{'show': isShowing}\"\n                @click=\"closeable && close\" />\n        </slot>\n        \n        <div\n            ref=\"dialog\"\n            class=\"modal-dialog\"\n            :class=\"{'modal-dialog-centered': center}\">\n            <div class=\"modal-content\">\n                <slot name=\"header\">\n                    <div class=\"modal-header\">\n                        <slot name=\"title\">\n                            <h3\n                                v-if=\"title\"\n                                class=\"modal-title\">\n                                {{ title }}\n                            </h3>\n                        </slot>\n\n                        <slot name=\"close-button\">\n                            <button\n                                v-if=\"closeable\"\n                                ref=\"close\"\n                                type=\"button\"\n                                class=\"close\"\n                                data-dismiss=\"modal\"\n                                aria-label=\"Close\"\n                                :disabled=\"isClosing\"\n                                @click=\"close\">\n                                <span aria-hidden=\"true\">&times;</span>\n                            </button>\n                        </slot>\n                    </div>\n                </slot>\n\n                <slot\n                    ref=\"body\"\n                    name=\"body\">\n                    <Suspense>\n                        <div class=\"modal-body\">\n                            <slot ref=\"content\" />\n                        </div>\n                        <template #fallback>\n                            <component :is=\"indicator\" />\n                        </template>\n                    </Suspense>\n                </slot>\n                \n                <slot\n                    v-if=\"footer\"\n                    name=\"footer\"\n                    :close=\"close\">\n                    <div\n                        v-if=\"currentButtons.length\"\n                        ref=\"footer\"\n                        class=\"modal-footer\">\n                        <div class=\"modal-footer-buttons\">\n                            <template v-if=\"currentButtons.length\">\n                                <Btn\n                                    v-for=\"(button, i) in currentButtons\"\n                                    :key=\"`btn-${i}`\"\n                                    v-bind=\"button\" />\n                            </template>\n                        </div>\n                    </div>\n                </slot>\n            </div>\n        </div>\n    </div>\n</template>\n\n<style>\n.modal-footer-buttons {\n    display: flex;\n    align-items: center;\n    flex-direction: row-reverse;\n    grid-gap: .5rem;\n    align-items: center;\n}\n</style>","import { App, h, render, VNode } from 'vue';\n\ninterface ModalParams {\n    title: string,\n    content: VNode,\n    resolve: Function,\n    reject: Function,\n    promise: () => Promise<any>,\n    props: Record<string,any>\n}\n\nexport default class ModalFactory {\n    constructor(\n        protected readonly app: App,\n        protected readonly props: Record<string, any>\n    ) {\n        //\n    }\n\n    mount(vnode: VNode) {\n        vnode.appContext = this.app._context;\n\n        const el = document.createElement('div');\n\n        render(h(vnode), el);\n\n        document.body.append(el);\n    }\n    \n    register(type: string, callback: (params: ModalParams) => VNode) {\n        Object.defineProperty(this, type, {\n            value: (title: string, content: string|((app: App, props: Record<string,any>) => VNode), props: Record<string,any>) => {\n                const promise = new Promise((resolve, reject) => {\n                    this.mount(callback({\n                        title,\n                        props: Object.assign({}, this.props, props),\n                        resolve: (value: any) => {\n                            resolve(value);\n\n                            return promise;\n                        },\n                        reject: (value: any) => {\n                            reject(value);\n\n                            return promise;\n                        },\n                        promise: () => promise,\n                        content: typeof content === 'string'\n                            ? h('div', content)\n                            : content(this.app, props)\n                    }));\n                });\n    \n                return promise;\n            }\n        });\n    }\n\n}","import { h } from 'vue';\nimport Modal from './Modal.vue';\nimport ModalFactory from './ModalFactory';\n\nexport default (app: any, props = {}) => {\n    const factory = new ModalFactory(app, props);\n\n    /**\n     * Dispatch an alert modal.\n     * \n     * @property {String} title\n     * @property {Function|String} content\n     * @property {Object} props\n     */\n    factory.register('alert', ({ title, content, props }) => {\n        return h(Modal, Object.assign({\n            title,\n            show: true,\n            type: 'alert'\n        }, props), {\n            default: () => h(content, Object.assign({\n                ref: 'content'\n            }))\n        });\n    });\n\n    /**\n     * Dispatch a confirmation modal.\n     * \n     * @property {String} title\n     * @property {Function|String} content\n     * @property {Object} props\n     */\n    factory.register('confirm', ({ title, content, props, resolve }) => {\n        return h(Modal, Object.assign({\n            title,\n            show: true,\n            type: 'confirm',\n            resolve(e: Event, button: any, modal: any, status: boolean) {\n                modal.close();\n                \n                resolve(status);\n            }\n        }, props), {\n            default: () => h(content, Object.assign({\n                ref: 'content',\n            }))\n        });\n    });\n\n    app.provide('modal', factory);\n    app.config.globalProperties.$modal = factory;\n};"],"names":["Triggerable","value","button","modal","resolve","handler","key","e","reactive","args","ref","onClick","_sfc_main","defineComponent","Btn","_a","_hoisted_3","_createElementVNode","_hoisted_8","_resolveComponent","_openBlock","_createElementBlock","_normalizeClass","_ctx","_cache","_withKeys","_createCommentVNode","_hoisted_1","_renderSlot","_hoisted_2","_toDisplayString","_createBlock","_Suspense","_withCtx","_resolveDynamicComponent","_hoisted_7","_hoisted_9","_Fragment","_renderList","i","_component_Btn","_mergeProps","ModalFactory","app","props","vnode","el","render","h","type","callback","title","content","promise","reject","ModalPlugin","factory","Modal","status"],"mappings":"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"}