element-plus
Version:
A Component Library for Vue 3
1 lines • 13.8 kB
Source Map (JSON)
{"version":3,"file":"method.mjs","sources":["../../../../../../packages/components/message/src/method.ts"],"sourcesContent":["import { createVNode, isVNode, render } from 'vue'\nimport {\n debugWarn,\n hasOwn,\n isBoolean,\n isClient,\n isElement,\n isFunction,\n isNumber,\n isString,\n} from '@element-plus/utils'\nimport { messageConfig } from '@element-plus/components/config-provider'\nimport MessageConstructor from './message.vue'\nimport {\n MESSAGE_DEFAULT_PLACEMENT,\n messageDefaults,\n messagePlacement,\n messageTypes,\n} from './message'\nimport { getOrCreatePlacementInstances, placementInstances } from './instance'\n\nimport type { MessageContext } from './instance'\nimport type { AppContext } from 'vue'\nimport type {\n Message,\n MessageFn,\n MessageHandler,\n MessageOptions,\n MessageParams,\n MessageParamsNormalized,\n MessagePlacement,\n MessageType,\n} from './message'\n\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 normalizeAppendTo = (normalized: MessageOptions) => {\n const appendTo = normalized.appendTo\n if (!appendTo) {\n normalized.appendTo = document.body\n } else if (isString(normalized.appendTo)) {\n let appendTo = document.querySelector<HTMLElement>(normalized.appendTo)\n\n // should fallback to default value with a warning\n if (!isElement(appendTo)) {\n debugWarn(\n 'ElMessage',\n 'the appendTo option is not an HTMLElement. Falling back to document.body.'\n )\n appendTo = document.body\n }\n normalized.appendTo = appendTo\n }\n}\n\nconst normalizePlacement = (normalized: MessageOptions) => {\n // if placement is not passed and global has config, use global config\n if (\n !normalized.placement &&\n isString(messageConfig.placement) &&\n messageConfig.placement\n ) {\n normalized.placement = messageConfig.placement as\n | MessagePlacement\n | undefined\n }\n // if placement is not passed and global has no config, use default config\n if (!normalized.placement) {\n normalized.placement = MESSAGE_DEFAULT_PLACEMENT\n }\n // if placement is not valid, use default config\n if (!messagePlacement.includes(normalized.placement!)) {\n debugWarn(\n 'ElMessage',\n `Invalid placement: ${normalized.placement}. Falling back to '${MESSAGE_DEFAULT_PLACEMENT}'.`\n )\n normalized.placement = MESSAGE_DEFAULT_PLACEMENT\n }\n}\n\nconst normalizeOptions = (params?: MessageParams) => {\n const options: MessageOptions =\n !params || isString(params) || isVNode(params) || isFunction(params)\n ? { message: params }\n : params\n\n const normalized: MessageOptions = {\n ...messageDefaults,\n ...options,\n }\n\n normalizeAppendTo(normalized)\n normalizePlacement(normalized)\n\n // When grouping is configured globally,\n // if grouping is manually set when calling message individually and it is not equal to the default value,\n // the global configuration cannot override the current setting. default => false\n if (isBoolean(messageConfig.grouping) && !normalized.grouping) {\n normalized.grouping = messageConfig.grouping\n }\n if (isNumber(messageConfig.duration) && normalized.duration === 3000) {\n normalized.duration = messageConfig.duration\n }\n if (isNumber(messageConfig.offset) && normalized.offset === 16) {\n normalized.offset = messageConfig.offset\n }\n if (isBoolean(messageConfig.showClose) && !normalized.showClose) {\n normalized.showClose = messageConfig.showClose\n }\n if (isBoolean(messageConfig.plain) && !normalized.plain) {\n normalized.plain = messageConfig.plain\n }\n\n return normalized as MessageParamsNormalized\n}\n\nconst closeMessage = (instance: MessageContext) => {\n const placement = instance.props.placement || MESSAGE_DEFAULT_PLACEMENT\n const instances = placementInstances[placement]\n\n const idx = instances.indexOf(instance)\n if (idx === -1) return\n instances.splice(idx, 1)\n const { handler } = instance\n handler.close()\n}\n\nconst createMessage = (\n { appendTo, ...options }: MessageParamsNormalized,\n context?: AppContext | null\n): MessageContext => {\n const id = `message_${seed++}`\n const userOnClose = options.onClose\n\n const container = document.createElement('div')\n\n const props = {\n ...options,\n // now the zIndex will be used inside the message.vue component instead of here.\n // zIndex: nextIndex() + options.zIndex\n id,\n onClose: () => {\n userOnClose?.()\n closeMessage(instance)\n },\n\n // clean message element preventing mem leak\n onDestroy: () => {\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 render(null, container)\n },\n }\n const vnode = createVNode(\n MessageConstructor,\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 = context || message._context\n\n render(vnode, container)\n // instances will remove this item when close function gets called. So we do not need to worry about it.\n appendTo.appendChild(container.firstElementChild!)\n\n const vm = vnode.component!\n\n const handler: MessageHandler = {\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 vm.exposed!.close()\n },\n }\n\n const instance: MessageContext = {\n id,\n vnode,\n vm,\n handler,\n props: (vnode.component as any).props,\n }\n\n return instance\n}\n\nconst message: MessageFn &\n Partial<Message> & { _context: AppContext | null } = (\n options = {},\n context\n) => {\n if (!isClient) return { close: () => undefined }\n\n const normalized = normalizeOptions(options)\n const instances = getOrCreatePlacementInstances(\n normalized.placement || MESSAGE_DEFAULT_PLACEMENT\n )\n\n if (normalized.grouping && instances.length) {\n const instance = instances.find(\n ({ vnode: vm }) => vm.props?.message === normalized.message\n )\n if (instance) {\n instance.props.repeatNum += 1\n instance.props.type = normalized.type\n return instance.handler\n }\n }\n\n if (isNumber(messageConfig.max) && instances.length >= messageConfig.max) {\n return { close: () => undefined }\n }\n\n const instance = createMessage(normalized, context)\n\n instances.push(instance)\n return instance.handler\n}\n\nmessageTypes.forEach((type) => {\n message[type] = (options = {}, appContext) => {\n const normalized = normalizeOptions(options)\n return message({ ...normalized, type }, appContext)\n }\n})\n\nexport function closeAll(type?: MessageType): void {\n for (const placement in placementInstances) {\n if (hasOwn(placementInstances, placement)) {\n // Create a copy of instances to avoid modification during iteration\n const instances: MessageContext[] = [...placementInstances[placement]]\n for (const instance of instances) {\n if (!type || type === instance.props.type) {\n instance.handler.close()\n }\n }\n }\n }\n}\n\nexport function closeAllByPlacement(placement: MessagePlacement) {\n if (!placementInstances[placement]) return\n // Create a copy of instances to avoid modification during iteration\n const instances = [...placementInstances[placement]]\n instances.forEach((instance) => instance.handler.close())\n}\n\nmessage.closeAll = closeAll\nmessage.closeAllByPlacement = closeAllByPlacement\nmessage._context = null\n\nexport default message as Message\n"],"names":["appendTo","instance"],"mappings":"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"}