zy-react-library/src/components/FormBuilder/FormItemsRenderer.d.ts

212 lines
9.2 KiB
TypeScript
Raw Normal View History

2025-10-22 14:43:42 +08:00
import type { ColProps } from "antd/es/col";
import type { FormItemProps, Rule } from "antd/es/form";
2025-12-02 17:43:11 +08:00
import type { FormListFieldData } from "antd/es/form/FormList";
import type { Gutter } from "antd/es/grid/row";
import type { NamePath, Store } from "rc-field-form/lib/interface";
import type { ReactElement, ReactNode } from "react";
2025-12-18 16:29:53 +08:00
import type { FORM_ITEM_RENDER_TYPE_MAP } from "../../enum/formItemRender";
2025-10-22 14:43:42 +08:00
/**
*
2025-10-22 14:43:42 +08:00
*/
export interface OptionItem {
/** ID字段 */
bianma?: any;
2025-10-22 14:43:42 +08:00
/** 名称字段 */
2026-01-22 17:20:11 +08:00
name?: string | ReactNode;
2026-01-19 14:43:16 +08:00
/** 是否禁用 */
disabled?: boolean;
2025-10-22 14:43:42 +08:00
[key: string]: any;
}
/**
*
*/
export interface ItemsFieldConfig {
2025-12-24 15:45:07 +08:00
/** 值字段的键名,默认 'bianma' */
2025-10-22 14:43:42 +08:00
valueKey?: string;
2025-12-24 15:45:07 +08:00
/** 标签字段的键名,默认 'name' */
2025-12-16 17:17:22 +08:00
labelKey?: string | ((item: Record<string, any>) => ReactNode);
2025-10-22 14:43:42 +08:00
}
2025-12-20 13:50:40 +08:00
/**
* Form.List
*/
export interface FormListOperations {
/** 当前表单项的数据字段信息 */
field: FormListFieldData;
/** 当前项在列表中的索引位置 */
2025-12-24 14:27:07 +08:00
fieldIndex: number;
2025-12-20 13:50:40 +08:00
/** 新增方法 */
add: (defaultValue?: Store, insertIndex?: number) => void;
2025-12-20 13:50:40 +08:00
/** 删除方法 */
remove: (index: number | number[]) => void;
/** 移动方法 */
move: (from: number, to: number) => void;
}
2025-12-02 17:43:11 +08:00
/**
* Form.List
*/
export interface FormListUniqueProps {
/** 是否显示新增按钮,默认 true */
showAddButton?: boolean;
/** 是否显示删除按钮,默认 true */
showRemoveButton?: boolean;
/** 新增按钮的文本,默认 '添加' */
addButtonText?: string;
/** 删除按钮的文本,默认 '删除' */
removeButtonText?: string;
/** 表单配置项 */
2025-12-24 14:27:07 +08:00
options: (field: FormListFieldData, fieldIndex: number, operations: FormListOperations) => FormOption[];
2025-12-02 17:43:11 +08:00
/** 点击新增按钮时的默认值 */
addDefaultValue?: Store;
2025-12-02 17:43:11 +08:00
/** 点击新增按钮时插入的索引位置 */
addInsertIndex?: number;
}
/**
*
*/
type WhenTrue<Condition extends boolean, T> = Condition extends true ? never : T;
/**
*
*/
type FormOptionProperty<IsOnlyForLabel extends boolean, IsCustomizeRender extends boolean, T> = WhenTrue<IsOnlyForLabel, WhenTrue<IsCustomizeRender, T>>;
2025-10-22 14:43:42 +08:00
/**
*
2025-10-22 14:43:42 +08:00
*/
export interface FormOptionBase<Values = any, IsOnlyForLabel extends boolean = false, IsCustomizeRender extends boolean = false> {
2025-11-05 14:42:39 +08:00
/** React 需要的 key如果传递了唯一的 name则不需要 */
key?: string;
2025-10-22 14:43:42 +08:00
/** 表单项字段名 */
name?: NamePath<Values>;
2025-10-22 14:43:42 +08:00
/** 表单项标签 */
label?: ReactNode;
2025-12-12 15:53:38 +08:00
/** 占据栅格列数,默认 12 */
span?: WhenTrue<IsOnlyForLabel, number | string>;
2025-10-22 14:43:42 +08:00
/** 是否必填,默认 true支持函数动态计算 */
required?: FormOptionProperty<IsOnlyForLabel, IsCustomizeRender, boolean | ((formValues: Values) => boolean)>;
2025-10-22 14:43:42 +08:00
/** 验证规则 */
rules?: FormOptionProperty<IsOnlyForLabel, IsCustomizeRender, Rule | Rule[]>;
2025-12-15 15:26:56 +08:00
/** 是否使用字符验证限制 */
useConstraints?: FormOptionProperty<IsOnlyForLabel, IsCustomizeRender, boolean>;
2025-10-22 14:43:42 +08:00
/** 占位符文本,默认会根据传入的 render 类型自动判断(请选择、请输入)和 label 组合 */
placeholder?: FormOptionProperty<IsOnlyForLabel, IsCustomizeRender, ReactNode>;
2025-10-22 14:43:42 +08:00
/** 提示信息,传入将在 label 右侧生成图标展示 tooltip */
tip?: FormOptionProperty<IsOnlyForLabel, IsCustomizeRender, ReactNode>;
2025-10-22 14:43:42 +08:00
/** 是否隐藏,默认 false支持函数动态计算 */
hidden?: WhenTrue<IsOnlyForLabel, boolean | ((formValues: Values) => boolean)>;
2025-11-11 09:10:08 +08:00
/** 是否自定义渲染,完全交给外部控制渲染,默认 false */
customizeRender?: IsCustomizeRender;
2025-10-22 14:43:42 +08:00
/** 传递给 Form.Item 的属性,支持函数动态计算 */
formItemProps?: FormOptionProperty<IsOnlyForLabel, IsCustomizeRender, FormItemProps | ((formValues: Values) => FormItemProps)>;
2025-10-28 12:30:57 +08:00
/** label 栅格配置,默认直接使用外层的 labelCol如果 span 等于 24是外层的 labelCol.span 一半 */
labelCol?: FormOptionProperty<IsOnlyForLabel, IsCustomizeRender, ColProps>;
2025-12-24 15:45:07 +08:00
/** wrapper 栅格配置,默认 24 - labelCol.span */
wrapperCol?: FormOptionProperty<IsOnlyForLabel, IsCustomizeRender, ColProps>;
2025-10-22 14:43:42 +08:00
/** 是否应该更新(用于表单联动) */
shouldUpdate?: FormOptionProperty<IsOnlyForLabel, IsCustomizeRender, boolean | ((prevValues: Values, nextValues: Values, info: { source?: string }) => boolean)>;
2025-10-22 14:43:42 +08:00
/** 依赖字段(用于表单联动) */
dependencies?: FormOptionProperty<IsOnlyForLabel, IsCustomizeRender, NamePath<Values>[]>;
2025-11-10 16:39:38 +08:00
/** 是否仅用于保存标签,不渲染到页面上,只在表单中保存数据,默认 false */
onlyForLabel?: IsOnlyForLabel;
2025-10-22 14:43:42 +08:00
}
/**
* render
*/
export type FormOptionByRender<RenderType extends keyof FORM_ITEM_RENDER_TYPE_MAP, Values = any, IsOnlyForLabel extends boolean = false, IsCustomizeRender extends boolean = false> = FormOptionBase<Values, IsOnlyForLabel, IsCustomizeRender> & {
/** 渲染类型(写字面量时 componentProps 会按该类型推导) */
render: RenderType;
/** 传递给表单控件的属性,类型由 render 决定 */
componentProps?: FormOptionProperty<IsOnlyForLabel, IsCustomizeRender, FORM_ITEM_RENDER_TYPE_MAP[RenderType] | ((formValues: Values) => FORM_ITEM_RENDER_TYPE_MAP[RenderType])>;
/** 选项数据(用于 select、radio、checkbox */
items?: FormOptionProperty<IsOnlyForLabel, IsCustomizeRender, RenderType extends "select" | "radio" | "checkbox" ? OptionItem[] : never>;
/** 字段键配置 */
itemsField?: FormOptionProperty<IsOnlyForLabel, IsCustomizeRender, RenderType extends "select" | "radio" | "checkbox" ? ItemsFieldConfig : never>;
/** checkbox 的栅格数量,如果不传入不使用栅格,传入才使用 */
checkboxCol?: FormOptionProperty<IsOnlyForLabel, IsCustomizeRender, RenderType extends "checkbox" ? number : never>;
/** Form.List 独有的属性 */
formListUniqueProps?: FormOptionProperty<IsOnlyForLabel, IsCustomizeRender, RenderType extends "formList" ? FormListUniqueProps | ((formValues: Values) => FormListUniqueProps) : never>;
};
/**
* render render input
*/
export type FormOptionDefault<Values = any, IsOnlyForLabel extends boolean = false, IsCustomizeRender extends boolean = false> = FormOptionBase<Values, IsOnlyForLabel, IsCustomizeRender> & {
/** 渲染类型,默认 input */
render?: "input" | undefined;
/** 传递给 Input 的属性 */
componentProps?: FORM_ITEM_RENDER_TYPE_MAP["input"] | ((formValues: Values) => FORM_ITEM_RENDER_TYPE_MAP["input"]);
/** 选项数据(用于 select、radio、checkboxinput 时不需要 */
items?: never;
/** 字段键配置input 时不需要 */
itemsField?: never;
/** checkbox 的栅格数量input 时不需要 */
checkboxCol?: never;
/** Form.List 独有的属性input 时不需要 */
formListUniqueProps?: never;
};
/**
* render ReactNode 使
*/
export type FormOptionCustomRender<Values = any, IsOnlyForLabel extends boolean = false, IsCustomizeRender extends boolean = false> = FormOptionBase<Values, IsOnlyForLabel, IsCustomizeRender> & {
/** 渲染类型,默认 ReactNode */
render: ReactNode;
/** 传递给表单控件的属性,自定义渲染时不需要 */
componentProps?: never;
/** 选项数据(用于 select、radio、checkbox自定义渲染时不需要 */
items?: never;
/** 字段键配置,自定义渲染时不需要 */
itemsField?: never;
/** checkbox 的栅格数量,自定义渲染时不需要 */
checkboxCol?: never;
/** Form.List 独有的属性,自定义渲染时不需要 */
formListUniqueProps?: never;
};
/**
*
*/
export type FormOption<Values = any>
= | FormOptionDefault<Values, false, false>
| FormOptionDefault<Values, false, true>
| FormOptionDefault<Values, true, false>
| { [K in keyof FORM_ITEM_RENDER_TYPE_MAP]: FormOptionByRender<K, Values, false, false> }[keyof FORM_ITEM_RENDER_TYPE_MAP]
| { [K in keyof FORM_ITEM_RENDER_TYPE_MAP]: FormOptionByRender<K, Values, false, true> }[keyof FORM_ITEM_RENDER_TYPE_MAP]
| { [K in keyof FORM_ITEM_RENDER_TYPE_MAP]: FormOptionByRender<K, Values, true, false> }[keyof FORM_ITEM_RENDER_TYPE_MAP]
| FormOptionCustomRender<Values, false, false>
| FormOptionCustomRender<Values, false, true>
| FormOptionCustomRender<Values, true, false>;
2025-10-22 14:43:42 +08:00
/**
* FormItemsRenderer
*/
export interface FormItemsRendererProps<Values = any> {
2025-10-22 14:43:42 +08:00
/** 表单配置项数组 */
options: FormOption<Values>[];
2025-10-22 14:43:42 +08:00
/** 默认栅格占据列数,默认 12 */
span?: number;
/** 是否折叠仅显示前3项默认 false */
collapse?: boolean;
/** 自动生成必填规则,默认 true */
useAutoGenerateRequired?: boolean;
2025-10-29 09:38:36 +08:00
/** 初始值,用于在表单未初始化时提供默认值 */
initialValues?: Values;
2025-12-02 17:43:11 +08:00
/** 栅格间距,继承自 FormBuilder */
gutter?: Gutter | [Gutter, Gutter];
/** label 栅格配置,继承自 FormBuilder */
labelCol?: ColProps;
2025-10-22 14:43:42 +08:00
}
/**
*
*/
declare const FormItemsRenderer: <Values = any>(props: FormItemsRendererProps<Values>) => ReactElement;
2025-10-22 14:43:42 +08:00
export default FormItemsRenderer;