DynamicForm.ts 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. import type { Rule, RuleItem, Rules } from "async-validator";
  2. import type { FormInstance, FormProps } from "../form/Form.vue";
  3. import type { FieldProps } from "../form/Field.vue";
  4. import type { ColProps } from "../layout/grid/Col.vue";
  5. import type { RowProps } from "../layout/grid/Row.vue";
  6. export interface IDynamicFormOptions {
  7. /**
  8. * 表单额外属性
  9. */
  10. formAdditionaProps?: Omit<FormProps, 'model'>;
  11. /**
  12. * 表单校验规则
  13. */
  14. formRules?: Rules;
  15. /**
  16. * 子条目定义
  17. */
  18. formItems: IDynamicFormItem[];
  19. /**
  20. * 是否在根级别抑制错误提示
  21. */
  22. suppressRootError?: boolean;
  23. /**
  24. * 空文本
  25. */
  26. emptyText?: string;
  27. /**
  28. * 是否禁用表单
  29. */
  30. disabled?: boolean;
  31. /**
  32. * 是否只读表单
  33. */
  34. readonly?: boolean;
  35. /**
  36. * 是否屏蔽所有子条目空错误。默认否
  37. * @default false
  38. */
  39. suppressEmptyError?: boolean,
  40. /**
  41. * 当显示嵌套的表单对象条目时是否在前部显示缩进,
  42. * 缩进大小可使用 CSS 变量 `--dynamic-form-item-nest-margin` 自定义。默认是 20px
  43. * @default true
  44. */
  45. nestObjectMargin?: boolean,
  46. }
  47. /**
  48. * 表单动态属性定义
  49. */
  50. export declare type IDynamicFormItemCallback<T> = {
  51. /**
  52. * 预留,暂未使用
  53. */
  54. type?: string;
  55. /**
  56. * @param model 当前表单条目的值
  57. * @param rawModel 整个 form 的值 (最常用,当两个关联组件距离较远时,可以从顶层的 rawModel 里获取)
  58. * @param parentModel 父表单元素的值 (上一级的值,只在列表场景的使用,例如列表某个元素的父级就是整个 item)
  59. * @param item 当前表单条目信息
  60. */
  61. callback: (model: any, rawModel: any, parentModel: any, params: {
  62. /**
  63. * 当前表单条目
  64. */
  65. item: IDynamicFormItem,
  66. /**
  67. * 当前表单条目的父级,为空时表示当前条目为根级别。
  68. */
  69. parent?: IDynamicFormItem,
  70. /**
  71. * 当前表单组件实例
  72. */
  73. form: IDynamicFormRef,
  74. /**
  75. * 全局参数。由表单组件顶层添加额外的参数。
  76. */
  77. formGlobalParams: IDynamicFormObject,
  78. /**
  79. * 当前条目校验数据
  80. */
  81. formRules?: Record<string, Rule>,
  82. /**
  83. * 是否是所在层级的第一个表单项
  84. */
  85. isFirst: boolean,
  86. /**
  87. * 是否是所在层级的最后一个表单项
  88. */
  89. isLast: boolean,
  90. }) => T;
  91. };
  92. export type IDynamicFormItemCallbackAdditionalProps<T> = { [P in keyof T]?: T[P]|IDynamicFormItemCallback<T[P]> }
  93. export type DynamicFormNestNameGenerateType = 'dot'|'array'
  94. /**
  95. * 表单事件中心消息名称
  96. */
  97. /**
  98. * 重新加载表单项目。由条目自由处理。
  99. */
  100. export const MESSAGE_RELOAD = 'reload';
  101. export type IDynamicFormObject = Record<string, any>
  102. /**
  103. * 表单动态组件属性定义
  104. */
  105. export interface IDynamicFormComponentAdditionalDefine {
  106. /**
  107. * 组件名称
  108. */
  109. name: string,
  110. /**
  111. * 是否需要显示右侧箭头
  112. */
  113. needArrow?: boolean,
  114. /**
  115. * 传递给表单条目的参数
  116. */
  117. itemProps?: FieldProps,
  118. /**
  119. * 传递给组件的参数
  120. */
  121. props?: Record<string, unknown>|unknown,
  122. }
  123. export interface IDynamicFormItem {
  124. /**
  125. * 表单项显示标签
  126. */
  127. label?: string|IDynamicFormItemCallback<string>;
  128. /**
  129. * 属性名称
  130. */
  131. name: string;
  132. /**
  133. * 表单项组件类型
  134. */
  135. type?: string;
  136. /**
  137. * 传递给条目组件的参数。(允许动态回调)
  138. */
  139. additionalProps?: Record<string, unknown|IDynamicFormItemCallback<unknown>>|unknown;
  140. /**
  141. * 传递给FormItem组件的参数
  142. */
  143. formProps?: FieldProps;
  144. /**
  145. * 默认值,用于默认数据生成
  146. */
  147. defaultValue?: any;
  148. /**
  149. * 是否屏蔽空错误。默认否
  150. * @default false
  151. */
  152. suppressEmptyError?: boolean,
  153. /**
  154. * 当前条目的校验规则
  155. */
  156. rules?: RuleItem[],
  157. /**
  158. * 子条目,在对象中为对象子属性,在数组中为数组条目(单条目按单项控制,多条目按对象看待控制)
  159. */
  160. children?: IDynamicFormItem[],
  161. /**
  162. * 是否显示。当为undefined时,默认显示。
  163. */
  164. show?: boolean|IDynamicFormItemCallback<boolean>|undefined,
  165. /**
  166. * 是否禁用当前表单项
  167. */
  168. disabled?: boolean|IDynamicFormItemCallback<boolean>;
  169. /**
  170. * 当前条目组件加载时发生事件
  171. * @param nowModel 当前表单条目的值
  172. * @param rawModel 顶层数据对象
  173. * @param ref 组件实例
  174. * @returns
  175. */
  176. mounted?: (nowModel: any, rawModel: any, ref: any) => void;
  177. /**
  178. * 当前条目组件卸载时发生事件
  179. * @param nowModel 当前表单条目的值
  180. * @param rawModel 顶层数据对象
  181. * @param ref 组件实例
  182. * @returns
  183. */
  184. beforeUnmount?: (nowModel: any, rawModel: any, ref: any) => void;
  185. /**
  186. * 当前条目数据更改时发生事件
  187. * @param oldValue 旧值
  188. * @param newValue 新值
  189. * @param topModel 顶层数据对象
  190. * @param ref 组件实例
  191. * @returns
  192. */
  193. watch?: (oldValue: any, newValue: any, rawModel: any, ref: any) => void;
  194. /**
  195. * 监听从外部或者其他表单发送过来的消息事件
  196. * @param messageName 消息名称
  197. * @param data 消息数据
  198. * @param getComponentRef 当前组件的实例
  199. * @returns
  200. */
  201. message?: (messageName: string, data: unknown, getComponentRef: () => unknown) => void,
  202. /**
  203. * 当子对象为数组时,可设置这个自定义回调。用于添加按钮新建一个对象,如果这个函数为空,则没有添加按钮。
  204. */
  205. newChildrenObject?: (arrayNow: unknown[]) => unknown;
  206. /**
  207. * 当子对象为数组时,可设置这个自定义回调。删除按钮回调,可选,不提供时默认操作为将 item 从 array 中移除。
  208. */
  209. deleteChildrenCallback?: (arrayNow: unknown[], deleteObject: unknown) => unknown;
  210. /**
  211. * 子条目的 Col 配置属性(应用到当前条目的所有子条目上)。仅在 object 或者其他容器条目中有效。
  212. */
  213. childrenColProps?: ColProps,
  214. /**
  215. * 当前条目的 Col 配置属性(应用到当前条目上)。仅在 object 或者其他容器条目中有效。
  216. */
  217. colProps?: ColProps,
  218. /**
  219. * 当前条目的 Row 配置属性(应用到当前条目上)。仅在 object 或者其他容器条目中有效。
  220. */
  221. rowProps?: RowProps,
  222. /**
  223. * 当显示嵌套的表单对象条目时是否在前部显示缩进。默认是
  224. */
  225. nestObjectMargin?: boolean,
  226. //内部使用,不建议外部调用
  227. fullName?: string;
  228. }
  229. export interface IDynamicFormRef {
  230. /**
  231. * 获取表单组件的 Ref
  232. * @returns
  233. */
  234. getFormRef: () => FormInstance;
  235. /**
  236. * 获取指定表单项组件的 Ref
  237. * @returns
  238. */
  239. getFormItemControlRef: <T>(key: string) => T;
  240. /**
  241. * 获取指定类型的所有表单项组件的 Ref
  242. * @param type 组件类型
  243. * @returns
  244. */
  245. getFormItemControlRefsByType: <T>(type: string) => T[];
  246. /**
  247. * 触发提交。同 getFormRef().submit() 。
  248. * @returns
  249. */
  250. submit: () => void;
  251. /**
  252. * 验证当前表单数据是否有效。同 getFormRef().validate() 。
  253. * @returns
  254. */
  255. validate: () => Promise<void>;
  256. /**
  257. * 外部修改指定单个 field 的数据
  258. * @param path 路径
  259. * @param value 值
  260. * @returns
  261. */
  262. setValueByPath: (path: string|string[], value: unknown) => void,
  263. /**
  264. * 外部获取指定单个 field 的数据
  265. * @param path 路径
  266. * @returns
  267. */
  268. getValueByPath: (path: string|string[]) => unknown,
  269. /**
  270. * 向所有或者指定的子组件分发消息事件。
  271. * @param messageName 消息名称。
  272. * @param data 可选参数。
  273. * @param receiveFilter 可选名称筛选正则,此正则通过名称的子组件会接受事件,其他则不会。
  274. * @returns
  275. */
  276. dispatchMessage: (messageName: string, data?: unknown, receiveFilter?: RegExp) => void;
  277. /**
  278. * 向所有子组件分发重新加载消息事件。
  279. * @returns
  280. */
  281. dispatchReload: () => void;
  282. /**
  283. * 获取当前表单中可见的所有字段名
  284. */
  285. getVisibleFormNames: () => string[];
  286. /**
  287. * 初始化表单默认值到模型中,对于已有数据非空的字段,不会覆盖已有的值。
  288. * @returns
  289. */
  290. initDefaultValuesToModel: () => void;
  291. }
  292. /**
  293. * 默认的动态表单属性
  294. */
  295. export let defaultDynamicFormOptions = {} as IDynamicFormOptions;
  296. /**
  297. * 配置默认的动态表单属性,配置后将会对所有动态表单生效。
  298. * @param options 参数
  299. */
  300. export function configDefaultDynamicFormOptions(options: Omit<IDynamicFormOptions, 'formItems'>) {
  301. defaultDynamicFormOptions = {
  302. ...defaultDynamicFormOptions,
  303. ...options,
  304. };
  305. }
  306. export type IEvaluateCallback = <T>(val: T | IDynamicFormItemCallback<T>) => T;
  307. export type IDynamicFormMessageCenterCallback = (messageName: string, data: unknown) => void;
  308. export type IDynamicFormWidgetRef = () => unknown;
  309. export interface IDynamicFormMessageCenter {
  310. addInstance: (name: string, fn: IDynamicFormMessageCenterCallback) => void,
  311. addWidgetRef: (name: string, type: string, ref: IDynamicFormWidgetRef) => void,
  312. removeWidgetRef: (name: string, type: string, ref: IDynamicFormWidgetRef) => void,
  313. removeInstance: (name: string) => void,
  314. }