UNPKG

bootstrap-vue-next

Version:

BootstrapVueNext is an early and lovely component library for Vue 3 & Nuxt 3 based on Bootstrap 5 and Typescript.

1 lines 11.2 kB
{"version":3,"file":"index.mjs","sources":["../../../../src/plugins/modalController/index.ts"],"sourcesContent":["import {\n isReadonly,\n isRef,\n markRaw,\n nextTick,\n onScopeDispose,\n type Plugin,\n ref,\n type Ref,\n toRef,\n toValue,\n watch,\n type WatchHandle,\n} from 'vue'\nimport {modalControllerPluginKey} from '../../utils/keys'\nimport type {\n ControllerKey,\n ModalOrchestratorCreateOptions,\n ModalOrchestratorCreateParam,\n ModalOrchestratorMapValue,\n ModalOrchestratorParam,\n PromiseWithModal,\n PromiseWithModalBoolean,\n PromiseWithModalInternal,\n} from '../../types/ComponentOrchestratorTypes'\nimport type {BvTriggerableEvent} from 'src/utils'\n\nexport const modalControllerPlugin: Plugin = {\n install(app) {\n const modals = ref(new Map<ControllerKey, ModalOrchestratorMapValue>())\n\n const _isOrchestratorInstalled = ref(false)\n\n const buildPromise = (\n _id: ControllerKey\n ): {\n value: PromiseWithModal | PromiseWithModalBoolean\n resolve: (value: BvTriggerableEvent | boolean | null) => void\n stop?: WatchHandle\n } => {\n let resolveFunc: (value: BvTriggerableEvent | boolean | null) => void = () => {}\n\n const promise = new Promise<BvTriggerableEvent | boolean | null>((resolve) => {\n resolveFunc = resolve\n }) as PromiseWithModal | PromiseWithModalBoolean\n Object.assign(promise, {\n id: _id,\n ref: null,\n show() {\n if (!this.ref) return this.set({modelValue: true})\n this.ref.show()\n return promise\n },\n hide(trigger?: string) {\n if (!this.ref) return this.set({modelValue: false})\n this.ref.hide(trigger, true)\n return promise\n },\n toggle() {\n if (!this.ref) return this.set({modelValue: !this.get()?.modelValue})\n this.ref.toggle()\n return promise\n },\n get() {\n return modals.value.get(_id)\n },\n set(val: Partial<ModalOrchestratorParam>) {\n const modal = modals.value.get(_id)\n if (modal) {\n const v = {...toValue(modal), ...toValue(val)}\n // add modal to v\n if (modal.modelValue !== v.modelValue) {\n modal['onUpdate:modelValue']?.(v.modelValue as boolean)\n }\n modals.value.set(_id, {\n ...v,\n title: toValue(v.title),\n body: toValue(v.body),\n modelValue: toValue(v.modelValue),\n })\n }\n return promise\n },\n async destroy() {\n const modal = modals.value.get(_id)\n if (!modal) return\n modal.promise.stop?.()\n if (modal.modelValue) {\n await new Promise((resolve) => {\n modal.modelValue = false\n const prev = modal['onHidden']\n modal['onHidden'] = (e) => {\n prev?.(e)\n resolve(e)\n }\n nextTick(() => {\n modal['onUpdate:modelValue']?.(false)\n })\n })\n }\n modals.value.delete(_id)\n },\n\n async [Symbol.asyncDispose]() {\n await this.destroy()\n },\n } as PromiseWithModalInternal)\n\n return {\n value: promise,\n resolve: resolveFunc,\n }\n }\n\n /**\n * @returns {PromiseWithModal} Returns a promise object with methods to control the modal (show, hide, toggle, get, set, destroy)\n */\n const create = (\n obj: ModalOrchestratorCreateParam = {},\n options: ModalOrchestratorCreateOptions = {}\n ): PromiseWithModal | PromiseWithModalBoolean => {\n if (!_isOrchestratorInstalled.value) {\n throw new Error(\n 'The BModalOrchestrator component must be mounted to use the modal controller'\n )\n }\n\n const {component, slots} = toValue(obj)\n if (component) {\n if (isRef(obj)) obj.value.component = markRaw(component)\n else if (typeof obj === 'object') obj.component = markRaw(component)\n }\n if (slots) {\n if (isRef(obj)) obj.value.slots = markRaw(slots)\n else if (typeof obj === 'object') obj.slots = markRaw(slots)\n }\n const resolvedProps = toRef(obj)\n const _self = resolvedProps.value?.id || Symbol('Modals controller')\n\n const promise = buildPromise(_self)\n\n promise.stop = watch(\n resolvedProps,\n (_newValue) => {\n const newValue = {...toValue(_newValue)}\n const previous = modals.value.get(_self)\n // if (!previous) return\n const v = {\n ...(previous || {}),\n }\n\n if (newValue.props) {\n Object.assign(v, newValue.props)\n newValue.props = undefined\n }\n for (const key in newValue) {\n if (key.startsWith('on')) {\n v[key as keyof ModalOrchestratorCreateParam] =\n newValue[key as keyof ModalOrchestratorCreateParam]\n } else {\n v[key as keyof ModalOrchestratorCreateParam] = toValue(\n newValue[key as keyof ModalOrchestratorCreateParam]\n )\n }\n }\n modals.value.set(_self, {\n ...v,\n ...(v.modelValue === undefined && {modelValue: true}),\n 'onUpdate:modelValue': (val: boolean) => {\n newValue['onUpdate:modelValue']?.(val)\n const {modelValue} = toValue(obj)\n if (isRef(obj) && !isRef(modelValue)) obj.value.modelValue = val\n if (isRef(modelValue) && !isReadonly(modelValue)) {\n ;(modelValue as Ref<ModalOrchestratorMapValue['modelValue']>).value = val\n }\n const modal = modals.value.get(_self)\n if (modal) {\n modals.value.set(_self, {\n ...modal,\n modelValue: val,\n })\n }\n },\n options,\n promise,\n })\n },\n {\n immediate: true,\n deep: true,\n }\n )\n onScopeDispose(() => {\n const modal = modals.value.get(_self)\n if (modal) {\n modal.promise.value.destroy?.()\n }\n }, true)\n return promise.value\n }\n\n /*\n * @deprecated use create({}).show() instead\n */\n const show = (obj: ModalOrchestratorCreateParam = {}): PromiseWithModalBoolean => {\n // eslint-disable-next-line no-console\n console.warn(\n '[BootstrapVueNext] useModalController: The show() method is deprecated. Use create({}).show() instead.'\n )\n return create(obj, {returnBoolean: true}).show() as PromiseWithModalBoolean\n }\n /*\n * @deprecated use create({}).show() instead\n */\n const confirm = (obj: ModalOrchestratorCreateParam = {}): PromiseWithModalBoolean => {\n // eslint-disable-next-line no-console\n console.warn(\n '[BootstrapVueNext] useModalController: The confirm() method is deprecated. Use create({}).show() instead.'\n )\n return create(obj, {returnBoolean: true}).show() as PromiseWithModalBoolean\n }\n\n app.provide(modalControllerPluginKey, {\n _isOrchestratorInstalled,\n create,\n modals,\n show,\n confirm,\n })\n },\n}\n"],"names":["_a"],"mappings":"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"}