@schema-render/form-render-react
Version:
Out-of-the-box form rendering library based on Core and Antd.
230 lines (210 loc) • 5.36 kB
TypeScript
import type {
IBaseSchema,
ICore,
ICoreRef,
IDeepWriteable,
IMaybePromise,
IObjectAny,
IOpenItemLayoutParams,
IPartPartial,
IPartRequired,
IRootSchema,
} from '@schema-render/core-react'
import type { CSSProperties, ReactNode } from 'react'
import type {
FORM_RENDER_DEFAULT_PROPS,
IAction,
IActionsLoading,
IActionsRenderMode,
} from '../constants'
import type zh_CN from '../locale/zh_CN'
import type { IBuiltinRenderers } from '../renderers'
type ILocale = typeof zh_CN
/**
* 注册表单行为函数的参数
*/
export interface IRegisterActionsFnParams<T extends IObjectAny = ILocale> {
/** 当值为 submit 时,存在该事件 */
handleSubmit?: () => void
/** 当值为 reset 时,存在该事件 */
handleReset?: () => void
/** submit 与 reset 按钮的 loading 状态 */
loading: IActionsLoading
/** 全局禁用状态,@schema-render/core-react global-status */
disabled?: boolean
/* 语言包 */
locale: T
/** 提交按钮文案 */
submitText?: string
/** 重置按钮文案 */
resetText?: string
}
/**
* 注册表单行为函数
*/
export type IRegisterActionsFn<T extends IObjectAny = ILocale> = (
p: IRegisterActionsFnParams<T>
) => ReactNode
/**
* 注册操作行为,如果是 submit、reset 将覆盖原有样式
*/
export interface IRegisterActions<T extends IObjectAny = ILocale> {
[actionName: string]: IRegisterActionsFn<T>
}
/**
* 自定义 label 渲染
*/
export type ILabelRender = (
p: Pick<
IOpenItemLayoutParams,
'schema' | 'required' | 'readonly' | 'disabled' | 'userCtx' | 'prefixClassNames'
> & {
locale: ILocale
labelWidth?: number | string
labelColon?: ReactNode
labelGap?: number
}
) => ReactNode
/**
* FormRender 参数配置
*/
export type IFormRenderProps = IPartPartial<
Omit<ICore, 'itemLayout' | 'locale' | 'schema'>,
'renderers'
> & {
/**
* 表单描述协议,带内置渲染器类型提示
*/
schema: IFormRenderRootSchema<string>
/**
* FormRender 根节点样式名
*/
rootClassName?: string
/**
* FormRender 根节点样式
*/
rootStyle?: CSSProperties
/**
* 只读状态没有数据时的占位符,默认 “-”
* 空数据:null、undefined 和空字符串
*/
readonlyPlaceholder?: ReactNode
/**
* 表单项布局结构
*/
itemLayout?: 'horizontal' | 'vertical' | ICore['itemLayout']
/**
* 表单标签(标题块)宽度
*/
labelWidth?: number | string
/**
* 标签冒号,默认没有冒号
*/
labelColon?: ReactNode
/**
* 标签与右侧内容的间距
*/
labelGap?: number
/**
* 自定义 label 渲染
*/
labelRender?: ILabelRender
/**
* 国际化
*/
locale?: ILocale
/**
* 定义操作行为:展示项、顺序
*/
actions?: IAction[] | null
/**
* @private 内部使用,操作行为渲染模式
* normal: 标准渲染,作为独立节点渲染在 Form 底部
* formItem: 作为表单项渲染,提供给 @schema-render/search-react 用
*/
actionsRenderMode?: IActionsRenderMode
/**
* @private 内部使用,定义操作行为 Schema,如样式等
* 提供给 @schema-render/search-react 用
*/
actionsRestSchema?: Partial<IBaseSchema>
/**
* 当操作行为按钮处于 loading 状态时,是否禁用表单
*/
disableFormOnActionLoading?: boolean
/**
* 触发 onSubmit 事件前是否执行表单校验,默认为 true,校验不通过将不会触发 onSubmit 事件
*/
validateFormOnSubmit?: boolean
/**
* 注册操作行为,如果是 submit、reset 将覆盖原有样式
*/
registerActions?: IRegisterActions<ILocale & IObjectAny>
/**
* 提交按钮文案,优先级大于 locale 语言包
*/
submitText?: string
/**
* 重置按钮文案,优先级大于 locale 语言包
*/
resetText?: string
/**
* 提交事件
* @param value 表单数据
*/
onSubmit?: (value: IObjectAny) => IMaybePromise<void>
/**
* 重置前置事件
* @param value 表单数据
* @returns 如果返回数据,则作为新数据填入表单
*/
onBeforeReset?: (value: IObjectAny) => IMaybePromise<IObjectAny | void>
/**
* 重置事件
* @param value 重置后的表单数据
*/
onReset?: (value: IObjectAny) => IMaybePromise<void>
}
/**
* 默认参数类型
*/
export type IFormRenderDefaultProps = IDeepWriteable<typeof FORM_RENDER_DEFAULT_PROPS>
/**
* 内部 FormRender 参数,合并默认值后的结果
*/
export type IInnerFormRenderProps = IPartRequired<
IFormRenderProps,
keyof IFormRenderDefaultProps
>
/**
* FormRender 引用
*/
export type IFormRenderRef = ICoreRef
/**
* FormRender 上下文数据
*/
export type IFormRenderContext = Pick<
IInnerFormRenderProps,
| 'labelWidth'
| 'labelGap'
| 'labelColon'
| 'labelRender'
| 'actions'
| 'registerActions'
| 'layoutColumnGap'
| 'layoutRowGap'
| 'readonlyPlaceholder'
| 'submitText'
| 'resetText'
> & {
locale: ILocale
actionsLoading: IActionsLoading
handleSubmit: Required<IRegisterActionsFnParams>['handleSubmit']
handleReset: Required<IRegisterActionsFnParams>['handleReset']
}
/**
* FormRender Root Schema 类型,含内置渲染器提示
*/
export type IFormRenderRootSchema<T extends string = ''> = IRootSchema<
T | IBuiltinRenderers
>