UNPKG

tdesign-react

Version:
490 lines (489 loc) 20.5 kB
/** * 该文件为脚本自动生成文件,请勿随意修改。如需修改请联系 PMC * */ import { IsEmailOptions } from 'validator/es/lib/isEmail'; import { IsURLOptions } from 'validator/es/lib/isURL'; import { TNode, FormResetEvent, FormSubmitEvent } from '../common'; export interface TdFormProps<FormData extends Data = Data> { /** * 是否在表单标签字段右侧显示冒号 * @default false */ colon?: boolean; /** * 是否禁用整个表单 */ disabled?: boolean; /** * 表单错误信息配置,示例:`{ idcard: '请输入正确的身份证号码', max: '字符长度不能超过 ${max}' }` */ errorMessage?: FormErrorMessage; /** * 经 `Form.useForm()` 创建的 form 控制实例 */ form?: FormInstanceFunctions; /** * 允许表单统一控制禁用状态的自定义组件名称列表。默认会有组件库的全部输入类组件:TInput、TInputNumber、TCascader、TSelect、TOption、TSwitch、TCheckbox、TCheckboxGroup、TRadio、TRadioGroup、TTreeSelect、TDatePicker、TTimePicker、TUpload、TTransfer、TSlider。对于自定义组件,组件内部需要包含可以控制表单禁用状态的变量 `formDisabled`。示例:`['CustomUpload', 'CustomInput']` */ formControlledComponents?: Array<string>; /** * 表单原生的id属性,支持用于配合非表单内的按钮通过form属性来触发表单事件 */ id?: string; /** * 表单初始数据,重置时所需初始数据,优先级小于 FormItem 设置的 initialData */ initialData?: object; /** * 表单字段标签对齐方式:左对齐、右对齐、顶部对齐 * @default right */ labelAlign?: 'left' | 'right' | 'top'; /** * 可以整体设置label标签宽度,默认为100px * @default '100px' */ labelWidth?: string | number; /** * 表单布局,有两种方式:纵向布局 和 行内布局 * @default vertical */ layout?: 'vertical' | 'inline'; /** * 是否阻止表单提交默认事件(表单提交默认事件会刷新页面),设置为 `true` 可以避免刷新 * @default true */ preventSubmitDefault?: boolean; /** * 是否显示必填符号(*),默认显示 */ requiredMark?: boolean; /** * 表单必填符号(*)显示位置 */ requiredMarkPosition?: 'left' | 'right'; /** * 重置表单的方式,值为 empty 表示重置表单为空,值为 initial 表示重置表单数据为初始值 * @default empty */ resetType?: 'empty' | 'initial'; /** * 表单字段校验规则 */ rules?: FormRules<FormData>; /** * 表单校验不通过时,是否自动滚动到第一个校验不通过的字段,平滑滚动或是瞬间直达。值为空则表示不滚动 */ scrollToFirstError?: '' | 'smooth' | 'auto'; /** * 校验不通过时,是否显示错误提示信息,统一控制全部表单项。如果希望控制单个表单项,请给 FormItem 设置该属性 * @default true */ showErrorMessage?: boolean; /** * 校验状态图标,值为 `true` 显示默认图标,默认图标有 成功、失败、警告 等,不同的状态图标不同。`statusIcon` 值为 `false`,不显示图标。`statusIcon` 值类型为渲染函数,则可以自定义右侧状态图标 */ statusIcon?: boolean | TNode<TdFormItemProps>; /** * 【讨论中】当校验结果只有告警信息时,是否触发 `submit` 提交事件 * @default false */ submitWithWarningMessage?: boolean; /** * 是否支持使用数字作为表单键值,在1.9.3版本后表单组件支持数字作为键值,若仍需要保留数字作为数组下标,请关闭此API * @default true */ supportNumberKey?: boolean; /** * 表单重置时触发 */ onReset?: (context: { e?: FormResetEvent; }) => void; /** * 表单提交时触发。其中 `context.validateResult` 表示校验结果,`context.firstError` 表示校验不通过的第一个规则提醒。`context.validateResult` 值为 `true` 表示校验通过;如果校验不通过,`context.validateResult` 值为校验结果列表。<br />【注意】⚠️ 默认情况,输入框按下 Enter 键会自动触发提交事件,如果希望禁用这个默认行为,可以给输入框添加 enter 事件,并在事件中设置 `e.preventDefault()` */ onSubmit?: (context: SubmitContext<FormData>) => void; /** * 字段值更新时触发的回调事件 */ onValuesChange?: (changedValues: Record<string, unknown>, allValues: Record<string, unknown>) => void; } /** 组件实例方法 */ export interface FormInstanceFunctions<FormData extends Data = Data> { /** * 清空校验结果。可使用 fields 指定清除部分字段的校验结果,fields 值为空则表示清除所有字段校验结果。清除邮箱校验结果示例:`clearValidate(['email'])` */ clearValidate: (fields?: Array<keyof FormData>) => void; /** * 获取 form dom 元素 */ currentElement?: HTMLFormElement; /** * 获取 form dom 元素 */ getCurrentElement?: () => HTMLFormElement; /** * 获取单个字段值 */ getFieldValue: (field: NamePath) => unknown; /** * 获取一组字段名对应的值,当调用 getFieldsValue(true) 时返回所有表单数据 */ getFieldsValue: getFieldsValue<FormData>; /** * 重置表单,表单里面没有重置按钮`<button type=\"reset\" />`时可以使用该方法,默认重置全部字段为空,该方法会触发 `reset` 事件。<br />如果表单属性 `resetType='empty'` 或者 `reset.type='empty'` 会重置为空;<br />如果表单属性 `resetType='initial'` 或者 `reset.type='initial'` 会重置为表单初始值。<br />`reset.fields` 用于设置具体重置哪些字段,示例:`reset({ type: 'initial', fields: ['name', 'age'] })` */ reset: (params?: FormResetParams<FormData>) => void; /** * 设置多组字段状态 */ setFields: (fields: FieldData[]) => void; /** * 设置表单字段值 */ setFieldsValue: (field: Data) => void; /** * 设置自定义校验结果,如远程校验信息直接呈现。注意需要在组件挂载结束后使用该方法。`FormData` 指表单数据泛型 */ setValidateMessage: (message: FormValidateMessage<FormData>) => void; /** * 获取校验结果 */ getValidateMessage: (fields?: Array<keyof FormData>) => Array<FormRule> | void; /** * 提交表单,表单里面没有提交按钮`<button type=\"submit\" />`时可以使用该方法。`showErrorMessage` 表示是否在提交校验不通过时显示校验不通过的原因,默认显示。该方法会触发 `submit` 事件 */ submit: (params?: { showErrorMessage?: boolean; }) => void; /** * 校验函数,包含错误文本提示等功能。泛型 `FormData` 表示表单数据 TS 类型。<br/>【关于参数】`params.fields` 表示校验字段,如果设置了 `fields`,本次校验将仅对这些字段进行校验。`params.trigger` 表示本次触发校验的范围,'params.trigger = blur' 表示只触发校验规则设定为 trigger='blur' 的字段,'params.trigger = change' 表示只触发校验规则设定为 trigger='change' 的字段,默认触发全范围校验。`params.showErrorMessage` 表示校验结束后是否显示错误文本提示,默认显示。<br />【关于返回值】返回值为 true 表示校验通过;如果校验不通过,返回值为校验结果列表 */ validate: (params?: FormValidateParams) => Promise<FormValidateResult<FormData>>; /** * 纯净的校验函数,仅返回校验结果,不对组件进行任何操作。泛型 `FormData` 表示表单数据 TS 类型。参数和返回值含义同 `validate` 方法 */ validateOnly: (params?: Pick<FormValidateParams, 'fields' | 'trigger'>) => Promise<FormValidateResult<FormData>>; } export interface TdFormItemProps { /** * label 原生属性 * @default '' */ for?: string; /** * 表单项说明内容 */ help?: TNode; /** * 表单初始数据,重置时所需初始数据 */ initialData?: InitialData; /** * 字段标签名称 * @default '' */ label?: TNode; /** * 表单字段标签对齐方式:左对齐、右对齐、顶部对齐。默认使用 Form 的对齐方式,优先级高于 Form.labelAlign */ labelAlign?: 'left' | 'right' | 'top'; /** * 可以整体设置标签宽度,优先级高于 Form.labelWidth */ labelWidth?: string | number; /** * 表单字段名称 */ name?: NamePath; /** * 是否显示必填符号(*),优先级高于 Form.requiredMark */ requiredMark?: boolean; /** * 表单字段校验规则 */ rules?: Array<FormRule>; /** * null * @default false */ shouldUpdate?: boolean | ((prevValue: any, curValue: any) => boolean); /** * 校验不通过时,是否显示错误提示信息,优先级高于 `Form.showErrorMessage` */ showErrorMessage?: boolean; /** * 校验状态,可在需要完全自主控制校验状态时使用 * @default '' */ status?: 'error' | 'warning' | 'success' | 'validating'; /** * 校验状态图标,值为 `true` 显示默认图标,默认图标有 成功、失败、警告 等,不同的状态图标不同。`statusIcon` 值为 `false`,不显示图标。`statusIcon` 值类型为渲染函数,则可以自定义右侧状态图标。优先级高级 Form 的 statusIcon */ statusIcon?: TNode; /** * 是否显示校验成功的边框,默认不显示 * @default false */ successBorder?: boolean; /** * 自定义提示内容,样式跟随 `status` 变动,可在需要完全自主控制校验规则时使用 */ tips?: TNode; /** * 当用户交互产生数据变化时触发,用于格式化数据 */ valueFormat?: FormItemFormatType; } export interface TdFormListProps { /** * 渲染函数 */ children?: (fields: FormListField[], operation: FormListFieldOperation) => React.ReactNode; /** * 设置子元素默认值,如果与 FormItem 的 initialData 冲突则以 FormItem 为准 */ initialData?: Array<any>; /** * 表单字段名称 */ name?: NamePath; /** * 表单字段校验规则 */ rules?: { [field in keyof FormData]: Array<FormRule>; } | Array<FormRule>; } export interface FormRule { /** * 内置校验方法,校验值类型是否为布尔类型,示例:`{ boolean: true, message: '数据类型必须是布尔类型' }` */ boolean?: boolean; /** * 内置校验方法,校验值是否为日期格式,[参数文档](https://github.com/validatorjs/validator.js),示例:`{ date: { delimiters: '-' }, message: '日期分隔线必须是短横线(-)' }` */ date?: boolean | IsDateOptions; /** * 内置校验方法,校验值是否为邮件格式,[参数文档](https://github.com/validatorjs/validator.js),示例:`{ email: { ignore_max_length: true }, message: '请输入正确的邮箱地址' }` */ email?: boolean | IsEmailOptions; /** * 内置校验方法,校验值是否属于枚举值中的值。示例:`{ enum: ['primary', 'info', 'warning'], message: '值只能是 primary/info/warning 中的一种' }` */ enum?: Array<string>; /** * 内置校验方法,校验值是否为身份证号码,组件校验正则为 `/^(\\d{18,18}|\\d{15,15}|\\d{17,17}x)$/i`,示例:`{ idcard: true, message: '请输入正确的身份证号码' }` */ idcard?: boolean; /** * 内置校验方法,校验值固定长度,如:len: 10 表示值的字符长度只能等于 10 ,中文表示 2 个字符,英文为 1 个字符。示例:`{ len: 10, message: '内容长度不对' }`。<br />如果希望字母和中文都是同样的长度,示例:`{ validator: (val) => val.length === 10, message: '内容文本长度只能是 10 个字' }` */ len?: number | boolean; /** * 内置校验方法,校验值最大长度,如:max: 100 表示值最多不能超过 100 个字符,中文表示 2 个字符,英文为 1 个字符。示例:`{ max: 10, message: '内容超出' }`。<br />如果希望字母和中文都是同样的长度,示例:`{ validator: (val) => val.length <= 10, message: '内容文本长度不能超过 10 个字' }`<br />如果数据类型数字(Number),则自动变为数字大小的比对 */ max?: number | boolean; /** * 校验未通过时呈现的错误信息,值为空则不显示 * @default '' */ message?: string; /** * 内置校验方法,校验值最小长度,如:min: 10 表示值最多不能少于 10 个字符,中文表示 2 个字符,英文为 1 个字符。示例:`{ min: 10, message: '内容长度不够' }`。<br />如果希望字母和中文都是同样的长度,示例:`{ validator: (val) => val.length >= 10, message: '内容文本长度至少为 10 个字' }`。<br />如果数据类型数字(Number),则自动变为数字大小的比对 */ min?: number | boolean; /** * 内置校验方法,校验值是否为数字(1.2 、 1e5 都算数字),示例:`{ number: true, message: '请输入数字' }` */ number?: boolean; /** * 内置校验方法,校验值是否符合正则表达式匹配结果,示例:`{ pattern: /@qq.com/, message: '请输入 QQ 邮箱' }` */ pattern?: RegExp; /** * 内置校验方法,校验值是否已经填写。该值为 true,默认显示必填标记,可通过设置 `requiredMark: false` 隐藏必填标记 */ required?: boolean; /** * 内置校验方法,校验值是否为手机号码,校验正则为 `/^1[3-9]\d{9}$/`,示例:`{ telnumber: true, message: '请输入正确的手机号码' }` */ telnumber?: boolean; /** * 校验触发方式 * @default change */ trigger?: ValidateTriggerType; /** * 校验未通过时呈现的错误信息类型,有 告警信息提示 和 错误信息提示 等两种 * @default error */ type?: 'error' | 'warning'; /** * 内置校验方法,校验值是否为网络链接地址,[参数文档](https://github.com/validatorjs/validator.js),示例:`{ url: { protocols: ['http','https','ftp'] }, message: '请输入正确的 Url 地址' }` */ url?: boolean | IsURLOptions; /** * 自定义校验规则,示例:`{ validator: (val) => val.length > 0, message: '请输入内容'}` */ validator?: CustomValidator; /** * 内置校验方法,校验值是否为空格。示例:`{ whitespace: true, message: '值不能为空' }` */ whitespace?: boolean; } export interface FormErrorMessage { /** * 布尔类型校验不通过时的表单项显示文案,全局配置默认是:`'${name}数据类型必须是布尔类型'` * @default '' */ boolean?: string; /** * 日期校验规则不通过时的表单项显示文案,全局配置默认是:`'请输入正确的${name}'` * @default '' */ date?: string; /** * 枚举值校验规则不通过时的表单项显示文案,全局配置默认是:`${name}只能是${validate}等` * @default '' */ enum?: string; /** * 身份证号码校验不通过时的表单项显示文案,全局配置默认是:`'请输入正确的${name}'` * @default '' */ idcard?: string; /** * 值长度校验不通过时的表单项显示文案,全局配置默认是:`'${name}字符长度必须是 ${validate}'` * @default '' */ len?: string; /** * 值的长度太长或值本身太大时,校验不通过的表单项显示文案,全局配置默认是:`'${name}字符长度不能超过 ${validate} 个字符,一个中文等于两个字符'` * @default '' */ max?: string; /** * 值的长度太短或值本身太小时,校验不通过的表单项显示文案,全局配置默认是:`'${name}字符长度不能少于 ${validate} 个字符,一个中文等于两个字符'` * @default '' */ min?: string; /** * 数字类型校验不通过时的表单项显示文案,全局配置默认是:`'${name}必须是数字'` * @default '' */ number?: string; /** * 正则表达式校验不通过时的表单项显示文案,全局配置默认是:`'请输入正确的${name}'` * @default '' */ pattern?: string; /** * 没有填写必填项时的表单项显示文案,全局配置默认是:`'${name}必填'` * @default '' */ required?: string; /** * 手机号号码校验不通过时的表单项显示文案,全局配置默认是:`'请输入正确的${name}'` * @default '' */ telnumber?: string; /** * 链接校验规则不通过时的表单项显示文案,全局配置默认是:`'请输入正确的${name}'` * @default '' */ url?: string; /** * 自定义校验规则校验不通过时的表单项显示文案,全局配置默认是:'${name}不符合要求' * @default '' */ validator?: string; /** * 值为空格校验不通过时表单项显示文案,全局配置默认是:`'${name}不能为空` * @default '' */ whitespace?: string; } export type FormRules<T extends Data> = { [field in keyof T]?: Array<FormRule>; }; export interface SubmitContext<T extends Data = Data> { e?: FormSubmitEvent; validateResult: FormValidateResult<T>; firstError?: string; fields?: any; } export type FormValidateResult<T> = boolean | ValidateResultObj<T>; export type ValidateResultObj<T> = { [key in keyof T]: boolean | ValidateResultList; }; export type ValidateResultList = Array<AllValidateResult>; export type AllValidateResult = CustomValidateObj | ValidateResultType; export interface ValidateResultType extends FormRule { result: boolean; } export type ValidateResult<T> = { [key in keyof T]: boolean | ErrorList; }; export type ErrorList = Array<FormRule>; export interface getFieldsValue<T> { (nameList: true): T; (nameList: any[]): Record<keyof T, unknown>; } export interface FormResetParams<FormData> { type?: 'initial' | 'empty'; fields?: Array<keyof FormData>; } export interface FieldData { name: NamePath; value?: unknown; status?: string; validateMessage?: { type?: string; message?: string; }; } export type FormValidateMessage<FormData> = { [field in keyof FormData]: FormItemValidateMessage[]; }; export interface FormItemValidateMessage { type: 'warning' | 'error'; message: string; } export interface FormValidateParams { fields?: Array<string>; showErrorMessage?: boolean; trigger?: ValidateTriggerType; } export type ValidateTriggerType = 'blur' | 'change' | 'submit' | 'all'; export type Data = { [key: string]: any; }; export type FormItemFormatType = (value: any) => any; export type InitialData = any; export type NamePath = string | number | Array<string | number>; export type FormListField = { key: number; name: number; isListField: boolean; }; export type FormListFieldOperation = { add: (defaultValue?: any, insertIndex?: number) => void; remove: (index: number | number[]) => void; move: (from: number, to: number) => void; }; export interface IsDateOptions { format: string; strictMode: boolean; delimiters: string[]; } export type CustomValidator = (val: ValueType) => CustomValidateResolveType | Promise<CustomValidateResolveType>; export type CustomValidateResolveType = boolean | CustomValidateObj; export interface CustomValidateObj { result: boolean; message: string; type?: 'error' | 'warning' | 'success'; } export type ValueType = any;