element-plus
Version:
A Component Library for Vue 3
1 lines • 11.2 kB
Source Map (JSON)
{"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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"}