import { Component } from 'vue'; import { AnTableContext } from '../components/Table'; import { TableUseOptions } from './useTable'; import { TableColumn } from './useTableColumn'; import { useTableRefresh } from '../plugins/useTableRefresh'; import { useColumnConfig } from '../plugins/useTableConfig'; import { useRowFormat } from '../plugins/useRowFormat'; import { useRowDelete } from '../plugins/useRowDelete'; import { useRowModify } from '../plugins/useRowModify'; export interface AnTablePlugin { /** * 插件ID(唯一) * @example * ```ts * 'refresh' * ``` */ id: string; /** * 提供给其他插件使用的变量 * @example * ```ts * { isOk: true } * ``` */ provide?: Recordable; /** * 组件钩子 * @description 对应表格组件的 `setup` 钩子 */ onSetup?: (context: AnTableContext) => void; /** * 钩子 * @description 在处理前进行参数处理 */ options?: (options: TableUseOptions) => TableUseOptions | null | undefined | void; /** * 表格列 */ column?: (column: TableColumn) => TableColumn; /** * 添加部件栏组件 * @example * ```tsx * () => * ``` */ widget?: () => (props: any) => any | Component; /** * 添加操作栏组件 * @example * ```tsx * () => * ``` */ action?: () => (props: any) => any | Component; /** * 搜索前处理 * */ onBeforeSearch?: (args: { page: number; size: number; [key: string]: any }) => Recordable | null | undefined | void; onPageChange?: (page: number) => void; onSizeChange?: (size: number) => void; } export class PluginContainer { actions: any[] = []; widgets: any[] = []; constructor(private plugins: AnTablePlugin[]) { this.plugins.unshift( useTableRefresh(), useColumnConfig(), useRowFormat(), useRowDelete(), useRowModify() ); for (const plugin of plugins) { const action = plugin.action?.(); if (action) { this.actions.push(action); } const widget = plugin.widget?.(); if (widget) { this.widgets.push(widget); } } } callSetupHook(context: AnTableContext) { for (const plugin of this.plugins) { plugin.onSetup?.(context); } } callOptionsHook(options: any) { for (const plugin of this.plugins) { options = plugin.options?.(options) ?? options; } return options; } callActionHook(options: any) { for (const plugin of this.plugins) { options = plugin.options?.(options) ?? options; } return options; } callWidgetHook(options: any) { for (const plugin of this.plugins) { options = plugin.options?.(options) ?? options; } return options; } callBeforeSearchHook(options: any) { for (const plugin of this.plugins) { options = plugin.onBeforeSearch?.(options) ?? options; } return options; } callPageChangeHook(page: number) { for (const plugin of this.plugins) { plugin.onPageChange?.(page); } } callSizeChangeHook(page: number) { for (const plugin of this.plugins) { plugin.onPageChange?.(page); } } }