messageBox.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var vue = require('vue');
  4. var index = require('./index.js');
  5. var core = require('@vueuse/core');
  6. var shared = require('@vue/shared');
  7. var types = require('../../../utils/types.js');
  8. var error = require('../../../utils/error.js');
  9. const messageInstance = /* @__PURE__ */ new Map();
  10. const getAppendToElement = (props) => {
  11. let appendTo = document.body;
  12. if (props.appendTo) {
  13. if (shared.isString(props.appendTo)) {
  14. appendTo = document.querySelector(props.appendTo);
  15. }
  16. if (types.isElement(props.appendTo)) {
  17. appendTo = props.appendTo;
  18. }
  19. if (!types.isElement(appendTo)) {
  20. error.debugWarn("ElMessageBox", "the appendTo option is not an HTMLElement. Falling back to document.body.");
  21. appendTo = document.body;
  22. }
  23. }
  24. return appendTo;
  25. };
  26. const initInstance = (props, container, appContext = null) => {
  27. const vnode = vue.createVNode(index["default"], props, shared.isFunction(props.message) || vue.isVNode(props.message) ? {
  28. default: shared.isFunction(props.message) ? props.message : () => props.message
  29. } : null);
  30. vnode.appContext = appContext;
  31. vue.render(vnode, container);
  32. getAppendToElement(props).appendChild(container.firstElementChild);
  33. return vnode.component;
  34. };
  35. const genContainer = () => {
  36. return document.createElement("div");
  37. };
  38. const showMessage = (options, appContext) => {
  39. const container = genContainer();
  40. options.onVanish = () => {
  41. vue.render(null, container);
  42. messageInstance.delete(vm);
  43. };
  44. options.onAction = (action) => {
  45. const currentMsg = messageInstance.get(vm);
  46. let resolve;
  47. if (options.showInput) {
  48. resolve = { value: vm.inputValue, action };
  49. } else {
  50. resolve = action;
  51. }
  52. if (options.callback) {
  53. options.callback(resolve, instance.proxy);
  54. } else {
  55. if (action === "cancel" || action === "close") {
  56. if (options.distinguishCancelAndClose && action !== "cancel") {
  57. currentMsg.reject("close");
  58. } else {
  59. currentMsg.reject("cancel");
  60. }
  61. } else {
  62. currentMsg.resolve(resolve);
  63. }
  64. }
  65. };
  66. const instance = initInstance(options, container, appContext);
  67. const vm = instance.proxy;
  68. for (const prop in options) {
  69. if (shared.hasOwn(options, prop) && !shared.hasOwn(vm.$props, prop)) {
  70. if (prop === "closeIcon" && shared.isObject(options[prop])) {
  71. vm[prop] = vue.markRaw(options[prop]);
  72. } else {
  73. vm[prop] = options[prop];
  74. }
  75. }
  76. }
  77. vm.visible = true;
  78. return vm;
  79. };
  80. function MessageBox(options, appContext = null) {
  81. if (!core.isClient)
  82. return Promise.reject();
  83. let callback;
  84. if (shared.isString(options) || vue.isVNode(options)) {
  85. options = {
  86. message: options
  87. };
  88. } else {
  89. callback = options.callback;
  90. }
  91. return new Promise((resolve, reject) => {
  92. const vm = showMessage(options, appContext != null ? appContext : MessageBox._context);
  93. messageInstance.set(vm, {
  94. options,
  95. callback,
  96. resolve,
  97. reject
  98. });
  99. });
  100. }
  101. const MESSAGE_BOX_VARIANTS = ["alert", "confirm", "prompt"];
  102. const MESSAGE_BOX_DEFAULT_OPTS = {
  103. alert: { closeOnPressEscape: false, closeOnClickModal: false },
  104. confirm: { showCancelButton: true },
  105. prompt: { showCancelButton: true, showInput: true }
  106. };
  107. MESSAGE_BOX_VARIANTS.forEach((boxType) => {
  108. MessageBox[boxType] = messageBoxFactory(boxType);
  109. });
  110. function messageBoxFactory(boxType) {
  111. return (message, title, options, appContext) => {
  112. let titleOrOpts = "";
  113. if (shared.isObject(title)) {
  114. options = title;
  115. titleOrOpts = "";
  116. } else if (types.isUndefined(title)) {
  117. titleOrOpts = "";
  118. } else {
  119. titleOrOpts = title;
  120. }
  121. return MessageBox(Object.assign({
  122. title: titleOrOpts,
  123. message,
  124. type: "",
  125. ...MESSAGE_BOX_DEFAULT_OPTS[boxType]
  126. }, options, {
  127. boxType
  128. }), appContext);
  129. };
  130. }
  131. MessageBox.close = () => {
  132. messageInstance.forEach((_, vm) => {
  133. vm.doClose();
  134. });
  135. messageInstance.clear();
  136. };
  137. MessageBox._context = null;
  138. exports["default"] = MessageBox;
  139. //# sourceMappingURL=messageBox.js.map