UNPKG

element-plus

Version:

A Component Library for Vue 3

111 lines (108 loc) 3.58 kB
import { isVNode, createVNode, render } from 'vue'; import NotificationConstructor from './notification2.mjs'; import { notificationTypes } from './notification.mjs'; import { isClient } from '@vueuse/core'; import { isString, isFunction } from '@vue/shared'; import { isElement, isUndefined } from '../../../utils/types.mjs'; import { debugWarn } from '../../../utils/error.mjs'; const notifications = { "top-left": [], "top-right": [], "bottom-left": [], "bottom-right": [] }; const GAP_SIZE = 16; let seed = 1; const notify = function(options = {}, context) { if (!isClient) return { close: () => void 0 }; if (isString(options) || isVNode(options)) { options = { message: options }; } const position = options.position || "top-right"; let verticalOffset = options.offset || 0; notifications[position].forEach(({ vm: vm2 }) => { var _a; verticalOffset += (((_a = vm2.el) == null ? void 0 : _a.offsetHeight) || 0) + GAP_SIZE; }); verticalOffset += GAP_SIZE; const id = `notification_${seed++}`; const userOnClose = options.onClose; const props = { ...options, offset: verticalOffset, id, onClose: () => { close(id, position, userOnClose); } }; let appendTo = document.body; if (isElement(options.appendTo)) { appendTo = options.appendTo; } else if (isString(options.appendTo)) { appendTo = document.querySelector(options.appendTo); } if (!isElement(appendTo)) { debugWarn("ElNotification", "the appendTo option is not an HTMLElement. Falling back to document.body."); appendTo = document.body; } const container = document.createElement("div"); const vm = createVNode(NotificationConstructor, props, isFunction(props.message) ? props.message : isVNode(props.message) ? () => props.message : null); vm.appContext = isUndefined(context) ? notify._context : context; vm.props.onDestroy = () => { render(null, container); }; render(vm, container); notifications[position].push({ vm }); appendTo.appendChild(container.firstElementChild); return { close: () => { vm.component.exposed.visible.value = false; } }; }; notificationTypes.forEach((type) => { notify[type] = (options = {}, appContext) => { if (isString(options) || isVNode(options)) { options = { message: options }; } return notify({ ...options, type }, appContext); }; }); function close(id, position, userOnClose) { const orientedNotifications = notifications[position]; const idx = orientedNotifications.findIndex(({ vm: vm2 }) => { var _a; return ((_a = vm2.component) == null ? void 0 : _a.props.id) === id; }); if (idx === -1) return; const { vm } = orientedNotifications[idx]; if (!vm) return; userOnClose == null ? void 0 : userOnClose(vm); const removedHeight = vm.el.offsetHeight; const verticalPos = position.split("-")[0]; orientedNotifications.splice(idx, 1); const len = orientedNotifications.length; if (len < 1) return; for (let i = idx; i < len; i++) { const { el, component } = orientedNotifications[i].vm; const pos = Number.parseInt(el.style[verticalPos], 10) - removedHeight - GAP_SIZE; component.props.offset = pos; } } function closeAll() { for (const orientedNotifications of Object.values(notifications)) { orientedNotifications.forEach(({ vm }) => { vm.component.exposed.visible.value = false; }); } } notify.closeAll = closeAll; notify._context = null; export { close, closeAll, notify as default }; //# sourceMappingURL=notify.mjs.map