diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/EventFilterTableDemo.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/EventFilterTableDemo.tsx index a1bfbf37ec..d2a2f0d796 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/EventFilterTableDemo.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/EventFilterTableDemo.tsx @@ -1,12 +1,18 @@ import React, { useState, useEffect, useMemo, useRef, useCallback } from 'react'; import { Button, Space, Card, Modal, App, Typography, Divider, Spin } from 'antd'; import { DeleteOutlined, RedoOutlined, SettingOutlined } from '@ant-design/icons'; -import { EventBus } from './libs/event-bus'; -import { EventFlowActionOptions, EventFlowManager } from './libs/eventflow-manager'; -import { FilterFlowManager } from './libs/filterflow-manager'; -import { EventContext, FilterContext, Filter } from './libs/types'; +import { + EventBus, + EventFlowActionOptions, + EventFlowManager, + FilterFlowManager, + EventContext, + FilterHandlerContext, + IFilter, + useTabulatorBuiltinStyles, + useTabulatorStyles, +} from '@nocobase/client'; import { configureAction } from './actions/open-configure-dialog'; -import { useTabulatorBuiltinStyles, useTabulatorStyles } from './libs/hooks'; import { useCompile } from '@nocobase/client'; import { TabulatorFull as Tabulator, ColumnDefinition } from 'tabulator-tables'; import ReactDOM from 'react-dom/client'; @@ -113,7 +119,7 @@ eventFlowManager.addAction(openViewDialogAction); eventFlowManager.addAction(configureAction); // 配置Action // --- Filter 定义 --- -const showInitialColumnsFilter: Filter = { +const showInitialColumnsFilter: IFilter = { name: 'showInitialColumns', title: '显示初始列', group: 'columns', @@ -160,7 +166,7 @@ const showInitialColumnsFilter: Filter = { }, }; -const addActionColumnFilter: Filter = { +const addActionColumnFilter: IFilter = { name: 'addActionColumn', title: '添加操作列', group: 'columns', @@ -355,7 +361,7 @@ const EventFilterTableDemo: React.FC = (props) => { // 应用 FilterFlow 获取列配置 const applyColumnFilter = useCallback(async () => { - const context: FilterContext = { + const context: FilterHandlerContext = { props: {}, payload: { hooks: hooks, diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/action-reuse.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/action-reuse.tsx index a62b16ea15..bb25877567 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/action-reuse.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/action-reuse.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { EventBus } from '../libs/event-bus'; +import { EventBus } from '@nocobase/client'; import { openSimpleDialogAction } from '../actions/open-simple-dialog'; import { Button, Flex } from 'antd'; diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/basic-eventflow.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/basic-eventflow.tsx index 628432326e..4a2936c0b4 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/basic-eventflow.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/basic-eventflow.tsx @@ -1,10 +1,9 @@ import { Button } from 'antd'; import React from 'react'; -import { EventFlowManager } from '../libs/eventflow-manager'; +import { EventFlowManager, EventBus } from '@nocobase/client'; import { openSimpleDialogAction } from '../actions/open-simple-dialog'; import { openNotificationAction } from '../actions/open-notification'; import { openFormDialogAction } from '../actions/open-form-dialog'; -import { EventBus } from '../libs/event-bus'; // 创建事件总线实例 const eventBus = new EventBus(); diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/basic-form.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/basic-form.tsx index c841cd64e8..cf77e88fa8 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/basic-form.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/basic-form.tsx @@ -1,5 +1,5 @@ import { Button, Space, Alert, Card, Divider } from 'antd'; -import { EventBus } from '../libs/event-bus'; +import { EventBus } from '@nocobase/client'; import React, { useState } from 'react'; import { openFormDialogAction } from '../actions/open-form-dialog'; diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/basic.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/basic.tsx index 79d4ab459d..dbe52dc552 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/basic.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/basic.tsx @@ -1,5 +1,5 @@ import { Button } from 'antd'; -import { EventBus } from '../libs/event-bus'; +import { EventBus } from '@nocobase/client'; import React from 'react'; import { openSimpleDialogAction } from '../actions/open-simple-dialog'; diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/conditional-eventflow.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/conditional-eventflow.tsx index b3d4b9ea07..55e381cbd9 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/conditional-eventflow.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/conditional-eventflow.tsx @@ -1,9 +1,8 @@ import { Button, Radio, Space } from 'antd'; import React, { useState } from 'react'; -import { EventFlowManager } from '../libs/eventflow-manager'; +import { EventFlowManager, EventBus } from '@nocobase/client'; import { openSimpleDialogAction } from '../actions/open-simple-dialog'; import { openNotificationAction } from '../actions/open-notification'; -import { EventBus } from '../libs/event-bus'; const eventBus = new EventBus(); const eventFlowManager = new EventFlowManager(eventBus); diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/conditional-flow-trigger.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/conditional-flow-trigger.tsx index e716e5555c..5a9653d4ba 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/conditional-flow-trigger.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/conditional-flow-trigger.tsx @@ -1,9 +1,8 @@ import { Button, InputNumber, Space, Switch, Typography } from 'antd'; import React, { useState } from 'react'; -import { EventFlowManager } from '../libs/eventflow-manager'; +import { EventFlowManager, EventBus } from '@nocobase/client'; import { openSimpleDialogAction } from '../actions/open-simple-dialog'; import { openNotificationAction } from '../actions/open-notification'; -import { EventBus } from '../libs/event-bus'; const { Text } = Typography; diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/configurable-action.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/configurable-action.tsx index 0597cae2a1..cc0e972571 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/configurable-action.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/configurable-action.tsx @@ -1,7 +1,6 @@ import { Button, Space, Typography, message } from 'antd'; import React, { useState } from 'react'; -import { EventFlowManager } from '../libs/eventflow-manager'; -import { EventBus } from '../libs/event-bus'; +import { EventFlowManager, EventBus } from '@nocobase/client'; import { configureAction } from '../actions/open-configure-dialog'; // 创建事件总线和事件流管理器 diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/data-passing-eventflow.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/data-passing-eventflow.tsx index 631465add3..1ce6dc80ba 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/data-passing-eventflow.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/data-passing-eventflow.tsx @@ -1,9 +1,8 @@ import { Button } from 'antd'; import React from 'react'; -import { EventFlowManager } from '../libs/eventflow-manager'; +import { EventFlowManager, EventBus } from '@nocobase/client'; import { openSimpleDialogAction } from '../actions/open-simple-dialog'; import { openNotificationAction } from '../actions/open-notification'; -import { EventBus } from '../libs/event-bus'; // Create managers const eventBus = new EventBus(); diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/multi-button-eventflow.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/multi-button-eventflow.tsx index 722586e259..e6ca8b7c4e 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/multi-button-eventflow.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/multi-button-eventflow.tsx @@ -1,10 +1,9 @@ import { Button, Space, Divider } from 'antd'; import React from 'react'; -import { EventFlowManager } from '../libs/eventflow-manager'; +import { EventFlowManager, EventBus } from '@nocobase/client'; import { openSimpleDialogAction } from '../actions/open-simple-dialog'; import { openNotificationAction } from '../actions/open-notification'; import { openFormDialogAction } from '../actions/open-form-dialog'; -import { EventBus } from '../libs/event-bus'; // 创建事件总线和事件流管理器 const eventBus = new EventBus(); diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/multi-sync-events.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/multi-sync-events.tsx index 511c5c0f39..0977ab892e 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/multi-sync-events.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/multi-sync-events.tsx @@ -1,5 +1,5 @@ import { Button } from 'antd'; -import { EventBus } from '../libs/event-bus'; +import { EventBus } from '@nocobase/client'; import React from 'react'; import openSimpleDialogAction from '../actions/open-simple-dialog'; import openNotificationAction from '../actions/open-notification'; diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/multiple-async-events.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/multiple-async-events.tsx index 3f31e34233..9b6d550232 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/multiple-async-events.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/events/multiple-async-events.tsx @@ -1,5 +1,5 @@ import { Button } from 'antd'; -import { EventBus } from '../libs/event-bus'; +import { EventBus } from '@nocobase/client'; import React from 'react'; import openSimpleDialogAction from '../actions/open-simple-dialog'; import openNotificationAction from '../actions/open-notification'; diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/basic-filter.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/basic-filter.tsx index 8cdd61b41a..3e3c8bba67 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/basic-filter.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/basic-filter.tsx @@ -1,11 +1,10 @@ import { Card, Space } from 'antd'; import React, { useEffect, useMemo, useState } from 'react'; -import { Filter, FilterContext } from '../libs/types'; -import { SchemaComponent, Checkbox, FormItem } from '@nocobase/client'; +import { IFilter, FilterHandlerContext, SchemaComponent, Checkbox, FormItem } from '@nocobase/client'; import { createForm, onFormValuesChange } from '@formily/core'; import { FormContext } from '@formily/react'; -const caseConvertFilter: Filter = { +const caseConvertFilter: IFilter = { name: 'caseConvert', title: '大小写转换', description: '将输入文本转换为大写或小写', @@ -18,7 +17,7 @@ const caseConvertFilter: Filter = { 'x-component': 'Checkbox', }, }, - handler: async (text, params, context: FilterContext) => { + handler: async (text, params, context: FilterHandlerContext) => { if (typeof text === 'string') { if (params.uppercase) { return text.toUpperCase(); diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/basic-filterflow.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/basic-filterflow.tsx index 77d803c255..6dadf26717 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/basic-filterflow.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/basic-filterflow.tsx @@ -1,6 +1,6 @@ import { Button, Card, Space, Typography } from 'antd'; import React, { useState } from 'react'; -import { FilterFlowManager } from '../libs/filterflow-manager'; +import { FilterFlowManager } from '@nocobase/client'; // 创建过滤器管理器实例 const filterFlowManager = new FilterFlowManager(); diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/conditional-filterflow.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/conditional-filterflow.tsx index 764851d613..7fb3f355ff 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/conditional-filterflow.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/conditional-filterflow.tsx @@ -1,6 +1,6 @@ import { Button, Card, Input, Radio, Space, Typography } from 'antd'; import React, { useState } from 'react'; -import { FilterFlowManager } from '../libs/filterflow-manager'; +import { FilterFlowManager } from '@nocobase/client'; // 创建FilterFlowManager实例 const filterFlowManager = new FilterFlowManager(); diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/configurable-filter.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/configurable-filter.tsx index cebc0eab85..61cdec5799 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/configurable-filter.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/configurable-filter.tsx @@ -1,6 +1,6 @@ import { Button, Card, Form, Input, Select, Space, Typography, Modal, Switch, InputNumber } from 'antd'; import React, { useState } from 'react'; -import { FilterFlowManager } from '../libs/filterflow-manager'; +import { FilterFlowManager } from '@nocobase/client'; import { configureAction } from '../actions/open-configure-dialog'; // 创建FilterFlowManager实例 diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/data-transform-filterflow.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/data-transform-filterflow.tsx index 2a0d9d9425..4d0e2c376f 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/data-transform-filterflow.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/data-transform-filterflow.tsx @@ -1,6 +1,6 @@ import { Button, Card, Table, Space, Typography } from 'antd'; import React, { useState } from 'react'; -import { FilterFlowManager } from '../libs/filterflow-manager'; +import { FilterFlowManager } from '@nocobase/client'; // 创建FilterFlowManager实例 const filterFlowManager = new FilterFlowManager(); diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/multi-step-filterflow.tsx b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/multi-step-filterflow.tsx index 6d35a6b66e..dd6e17dc0a 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/multi-step-filterflow.tsx +++ b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/filters/multi-step-filterflow.tsx @@ -1,6 +1,6 @@ import { Button, Card, Input, Space, Typography } from 'antd'; import React, { useState } from 'react'; -import { FilterFlowManager } from '../libs/filterflow-manager'; +import { FilterFlowManager } from '@nocobase/client'; // 创建FilterFlowManager实例 const filterFlowManager = new FilterFlowManager(); diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/libs/types.ts b/packages/core/client/docs/zh-CN/core/event-and-filter/demos/libs/types.ts deleted file mode 100644 index 71c51e1fbf..0000000000 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/libs/types.ts +++ /dev/null @@ -1,134 +0,0 @@ -/** - * This file is part of the NocoBase (R) project. - * Copyright (c) 2020-2024 NocoBase Co., Ltd. - * Authors: NocoBase Team. - * - * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. - * For more information, please refer to: https://www.nocobase.com/agreement. - */ - -import { ISchema } from '@formily/json-schema'; -import { Resource } from '@nocobase/resourcer'; -import { ComponentProps } from 'react'; - -export type UnregisterFunction = () => void; - -// Event System Types -export interface EventContext { - // 事件源 (dispatchEvent调用者) 信息 - source?: { - id?: string; - type?: string; // 'user-interaction', 'system', 'workflow' - [key: string]: any; - }; - - // 用于指定接收者信息, 主要用于精准触发事件 - target?: { - id?: string; - }; - - // 事件相关数据 - payload?: T; - - // 元数据 - meta?: { - timestamp?: number; - userId?: string; - event?: string | string[]; - [key: string]: any; - }; - - // 用于收集事件监听器的输出结果 - results?: Record; -} - -export interface EventListenerOptions { - id?: string; // 监听器唯一标识 - sort?: number; // 数值越大运行越靠后,默认为 0 - once?: boolean; // 是否只执行一次,默认为 false - blocking?: boolean; // 是否为阻塞监听器,默认false - condition?: (ctx: EventContext, options: EventListenerOptions) => boolean; // 运行条件 -} - -export type EventListener = (context: EventContext) => void | Promise; - -export type Unsubscriber = () => void; - -export type LinkageRuleItem = { - actions: Array<{ - operator: string; - targetFields: string[]; - value: { - mode: string; - value: string; - }; - }>; - condition: { - [type in '$and' | '$or']: Array<{ - [field: string]: Record; - }>; - }; -}; - -export type LinkageRuleSettings = { - fields: Record; - actions: Record; - recordActions: Record; -}; - -export type FieldSettings = Record; - -export type ActionSettings = Record; - -export type BlockSettings = { - linkageRules: Record; - fields: Record; - actions: Record; - recordActions: Record; -}; - -export type FilterContext = { - props?: ComponentProps; - payload?: any; - _cancel?: boolean; -}; - -// FilterFlowManager Types -export type FilterHandler = ( - currentValue: any, - params?: Record, - context?: FilterContext, -) => any | Promise; - -/** - * 可注册的 Filter 配置 - */ -export interface Filter { - name: string; // 唯一标识符 - title: string; // 显示名称 - description?: string; // 描述 - group?: string; // 所属分组 - sort?: number; // 排序 - uiSchema: Record; // 参数配置的 UI Schema - handler: FilterHandler; // 实际的过滤处理函数 -} - -export interface FilterGroupOptions { - name: string; - title: string; - sort?: number; -} - -export interface FilterFlowStepOptions { - key?: string; - filterName: string; - title?: string; - params?: Record; - condition?: string; -} - -export interface FilterFlowOptions { - name: string; - title: string; - steps: FilterFlowStepOptions[]; -} diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/libs/event-bus.ts b/packages/core/client/src/eventflow/event-bus.ts similarity index 100% rename from packages/core/client/docs/zh-CN/core/event-and-filter/demos/libs/event-bus.ts rename to packages/core/client/src/eventflow/event-bus.ts diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/libs/eventflow-manager.ts b/packages/core/client/src/eventflow/eventflow-manager.ts similarity index 87% rename from packages/core/client/docs/zh-CN/core/event-and-filter/demos/libs/eventflow-manager.ts rename to packages/core/client/src/eventflow/eventflow-manager.ts index 7dd126f1a8..06ea4f4830 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/libs/eventflow-manager.ts +++ b/packages/core/client/src/eventflow/eventflow-manager.ts @@ -3,66 +3,17 @@ import { observable } from '@formily/reactive'; import { uid } from '@formily/shared'; import _ from 'lodash'; import { EventBus } from './event-bus'; - -export type EventFlowEventHandler = (params: Record, context: any) => Promise; -export type EventFlowActionHandler = (params: Record, context: any) => Promise; - -export type EventFlowEventGroupOptions = { - name: string; - title: string; - sort?: number; -}; - -export type EventFlowEventOptions = { - name: string; - title: string; - description?: string; - group: string; - sort?: number; - uiSchema: Record; - handler?: EventFlowEventHandler; -}; - -export type EventFlowActionGroupOptions = { - name: string; - title: string; - sort?: number; -}; - -export type EventFlowActionOptions = { - name: string; - title: string; - description?: string; - group: string; - sort?: number; - uiSchema: Record; - handler: EventFlowActionHandler; -}; - -export type EventFlowStepOptions = { - key?: string; - action: string; - title?: string; - params?: Record; - condition?: string; - isAwait?: boolean; -}; - -export type EventFlowOnOptions = { - event?: string; - title?: string; - condition?: string; - params?: Record; -}; - -export type EventFlowOptions = { - sort?: number; - isAwait?: boolean; - key?: string; - title?: string; - on?: EventFlowOnOptions; - steps?: EventFlowStepOptions[]; -}; +import type { + EventFlowActionHandler, + EventFlowActionGroupOptions, + EventFlowActionOptions, + EventFlowEventHandler, + EventFlowEventGroupOptions, + EventFlowEventOptions, + EventFlowOnOptions, + EventFlowOptions, + EventFlowStepOptions, +} from './types'; export class EventFlowStep { options: EventFlowStepOptions; diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/libs/hooks.tsx b/packages/core/client/src/eventflow/hooks.tsx similarity index 100% rename from packages/core/client/docs/zh-CN/core/event-and-filter/demos/libs/hooks.tsx rename to packages/core/client/src/eventflow/hooks.tsx diff --git a/packages/core/client/src/eventflow/index.ts b/packages/core/client/src/eventflow/index.ts new file mode 100644 index 0000000000..8104becc5f --- /dev/null +++ b/packages/core/client/src/eventflow/index.ts @@ -0,0 +1,13 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + +export * from './event-bus'; +export * from './eventflow-manager'; +export * from './hooks'; +export * from './types'; diff --git a/packages/core/client/src/eventflow/types.ts b/packages/core/client/src/eventflow/types.ts new file mode 100644 index 0000000000..872ad3821d --- /dev/null +++ b/packages/core/client/src/eventflow/types.ts @@ -0,0 +1,69 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + +import { ISchema } from '@formily/json-schema'; + +// Event System Types +export interface EventContext { + source?: { id?: string; type?: string; [key: string]: any }; + target?: { id?: string }; + payload?: T; + meta?: { timestamp?: number; userId?: string; event?: string | string[]; [key: string]: any }; + results?: Record; +} +export interface EventListenerOptions { + id?: string; + sort?: number; + once?: boolean; + blocking?: boolean; + condition?: (ctx: EventContext, options: EventListenerOptions) => boolean; +} +export type EventListener = (context: EventContext) => void | Promise; +export type Unsubscriber = () => void; + +// EventFlow Types +export type EventFlowEventHandler = (params: Record, context: any) => Promise; +export type EventFlowActionHandler = (params: Record, context: any) => Promise; +export type EventFlowEventGroupOptions = { name: string; title: string; sort?: number }; +export type EventFlowEventOptions = { + name: string; + title: string; + description?: string; + group: string; + sort?: number; + uiSchema: Record; + handler?: EventFlowEventHandler; +}; +export type EventFlowActionGroupOptions = { name: string; title: string; sort?: number }; +export type EventFlowActionOptions = { + name: string; + title: string; + description?: string; + group: string; + sort?: number; + uiSchema: Record; + handler: EventFlowActionHandler; +}; +export type EventFlowStepOptions = { + key?: string; + action: string; + title?: string; + params?: Record; + condition?: string; + isAwait?: boolean; +}; +export type EventFlowOnOptions = { event?: string; title?: string; condition?: string; params?: Record }; +export type EventFlowOptions = { + sort?: number; + isAwait?: boolean; + key?: string; + title?: string; + on?: EventFlowOnOptions; + steps?: EventFlowStepOptions[]; +}; diff --git a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/libs/filterflow-manager.ts b/packages/core/client/src/filterflow/filterflow-manager.ts similarity index 96% rename from packages/core/client/docs/zh-CN/core/event-and-filter/demos/libs/filterflow-manager.ts rename to packages/core/client/src/filterflow/filterflow-manager.ts index 41b85d2458..164620b355 100644 --- a/packages/core/client/docs/zh-CN/core/event-and-filter/demos/libs/filterflow-manager.ts +++ b/packages/core/client/src/filterflow/filterflow-manager.ts @@ -3,12 +3,12 @@ import { observable } from '@formily/reactive'; import { uid } from '@nocobase/utils/client'; import _ from 'lodash'; import { - FilterContext, + FilterHandlerContext, FilterFlowOptions, FilterFlowStepOptions, FilterHandler, FilterGroupOptions, - Filter, + IFilter, } from './types'; export class FilterFlowStep { @@ -166,7 +166,7 @@ export class FilterFlow { * 获取指定的 Filter 配置 * 该方法转发调用到 FilterFlowManager */ - getFilter(filterName: string): Filter | undefined { + getFilter(filterName: string): IFilter | undefined { return this.filterFlowManager.getFilter(filterName); } @@ -185,7 +185,7 @@ export class FilterFlow { // --- FilterFlowManager Class --- export class FilterFlowManager { private filterGroups: Record = {}; - private filters: Record = {}; + private filters: Record = {}; private filterFlows: Map; constructor() { @@ -206,14 +206,14 @@ export class FilterFlowManager { /** * 注册 Filter (可复用的 Filter 逻辑) */ - addFilter(filter: Filter) { + addFilter(filter: IFilter) { this.filters[filter.name] = filter; } /** * 获取指定的 Filter 配置 */ - getFilter(filterName: string): Filter | undefined { + getFilter(filterName: string): IFilter | undefined { return this.filters[filterName]; } @@ -354,7 +354,7 @@ export class FilterFlowManager { * @param context Filter上下文 * @returns 应用 Flow 中所有 Filter 后的最终值 */ - async applyFilters(flowKey: string, initialValue: any, context: FilterContext): Promise { + async applyFilters(flowKey: string, initialValue: any, context: FilterHandlerContext): Promise { const flow = this.getFlow(flowKey); if (!flow) { console.warn(`FilterFlow with key "${flowKey}" not found. Returning initial value.`); @@ -409,7 +409,7 @@ export class FilterFlowManager { * @param context 上下文对象 * @returns boolean */ - private checkCondition(condition?: string, context?: FilterContext): boolean { + private checkCondition(condition?: string, context?: FilterHandlerContext): boolean { if (!condition) { return true; // 没有条件,默认通过 } diff --git a/packages/core/client/src/filterflow/index.ts b/packages/core/client/src/filterflow/index.ts new file mode 100644 index 0000000000..60e83056ab --- /dev/null +++ b/packages/core/client/src/filterflow/index.ts @@ -0,0 +1,11 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + +export * from './filterflow-manager'; +export * from './types'; diff --git a/packages/core/client/src/filterflow/types.ts b/packages/core/client/src/filterflow/types.ts new file mode 100644 index 0000000000..0da330ec2a --- /dev/null +++ b/packages/core/client/src/filterflow/types.ts @@ -0,0 +1,45 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + +import { ISchema } from '@formily/json-schema'; +import { ComponentProps } from 'react'; + +// Filter System Types +export type FilterHandlerContext = { props?: ComponentProps; payload?: any; _cancel?: boolean }; +export type FilterHandler = ( + currentValue: any, + params?: Record, + context?: FilterHandlerContext, +) => any | Promise; +export interface IFilter { + name: string; + title: string; + description?: string; + group?: string; + sort?: number; + uiSchema: Record; + handler: FilterHandler; +} +export interface FilterGroupOptions { + name: string; + title: string; + sort?: number; +} +export interface FilterFlowStepOptions { + key?: string; + filterName: string; + title?: string; + params?: Record; + condition?: string; +} +export interface FilterFlowOptions { + name: string; + title: string; + steps: FilterFlowStepOptions[]; +} diff --git a/packages/core/client/src/index.ts b/packages/core/client/src/index.ts index 2da90be022..62a15cc2e8 100644 --- a/packages/core/client/src/index.ts +++ b/packages/core/client/src/index.ts @@ -59,6 +59,8 @@ export * from './system-settings'; export * from './testUtils'; export * from './user'; export * from './variables'; +export * from './eventflow'; +export * from './filterflow'; export { withDynamicSchemaProps } from './hoc/withDynamicSchemaProps'; export { withSkeletonComponent } from './hoc/withSkeletonComponent';