drawer.ts 3.2 KB

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