@flatbiz/antd
Version:
390 lines (387 loc) • 14.3 kB
TypeScript
import { DateFormatType, TAny, TNoopDefine, TPlainObject } from '@flatbiz/utils';
import { ButtonProps, DropdownProps, FormInstance, ModalProps, PopconfirmProps, SpaceProps } from 'antd';
import { ConfigProviderProps } from 'antd/lib/config-provider/index.js';
import { CSSProperties, ReactElement, ReactNode } from 'react';
export type ButtonWrapperProps = Omit<ButtonProps, "onClick" | "color"> & {
/** 当返回 Promise 时,按钮自动loading */
onClick?: (e: React.MouseEvent) => Promise<TAny> | void;
/** 重复点击间隙,单位毫秒 默认值:500 */
debounceDuration?: number;
/** 基于GLOBAL中elemAclLimits按钮权限列表,控制按钮显示、隐藏 */
permission?: string;
/** 是否隐藏按钮 */
hidden?: boolean;
/** loading 显示位置,默认值:left */
loadingPosition?: "left" | "center";
/** 移除按钮内边距,一般用于 type=link 类型下 */
removeGap?: boolean;
color?: string;
};
export type TLocale = "en" | "zh-cn";
export type TFbaLocale = {
TreeWrapper?: {
/** 数据加载异常默认文案 */
requestError?: string;
};
FbaDialogModal?: {
cancelText?: string;
};
};
export type ConfigProviderWrapperProps = Omit<ConfigProviderProps, "locale"> & {
locale?: TLocale;
/** 自定义国际化数据 */
customLocaleMessage?: Partial<TFbaLocale>;
/** 同 fbaHooks.useCopyRemoveSpace[ignoreClass] */
copyOperateIgnoreClass?: string[];
};
export type DialogModalProps = Omit<ModalProps, "onOk" | "onCancel" | "getContainer" | "open" | "open" | "okButtonProps" | "cancelButtonProps" | "footer"> & {
/**
* 内置尺寸,根据比例固定高度、宽度,默认:无
* ```
* 1. 如果自定义了width、bodyHeight属性,size中的height、width将对应失效
* 2. 不传、传null值可取消内置尺寸
* ```
*/
size?: "small" | "middle" | "large" | null;
onOk?: (form: FormInstance, e: React.MouseEvent<HTMLElement>) => void | Promise<void>;
onCancel?: (form: FormInstance, e: React.MouseEvent<HTMLElement>) => void | Promise<void>;
/**
* content只在第一次弹起时,执行一次
*/
content: string | ReactElement | ((form: FormInstance, operate: {
onClose: TNoopDefine;
}) => ReactElement);
configProviderProps?: ConfigProviderWrapperProps;
okHidden?: boolean;
cancelHidden?: boolean;
okButtonProps?: Omit<ButtonWrapperProps, "hidden" | "children" | "onClick">;
cancelButtonProps?: Omit<ButtonWrapperProps, "hidden" | "children" | "onClick">;
/**
* 设置modal body height 为当前窗口height的百分比,例如:30
* @deprecated 已失效,可通过size属性设置
* ```
* 1. 最大值:80
* 1. 设置bodyStyle.height 后,bodyHeightPercent失效
* ```
*/
bodyHeightPercent?: number;
titleExtra?: ReactElement;
/**
* null则隐藏footer
* ```
* extraData 为外部通过 useDialogModal.rerenderFooter 重新渲染footer携带的数据
* ```
*/
footer?: null | ReactElement | ReactElement[] | ((form: FormInstance, extraData?: TPlainObject) => ReactElement);
/** 内容高度,为styles.body.height快捷配置,优先级低于styles.body.height */
bodyHeight?: number;
};
export interface DropdownMenuItem extends Omit<ButtonProps, "color"> {
text?: string | ReactElement;
color?: string;
onClick?: (event: React.MouseEvent<HTMLElement>) => void | Promise<void>;
permission?: string;
needConfirm?: boolean;
confirmMessage?: ReactNode;
hidden?: boolean;
confirmModalProps?: DialogModalProps;
stopPropagation?: boolean;
}
export interface DropdownMenuWrapperProps extends Omit<DropdownProps, "menu"> {
menuList: Array<DropdownMenuItem | null>;
/** dropdown 设置弹框根节点在body下 */
isFixed?: boolean;
}
export interface ButtonOperateItem extends ButtonWrapperProps {
/** hover 提示文字,isFold=true无效 */
hoverTips?: string | ReactElement;
/** hover 提示类型 默认:'tooltip' */
tipsType?: "popover" | "tooltip";
/** 按钮文案 */
text?: string | ReactElement;
/** 自定义按钮颜色 */
color?: string;
/** 是否需要二次弹框确认 */
needConfirm?: boolean;
/** 二次弹框确认文案 */
confirmMessage?: ReactNode;
popconfirmProps?: Pick<PopconfirmProps, "placement" | "okText" | "cancelText" | "trigger">;
/** 是否折叠合拢 */
isFold?: boolean;
confirmModalProps?: DialogModalProps;
/** 是否显示按钮,优先级高于 hidden */
show?: boolean;
}
export interface ButtonOperateProps {
className?: string;
style?: CSSProperties;
/**
* 如果数组中元素为ReactElement类型
* 1. 一般为antd Button组件,如果组件存在属性hidden=true、v-hidden=true,则会隐藏
* 2. 可配置 v-permission 权限值,例如 v-permission="add"
* 3. 任何confirm、disabled等状态在外部控制
* 3. 不支持fold效果
*/
operateList: Array<ButtonOperateItem | null | ReactElement>;
/** 是否换行,默认true */
wrap?: boolean;
/** 隐藏图标Icon */
foldIcon?: ReactElement;
/** 按钮之间是否添加分隔符 */
split?: boolean;
/** 多个按钮的包装组件Space属性 */
spaceProps?: SpaceProps;
/** 间距,默认:10;split=true配置下无效(可通过spaceProps设置间距) */
gap?: number;
/** 折叠合拢属性 */
dropdownMenuProps?: Omit<DropdownMenuWrapperProps, "menuList">;
/**
* 按钮布局尺寸
* ```
* 1. 设置为small后,gap、split 配置失效
* ```
*/
size?: "small" | "default";
}
export type TagListRenderValue = string | number | boolean;
export type TagListRenderDataItem = {
label: string;
value: TagListRenderValue;
color?: string;
};
export type TagListRenderProps = {
dataList: TagListRenderDataItem[];
/** 颜色配置数据,例如:{ 1:'red', 2: 'blue'} key值与 dataList中value相同 */
colorMap?: Record<string | number, string>;
value?: TagListRenderValue | TagListRenderValue[];
/** 是否强制匹配,默认值false */
forceMatch?: boolean;
/** 最大显示Tag数量,超出折叠隐藏 */
maxShowCount?: number;
/** 触发maxShowCount后,被折叠的内容是否显示完整tag,默认值:false */
foldShowAllTag?: boolean;
/** 所有tag背景匹配此颜色,在colorMap为空、dataList中未配置color的情况下有效果 */
tagColor?: string;
/** 未匹配到color时,是否显示Tag效果,默认值:true */
noColorShowTag?: boolean;
};
export type TableColumnIconRenderProps = {
/** 额外内容,一般为Icon */
extra: ReactElement;
extraPosition?: "before" | "after";
onClick?: (e: any) => void;
/** 是否显示原单元格数据,默认值:true */
showData?: boolean;
/** 溢出显示【...】, 最大长度(默认:20个字节) */
showMaxNumber?: number;
/** 未溢出显示【extra】配置,默认值:true */
notOverflowShowExtra?: boolean;
};
export declare const tableCellRender: {
/**
* 表格单元格 拼接额外内容渲染
* ```
* 1. extra 额外内容
* 2. showData 是否显示原单元格数据,默认值:true
* 3. showMaxNumber 显示最大长度,作用于原单元格字符串数据
*
*
* 结合table column render 使用
* # 在单元格渲染文字右侧添加图标
* render: tableCellRender.extraContentRender(() => {
* return {
* extra: <FullscreenOutlined />,
* onClick: () => { ... },
* };
* }),
* ```
*/
extraContentRender: (handle: (item: TPlainObject) => TableColumnIconRenderProps) => (value: TAny, item: TPlainObject) => any;
/**
* table 索引展示,如果存在pageSize、pageNo参数可分页展示索引,否则每页都从1开始
* @deprecated 已过时 4.3.0版本移除,请使用 serialNumberCell
*/
indexCell: (pageNo?: number, pageSize?: number) => (_value: any, _record: any, index: number) => number;
/**
* table 序号展示,如果存在pageSize、pageNo参数可分页展示累加序号,否则每页都从1开始
* ```
* render: tableCellRender.serialNumberCell(() => {
* return {
* pageNo: easyTableApi.getRequestParams().pageNo,
* pageSize: easyTableApi.getRequestParams().pageSize,
* }
* }),
* 参考:
* https://gitlab.itcjf.com/flatjs/flat-os/flat-oss-demo/blob/master/src/modules/crud/demo1/home/table.tsx
* ```
*/
serialNumberCell: (method?: () => {
pageNo?: number;
pageSize?: number;
}) => (_value: any, _record: any, index: number) => number;
/**
* 表格日期格式数据渲染,默认格式:YYYY-MM-DD
* ```
* 独立使用
* tableCellRender.dateCell('YYYY-MM-DD hh:mm:ss')(value)
*
* 结合table column render 使用
* render: tableCellRender.dateCell('YYYY-MM-DD hh:mm:ss')
* render: (value) => {
* return tableCellRender.dateCell('YYYY-MM-DD')(value);
* }
* ```
*/
dateCell: (dateFormatType?: DateFormatType, defaultValue?: string) => (value: string | number) => string | number | undefined;
/**
* table操作栏目渲染
* ```
* 使用方式
* tableCellRender.operateCell((item) => ({
* operateList: [
* {
* text: '编辑',
* onClick: onItemOperate.bind(null, 'update', item),
* },
* {
* text: '删除',
* needConfirm: true,
* confirmMessage: '确定要删除吗?',
* onClick: onItemOperate.bind(null, 'delete', item),
* },
* ],
* }))
* ```
*/
operateCell: (options: (item: TAny, index: number) => ButtonOperateProps) => (_value: string | number, record: any, index: number) => import("react").JSX.Element;
/**
* 实现字段超出隐藏,默认长度10个字符
* @deprecated 已过期,请使用 TextOverflow 组件实现
* ```
* 1. showMaxNumber: 显示最大长度
* 2. 会讲字符转出字节进行计算显示
* ```
*/
tooltipCell: (showMaxNumber?: number, defaultValue?: string) => (value: string | number) => string | number | import("react").JSX.Element | undefined;
/**
* Tag格式数据渲染,可结合枚举定义数据
* ```
* 独立使用
* tableCellRender.selectorCell([{ label: '已开启', value: 1 }])(value)
* tableCellRender.selectorCell([{ label: '已开启', value: 1, color: '#108ee9' }])(value)
* tableCellRender.selectorCell([{ label: '已开启', value: 1 }], { 1: '#108ee9' })(value)
* tableCellRender.selectorCell(taskTypeEnumList)(value);
*
*
* 结合table column render 使用
* render: tableCellRender.selectorCell(taskTypeEnumList);
* render: tableCellRender.selectorCell([{ label: '已开启', value: 1 ]);
* render: (value) => {
* return tableCellRender.selectorCell([{ label: '已开启', value: 1 ])(value);
* }
*
* 其中value值可以是单个值或者数组;例如:'1' 或者 ['1', '2']
* ```
*/
selectorCell: (selectorList: TagListRenderProps["dataList"], colorMap?: TagListRenderProps["colorMap"], options?: {
/** 最大显示Tag数量,超出折叠隐藏 */
maxShowCount?: number;
/** 触发maxShowCount后,被折叠的内容是否显示完整tag,默认值:false */
foldShowAllTag?: boolean;
}) => (value?: TAny) => import("react").JSX.Element | null;
/**
* 单元格对象数据处理,支持多级处理
* ```
* tableCellRender.objectCell('a.b.c')
* ```
*/
objectCell: (key: string, defaultValue?: string) => (value?: TPlainObject) => any;
/**
* 分金额展示,入参分,显示元(默认添加千分位)
* ```
* 可配置
* 1. separator:是否显示千分位分隔符,默认值:false
* 2. defaultValue:当值为空默认展示
* 3. hideBgColor:隐藏背景颜色
*
* 例如:
* fen2yuanCell()(100090) => 1000.90
* fen2yuanCell({separator: true})(100090) => 1,000.90
* fen2yuanCell()('abc') => abc
* fen2yuanCell({defaultValue: '--'})('') => --
* fen2yuanCell()('') => undefined
* fen2yuanCell({ defaultValue: 0 })('') => 0.00
* ```
*/
fen2yuanCell: (options?: {
/** 是否显示分隔符,默认值:false */
separator?: boolean;
defaultValue?: string | number;
/** 隐藏背景颜色, 默认值:true */
hideBgColor?: boolean;
}) => (value?: string | number) => string | number | import("react").JSX.Element | undefined;
/**
* 分金额展示,入参分,显示万元(默认添加千分位)
* ```
* 可配置
* 1. separator:是否显示千分位分隔符,默认值:false
* 2. defaultValue:当值为空默认展示
* 3. showBgColor:隐藏背景颜色
* 4. removeTailZero:移除小数点后末尾零
*
* 例如:
* fen2yuanCell()(1000900000) => 1000.90
* fen2yuanCell({separator: true})(1000900000) => 1,000.90
* fen2yuanCell()('abc') => abc
* fen2yuanCell({defaultValue: '--'})('') => --
* fen2yuanCell()('') => undefined
* fen2yuanCell({ defaultValue: 0 })('') => 0.00
* ```
*/
fen2wanCell: (options?: {
/** 是否显示分隔符,默认值:false */
separator?: boolean;
defaultValue?: string | number;
/** 隐藏背景颜色,默认:false */
showBgColor?: boolean;
/** 移除小数点后末尾零 */
removeTailZero?: boolean;
}) => (value?: string | number) => string | number | import("react").JSX.Element | undefined;
/**
* 单元格徽标展示数据
* ```
* 1. badge 默认颜色:灰色rgba(0, 0, 0, 0.25)
*
* 独立使用
* tableCellRender.badgeCell([{ label: '已开启', value: 1 ])(value)
* tableCellRender.badgeCell([{ label: '已开启', value: 1, color: '#108ee9' }])(value)
* tableCellRender.badgeCell([{ label: '已开启', value: 1 }], { 1: '#108ee9' })(value)
*
* 结合table column render 使用
* render: tableCellRender.badgeCell([{ label: '已开启', value: 1 ])
* render: (value) => {
* return tableCellRender.badgeCell([{ label: '已开启', value: 1 ])(value)
* }
* ```
*/
badgeCell: (selectorList: {
label: string;
value: TagListRenderValue;
color?: string;
}[], colorMap?: Record<string | string, string>) => (value?: TAny) => any;
/**
* 单元格点击事件
* ```
* 独立使用
* tableCellRender.clickCell(onClick)(value, record)
*
* 结合table column render 使用
* render: tableCellRender.clickCell(onClick)
* render: (value, record) => {
* return tableCellRender.clickCell(onClick)(value, record)
* }
* ```
*/
clickCell: (onClick: (record: TPlainObject, e: any) => void, defaultValue?: string) => (value: TAny, record: TPlainObject) => string | import("react").JSX.Element | undefined;
};
export {};