modal.ts 3.5 KB

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