You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

536 lines
14 KiB
TypeScript

1 year ago
import type { SpinProps } from 'ant-design-vue/lib/spin'
import type { TableProps } from 'ant-design-vue/lib/table'
import type {
ColumnFilterItem,
ColumnType,
CompareFn,
SortOrder
} from 'ant-design-vue/lib/table/interface'
import type { ComputedRef, CSSProperties, ExtractPropTypes, PropType, Ref } from 'vue'
import type { AlertRenderType } from './components/Alert'
import type { ListToolBarProps } from './components/ListToolBar'
import type { OptionConfig, ToolBarProps } from './components/ToolBar'
import type { DensitySize } from './components/ToolBar/DensityIcon'
import type { ColumnsState, CounterType } from './container'
import type { SizeType } from 'ant-design-vue/lib/config-provider/context'
import type { TooltipProps } from 'ant-design-vue/es/tooltip'
import type { VueKey, VueNode, VueNodeOrRender } from '#/types'
import type { CardProps, InputProps } from 'ant-design-vue'
import type { ChangeEvent } from 'ant-design-vue/es/_util/EventInterface'
import { tableProps } from 'ant-design-vue/es/table'
import type { WithFalse } from '#/layout/types'
import { VueNodeOrRenderPropType } from '#/types'
import omit from 'ant-design-vue/es/_util/omit'
import type { ProFieldEmptyText } from '#/field'
import type { LightWrapperProps } from '#/form/BaseForm/LightWrapper'
import type { SearchConfig } from '#/table/components/Form/FormRender'
import type {
ProCoreActionType,
ProSchema,
ProSchemaComponentTypes,
ProTableEditableFnType,
SearchTransformKeyFn
} from '#/utils/typing'
import type { ApiResult } from '@/api/types'
export type WrapperTooltipProps = TooltipProps & {
icon?: VueNode
}
export type LabelTooltipType = WrapperTooltipProps | VueNode
export interface SearchProps extends InputProps {
inputPrefixCls?: string
onSearch?: (value: string, event?: ChangeEvent | MouseEvent | KeyboardEvent) => void
// enterButton?: VueNode // vue 暂时不支持 注释
loading?: boolean
}
export type PageInfo = {
pageSize: number
total: number
current: number
}
export type PageResult<T> = {
records: T[]
total: number
}
export type RequestData<T> = ApiResult<PageResult<T>>
export type UseFetchDataAction<T = any> = {
dataSource: T[]
setDataSource: (dataSource: T[]) => void
loading: boolean | SpinProps | undefined
pageInfo: PageInfo
reload: () => Promise<void>
fullScreen?: () => void
reset: () => void
pollingLoading: boolean
setPageInfo: (pageInfo: Partial<PageInfo>) => void
}
/** 转化列的定义 */
export type ColumnRenderInterface<T> = {
item: ProColumns<T>
text: any
row: T
index: number
columnEmptyText?: ProFieldEmptyText
type: ProSchemaComponentTypes
counter: CounterType
}
export type TableRowSelection = TableProps<any>['rowSelection']
export type ExtraProColumnType<T> = Omit<
ColumnType<T>,
'render' | 'children' | 'title' | 'filters' | 'onFilter' | 'sorter'
> & {
sorter?:
| string
| boolean
| CompareFn<T>
| {
compare?: CompareFn<T>
/** Config multiple sorter order priority */
multiple?: number
}
}
export type ProColumnType<T = unknown, ValueType = 'text'> = ProSchema<
T,
ExtraProColumnType<T> & {
index?: number
/**
*
*
* @param = span* colSize
* @param 1
*/
colSize?: number
/** 搜索表单的默认值 */
initialValue?: any
/** 是否缩略 */
ellipsis?: boolean | { showTitle?: boolean }
/** 是否拷贝 */
copyable?: boolean
/** @deprecated Use `search=false` instead 在查询表单中隐藏 */
hideInSearch?: boolean
/** 在查询表单中隐藏 */
search?:
| false
| {
/**
* Transform: (value: any) => ({ startTime: value[0], endTime: value[1] }),
*
* key,
*/
transform: SearchTransformKeyFn
}
/** 在 table 中隐藏 */
hideInTable?: boolean
/** 在新建表单中删除 */
hideInForm?: boolean
/** 不在配置工具中显示 */
hideInSetting?: boolean
/** 表头的筛选菜单项 */
filters?: boolean | ColumnFilterItem[]
/** 筛选的函数,设置为 false 会关闭自带的本地筛选 */
onFilter?: boolean | ColumnType<T>['onFilter']
/** Form 的排序 */
order?: number
/** 可编辑表格是否可编辑 */
editable?: boolean | ProTableEditableFnType<T>
/** @private */
listKey?: string
/** 只读 */
readonly?: boolean
/** 列设置的 disabled */
disable?:
| boolean
| {
checkbox: boolean
}
onCell?: any
render?: any
},
ProSchemaComponentTypes,
ValueType,
{
lightProps?: LightWrapperProps
}
>
export type ProColumnGroupType<RecordType, ValueType> = {
children: ProColumns<RecordType>[]
} & ProColumnType<RecordType, ValueType>
export type ProColumns<T = any, ValueType = 'text'> =
| ProColumnGroupType<T, ValueType>
| ProColumnType<T, ValueType>
export type BorderedType = 'search' | 'table'
export type Bordered =
| boolean
| {
search?: boolean
table?: boolean
}
export type ColumnsStateType = {
/**
* localStorage sessionStorage
*
* @param localStorage
* @param sessionStorage
*/
persistenceType?: 'localStorage' | 'sessionStorage'
/** 持久化的key用于存储到 storage 中 */
persistenceKey?: string
/** ColumnsState 的值columnsStateMap将会废弃 */
defaultValue?: Record<string, ColumnsState>
/** ColumnsState 的值columnsStateMap将会废弃 */
value?: Record<string, ColumnsState>
onChange?: (map: Record<string, ColumnsState>) => void
}
// 表格请求数据的方法
export type TableRequest<U = Record<string, unknown>> = (
params: U & {
pageSize?: number
current?: number
keyword?: string
},
sort: Record<string, SortOrder>,
filter: Record<string, VueKey[] | null>
) => Promise<unknown>
export const proTableProps = <T, U = Record<string, any>, ValueType = 'text'>() => ({
...omit(tableProps(), ['columns', 'rowSelection']),
/**
* @name
*/
columns: { type: Array as PropType<ProColumns<T, ValueType>[]>, default: () => [] },
/**
* ListToolBar
*/
toolbar: Object as PropType<ListToolBarProps>,
/**
* padding
*/
ghost: { type: Boolean, default: false },
/**
* request
*
* @example pathname request
* params={{ pathName }}
*/
params: { type: Object as PropType<U>, default: () => ({}) },
/**
*
*
* @deprecated 使 columnsState.onChange
*/
onColumnsStateChange: Function as PropType<(map: Record<string, ColumnsState>) => void>,
/** 列状态的配置,可以用来操作列功能 */
columnsState: Object as PropType<ColumnsStateType>,
onSizeChange: Function as PropType<(size: DensitySize) => void>,
/**
* table
*/
cardProps: {
type: [Object, Boolean] as PropType<WithFalse<CardProps>>,
default: undefined
},
/**
* table
*/
tableRender: Function as PropType<
(
props: any,
defaultDom: JSX.Element,
/** 各个区域的 dom */
domList: {
toolbar: VueNode | undefined
alert: VueNode | undefined
table: VueNode | undefined
}
) => VueNode
>,
/**
* table ProList使
*/
tableViewRender: Function as PropType<
(props: TableProps<T>, defaultDom: JSX.Element) => JSX.Element | undefined
>,
/**
* table dom
*
* @example table
*
* tableExtraRender={()=> <Statistic title="统计" value={10} />}
*/
tableExtraRender: Function as PropType<(props: any, dataSource: T[]) => VueNode>,
/** 一个获得 dataSource 的方法 */
request: Function as PropType<TableRequest<U>>,
/** 对数据进行一些处理 */
postData: Function as PropType<(data: any[]) => any[]>,
/** 默认的数据 */
defaultData: Array as PropType<T[]>,
/**
* table
*
* @example
* actionRef.current?.reload();
*
* @example
* actionRef.current?.reset();
*/
actionRef: Object as PropType<Ref<ActionType | undefined>>,
/**
* form
*/
// formRef: TableFormItem<T>['formRef']
/**
*
*/
toolBarRender: {
type: [Function, Boolean] as PropType<ToolBarProps<T>['toolBarRender'] | false>,
default: undefined
},
/**
*
*/
onLoad: Function as PropType<(dataSource: T[]) => void>,
/**
* loading
*/
onLoadingChange: Function as PropType<(loading: boolean | SpinProps | undefined) => void>,
/**
*
*/
onRequestError: Function as PropType<(e: Error) => void>,
/**
* ProTable onValueChange formRef.current?.submit()
*
* @param dataSource
*/
polling: [Number, Function] as PropType<number | ((dataSource: T[]) => number)>,
/** 给封装的 table 的 className */
tableClassName: String,
/** 给封装的 table 的 style */
tableStyle: Object as PropType<CSSProperties>,
/** 左上角的 title */
headerTitle: VueNodeOrRenderPropType as PropType<VueNodeOrRender>,
/** 标题旁边的 tooltip */
tooltip: [String, Object] as PropType<string | LabelTooltipType>,
/** 操作栏配置 */
options: { type: [Object, Boolean] as PropType<WithFalse<OptionConfig>>, default: undefined },
/**
* @type SearchConfig
*
*/
search: {
type: [Object, Boolean] as PropType<WithFalse<SearchConfig>>,
default: undefined
},
/**
* antd Form , form onFinish
*
* type="form" Form
*/
// form?: Omit<ProFormProps & QueryFilterProps, 'form'>
/**
* TODO, 使 dayjs
*
* moment - string YYYY-DD-MM - number
*
*/
// dateFormatter?:
// | 'string'
// | 'number'
// | ((value: moment.Moment, valueType: string) => string | number)
// | false
/** 格式化搜索表单提交数据 */
beforeSearchSubmit: Function as PropType<(params: Partial<U>) => any>,
/**
* false
*
* table alert
*/
tableAlertRender: {
type: [Object, Boolean] as PropType<AlertRenderType<T>>,
default: undefined
},
/**
* false
*
* table alert
*/
tableAlertOptionRender: {
type: [Object, Boolean] as PropType<AlertRenderType<T>>,
default: undefined
},
/** 选择项配置 */
rowSelection: {
type: [Object, Boolean] as PropType<
| (TableProps<T>['rowSelection'] & {
alwaysShowAlert?: boolean
})
| false
>,
default: false
},
/** 支持 ProTable 的类型 */
// type: ProSchemaComponentTypes
/** 提交表单时触发 */
onSubmit: Function as PropType<(params: U) => void>,
/** 重置表单时触发 */
onReset: Function as PropType<() => void>,
/** 空值时显示 */
// columnEmptyText: ProFieldEmptyText
/** 是否手动触发请求 */
manualRequest: { type: Boolean, default: false },
/**
*
*
* @example
* editable={{type:"multiple"}}
*
* @example
* editable={{ onSave:async (rows)=>{ await save(rows) } }}
*/
// editable?: RowEditableConfig<T>
/**
*
*/
onDataSourceChange: {
type: Function as PropType<(dataSource: T[]) => void>,
default: undefined
},
/** 查询表单和 Table 的卡片 border 配置 */
cardBordered: {
type: [Boolean, Object] as PropType<Bordered>,
default: undefined
},
/** 去抖时间 */
debounceTime: { type: Number, default: 10 },
/**
* request
*
* @default true
*
*/
revalidateOnFocus: { type: Boolean, default: false },
/** 默认的表格大小 */
defaultSize: String as PropType<SizeType>
/**
* @name, name,name form
*/
// name?: NamePath
/**
*
*/
//ErrorBoundary: any
})
export type ProTableProps = Partial<ExtractPropTypes<ReturnType<typeof proTableProps>>>
export type ActionType = ProCoreActionType & {
fullScreen?: () => void
setPageInfo?: (page: Partial<PageInfo>) => void
}
export type UseFetchProps = {
dataSource?: any
loading: Ref<UseFetchDataAction['loading']>
onLoadingChange?: (loading: UseFetchDataAction['loading']) => void
onLoad?: (dataSource: any[], extra: any) => void
onDataSourceChange?: (dataSource?: any) => void
postData: any
pageInfo:
| {
current?: number
pageSize?: number
defaultCurrent?: number
defaultPageSize?: number
}
| false
onPageInfoChange?: (pageInfo: PageInfo) => void
effects?: ComputedRef<any[]>
onRequestError?: (e: Error) => void
manual: boolean
debounceTime?: number
polling?: number | ((dataSource: any[]) => number)
revalidateOnFocus?: boolean
}
export type OptionSearchProps = Omit<SearchProps, 'onSearch'> & {
/** 如果 onSearch 返回一个false直接拦截请求 */
onSearch?: (keyword: string) => boolean | undefined
}