import { UseTableDragScrollOptions } from 'yc-pro-components/es/hooks/useTableDragScroll'; import { PlusPageProps } from 'yc-pro-components/es/components/page'; import { FieldValues } from 'yc-pro-components/es/types/form'; import { PlusColumn, PageInfo } from 'yc-pro-components/es/types/plus'; /** * 请求函数返回的数据结构 * 使用 unknown 替代 any,以兼容不同的数据结构 */ export type RequestResponse = { data: unknown[]; success?: boolean; total?: number; /** 操作符目录(可选,来自后端) */ operator_catalog?: Record; /** 字段目录(可选,来自后端) */ field_catalog?: FieldCatalog; [key: string]: unknown; }; /** * 字段目录项 - 来自后端的字段配置 */ export interface FieldCatalogItem { /** 字段类型 */ type?: 'string' | 'number' | 'date' | 'boolean' | 'json'; /** 字段标签 */ label?: string; /** 是否支持筛选 */ filter?: boolean; /** 是否可为空/控制列显示 */ nullable?: boolean; /** 是否为字典字段 */ dictField?: boolean; /** 对应 column.prop */ allowedField?: string; /** 原始字段名(如 vwProjectCountparking.projectName) */ [key: string]: unknown; } /** * 字段目录 */ export type FieldCatalog = Record; /** * 操作符选项 */ export interface OperatorOption { /** 显示标签 */ label: string; /** 操作符代码 */ code: string; } /** * 表头筛选配置 */ export interface HeaderFilterConfig { /** 是否启用表头筛选,默认 false */ enabled?: boolean; /** 字段目录(来自后端) */ fieldCatalog?: FieldCatalog; /** 操作符目录(可选,默认使用内置) */ operatorCatalog?: Record; /** 默认排序 */ defaultOrderBy?: Array<{ field: string; direction: 'asc' | 'desc'; }>; /** 是否隐藏所有列的排序图标(全局配置),默认 false。列级 headerFilter.hideSort 优先 */ hideSort?: boolean; /** 是否隐藏所有列的筛选图标(全局配置),默认 false。列级 headerFilter.hideFilter 优先 */ hideFilter?: boolean; } /** * 列级别的表头筛选配置 */ export interface ColumnHeaderFilterConfig { /** 筛选交互组件类型,若未配置则根据 column.valueType 自动推断 */ type?: 'input' | 'select' | 'date-picker' | 'time-picker' | 'time-select' | 'cascader' | 'tree-select' | 'checkbox'; /** 极度自定义的渲染函数接管(如自定义业务弹窗或滑动条等),通过回调更新组件抛出的 filter 值 */ renderField?: (value: T, onChange: (val: T) => void) => any; /** 传递给筛选渲染组件的 props,例如 { multiple: true } */ props?: Record; /** 如果想独立设置筛选组件的 options 数据源,支持传入数组或 Promise。未设置则回退取 column.options 或 autoDict */ options?: any[] | Promise | ((column: any) => any[]); /** 自定义操作符列表 */ operators?: OperatorOption[]; /** 确认回调 */ onConfirm?: (payload: HeaderFilterPayload) => void; /** 重置回调 */ onReset?: (payload: HeaderFilterResetPayload) => void; /** 是否隐藏该列的排序图标,默认 false。优先级高于全局 HeaderFilterConfig.hideSort */ hideSort?: boolean; /** 是否隐藏该列的筛选图标,默认 false。优先级高于全局 HeaderFilterConfig.hideFilter */ hideFilter?: boolean; } /** * 表头筛选确认事件 payload */ export interface HeaderFilterPayload { column: PlusColumn; op: string; value?: string; } /** * 表头筛选重置事件 payload */ export interface HeaderFilterResetPayload { column: PlusColumn; op: string; } /** * 筛选项 */ export interface FilterItem { field: string; op: string; value?: string; } /** * 筛选状态 */ export interface HeaderFiltersState { logic: 'and' | 'or'; filters: FilterItem[]; } /** * 排序项 */ export interface OrderByItem { field: string; direction: 'asc' | 'desc'; } /** * YcPlusPage 组件属性 */ export interface YcPlusPageProps extends /* @vue-ignore */ Omit, 'request' | 'data' | 'search' | 'pagination'> { /** 表格列配置 */ columns?: PlusColumn[]; /** 数据请求函数,返回类型为 unknown 以兼容不同的数据结构 */ request?: (query: PageInfo & FieldValues) => Promise; /** 直接传入的数据数组,如果提供了此属性,将优先使用此数据,不再调用 request */ data?: unknown[]; /** 是否显示为卡片样式,默认 true */ isCard?: boolean; /** 搜索表单配置,支持对象配置或 false,默认值为空对象 */ search?: false | Record; /** 搜索卡片属性配置,默认 { shadow: 'never' } */ searchCardProps?: Record; /** 表格卡片属性配置,默认 { shadow: 'never' } */ tableCardProps?: Record; /** * 表格配置,默认包含 titleBar: { refresh: false, density: false } * 当包含 useVirtual: true 时,启用虚拟滚动表格(el-table-v2) * 虚拟模式下不支持:editable、dragSortable、hasExpand、isRadio */ table?: Record & { useVirtual?: boolean; }; /** 分页配置,默认 { background: true, pageSizes: [20, 50, 100], defaultPageSize: 20 },支持传入 false 隐藏分页 */ pagination?: false | Record; /** 是否隐藏默认的列设置图标,默认 false */ hideColumnSettingsIcon?: boolean; /** * 是否显示搜索栏 * @description * - 如果传入 true/false,使用传入的值 * - 如果不传(undefined),使用 YcConfigProvider 的 showPageSearch 全局配置 * - 如果全局配置也未设置,默认 true */ showSearch?: boolean; /** * 表头筛选配置 * - 传入 true 启用默认配置 * - 传入对象自定义配置 * - 不传或传入 false 禁用(默认) */ headerFilter?: HeaderFilterConfig | boolean; /** * 是否隐藏表头筛选(简写方式) * @default true(默认隐藏) */ hideHeaderFilter?: boolean; /** * 是否启用表格横向拖拽滚动 * - true: 使用默认配置启用 * - 对象: 自定义 useTableDragScroll 配置(resizeAreaWidth / scrollContainerSelector 等) * - false / 不传: 关闭(默认) * @default false */ dragScroll?: boolean | UseTableDragScrollOptions; } /** * 列设置缓存数据 * 用于保存列的排列顺序和勾选状态到 localStorage */ export interface ColumnCacheData { /** 列顺序(prop 数组) */ order: string[]; /** 已勾选的列(prop 数组) */ checked: string[]; /** 列宽度(prop -> width 映射,用户拖动调整列宽后缓存) */ widths?: Record; } export type RePlusPageProps = YcPlusPageProps;