modal.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import type { Component, Ref } from 'vue';
  2. import type { MaybePromise } from '@vben-core/typings';
  3. import type { ModalApi } from './modal-api';
  4. export interface ModalProps {
  5. /**
  6. * 是否要挂载到内容区域
  7. * @default false
  8. */
  9. appendToMain?: boolean;
  10. /**
  11. * 是否显示边框
  12. * @default false
  13. */
  14. bordered?: boolean;
  15. /**
  16. * 取消按钮文字
  17. */
  18. cancelText?: string;
  19. /**
  20. * 是否居中
  21. * @default false
  22. */
  23. centered?: boolean;
  24. class?: string;
  25. /**
  26. * 是否显示右上角的关闭按钮
  27. * @default true
  28. */
  29. closable?: boolean;
  30. /**
  31. * 点击弹窗遮罩是否关闭弹窗
  32. * @default true
  33. */
  34. closeOnClickModal?: boolean;
  35. /**
  36. * 按下 ESC 键是否关闭弹窗
  37. * @default true
  38. */
  39. closeOnPressEscape?: boolean;
  40. /**
  41. * 禁用确认按钮
  42. */
  43. confirmDisabled?: boolean;
  44. /**
  45. * 确定按钮 loading
  46. * @default false
  47. */
  48. confirmLoading?: boolean;
  49. /**
  50. * 确定按钮文字
  51. */
  52. confirmText?: string;
  53. contentClass?: string;
  54. /**
  55. * 弹窗描述
  56. */
  57. description?: string;
  58. /**
  59. * 在关闭时销毁弹窗
  60. */
  61. destroyOnClose?: boolean;
  62. /**
  63. * 是否可拖拽
  64. * @default false
  65. */
  66. draggable?: boolean;
  67. /**
  68. * 是否显示底部
  69. * @default true
  70. */
  71. footer?: boolean;
  72. footerClass?: string;
  73. /**
  74. * 是否全屏
  75. * @default false
  76. */
  77. fullscreen?: boolean;
  78. /**
  79. * 是否显示全屏按钮
  80. * @default true
  81. */
  82. fullscreenButton?: boolean;
  83. /**
  84. * 是否显示顶栏
  85. * @default true
  86. */
  87. header?: boolean;
  88. headerClass?: string;
  89. /**
  90. * 弹窗是否显示
  91. * @default false
  92. */
  93. loading?: boolean;
  94. /**
  95. * 是否显示遮罩
  96. * @default true
  97. */
  98. modal?: boolean;
  99. /**
  100. * 是否自动聚焦
  101. */
  102. openAutoFocus?: boolean;
  103. /**
  104. * 弹窗遮罩模糊效果
  105. */
  106. overlayBlur?: number;
  107. /**
  108. * 是否显示取消按钮
  109. * @default true
  110. */
  111. showCancelButton?: boolean;
  112. /**
  113. * 是否显示确认按钮
  114. * @default true
  115. */
  116. showConfirmButton?: boolean;
  117. /**
  118. * 提交中(锁定弹窗状态)
  119. */
  120. submitting?: boolean;
  121. /**
  122. * 弹窗标题
  123. */
  124. title?: string;
  125. /**
  126. * 弹窗标题提示
  127. */
  128. titleTooltip?: string;
  129. /**
  130. * 弹窗层级
  131. */
  132. zIndex?: number;
  133. }
  134. export interface ModalState extends ModalProps {
  135. /** 弹窗打开状态 */
  136. isOpen?: boolean;
  137. /**
  138. * 共享数据
  139. */
  140. sharedData?: Record<string, any>;
  141. }
  142. export type ExtendedModalApi = ModalApi & {
  143. useStore: <T = NoInfer<ModalState>>(
  144. selector?: (state: NoInfer<ModalState>) => T,
  145. ) => Readonly<Ref<T>>;
  146. };
  147. export interface ModalApiOptions extends ModalState {
  148. /**
  149. * 独立的弹窗组件
  150. */
  151. connectedComponent?: Component;
  152. /**
  153. * 关闭前的回调,返回 false 可以阻止关闭
  154. * @returns
  155. */
  156. onBeforeClose?: () => MaybePromise<boolean | undefined>;
  157. /**
  158. * 点击取消按钮的回调
  159. */
  160. onCancel?: () => void;
  161. /**
  162. * 弹窗关闭动画结束的回调
  163. * @returns
  164. */
  165. onClosed?: () => void;
  166. /**
  167. * 点击确定按钮的回调
  168. */
  169. onConfirm?: () => void;
  170. /**
  171. * 弹窗状态变化回调
  172. * @param isOpen
  173. * @returns
  174. */
  175. onOpenChange?: (isOpen: boolean) => void;
  176. /**
  177. * 弹窗打开动画结束的回调
  178. * @returns
  179. */
  180. onOpened?: () => void;
  181. }