UNPKG

@flatbiz/antd

Version:
550 lines (547 loc) 17.3 kB
import { TAny, TPlainObject } from '@flatbiz/utils'; import { DatePicker, FormItemProps, FormListFieldData, FormListOperation, GetProps, InputNumberProps, InputProps, PopoverProps, RadioGroupProps, SelectProps, SwitchProps, TableProps, TooltipProps, UploadFile, UploadProps } from 'antd'; import { CheckboxGroupProps } from 'antd/lib/checkbox/index.js'; import { FormListProps } from 'antd/lib/form/index.js'; import { TextAreaProps } from 'antd/lib/input/index.js'; import { ColumnsType } from 'antd/lib/table/index.js'; import { UploadChangeParam } from 'antd/lib/upload/index.js'; import { CSSProperties, ReactElement, ReactNode } from 'react'; 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 TDayjsDateType = "YYYY-MM-DD HH:mm:ss" | "YYYY-MM-DD HH:mm" | "YYYY-MM-DD HH" | "YYYY-MM-DD" | (string & {}); export type DatePickerType = GetProps<typeof DatePicker>; export type DatePickerWrapperProps = Omit<DatePickerType, "value" | "onChange" | "format" | "picker"> & { /** 默认格式为 'YYYY-MM-DD' */ value?: string; onChange?: (value?: string) => void; disabledDateConfig?: { minDate?: TDayjsDateType; maxDate?: TDayjsDateType; /** 禁用 小时 刻度列表,与日期无关 */ disabledHourList?: number[]; /** 禁用 分钟 刻度列表,与日期无关 */ disabledMinuteList?: number[]; /** 禁用 秒钟 刻度列表,与日期无关 */ disabledSecondList?: number[]; }; /** 可自定义格式 */ format?: TDayjsDateType; /** value 输出适配 */ outputNormalize?: (value?: TAny) => TAny; /** value 输入适配 */ inputNormalize?: (value?: TAny) => string | undefined; }; export type DateRangePickerType = GetProps<typeof DatePicker.RangePicker>; export type DateRangePickerWrapperProps = Omit<DateRangePickerType, "value" | "onChange" | "onCalendarChange" | "format" | "picker"> & { value?: [ string, string ]; onChange?: (value?: [ string, string ]) => void; /** * 1. minDate、maxDate 与 format格式相同;默认:YYYY-MM-DD * 2. maxDays 最大可选的天数 */ disabledDateConfig?: { minDate?: TDayjsDateType; maxDate?: TDayjsDateType; maxDays?: number; /** 禁用 小时 刻度列表,与日期无关 */ disabledHourList?: number[]; /** 禁用 分钟 刻度列表,与日期无关 */ disabledMinuteList?: number[]; /** 禁用 秒钟 刻度列表,与日期无关 */ disabledSecondList?: number[]; }; format?: TDayjsDateType; /** value 输出适配 */ outputNormalize?: (value: [ string, string ]) => TAny; /** value 输入适配 */ inputNormalize?: (value?: TAny) => [ string, string ] | undefined; }; export type TRequestStatus = "request-init" | "request-progress" | "request-success" | "request-error" | "request-search-keyword-empty" | "no-dependencies-params"; export type TRequestStatusProps = { status?: TRequestStatus; errorButton?: ReactElement; messageConfig?: Partial<Record<TRequestStatus, string>>; loading?: boolean; }; export type SelectorWrapperValue = string | number | Array<string | number> | TPlainObject<string | number> | Array<TPlainObject<string | number>>; export type SelectorServiceConfig = { params?: TPlainObject; /** 与 params 配合使用 */ requiredParamsKeys?: string[]; onRequest?: (params?: TAny) => Promise<TAny>; /** * 响应数据适配器 */ onRequestResultAdapter?: (respData: TAny) => TPlainObject[]; }; export type SelectorWrapperProps = Omit<SelectProps, "onSearch" | "notFoundContent" | "options" | "fieldNames" | "onChange" | "value" | "loading" | "mode"> & { /** 不支持 tags 模式,tags模式请使用 SelectorWrapperSimple 组件 */ mode?: "multiple"; /** * 设置请求唯一值 * ``` * 1. 设置后,如果请求入参不变,不会重复请求接口,直接使用上次缓存数据 * ``` */ modelKey?: string; /** * 参数Key映射 * ``` * 1. 默认值:value=value、label=label、disabled=disabled * 2. list 为 onRequest 返回数据中列表key值,可多级取值,例如: 'a.b.c' * 3. 配置 serviceConfig.onRequestResultAdapter后,fieldNames.list配置失效 * 4. 如果没有配置list,可说明接口返回为数组 * ``` */ fieldNames?: { list?: string; label?: string; value?: string; disabled?: string; }; /** * 请求服务需求的数据 */ serviceConfig?: SelectorServiceConfig; /** * 同步设置选择器选项列表 * ``` * 1. 如果配置fieldNames,会转换后使用 * 2. 值为undefined、null不会更新,需要清空可传递空数组 * ``` */ selectorList?: TPlainObject[]; /** * select 数据源发生变更时触发,第一次不调用 */ onSelectorListChange?: (dataList: TPlainObject[]) => void; /** select 数据源发生变更时触发,每次都会调用 */ onSelectorListAllChange?: (dataList: TPlainObject[]) => void; /** * 通过服务获取数据异常回调 */ onSelectorRequestError?: (error: Error) => void; /** * 添加全部选项 * ``` * 1. 默认值label="全部",value="" * 2. 可配置label、value * ``` */ showAllOption?: true | { label: string; value: string | number; }; onLabelRenderAdapter?: (dataItem: TPlainObject) => string | ReactElement; onChange?: (value?: SelectorWrapperValue, selectedList?: TPlainObject[] | TPlainObject) => void; showIcon?: boolean; /** select option添加图标;与showIcon组合使用 */ icon?: (data: TPlainObject, index: number) => ReactElement; requestMessageConfig?: TRequestStatusProps["messageConfig"]; /** * value格式 *``` * 1. string 、number * 2. Array<string | number> * 3. lableInValue = true,根据fieldNames配置格式 * 4. lableInValue = true,Array<fieldNames配置> * ``` */ value?: SelectorWrapperValue; /** * 使用缓存,默认值:true * ``` * 1. true: 在 modelKey下使用请求参数缓存数据,如果相同modelKey、相同请求参数直接使用缓存数据 * 2. false: 每次都调用接口,不参与缓存数据、不使用缓存数据 * 3. useCache=false 在 serviceConfig.requiredParamsKeys.length > 0 有效 * * @deprecated 已废弃 * * ``` * 1. 需要缓存设置 modelKey,不需要不设置 * ``` */ useCache?: boolean; /** 是否显示刷新图标 */ showRefreshIcon?: boolean; }; export type SwitchWrapperValue = string | number | boolean; export type SwitchWrapperProps = Omit<SwitchProps, "checked" | "defaultChecked" | "onChange" | "value"> & { value?: SwitchWrapperValue; checkedValue: SwitchWrapperValue; unCheckedValue: SwitchWrapperValue; onChange?: (value: SwitchWrapperValue) => void; tooltipProps?: Omit<TooltipProps, "title">; tooltipTitle?: string | ((value?: SwitchWrapperValue) => string | undefined); serviceConfig?: { onRequest: (value: SwitchWrapperValue) => TAny; message?: { success?: string; defaultError?: string; }; }; }; export type UploadWrapperProps<T extends TPlainObject = TPlainObject> = { value?: T[] | T; onChange?: (value?: T[]) => void; onUploadError?: (message?: string) => void; onUploadChange?: (info: UploadChangeParam<UploadFile>) => void; /** * 属性取值映射 */ fieldNames?: { uid: string; name?: string; url?: string; /** 文件大小 */ size?: string | number; }; /** * 接口响应数据适配器,如果配置了fieldNames,适配器返回值会再进过fieldNames转换 */ onRequestResultAdapter?: (respData: TAny) => TPlainObject; /** 操作触发显示文本 */ triggerText?: string; /** 超过maxCount 隐藏上传入口 */ limitHidden?: boolean; /** * 自动提交,默认:true * ``` * 1. 自定义beforeUpload配置后 autoSubmit 失效 * 2. 设置为 false 时,在onChange中获取File对象数组 * ``` */ autoSubmit?: boolean; /** 图片预览开关, 重写 onPreview 方法后失效 */ imagePreviewSwitch?: boolean; /** 图片预览文件类型,默认:['png', 'jpg', 'jpeg', 'gif', 'heic', 'heif'] */ imagePreviewAccept?: string[]; /** * 配置文件额外操作 * ``` * 额外操作超过两项后,listType为 picture-card、picture-circle 时会出现显示异常,需要自行修改覆盖样式 * ``` */ extraOperate?: { icon: ReactElement; onClick: (file: UploadFile, fileList: UploadFile[], e: any) => void; }[]; /** 是否使用拖拽上传 */ isDragger?: boolean; } & Omit<UploadProps, "onChange" | "fileList">; export type EditableTableName = string | number | Array<string | number>; export type EditableTableRecordType = FormListFieldData & { operation: FormListOperation; }; export type EditableInputConfig = { type: "input"; editableComptProps?: InputProps; }; export type EditableInputNumberConfig = { type: "inputNumber"; editableComptProps?: InputNumberProps; }; export type EditableSelectWrapperConfig = { type: "selectorWrapper"; editableComptProps: SelectorWrapperProps; }; export type EditableDatePickerWrapperConfig = { type: "datePickerWrapper"; editableComptProps?: DatePickerWrapperProps; }; export type EditableDateRangePickerWrapperConfig = { type: "dateRangePickerWrapper"; editableComptProps?: DateRangePickerWrapperProps; }; export type EditableCheckboxGroupConfig = { type: "checkboxGroup"; editableComptProps: CheckboxGroupProps; }; export type EditableRadioGroupConfig = { type: "radioGroup"; editableComptProps: RadioGroupProps; }; export type EditableTextareaConfig = { type: "textArea"; editableComptProps: TextAreaProps; }; export type EditableFileUploadConfig = { type: "uploadWrapper"; editableComptProps: UploadWrapperProps; }; export type EditableSwitchWrapperConfig = { type: "switchWrapper"; editableComptProps: SwitchWrapperProps; }; /** * 自定义编辑组件 * ``` * 1.需要处理Form.Item * 2. 例如 * editableConfig: { type: 'custom', editableComptProps: (props) => { return ( <Form.Item name={props.name}> <Input /> </Form.Item> ); }, }, ``` */ export type EditableCustomConfig = { type: "custom"; editableComptProps: (props: { name: Array<number | string>; editable?: boolean; completeName: Array<number | string>; tableRowIndex: number; }) => ReactElement; }; export type EditableTypeConfig = EditableCustomConfig | EditableInputConfig | EditableSelectWrapperConfig | EditableDatePickerWrapperConfig | EditableDateRangePickerWrapperConfig | EditableCheckboxGroupConfig | EditableTextareaConfig | EditableInputNumberConfig | EditableRadioGroupConfig | EditableFileUploadConfig | EditableSwitchWrapperConfig; export type FieldSingleConfig = { editable?: boolean | ((data: { tableRowIndex: number; }) => boolean); editableConfig?: EditableTypeConfig; /** * 当editableConfig type=custom时,此配置无效 */ formItemProps?: Omit<FormItemProps, "name">; /** * 自定义非编辑渲染 * 1. 当editableConfig type=custom时,此配置无效 * 2. 只在editable=false的情况下有效 * 3. 同级配置 editableConfigList后,同级render配置失效 * 4. checkboxGroup、radioGroup、selectorWrapper第二次参数为options数组 */ render?: (params?: TAny, other?: TAny) => ReactNode; }; export type FormListItemMethodOperateProps = { tableRowIndex: number; add: FormListOperation["add"]; remove: () => void; formListItemIndex: number; value: TAny; }; export type FormListMethodOperateProps = { tableRowIndex: number; add: FormListOperation["add"]; value: TAny; }; export type FormListConfig = { editableConfigList: Array<FieldSingleConfig & { fieldName: string; }>; onFormListBeforeRender?: (data: FormListMethodOperateProps) => ReactElement | null; onFormListAfterRender?: (data: FormListMethodOperateProps) => ReactElement | null; onFormListItemBeforeRender?: (data: FormListItemMethodOperateProps) => ReactElement | null; onFormListItemAfterRender?: (data: FormListItemMethodOperateProps) => ReactElement | null; deleteOperateRender?: (data: { remove: () => void; formListItemIndex: number; }) => ReactElement; }; export type fieldConfigFunctionParams = { tableRowIndex: number; name: EditableTableName; tableRowName: EditableTableName; getTableRowData: () => TPlainObject; }; /** * antd 默认render功能此处不能使用 */ export type EditableTableColumn = Omit<ColumnsType["0"], "render"> & { /** * @description 请使用 tipsWrapperProps 属性配置 * ``` * 会在 title 之后展示一个 icon,hover 之后提示一些信息 * 1. title为string类型、ReactElement有效 * 2. hoverArea 默认值:icon * ``` */ /** * 会在 title 之后展示一个 icon * ``` * 1. title为string类型有效 * 2. 可为icon添加提示效果 * 3. 可为icon添加点击事件 * * 例如 * tipsWrapperProps: { * tipType: 'tooltip', * tooltipProps: { * title: '我是内容', * }, * } * * tipsWrapperProps: { * tipType: 'popover', * popoverProps: { * title: '我是标题', * content: '我是内容', * }, * }, * ``` */ tipsWrapperProps?: string | TipsWrapperProps; dataIndex?: string; fieldConfig?: FieldSingleConfig | FormListConfig | ((data: fieldConfigFunctionParams) => FieldSingleConfig | FormListConfig); /** 隐藏域字段 */ hiddenField?: { dataIndex: string; } | { dataIndex: string; }[]; /** * 渲染中间件,如果renderMiddleware返回值为ReactElement格式,则会终止后续逻辑,fieldConfig配置将失效 * ``` * 1. tableRowIndex: 当前row的索引值 * 2. name: 当前table单元格的form.item的name值 * 3. operation Form.List的操作函数 * 4. 对 table children column渲染无效 * ``` */ renderMiddleware?: (item: { tableRowIndex: number; name: EditableTableName; tableRowName: EditableTableName; operation: FormListOperation; index: number; getTableRowData: () => TPlainObject; }) => ReactElement | null; /** table datasource children column 自定义渲染 */ tableChildrenColumnRender?: (value: TAny, record: TPlainObject, index: number) => ReactElement | null; /** 为表格header中的字段添加必填标识,无验证拦截功能 */ required?: boolean; }; export type EditableTableProps = { /** FormList name属性 */ name: EditableTableName; /** * 当前Edittable处在formList内部时(必填),完整formItem的name * ``` * 例如 处在formList内部 * 1. name=[0,dataList] * 2. completeName=[xxxList, 0, dataList] * ``` */ completeName?: Array<string | number>; /** * 表格行数据,唯一值字段Key * ``` * 1. 如果数据中没有可前端添加key * 2. 有问题可咨询 xg15472 * ``` */ uidFieldKey: string; /** * ``` * antd table属性 * 1. 新增cellVerticalAlign,单元格竖直方向对齐方式,设置table column onCell属性后失效 * ``` */ tableProps?: Omit<TableProps<EditableTableRecordType>, "dataSource" | "columns" | "rowKey"> & { cellVerticalAlign?: "baseline" | "middle" | "top" | "bottom"; }; columns: EditableTableColumn[]; onTableBeforeRender?: (formListOperation: FormListOperation, nextRowIndex: number) => ReactElement | null; /** * 设置后,将覆盖底部`新增`按钮 */ onTableAfterRender?: (formListOperation: FormListOperation, nextRowIndex: number) => ReactElement | null; /** 新增行默认值,自定义onTableAfterRender后失效 */ getAddRowDefaultValues?: () => TPlainObject; /** 隐藏底部`新增`按钮,设置 onTableAfterRender后 失效 */ hiddenFooterBtn?: boolean; /** * Form.List rules * ``` rules={[ { validator: async (_, names) => { if (!names || names.length < 2) { return Promise.reject(new Error('At least 2 passengers')); } }, }, ]} * ``` */ rules?: FormListProps["rules"]; /** 空效果显示尺寸,默认值:small */ emptyShowSize?: "small" | "large"; className?: string; style?: CSSProperties; }; export type DragEditableTableProps = EditableTableProps & { /** * 拖拽图标自定义,默认使用 DragOutlined 图标 */ dragIcon?: ReactElement; /** 禁用拖拽 */ disabledDrag?: boolean; /** * 表格数据唯一值字段Key * ``` * ``` */ uidFieldKey: string; /** * 拖拽结束事件 * ``` * dataSource: 拖拽完成后的数据源 * dragData * 1. activeId 拖拽ID * 2. activeIndex 拖拽起始表格数组索引值 * 3. overIndex 拖拽结束表格数组索引值 * ``` */ onDragChange?: (dataSource: TPlainObject[], dragData: { activeId: string | number; overId?: string | number; activeIndex: number; overIndex: number; }) => void; }; /** * 可拖拽编辑表格 * @deprecated 已过期,请使用 DragEditableTablePro组件 * ``` * 1. 表格数据必须要有唯一值字段,通过参数 uidFieldKey 告诉组件 * 2. Table 参数 components.body.row 被组件内部使用 * ``` */ export declare const DragEditableTable: (props: DragEditableTableProps) => import("react").JSX.Element; export {};