UNPKG

@flatbiz/antd

Version:
251 lines (248 loc) 9.17 kB
import { TAny, TPlainObject } from '@flatbiz/utils'; import { FormItemProps, FormListOperation, PopoverProps, TableProps, TooltipProps } from 'antd'; import { FormListProps } from 'antd/es/form'; import { ColumnsType } from 'antd/es/table'; import { CSSProperties, ReactElement, ReactNode } from 'react'; export type TFormItemLayoutPreClassNameProps = { /** * label宽度,Form内部所有FormItem label都生效 * ``` * 1. 可设置数值 * 2. 可设置`auto`自适应 * ``` */ labelWidth?: "auto" | "70" | "80" | "90" | "100" | "110" | "120" | "130" | "140" | "150" | "160" | "170" | "180" | "190" | "200"; /** labelItem 竖直布局 */ labelItemVertical?: boolean; /** label 对齐方式 */ labelAlign?: "left" | "right"; /** * className 中可能会包含 preDefinedClassName.formItem.xx,优先级大于 labelWidth、labelItemVertical、labelAlign */ className?: string; }; export type FormItemWrapperProps = Omit<FormItemProps, "hidden" | "children" | "noStyle"> & TFormItemLayoutPreClassNameProps & { wrapper?: (children: ReactNode) => ReactElement; /** 设置wrapper后,before、after失效 */ before?: ReactNode; /** 设置wrapper后,before、after失效 */ after?: ReactNode; /** 设置 before、after 属性的包装结构style */ beforeAfterStyle?: CSSProperties; /** value 序列化处理 */ inputNormalize?: (value?: TAny) => TAny; /** * onChange 参数序列化处理 * 如果设置 normalize 属性,outputNormalize将失效 */ outputNormalize?: (value?: TAny) => TAny; /** * 隐藏 Form.Item,同时清除 Form.Item 值 * ``` * 1.与 dependencies 属性配合使用,可实现当前FormItemWrapper的显示隐藏 * 2.提交不校验rules * ``` */ isClear?: boolean | ((formValues: TPlainObject) => boolean); /** * 隐藏 Form.Item,不会清除 Form.Item 值 * ``` * 1.与 dependencies 属性配合使用,可实现当前FormItemWrapper的显示隐藏 * 2.提交会校验rules * ``` */ hidden?: boolean | ((formValues: TPlainObject) => boolean); /** * 栅格占位格数,最大值:24 * ``` * 1. 当前FormItemWrapper处在 EasyForm 直接子节点中有效,即FormItemWrapper在EasyForm栅格中的占位格数; * 2. 父节点使用属性值,当前节点不使用属性值 * ``` */ span?: number; /** 不支持函数式写法,如果需要使用dependencies获取表单值,可使用FormItemWrapperDependencies 组件 */ children?: ReactNode; /** * ``` * 1. 设置noStyle后,可能会导致 FromItemWrapper 在 EasyFrom 内部渲染网格布局时出现异常 * 2. 在FormItemWrapper中使用 dependencies 逻辑不需要设置 noStyle * ``` */ noStyle?: boolean; }; export type TipsWrapperProps = { gap?: number; className?: string; style?: CSSProperties; children?: ReactNode; icon?: ReactElement; /** Icon添加点击事件,设置hoverTips后失效 */ onClick?: (event: any) => void; /** * 提示效果类型 * ``` * 1. popover 气泡卡片,内容通过popoverProps设置 * 2. tooltip 文字提示,内容通过tooltipProps设置 * ``` */ tipType?: "popover" | "tooltip"; popoverProps?: PopoverProps; tooltipProps?: TooltipProps; trigger?: "icon" | "all"; }; export type EditableTableProDataIndex = string | readonly (string | number)[]; export interface EditableTableProOperation { add: (defaultValue: TPlainObject, insertIndex?: number) => void; remove: (index: number) => void; /** 同一级内移动 */ move: (fromIndex: number, toIndex: number) => void; /** 是否可编辑 */ editable: boolean; /** 当前行数据层级 */ level: number; /** 设置当前行指定字段值 */ setCurrentRowTargetField: (dataIndexConfigs: { name: EditableTableProDataIndex; value?: TAny; }[]) => void; /** 设置当前行 children 数据 */ setCurrentRowChildrenValue: (value?: TPlainObject[]) => void; /** 当前行父级数据 */ parentItem: TPlainObject | null; /** 当前行表单 name */ tableRowFormItemName: Array<string | number>; /** 当前行表单完整 name */ tableRowFormItemCompleteName: Array<string | number>; /** 当前行表单验证,需要自行指定nameList(dataIndex数组) */ validateRowFields: (nameList: EditableTableProDataIndex[]) => Promise<void>; } export type EditableTableProColumnItem = Omit<ColumnsType[0], "render" | "title" | "dataIndex"> & { title?: ReactElement | string; dataIndex?: EditableTableProDataIndex; /** Form.Item props */ formItemProps?: Omit<FormItemWrapperProps, "children" | "name"> | ((value: TAny, record: TPlainObject, index: number, operation: EditableTableProOperation) => Omit<FormItemWrapperProps, "children" | "name">); /** * 通过 operation.editable 来判断渲染结构,其中render返回的根节点会作为 Form.Item 的children * ``` * 例如 * render: (_value, _record, _index, operation) => { * if (operation.editable) { * return <Input placeholder="请输入" />; * } * return <Tag>{value}</Tag>; * } * * 如果需要额外布局,可通过 formItemProps.wrapper 实现 * formItemProps: (_value, _record, _index, operation) => { * return { * wrapper: (children) => { * return ( * <FlexLayout fullIndex={[0]} direction="horizontal" gap={10}> * <div>{children}</div> * <div>额外布局</div> * </FlexLayout> * ); * }, * }; * }, * render: (_value, _record, _index, operation) => { * if (operation.editable) { * return <Input placeholder="请输入" />; * } * return <Tag>{value}</Tag>; * } * ``` */ render?: (value: TAny, record: TPlainObject, index: number, operation: EditableTableProOperation) => ReactElement; /** 是否可编辑 */ editable: boolean | ((record: TPlainObject, index: number) => boolean); /** * 会在 title 之后展示一个 icon * ``` * 1. title为string类型有效 * 2. 可为icon添加提示效果 * 3. 可为icon添加点击事件 * ``` */ tipsWrapperProps?: string | TipsWrapperProps; /** 为表格header中的字段添加必填标识,如果未配置 formItemProps.rules,内部会新增一条required rule */ required?: boolean; }; export type EditableTableProProps = { columns: EditableTableProColumnItem[]; /** * 当前Edittable处在formList内部时(必填),完整formItem的name * ``` * 例如 处在formList内部 * 1. formListName=[0,dataList] * 2. formListCompleteName=[xxxList, 0, dataList] * ``` */ formListCompleteName?: Array<string | number>; /** Form.List name */ formListName: Array<string | number> | string; /** 唯一值字段Key */ uidFieldKey: string; /** 初始化值 */ initialValue?: TPlainObject[]; /** 指定树形结构的列名,默认值:children */ childrenColumnName?: string; /** 表格组件配置 */ tableProps?: Omit<TableProps<TPlainObject>, "dataSource" | "columns" | "rowKey"> & { cellVerticalAlign?: "baseline" | "middle" | "top" | "bottom"; }; /** * Form.List rules * ``` rules={[ { validator: async (_, names) => { if (!names || names.length < 2) { return Promise.reject(new Error('At least 2 passengers')); } }, }, ]} * ``` */ rules?: FormListProps["rules"]; className?: string; style?: CSSProperties; /**`默认新增按钮`新增行默认值,hiddenFooterBtn != true 有效 */ addRowDefaultValues?: () => TPlainObject; /** 隐藏底部`新增`按钮 */ hiddenFooterBtn?: boolean; /** 表格顶部区域渲染 */ tableBeforeAreaRender?: (formListOperation: FormListOperation, nextRowIndex: number) => ReactElement | null; /** 表格底部区域渲染 */ tableAfterAreaRender?: (formListOperation: FormListOperation, nextRowIndex: number) => ReactElement | null; /** 展开的行key,一般用于初始化,重新tableProps.expandable.expandedRowKeys后失效 */ expandedRowKeys?: string[]; /** * 展开图标布局,默认:layout1 * ``` * 1. 可编辑表格第一项为可编辑状态时,选 layout1 * 2. 可编辑表格第一项为非可编辑状态时,选 layout2 * ``` */ expandedIconLayout?: "layout1" | "layout2"; }; /** * 使用FormList实现可编辑表格 * ``` * 1. 必须在外部包裹Form组件 * 2. 表格数据源数组中必须存在唯一值字段,通过uidFieldKey配置 * 3. 可嵌套编辑,数据嵌套的节点名称可通过 childrenColumnName设置,默认:children * 4. 行内需要联动逻辑可使用 column.render.operation.setCurrentRowTargetField 方法 * 5. 在多级编辑中,可通过 column.render.operation.level 判断当前行数据层级 * 6. 不存在多级的情况下,可使用DragEditableTablePro组件实现拖拽排序 * 7. 存在多级的情况下,可通过 column.render.operation.move 方法实现同一级内移动 * * demo * https://fex.qa.tcshuke.com/docs/admin/main/table/row-editable1 * https://fex.qa.tcshuke.com/docs/admin/main/table/row-editable2 * https://fex.qa.tcshuke.com/docs/admin/main/table/row-editable4 * ``` */ export declare const EditableTablePro: (props: EditableTableProProps) => import("react").JSX.Element; export {};