UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 11.4 kB
{"version":3,"file":"messageBox.mjs","sources":["../../../../../../packages/components/message-box/src/messageBox.ts"],"sourcesContent":["import { createVNode, isVNode, markRaw, render } from 'vue'\nimport {\n debugWarn,\n hasOwn,\n isClient,\n isElement,\n isFunction,\n isObject,\n isString,\n isUndefined,\n} from '@element-plus/utils'\nimport MessageBoxConstructor from './index.vue'\n\nimport type { AppContext, ComponentPublicInstance, VNode } from 'vue'\nimport type {\n Action,\n Callback,\n ElMessageBoxOptions,\n ElMessageBoxShortcutMethod,\n IElMessageBox,\n MessageBoxData,\n MessageBoxState,\n} from './message-box.type'\n\n// component default merge props & data\n\nconst messageInstance = new Map<\n ComponentPublicInstance<{ doClose: () => void }>, // marking doClose as function\n {\n options: any\n callback: Callback | undefined\n resolve: (res: any) => void\n reject: (reason?: any) => void\n }\n>()\n\nconst getAppendToElement = (props: any): HTMLElement => {\n let appendTo: HTMLElement | null = document.body\n if (props.appendTo) {\n if (isString(props.appendTo)) {\n appendTo = document.querySelector<HTMLElement>(props.appendTo)\n }\n if (isElement(props.appendTo)) {\n appendTo = props.appendTo\n }\n\n // should fallback to default value with a warning\n if (!isElement(appendTo)) {\n debugWarn(\n 'ElMessageBox',\n 'the appendTo option is not an HTMLElement. Falling back to document.body.'\n )\n appendTo = document.body\n }\n }\n return appendTo\n}\n\nconst initInstance = (\n props: any,\n container: HTMLElement,\n appContext: AppContext | null = null\n) => {\n const vnode = createVNode(\n MessageBoxConstructor,\n props,\n isFunction(props.message) || isVNode(props.message)\n ? {\n default: isFunction(props.message)\n ? props.message\n : () => props.message,\n }\n : null\n )\n vnode.appContext = appContext\n render(vnode, container)\n getAppendToElement(props).appendChild(container.firstElementChild!)\n return vnode.component\n}\n\nconst genContainer = () => {\n return document.createElement('div')\n}\n\nconst showMessage = (options: any, appContext?: AppContext | null) => {\n const container = genContainer()\n // Adding destruct method.\n // when transition leaves emitting `vanish` evt. so that we can do the clean job.\n options.onVanish = () => {\n // not sure if this causes mem leak, need proof to verify that.\n // maybe calling out like 1000 msg-box then close them all.\n render(null, container)\n messageInstance.delete(vm) // Remove vm to avoid mem leak.\n // here we were suppose to call document.body.removeChild(container.firstElementChild)\n // but render(null, container) did that job for us. so that we do not call that directly\n }\n\n options.onAction = (action: Action) => {\n const currentMsg = messageInstance.get(vm)!\n let resolve: Action | { value: string; action: Action }\n if (options.showInput) {\n resolve = { value: vm.inputValue, action }\n } else {\n resolve = action\n }\n if (options.callback) {\n options.callback(resolve, instance.proxy)\n } else {\n if (action === 'cancel' || action === 'close') {\n if (options.distinguishCancelAndClose && action !== 'cancel') {\n currentMsg.reject('close')\n } else {\n currentMsg.reject('cancel')\n }\n } else {\n currentMsg.resolve(resolve)\n }\n }\n }\n\n const instance = initInstance(options, container, appContext)!\n\n // This is how we use message box programmatically.\n // Maybe consider releasing a template version?\n // get component instance like v2.\n const vm = instance.proxy as ComponentPublicInstance<\n {\n visible: boolean\n doClose: () => void\n } & MessageBoxState\n >\n\n for (const prop in options) {\n if (hasOwn(options, prop) && !hasOwn(vm.$props, prop)) {\n if (prop === 'closeIcon' && isObject(options[prop])) {\n vm[prop as keyof ComponentPublicInstance] = markRaw(options[prop])\n } else {\n vm[prop as keyof ComponentPublicInstance] = options[prop]\n }\n }\n }\n\n // change visibility after everything is settled\n vm.visible = true\n return vm\n}\n\nasync function MessageBox(\n options: ElMessageBoxOptions,\n appContext?: AppContext | null\n): Promise<MessageBoxData>\nfunction MessageBox(\n options: ElMessageBoxOptions | string | VNode,\n appContext: AppContext | null = null\n): Promise<{ value: string; action: Action } | Action> {\n if (!isClient) return Promise.reject()\n let callback: Callback | undefined\n if (isString(options) || isVNode(options)) {\n options = {\n message: options,\n }\n } else {\n callback = options.callback\n }\n\n return new Promise((resolve, reject) => {\n const vm = showMessage(\n options,\n appContext ?? (MessageBox as IElMessageBox)._context\n )\n // collect this vm in order to handle upcoming events.\n messageInstance.set(vm, {\n options,\n callback,\n resolve,\n reject,\n })\n })\n}\n\nconst MESSAGE_BOX_VARIANTS = ['alert', 'confirm', 'prompt'] as const\nconst MESSAGE_BOX_DEFAULT_OPTS: Record<\n (typeof MESSAGE_BOX_VARIANTS)[number],\n Partial<ElMessageBoxOptions>\n> = {\n alert: { closeOnPressEscape: false, closeOnClickModal: false },\n confirm: { showCancelButton: true },\n prompt: { showCancelButton: true, showInput: true },\n}\n\nMESSAGE_BOX_VARIANTS.forEach((boxType) => {\n ;(MessageBox as IElMessageBox)[boxType] = messageBoxFactory(\n boxType\n ) as ElMessageBoxShortcutMethod\n})\n\nfunction messageBoxFactory(boxType: (typeof MESSAGE_BOX_VARIANTS)[number]) {\n return (\n message: string | VNode,\n title: string | ElMessageBoxOptions,\n options?: ElMessageBoxOptions,\n appContext?: AppContext | null\n ) => {\n let titleOrOpts = ''\n if (isObject(title)) {\n options = title as ElMessageBoxOptions\n titleOrOpts = ''\n } else if (isUndefined(title)) {\n titleOrOpts = ''\n } else {\n titleOrOpts = title as string\n }\n\n return MessageBox(\n Object.assign(\n {\n title: titleOrOpts,\n message,\n type: '',\n ...MESSAGE_BOX_DEFAULT_OPTS[boxType],\n },\n options,\n {\n boxType,\n }\n ),\n appContext\n )\n }\n}\n\nMessageBox.close = () => {\n // instance.setupInstall.doClose()\n // instance.setupInstall.state.visible = false\n\n messageInstance.forEach((_, vm) => {\n vm.doClose()\n })\n\n messageInstance.clear()\n}\n;(MessageBox as IElMessageBox)._context = null\n\nexport default MessageBox as IElMessageBox\n"],"names":[],"mappings":"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"}