import type { TExecutionSequence, TMethodMetaValue } from "../types"; /** * 事件链执行器。 * * 改造前"按 priority 排序 -> 按 es 分阶段 -> 依次 await"这套逻辑 * 在 UmByClass(操作列 / 工具栏)和 UmByClassEnhance(弹窗确认)里被复制了 3 份, * 参数顺序、是否透传行数据、是否支持重跑都各不相同。这里统一。 */ /** 一个待执行的事件 */ export interface IEventTask { event: (...args: any[]) => any; meta: TMethodMetaValue; } /** 阶段顺序 */ export declare const EVENT_PHASES: TExecutionSequence[]; /** 按优先级排序(数字越大越先执行),不修改入参数组 */ export declare const sortTasksByPriority: (tasks: IEventTask[]) => IEventTask[]; /** * 阶段之间的钩子,把控制权交回业务组件(弹窗、消息提示等都挂在这里)。 * - `data`:当前累积的数据 * - `type`:按钮类型("添加" / "edit" / "del" / "批量删除" ...),业务侧据此分支 * - `phase`:当前阶段 * - `meta`:该阶段第一个事件的元数据 * @returns 处理后的数据,作为下一阶段的输入 */ export type TFireHook = (data: any, type: string, phase: TExecutionSequence, meta?: TMethodMetaValue) => Promise | any; export interface IRunEventPipelineOptions { tasks: IEventTask[]; /** 原始入参,恒作为每个事件的第一个参数 */ rowId: any; /** * "当前数据"(第二个参数,也是 fire 钩子拿到的 `data`)的初始值, * 缺省等于 `rowId`。 * * 操作列会把整行数据作为初始值传进来:行数据通常已经是完整的, * 组件不应该强迫使用方再写一个 `es: "onBefore"` 的方法去查一遍详情, * 否则一旦漏写,`edit` 拿到的就只有一个行 id,表单会静默变成空的。 */ initial?: any; /** 按钮类型,透传给 fire 钩子 */ type: string; /** 阶段间的钩子 */ fire: TFireHook; /** 透传给事件的额外参数(如整表数据) */ extra?: any[]; /** * 只执行指定阶段(默认按 onBefore -> onNow -> onAfter 全跑)。 * 弹窗"确定"时只需要补跑 onAfter,用这个参数收窄。 */ phases?: TExecutionSequence[]; /** * onAfter 返回假值时是否回到第一阶段重跑。 * 原 UmByClass 工具栏分支用 `i -= 2` 实现,一旦事件始终返回假值会死循环卡死页面, * 这里保留该行为但加上最大重跑次数保护。 */ rerunOnAfterFalsy?: boolean; maxRerun?: number; } /** * 依次执行 onBefore -> onNow -> onAfter。 * * 事件签名固定为 `(rowId, currentData, meta, ...extra)`: * - `rowId`:原始入参(行 id / 选中项),恒定不变; * - `currentData`:上一个事件的返回值,同阶段多个事件形成"责任链"; * - `meta`:该事件的元数据; * - `...extra`:组件透传的额外数据(如整表数据)。 */ export declare function runEventPipeline(options: IRunEventPipelineOptions): Promise;