8c487d9c6e9448534d7124d5ebbc1951a4cad32b66bbf9c3177701d8f7e8b8680e4b2ee33db4fddb7e3f59083e8c0f62747280020c6451993784a2ef6b0d61 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import { isVNode, render, createVNode } from 'vue';
  2. import MessageConstructor from './message.mjs';
  3. import { messageTypes, MESSAGE_DEFAULT_PLACEMENT, messageDefaults, messagePlacement } from './message2.mjs';
  4. import { getOrCreatePlacementInstances, placementInstances } from './instance.mjs';
  5. import { messageConfig } from '../../config-provider/src/config-provider.mjs';
  6. import { isClient } from '@vueuse/core';
  7. import { isNumber, isBoolean, isElement } from '../../../utils/types.mjs';
  8. import { hasOwn, isString, isFunction } from '@vue/shared';
  9. import { debugWarn } from '../../../utils/error.mjs';
  10. let seed = 1;
  11. const normalizeAppendTo = (normalized) => {
  12. const appendTo = normalized.appendTo;
  13. if (!appendTo) {
  14. normalized.appendTo = document.body;
  15. } else if (isString(normalized.appendTo)) {
  16. let appendTo2 = document.querySelector(normalized.appendTo);
  17. if (!isElement(appendTo2)) {
  18. appendTo2 = document.body;
  19. }
  20. normalized.appendTo = appendTo2;
  21. }
  22. };
  23. const normalizePlacement = (normalized) => {
  24. if (!normalized.placement && isString(messageConfig.placement) && messageConfig.placement) {
  25. normalized.placement = messageConfig.placement;
  26. }
  27. if (!normalized.placement) {
  28. normalized.placement = MESSAGE_DEFAULT_PLACEMENT;
  29. }
  30. if (!messagePlacement.includes(normalized.placement)) {
  31. debugWarn("ElMessage", `Invalid placement: ${normalized.placement}. Falling back to '${MESSAGE_DEFAULT_PLACEMENT}'.`);
  32. normalized.placement = MESSAGE_DEFAULT_PLACEMENT;
  33. }
  34. };
  35. const normalizeOptions = (params) => {
  36. const options = !params || isString(params) || isVNode(params) || isFunction(params) ? { message: params } : params;
  37. const normalized = {
  38. ...messageDefaults,
  39. ...options
  40. };
  41. normalizeAppendTo(normalized);
  42. normalizePlacement(normalized);
  43. if (isBoolean(messageConfig.grouping) && !normalized.grouping) {
  44. normalized.grouping = messageConfig.grouping;
  45. }
  46. if (isNumber(messageConfig.duration) && normalized.duration === 3e3) {
  47. normalized.duration = messageConfig.duration;
  48. }
  49. if (isNumber(messageConfig.offset) && normalized.offset === 16) {
  50. normalized.offset = messageConfig.offset;
  51. }
  52. if (isBoolean(messageConfig.showClose) && !normalized.showClose) {
  53. normalized.showClose = messageConfig.showClose;
  54. }
  55. if (isBoolean(messageConfig.plain) && !normalized.plain) {
  56. normalized.plain = messageConfig.plain;
  57. }
  58. return normalized;
  59. };
  60. const closeMessage = (instance) => {
  61. const placement = instance.props.placement || MESSAGE_DEFAULT_PLACEMENT;
  62. const instances = placementInstances[placement];
  63. const idx = instances.indexOf(instance);
  64. if (idx === -1)
  65. return;
  66. instances.splice(idx, 1);
  67. const { handler } = instance;
  68. handler.close();
  69. };
  70. const createMessage = ({ appendTo, ...options }, context) => {
  71. const id = `message_${seed++}`;
  72. const userOnClose = options.onClose;
  73. const container = document.createElement("div");
  74. const props = {
  75. ...options,
  76. id,
  77. onClose: () => {
  78. userOnClose == null ? void 0 : userOnClose();
  79. closeMessage(instance);
  80. },
  81. onDestroy: () => {
  82. render(null, container);
  83. }
  84. };
  85. const vnode = createVNode(MessageConstructor, props, isFunction(props.message) || isVNode(props.message) ? {
  86. default: isFunction(props.message) ? props.message : () => props.message
  87. } : null);
  88. vnode.appContext = context || message._context;
  89. render(vnode, container);
  90. appendTo.appendChild(container.firstElementChild);
  91. const vm = vnode.component;
  92. const handler = {
  93. close: () => {
  94. vm.exposed.close();
  95. }
  96. };
  97. const instance = {
  98. id,
  99. vnode,
  100. vm,
  101. handler,
  102. props: vnode.component.props
  103. };
  104. return instance;
  105. };
  106. const message = (options = {}, context) => {
  107. if (!isClient)
  108. return { close: () => void 0 };
  109. const normalized = normalizeOptions(options);
  110. const instances = getOrCreatePlacementInstances(normalized.placement || MESSAGE_DEFAULT_PLACEMENT);
  111. if (normalized.grouping && instances.length) {
  112. const instance2 = instances.find(({ vnode: vm }) => {
  113. var _a;
  114. return ((_a = vm.props) == null ? void 0 : _a.message) === normalized.message;
  115. });
  116. if (instance2) {
  117. instance2.props.repeatNum += 1;
  118. instance2.props.type = normalized.type;
  119. return instance2.handler;
  120. }
  121. }
  122. if (isNumber(messageConfig.max) && instances.length >= messageConfig.max) {
  123. return { close: () => void 0 };
  124. }
  125. const instance = createMessage(normalized, context);
  126. instances.push(instance);
  127. return instance.handler;
  128. };
  129. messageTypes.forEach((type) => {
  130. message[type] = (options = {}, appContext) => {
  131. const normalized = normalizeOptions(options);
  132. return message({ ...normalized, type }, appContext);
  133. };
  134. });
  135. function closeAll(type) {
  136. for (const placement in placementInstances) {
  137. if (hasOwn(placementInstances, placement)) {
  138. const instances = [...placementInstances[placement]];
  139. for (const instance of instances) {
  140. if (!type || type === instance.props.type) {
  141. instance.handler.close();
  142. }
  143. }
  144. }
  145. }
  146. }
  147. function closeAllByPlacement(placement) {
  148. if (!placementInstances[placement])
  149. return;
  150. const instances = [...placementInstances[placement]];
  151. instances.forEach((instance) => instance.handler.close());
  152. }
  153. message.closeAll = closeAll;
  154. message.closeAllByPlacement = closeAllByPlacement;
  155. message._context = null;
  156. export { closeAll, closeAllByPlacement, message as default };
  157. //# sourceMappingURL=method.mjs.map