UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 7.01 kB
{"version":3,"file":"message-method.mjs","sources":["../../../../../../packages/components/message/src/message-method.ts"],"sourcesContent":["import { createVNode, render } from 'vue'\nimport { isVNode } from '@element-plus/utils/util'\nimport PopupManager from '@element-plus/utils/popup-manager'\nimport isServer from '@element-plus/utils/isServer'\nimport { debugWarn } from '@element-plus/utils/error'\nimport MessageConstructor from './message.vue'\nimport { messageTypes } from './message'\n\nimport type { Message, MessageFn, MessageQueue, MessageProps } from './message'\nimport type { ComponentPublicInstance, VNode } from 'vue'\n\nconst instances: MessageQueue = []\nlet seed = 1\n\n// TODO: Since Notify.ts is basically the same like this file. So we could do some encapsulation against them to reduce code duplication.\n\nconst message: MessageFn & Partial<Message> = function (options = {}) {\n if (isServer) return { close: () => undefined }\n\n if (\n !isVNode(options) &&\n typeof options === 'object' &&\n options.grouping &&\n !isVNode(options.message) &&\n instances.length\n ) {\n const tempVm: any = instances.find(\n (item) =>\n `${item.vm.props?.message ?? ''}` ===\n `${(options as any).message ?? ''}`\n )\n if (tempVm) {\n tempVm.vm.component!.props.repeatNum += 1\n tempVm.vm.component!.props.type = options?.type\n return {\n close: () =>\n ((\n vm.component!.proxy as ComponentPublicInstance<{ visible: boolean }>\n ).visible = false),\n }\n }\n }\n\n if (typeof options === 'string' || isVNode(options)) {\n options = { message: options }\n }\n\n let verticalOffset = options.offset || 20\n instances.forEach(({ vm }) => {\n verticalOffset += (vm.el?.offsetHeight || 0) + 16\n })\n verticalOffset += 16\n\n const id = `message_${seed++}`\n const userOnClose = options.onClose\n const props: Partial<MessageProps> = {\n zIndex: PopupManager.nextZIndex(),\n offset: verticalOffset,\n ...options,\n id,\n onClose: () => {\n close(id, userOnClose)\n },\n }\n\n let appendTo: HTMLElement | null = document.body\n if (options.appendTo instanceof HTMLElement) {\n appendTo = options.appendTo\n } else if (typeof options.appendTo === 'string') {\n appendTo = document.querySelector(options.appendTo)\n }\n // should fallback to default value with a warning\n if (!(appendTo instanceof HTMLElement)) {\n debugWarn(\n 'ElMessage',\n 'the appendTo option is not an HTMLElement. Falling back to document.body.'\n )\n appendTo = document.body\n }\n\n const container = document.createElement('div')\n\n container.className = `container_${id}`\n\n const message = props.message\n const vm = createVNode(\n MessageConstructor,\n props,\n isVNode(props.message) ? { default: () => message } : null\n )\n\n // clean message element preventing mem leak\n vm.props!.onDestroy = () => {\n render(null, container)\n // since the element is destroy, then the VNode should be collected by GC as well\n // we do not want cause any mem leak because we have returned vm as a reference to users\n // so that we manually set it to false.\n }\n\n render(vm, container)\n // instances will remove this item when close function gets called. So we do not need to worry about it.\n instances.push({ vm })\n appendTo.appendChild(container.firstElementChild!)\n\n return {\n // instead of calling the onClose function directly, setting this value so that we can have the full lifecycle\n // for out component, so that all closing steps will not be skipped.\n close: () =>\n ((\n vm.component!.proxy as ComponentPublicInstance<{ visible: boolean }>\n ).visible = false),\n }\n}\n\nmessageTypes.forEach((type) => {\n message[type] = (options = {}) => {\n if (typeof options === 'string' || isVNode(options)) {\n options = {\n message: options,\n }\n }\n return message({\n ...options,\n type,\n })\n }\n})\n\nexport function close(id: string, userOnClose?: (vm: VNode) => void): void {\n const idx = instances.findIndex(({ vm }) => id === vm.component!.props.id)\n if (idx === -1) return\n\n const { vm } = instances[idx]\n if (!vm) return\n userOnClose?.(vm)\n\n const removedHeight = vm.el!.offsetHeight\n instances.splice(idx, 1)\n\n // adjust other instances vertical offset\n const len = instances.length\n if (len < 1) return\n for (let i = idx; i < len; i++) {\n const pos =\n parseInt(instances[i].vm.el!.style['top'], 10) - removedHeight - 16\n\n instances[i].vm.component!.props.offset = pos\n }\n}\n\nexport function closeAll(): void {\n for (let i = instances.length - 1; i >= 0; i--) {\n const instance = instances[i].vm.component\n ;(instance?.proxy as any)?.close()\n }\n}\n\nmessage.closeAll = closeAll\n\nexport default message as Message\n"],"names":["MessageConstructor"],"mappings":"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"}