This commit is contained in:
2026-09-18 17:38:14 +08:00
parent cebf3a2ea1
commit b9e401af4f
10 changed files with 859 additions and 659 deletions
+286 -108
View File
@@ -1,4 +1,5 @@
import React from 'react';
import React, { CSSProperties } from 'react';
import { FormInstance, Rule } from 'rc-field-form/es/interface';
import PropTypes from 'prop-types';
/**
@@ -13,124 +14,274 @@ import PropTypes from 'prop-types';
*/
declare function useFnRun(fn: string, initialValue: any, params?: any, fns?: any, basicForm?: any, resultType?: string): [any, any];
/** useStructure 返回的表单结构数据,请求完成前为 `{ items: [], hides: [] }` */
interface FormStructure {
/** 记录主键 */
pk?: unknown
/** 表单唯一标识 */
uuid?: string
/** 表单编码 */
code?: string
/** 关联资源标识 */
resource?: string
/** 字段对齐方式 */
align?: unknown
/** 网格列数 */
cols?: number
/** 网格行高(px) */
rowHeight?: number
/** 网格水平间距(px) */
marginX?: number
/** 网格垂直间距(px) */
marginY?: number
/** 容器主题标识,对应 core.getWidgetComponent 的加载路径 */
theme?: string
/** 传给 theme 组件的 $setting 配置 */
themeProps?: Record<string, unknown>
/** 字段分组配置 */
groups?: FormGroup[]
/** 字段联动监听字段列表(字段 code 数组) */
listenChangeFields?: string[]
/** 字段联动处理函数/表达式,经 func.exec 执行 */
listenChangeFieldsFunc?: WidgetDecorator
/** 可见字段列表(field.hidden 为 false) */
items?: FormItem[]
/** 隐藏字段列表(field.hidden 为 true) */
hides?: FormField[]
}
/** 表单字段定义(对应后端返回的 field 对象) */
interface FormField {
/** 字段 name,对应 rc-field-form Field.name */
code?: string
/** 字段值类型(string/number/boolean/array/bool/json 等) */
type?: string
/** 字段标签 */
label?: string
/** 是否必填 */
required?: boolean
/** 是否隐藏 */
hidden?: boolean
/** 输入占位文字 */
placeholder?: string
/** 是否隐藏 FormItem 样式 */
noStyle?: boolean
/** FormItem 根节点行内样式 */
style?: CSSProperties
/** 字段提示文字 */
help?: string
/** 校验规则配置 */
validators?: FieldValidators
/** 透传给控件 $setting 的扩展配置 */
extras?: Record<string, unknown>
/** 字段初始值 */
initialValue?: unknown
/** 初始值语言(用于特定类型的取值转换) */
initialValueLanguage?: string
/** 虚拟字段,不参与表单提交 */
isVirtual?: boolean
/** 控件标识 */
widget?: string
/** 控件前缀 */
widgetPrefix?: string
/** 控件切换表达式/函数 */
widgetDecorator?: WidgetDecorator
/** 可切换的候选子控件列表 */
subWidgets?: SubWidget[]
}
/** 表单项(网格布局单元,包含字段定义与布局信息) */
interface FormItem {
/** 字段定义 */
field?: FormField
/** 网格 x 坐标 */
x?: number
/** 网格 y 坐标 */
y?: number
/** 网格宽度(列数) */
w?: number
/** 网格高度(行数) */
h?: number
[key: string]: unknown
}
/** 字段分组配置,用于主题多分组渲染 */
interface FormGroup {
/** 分组唯一标识 */
key: string
/** 分组显示标签 */
label?: string
[key: string]: unknown
}
/**
* 增强后的表单实例,在 rc-field-form FormInstance 基础上补全 antd 兼容接口
* (__INTERNAL__ / scrollToField / focusField / getFieldInstance)
*/
type EnhancedFormInstance = FormInstance & Record<string, unknown>
/** useFormData / useFormSubmit / useFormAction 的表单配置参数 */
interface FormSetting {
/** 初始化数据的请求地址,默认 `/api/{code}` */
initDataUri?: string
/** 初始化数据的请求方法,默认 `'GET'` */
initDataMethod?: string
/** 提交数据的请求地址,默认 `/api/{code}` */
submitDataUri?: string
/** 提交数据的请求方法,默认 `'POST'` */
submitDataMethod?: string
}
/** useFormSubmit / useFormAction 的提交选项 */
interface SubmitOptions {
/** 提交前对表单数据做转换,默认原样返回 */
serialize?: (data: Record<string, unknown>) => unknown
/** 提交成功回调 */
onSuccess?: (res: unknown) => void
/** 提交失败回调,默认校验错误时弹出提示 */
onFail?: (error: unknown) => void
}
/** widgetDecorator 命中时可切换的候选子控件 */
interface SubWidget {
/** 控件标识,规则同 GridLayoutFormWidget.widget */
widget: string
/** 控件前缀,默认同外层 widgetPrefix */
widgetPrefix?: string
/** 合并到实际控件的额外 props */
props?: Record<string, unknown>
}
/** 决定控件切换的表达式或函数,经 useFnRun 执行,返回值作为 subWidgets 下标 */
type WidgetDecorator = string | ((...args: unknown[]) => number | undefined)
/** useFieldArray 的返回值 */
interface UseFieldArrayReturn {
/** 当前受控数组(始终是干净的原始数组,不含注入字段) */
items: unknown[]
/** 返回第 i 项的稳定 React key,供 map 时使用 */
keyAt: (i: number) => string
/** 追加一个或多个项到末尾 */
append: (...values: unknown[]) => void
/** 插入一个或多个项到开头 */
prepend: (...values: unknown[]) => void
/** 在指定下标处插入一个或多个项 */
insert: (index: number, ...values: unknown[]) => void
/** 按下标删除一个或多个项 */
remove: (...indexes: number[]) => void
/** 清空所有项 */
clear: () => void
/** 替换指定下标的项 */
update: (index: number, value: unknown) => void
/** 整体替换数组内容 */
reset: (value: unknown) => void
/** 交换两个下标的项 */
swap: (indexA: number, indexB: number) => void
/** 将 from 处的项移动到 to 位置 */
move: (from: number, to: number) => void
}
/**
* GridLayoutFormWidget 字段校验规则配置
* 对应 useRules 的入参,由 validators prop 传入
*/
interface FieldValidators {
/** 校验类型:string 长度校验 / pattern 正则校验 / validator 自定义 */
type?: 'string' | 'pattern' | 'validator' | ''
/** 是否必填 */
required?: boolean
/** 最大长度/值(type='string' 时生效) */
max?: number
/** 最小长度/值(type='string' 时生效) */
min?: number
/** 正则表达式(type='pattern' 时生效) */
pattern?: string | RegExp
/** 校验失败提示文字 */
message?: string
/** 自定义校验表达式/函数(type='validator' 时经 func.exec 执行) */
validator?: unknown
}
/**
* 按表单编码(code)拉取表单结构定义,并把字段列表拆分为可见项(items)与隐藏项(hides)
* @param {string} code 表单编码,为空时不发起请求
* @returns {{items?: Array<Object>, hides?: Array<Object>, pk?: *, uuid?: string, code?: string, resource?: string, align?: *, cols?: number, rowHeight?: number, marginX?: number, marginY?: number, theme?: string, themeProps?: Object, groups?: Array<Object>, listenChangeFields?: *, listenChangeFieldsFunc?: *}} 表单结构数据,请求完成前为 `{ items: [], hides: [] }`
* @returns {FormStructure} 表单结构数据,请求完成前为 `{ items: [], hides: [] }`
*/
declare function useStructure(code: string): {
items?: Array<any>;
hides?: Array<any>;
pk?: any;
uuid?: string;
code?: string;
resource?: string;
align?: any;
cols?: number;
rowHeight?: number;
marginX?: number;
marginY?: number;
theme?: string;
themeProps?: any;
groups?: Array<any>;
listenChangeFields?: any;
listenChangeFieldsFunc?: any;
};
declare function useStructure(code: string): FormStructure;
/**
* 根据字段的校验配置生成 rc-field-form 的 rules 数组;支持必填、长度限制、正则、自定义校验函数
* @param {Object} [config]
* @param {number} [config.max=0] 最大长度/值(type 为 'string' 时使用)
* @param {number} [config.min=0] 最小长度/值(type 为 'string' 时使用)
* @param {'string'|'pattern'|'validator'|''} [config.type=''] 校验类型
* @param {string} [config.message] 校验失败提示语
* @param {string|RegExp} [config.pattern] type 为 'pattern' 时使用的正则
* @param {boolean} [config.required=false] 是否必填
* @param {*} [config.validator] type 为 'validator' 时执行的表达式/函数(经 func.exec 执行)
* @param {FieldValidators} config
* @param {string} fieldName 字段名,传给自定义 validator 表达式
* @param {string} fieldType 字段类型('number'|'string'|'array'|'bool'|'json' 等),决定必填校验的 type 及 bool/json 的映射
* @returns {Array<Object>} rc-field-form 规则数组
* @returns {Rule[]} rc-field-form 规则数组
*/
declare function useRules({ max, min, type, message, pattern, required, validator, }?: {
max?: number;
min?: number;
type?: "string" | "pattern" | "validator" | "";
message?: string;
pattern?: string | RegExp;
required?: boolean;
validator?: any;
}, fieldName: string, fieldType: string): Array<any>;
declare function useRules({ max, min, type, message, pattern, required, validator, }: FieldValidators, fieldName: string, fieldType: string): Rule[];
/**
* 按主键(primaryKey)拉取表单初始数据;primaryKey 为空时不请求
* @param {string} code 表单编码,用于拼接默认的请求地址 `/api/{code}`
* @param {string|number} primaryKey 记录主键,为空时不发起请求
* @param {Object} [formSetting] 表单配置
* @param {string} [formSetting.initDataUri] 初始化数据的请求地址,默认 `/api/{code}`
* @param {string} [formSetting.initDataMethod='GET'] 初始化数据的请求方法
* @returns {Object|null} 拉取到的表单数据,请求完成前为 `null`
* @param {FormSetting} [formSetting] 表单配置
* @returns {Record<string, unknown>|null} 拉取到的表单数据,请求完成前为 `null`
*/
declare function useFormData(code: string, primaryKey: string | number, formSetting?: {
initDataUri?: string;
initDataMethod?: string;
}): any | null;
declare function useFormData(code: string, primaryKey: string | number, formSetting?: FormSetting): Record<string, unknown> | null;
/**
* 生成提交表单的回调函数;校验通过后按 `__RESOURCE__` 字段值裁剪数据(若存在),经 opt.serialize 序列化后提交
* @param {string} code 表单编码,用于拼接默认的请求地址 `/api/{code}`
* @param {string|number} primaryKey 记录主键,存在时拼到请求地址后面
* @param {Object} [formSetting] 表单配置
* @param {string} [formSetting.submitDataUri] 提交数据的请求地址,默认 `/api/{code}`
* @param {string} [formSetting.submitDataMethod='POST'] 提交数据的请求方法
* @returns {(form: Object, opt?: {serialize?: Function, onSuccess?: Function, onFail?: Function}) => Promise<*>} 提交函数;opt.serialize 用于提交前转换数据,onSuccess/onFail 为成功/失败回调(默认失败时如为校验错误会弹出提示)
* @param {FormSetting} [formSetting] 表单配置
* @returns {(form: FormInstance, opt?: SubmitOptions) => Promise<*>} 提交函数
*/
declare function useFormSubmit(code: string, primaryKey: string | number, formSetting?: {
submitDataUri?: string;
submitDataMethod?: string;
}): (form: any, opt?: {
serialize?: Function;
onSuccess?: Function;
onFail?: Function;
}) => Promise<any>;
declare function useFormSubmit(code: string, primaryKey: string | number, formSetting?: FormSetting): (form: FormInstance, opt?: SubmitOptions) => Promise<any>;
/**
* 组合 useFormData 与 useFormSubmit:数据拉取到后自动回填表单(否则重置),并返回已绑定 form 的提交函数
* @param {Object} form rc-field-form 的表单实例
* @param {FormInstance} form rc-field-form 的表单实例
* @param {string} code 表单编码
* @param {string|number} primaryKey 记录主键
* @param {Object} [formSetting] 表单配置(透传给 useFormData/useFormSubmit)
* @returns {(opt?: {serialize?: Function, onSuccess?: Function, onFail?: Function}) => Promise<*>} 已绑定当前 form 的提交函数
* @param {FormSetting} [formSetting] 表单配置(透传给 useFormData/useFormSubmit)
* @returns {(opt?: SubmitOptions) => Promise<*>} 已绑定当前 form 的提交函数
*/
declare function useFormAction(form: any, code: string, primaryKey: string | number, formSetting?: any): (opt?: {
serialize?: Function;
onSuccess?: Function;
onFail?: Function;
}) => Promise<any>;
declare function useFormAction(form: FormInstance, code: string, primaryKey: string | number, formSetting?: FormSetting): (opt?: SubmitOptions) => Promise<any>;
/**
* 根据 widgetDecorator 表达式动态决定字段实际渲染的控件;
* widgetDecorator 执行结果为 subWidgets 的下标时,切换为对应子控件(合并其 props),
* 同时暴露 setDisabled/setRequired/getDisabled/getRequired 供 widgetDecorator 内部调用来动态调整禁用/必填状态
* @param {string} itemWidget 默认使用的控件(已归一化的 widget 路径)
* @param {*} widgetDecorator 决定控件切换的表达式/函数,经 useFnRun 执行,返回值作为 subWidgets 下标
* @param {Array<{widget: string, widgetPrefix?: string, props?: Object}>} [subWidgets=[]] 可切换的候选子控件列表
* @param {Object} [basicForm={}] 传给 widgetDecorator 执行上下文的表单实例
* @param {WidgetDecorator} widgetDecorator 决定控件切换的表达式/函数,经 useFnRun 执行,返回值作为 subWidgets 下标
* @param {SubWidget[]} [subWidgets=[]] 可切换的候选子控件列表
* @param {FormInstance|null} [basicForm={}] 传给 widgetDecorator 执行上下文的表单实例
* @returns {[string, Object]} `[实际渲染的控件路径, 当前生效的控件 props]`
*/
declare function useWidgetDecorator(itemWidget: string, widgetDecorator: any, subWidgets?: Array<{
widget: string;
widgetPrefix?: string;
props?: any;
}>, basicForm?: any): [string, any];
declare function useWidgetDecorator(itemWidget: string, widgetDecorator: WidgetDecorator, subWidgets?: SubWidget[], basicForm?: FormInstance | null): [string, any];
/**
* 把受控的 value/onChange 与 rc-field-form 表单实例双向桥接:外部 value 变化时同步进表单
* (仅当与内部最近一次变更不同,避免循环),表单内部变化时回调 onChange;
* 同时补全一份兼容 antd Form 的 `__INTERNAL__`/getFieldInstance 等接口(scrollToField/focusField 未实现,仅打印警告)
* @param {Object} config
* @param {Object} [config.value] 外部受控值,变化时会同步到表单
* @param {(allValues: Object) => void} [config.onChange] 表单值变化时的回调
* @param {Object} [form=null] 复用的 rc-field-form 表单实例,不传则内部创建
* @returns {[Object, (changedValues: Object, allValues: Object) => void]} `[增强后的表单实例, 供 Form onValuesChange 使用的处理函数]`
* @param {Record<string, unknown>} [config.value] 外部受控值,变化时会同步到表单
* @param {(allValues: Record<string, unknown>) => void} [config.onChange] 表单值变化时的回调
* @param {FormInstance|null} [form=null] 复用的 rc-field-form 表单实例,不传则内部创建
* @returns {[EnhancedFormInstance, (changedValues: Record<string, unknown>, allValues: Record<string, unknown>) => void]} `[增强后的表单实例(补全 antd __INTERNAL__/scrollToField 等接口), 供 Form onValuesChange 使用的处理函数]`
*/
declare function useMergedFormValuesChange({ value, onChange }: {
value?: any;
onChange?: (allValues: any) => void;
}, form?: any): [any, (changedValues: any, allValues: any) => void];
value?: Record<string, unknown>;
onChange?: (allValues: Record<string, unknown>) => void;
}, form?: FormInstance | null): [EnhancedFormInstance, (changedValues: Record<string, unknown>, allValues: Record<string, unknown>) => void];
/**
* 受控的数组字段管理 hook,提供 append/prepend/insert/remove/update/set/clear/swap/move
* 等操作方法,调用方无需手写 immutability-helper 语句。
*
* 数据不归 hook 自己管,由外部通过 value/onChange 控制(对应 antd Form.Item 受控字段契约)。
*
* **稳定 key 设计**:不向 items 数据注入额外字段,改为单独提供 `keyAt(i)` 按下标查询——
* items 始终是干净的原始数组。key 由内部自增 id 生成(用下标当 key 时,删除中间项会导致
* React 按位置复用组件实例,表现为"删第 1 条,视觉上最后一条消失"),外部整体替换 value
* 时自动按长度兜底同步。
*
* @param {*} value 受控数组值(antd Form.Item 注入的 value),任意类型经 toPrimitive 强转为数组
* @param {(value: Array) => void} onChange 数组变化回调(antd Form.Item 注入的 onChange)
* @returns {UseFieldArrayReturn} 当前数组及全部操作方法
*/
declare function useFieldArray(value: any, onChange: (value: any[]) => void): UseFieldArrayReturn;
/**
* 按 widget 标识异步加载并渲染对应的表单部件,加载完成前不渲染任何内容;
@@ -138,16 +289,43 @@ declare function useMergedFormValuesChange({ value, onChange }: {
* @param {Object} props
* @param {string} [props.widget='Input'] 部件标识;以 `@` 或 `blob:` 开头时按原样使用,否则拼接 widgetPrefix 前缀
* @param {string} [props.widgetPrefix='@pkg/ff/grid-layout-forms'] widget 非绝对标识时使用的前缀
* @param {*} [props.widgetDecorator] 决定控件切换的表达式/函数,详见 useWidgetDecorator
* @param {Array<Object>} [props.subWidgets=[]] widgetDecorator 命中时可切换的候选子控件列表
* @param {*} [props.basicForm] 表达式求值/字段联动用的外层表单实例
* @param {WidgetDecorator} [props.widgetDecorator] 决定控件切换的表达式/函数,详见 useWidgetDecorator
* @param {SubWidget[]} [props.subWidgets=[]] widgetDecorator 命中时可切换的候选子控件列表
* @param {FormInstance|null} [props.basicForm] 表达式求值/字段联动用的外层表单实例
* @param {string} [props.code] 字段 name,对应 rc-field-form Field.name
* @param {string} [props.type] 字段值类型(string/number/boolean 等),用于取值归一化
* @param {string} [props.label] 字段标签
* @param {boolean} [props.required] 是否必填
* @param {string} [props.placeholder] 输入占位文字,透传给实际控件
* @param {boolean} [props.noStyle] 是否隐藏 FormItem 的 label/border 等样式
* @param {Object} [props.style] FormItem 根节点行内样式
* @param {string} [props.help] 字段提示文字(tooltip)
* @param {FieldValidators} [props.validators] 校验规则配置,合并到 rc-field-form rules
* @param {Object} [props.extras] 透传给 ItemWidget.$setting 的扩展配置(key 由 defaultProps.extras 定义)
* @param {*} [props.initialValue] 字段初始值
* @param {string} [props.initialValueLanguage] 初始值语言(用于特定类型的取值转换)
* @param {boolean} [props.isVirtual] 虚拟字段,不参与表单提交
* 其余未识别的 props 经 itemWidgetRender 透传到实际控件的 fieldProps 中
*/
declare function GridLayoutFormWidget({ widget, widgetPrefix, widgetDecorator, subWidgets, basicForm, ...props }: {
widget?: string;
widgetPrefix?: string;
widgetDecorator?: any;
subWidgets?: Array<any>;
basicForm?: any;
widgetDecorator?: WidgetDecorator;
subWidgets?: SubWidget[];
basicForm?: FormInstance | null;
code?: string;
type?: string;
label?: string;
required?: boolean;
placeholder?: string;
noStyle?: boolean;
style?: any;
help?: string;
validators?: FieldValidators;
extras?: any;
initialValue?: any;
initialValueLanguage?: string;
isVirtual?: boolean;
}): undefined;
/**
@@ -174,49 +352,49 @@ declare function GridLayoutFormHelper({ $setting, $close, extras, code, primaryK
* 以及指定 theme 时委托 GridLayoutFramework 渲染主题外壳
* @param {Object} props
* @param {string} [props.name] 表单字段容器名
* @param {*} [props.form] 外部传入的 rc-field-form 表单实例,不传时内部自建
* @param {*} [props.basicForm] 表达式求值/字段联动用的外层表单实例
* @param {Object} [props.style] 容器行内样式
* @param {FormInstance|null} [props.form] 外部传入的 rc-field-form 表单实例,不传时内部自建
* @param {FormInstance|null} [props.basicForm] 表达式求值/字段联动用的外层表单实例
* @param {CSSProperties} [props.style] 容器行内样式
* @param {string} [props.className] 容器额外 class 名
* @param {number} [props.cols=24] 栅格列数
* @param {number} [props.rowHeight=16] 栅格行高(px)
* @param {[number, number]} [props.itemMargin=[8, 16]] 字段项间距 [横向, 纵向](px)
* @param {[number, number]} [props.containerPadding=[0, 0]] 容器内边距 [纵向, 横向](px)
* @param {Array} [props.fields=[]] 可见字段配置列表(位置、尺寸、部件类型等)
* @param {Array} [props.hides=[]] 隐藏字段配置列表,按 initialValueLanguage 求值后写入对应字段
* @param {FormItem[]} [props.fields=[]] 可见字段配置列表(位置、尺寸、部件类型等)
* @param {FormField[]} [props.hides=[]] 隐藏字段配置列表,按 initialValueLanguage 求值后写入对应字段
* @param {string|number} [props.primaryKey=0] 记录主键,注入为 `__PRIMARY_KEY__` 字段值
* @param {Object} [props.formProps={}] 注入为 `__PROPS__` 字段值的表单级参数
* @param {Array} [props.formFields=[]] 额外注入的表单字段(与 formProps/primaryKey 一并作为初始 fields)
* @param {Array} [props.listenChangeFields] 触发联动表达式重新求值的字段列表
* @param {Record<string, unknown>} [props.formProps={}] 注入为 `__PROPS__` 字段值的表单级参数
* @param {FormItem[]} [props.formFields=[]] 额外注入的表单字段(与 formProps/primaryKey 一并作为初始 fields)
* @param {string[]} [props.listenChangeFields] 触发联动表达式重新求值的字段列表
* @param {*} [props.listenChangeFieldsFunc] 字段值变化时执行的联动表达式(经 func.exec 执行)
* @param {(changedValues: Object, allValues: Object) => void} [props.onValuesChange] 表单值变化回调,先于联动表达式执行
* @param {string} [props.theme] 主题组件标识,指定时通过 GridLayoutFramework 渲染主题外壳
* @param {Object} [props.themeProps={}] 传给主题组件的额外参数
* @param {Array} [props.groups=[{key:'default',label:'默认'}]] 字段分组配置,用于主题多分组渲染
* @param {*} [props.children] 附加渲染在字段项之后的内容
* @param {FormGroup[]} [props.groups=[{key:'default',label:'默认'}]] 字段分组配置,用于主题多分组渲染
* @param {ReactNode} [props.children] 附加渲染在字段项之后的内容
*/
declare function GridLayoutForm({ name, form: initForm, basicForm, style, className, cols, rowHeight, itemMargin, containerPadding, fields, hides, primaryKey, formProps, formFields, listenChangeFields, listenChangeFieldsFunc, onValuesChange, theme, themeProps, groups, children, ...props }: {
name?: string;
form?: any;
basicForm?: any;
style?: any;
form?: FormInstance | null;
basicForm?: FormInstance | null;
style?: React.CSSProperties;
className?: string;
cols?: number;
rowHeight?: number;
itemMargin?: [number, number];
containerPadding?: [number, number];
fields?: any[];
hides?: any[];
fields?: FormItem[];
hides?: FormField[];
primaryKey?: string | number;
formProps?: any;
formFields?: any[];
listenChangeFields?: any[];
formProps?: Record<string, unknown>;
formFields?: FormItem[];
listenChangeFields?: string[];
listenChangeFieldsFunc?: any;
onValuesChange?: (changedValues: any, allValues: any) => void;
theme?: string;
themeProps?: any;
groups?: any[];
children?: any;
groups?: FormGroup[];
children?: React.ReactNode;
}): React.JSX.Element;
declare namespace GridLayoutForm {
namespace propTypes {
@@ -230,4 +408,4 @@ declare const _default: ({ code, isPreview, ...props }: {
isPreview?: boolean;
}) => React.JSX.Element;
export { GridLayoutForm, GridLayoutFormHelper, GridLayoutFormWidget, _default as default, useFnRun, useFormAction, useFormData, useFormSubmit, useMergedFormValuesChange, useRules, useStructure, useWidgetDecorator };
export { GridLayoutForm, GridLayoutFormHelper, GridLayoutFormWidget, _default as default, useFieldArray, useFnRun, useFormAction, useFormData, useFormSubmit, useMergedFormValuesChange, useRules, useStructure, useWidgetDecorator };