import type { EventEmitter as EventEmitterType } from "event-emitter3"; export declare namespace TableHelper { type RecordKey = string; type RecordType = { [key in RecordKey]: any; }; /** * 加载表格数据的函数 */ class TableHelper { /** * @param loadRecord 加载数据的函数 * @param recordKeyName 指定数据 key 的属性名称 * @param options 可选的额外参数 * @param options.pageStartIndex 分页时起始页的页数. 默认第一页的页数为 `1` * @param options.pageSize 分页时每页数据的条数, 默认为 `10` 页 */ constructor(loadRecord: LoadTableRecordFunction, recordKeyName: RECORD_KEY, options?: Partial); /** * 保存最近一次加载数据时, 变化的查询参数. * * 数据加载完成后将会清空. * @private */ private changes; /** * 记录的 key 的属性名称 * @protected */ protected readonly recordKeyName: RECORD_KEY; protected readonly _recordLoadFunction: LoadTableRecordFunction; protected readonly _recordMap: Map; /** * 最近一次加载的数据 * @protected */ latestLoadRecord?: Array; protected eventEmitter: EventEmitterType; /** * 相对于 {@link options.pageStartIndex} 的当前页数, 从 1 开始计数. * @protected */ protected get currentPageNumber(): number; readonly options: TableHelperOptions; paginationParams: TablePaginationParams; filterParams: TableFilterParams; sortParams: Array; /** * 指示当前是否正在加载数据的流程中 */ loading: boolean; /** * 指示当前是否正在任何流程中, 包括加载中以及加载前后. * * @see {@link _loadRecord} */ processing: boolean; /** * 数据总条数 */ total: number; /** * 获取最新加载的数据 */ get records(): Array; /** * 根据 {@link paginationParams.pageSize} 和 {@link total} 计算出的总页数, 以便于分页时使用. * * **该值为绝对页数, 不会受到 {@link options.pageStartIndex} 的影响.** */ get pageCount(): number; /** * 加载下一页的数据, 已到达最后一页时被忽略. */ nextPage(): this; /** * 加载最后一页的数据, 如果当前已经是最后一页则被忽略. */ lastPage(): this; /** * 加载上一页的数据, 已到达第一页时被忽略. */ previousPage(): this; /** * 加载第一页的数据, 如果当前已经是第一页则被忽略. */ firstPage(): this; /** * 重新请求当前页的数据. */ reloadPage(): this; /** * 跳转到指定页码. 页码默认是相对与 {@link pageStartIndex} 的, 可以设置 `relative` 为 `false` 使用绝对页码. * @param pageNumber * @param relative */ skipToPage(pageNumber: number, relative?: boolean): this; /** * 等待记录加载完成. * * **注意:** 如果当前没有在加载数据, 会等待直到下一次加载数据完成. */ wait(): Promise; /** * 设置过滤参数, 并重新加载数据. * @param params */ updateFilterParams(params: TableFilterParams): this; /** * 设置排序参数, 并重新加载数据. * @param paramsList 支持同时设置多个排序参数 */ addSortParams(...paramsList: Array): this; /** * 移除排序参数, 并重新加载数据. * @param args 传入 {@link TableSortParams} 或 {@link TableSortParams.field} 以删除对应的排序参数. 如传空则删除所有排序参数 */ removeSortParams(...args: Array): this; /** * 设置分页参数, 并重新加载数据. * @param params.current 当前页数 * @param params.pageSize 每页的数据条数 */ updatePaginationParams(params: Partial): this; /** * 使用防抖函数包装的 {@link _loadRecord} 方法, 以便于在短时间内多次调用时只会执行一次. 默认的防抖时间为 `480ms`. * @protected * * **请不要用箭头函数来定义该方法, 否则会导致 `this` 指向错误.** * * 其中一个用例是, 当外部用 [reactive](https://vuejs.org/api/reactivity-core.html#reactive) 包裹时, 会导致 `this` 指向 {@link TableHepler} 本身, **而不是 Proxy 对象**. */ protected debounceLoadRecord: import("lodash").DebouncedFunc<() => Promise>; /** * 重新加载数据, 默认会有 480 ms 的防抖. 如需要立即加载, 将 `immediate` 设置为 `true`, 则会忽略防抖并立即加载数据. * @param immediate 是否立即加载数据 */ loadRecord(immediate?: boolean): this; destroy(): void; on(type: K, listener: (event: TableHelperEventMap[K]) => any): void; off(type: K, listener: (event: TableHelperEventMap[K]) => any): void; once(type: K, listener: (event: TableHelperEventMap[K]) => any): void; protected emit(type: K, event: TableHelperEventMap[K]): void; protected _loadRecord(): Promise; protected _internalLoadRecord(): Promise; protected _invokeLoadRecordFunction(): Promise>; /** * 判断当前是否已处于最后一页. * * 特殊情况: * * 只有成功加载过记录后, 才会判断是否为最后一页. * @protected */ protected _isLastPage(): boolean; protected _joinLoadRecordArguments(): [ TablePaginationParams, TableFilterParams, TableSortParams[], ...Array ]; /** * 将相对页码(即从 {@link options.pageStartIndex} 开始的页码)转换为绝对页码. * @param page * @protected */ protected _relativeToAbsolutePageNumber(page: number): number; /** * 加载记录前的回调. 是否继续进行流程取决于该函数是否返回了一个 error. * * * 如果返回 error, 则将 {@link loading} 状态设置为 false 并中止流程. * * 如果返回值为空继续加载流程. * @param changes 发生变化的参数 * @protected */ protected _onBeforeLoadRecord(changes: Partial): Error | undefined; /** * 加载记录后的回调. 加载完成后的 {@link loading} 状态依赖于该函数是否返回了一个 error. * * * 如果返回 error, 则将 {@link loading} 状态设置为 false. * * 如果返回值为空, 则认为 `error` 是预期的, {@link loading} 继续保持当前状态. * @param changes 发生变化的参数 * @param error 加载失败时的错误信息 * @protected */ protected _onAfterLoadRecord(changes: Partial, error?: Error): Error | undefined; /** * 加载流程开始前的回调. */ protected _loadRecordProcessStart(): void; /** * 加载流程结束后的回调. 无论加载成功或失败都会执行该函数. * 应在记录加载完后且触发回调(recordLoadEnd, recordLoadError)前调用. */ protected _loadRecordProcessFinally(): void; } class TableHelperOptions { /** * 分页起始页码, 默认为 1 */ pageStartIndex: number; /** * 每页的数据条数, 默认为 10 */ pageSize: number; constructor(params?: Partial); } /** * 分页查询参数, 用于记录分页信息. */ interface TablePaginationParams { /** * 当前页数 */ current: number; /** * 每页的数据条数 */ pageSize: number; } /** * 过滤查询参数, 用于记录搜索条件. */ type TableFilterParams = Record; /** * 排序参数, 用于记录排序条件. */ interface TableSortParams { /** * 排序方式, `ascend` 为升序, `descend` 为降序, `undefined` 为不排序 */ direction: "ascend" | "descend" | undefined | null; /** * 排序字段 */ field: string; } /** * 加载记录的函数返回值. */ interface LoadTableRecordFunctionResult { /** * 加载到的记录 */ data: Array; /** * 记录总数 */ total: number; } /** * 加载记录的函数, 用于 {@link TableHelper} 的构造函数. * @param pagination 分页参数 * @param filter 过滤参数 * @param sort 排序参数 * * @returns 返回值为 {@link LoadTableRecordFunctionResult} */ type LoadTableRecordFunction = (pagination: TablePaginationParams, filter: TableFilterParams, sort: Array, ...args: Array) => LoadTableRecordFunctionResult | Promise>; /** * 表格变更参数, 用于标记表格的哪些参数发生了变化, 用于 {@link TableHelperEventMap.recordLoadStart} 和 {@link TableHelperEventMap.recordLoadEnd} 的回调函数. */ interface TableChangedParams { current: boolean; pageSize: boolean; filter: boolean; sort: boolean; } /** * {@link TableHelper} 发出的事件. */ interface TableHelperEventMap { /** * 记录加载开始时触发. */ recordLoadStart: { changes: Partial; }; /** * 记录加载完成时触发. */ recordLoadEnd: { changes: Partial; }; recordLoadError: { changes: Partial; error: Error; }; } }