@yiyi_zhang/reactflow-ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +107 -0
- package/dist/WorkflowIDE.d.ts +108 -0
- package/dist/components/AICopilot/AIChatPanel.d.ts +8 -0
- package/dist/components/AICopilot/ParameterSuggester.d.ts +16 -0
- package/dist/components/ConfirmDialog.d.ts +7 -0
- package/dist/components/Controls/ActionBar.d.ts +10 -0
- package/dist/components/Controls/ControlButton.d.ts +13 -0
- package/dist/components/Controls/ControlHub.d.ts +3 -0
- package/dist/components/Editor/NodeSelector.d.ts +8 -0
- package/dist/components/EmptyStatePanel.d.ts +7 -0
- package/dist/components/ExecutionStatusBar.d.ts +5 -0
- package/dist/components/ExecutionTaskPanel.d.ts +5 -0
- package/dist/components/HealthCheckPanel.d.ts +12 -0
- package/dist/components/TaskDetailPanel.d.ts +11 -0
- package/dist/components/Toast.d.ts +11 -0
- package/dist/components/WorkflowDesigner.d.ts +15 -0
- package/dist/components/WorkflowSettingsPanel.d.ts +10 -0
- package/dist/components/edges/AddableEdge.d.ts +8 -0
- package/dist/components/nodes/DecisionNode.d.ts +5 -0
- package/dist/components/nodes/ExecutionStatusBadge.d.ts +7 -0
- package/dist/components/nodes/ForkJoinNode.d.ts +16 -0
- package/dist/components/nodes/LoopNode.d.ts +5 -0
- package/dist/components/nodes/NodeLayout.d.ts +16 -0
- package/dist/components/nodes/NodeWrapper.d.ts +15 -0
- package/dist/components/nodes/SubWorkflowNode.d.ts +5 -0
- package/dist/components/nodes/TaskNode.d.ts +5 -0
- package/dist/config/taskTypes.d.ts +14 -0
- package/dist/hooks/useConfirm.d.ts +14 -0
- package/dist/hooks/useNodeExecution.d.ts +8 -0
- package/dist/hooks/useNodeLayout.d.ts +10 -0
- package/dist/hooks/useShortcuts.d.ts +11 -0
- package/dist/hooks/useToast.d.ts +9 -0
- package/dist/index.d.ts +5 -0
- package/dist/layout/autoLayout.d.ts +22 -0
- package/dist/parser/conductorGenerator.d.ts +28 -0
- package/dist/parser/conductorParser.d.ts +24 -0
- package/dist/reactflow-ui.css +1 -0
- package/dist/reactflow-ui.es.js +11035 -0
- package/dist/reactflow-ui.umd.js +229 -0
- package/dist/sample-workflows/complex-workflow.json +210 -0
- package/dist/sample-workflows/decision-workflow.json +118 -0
- package/dist/sample-workflows/fork-join-workflow.json +112 -0
- package/dist/sample-workflows/sample-execution.json +327 -0
- package/dist/sample-workflows/simple-workflow.json +42 -0
- package/dist/services/aiService.d.ts +24 -0
- package/dist/services/promptTemplates.d.ts +6 -0
- package/dist/store/workflowStore.d.ts +30 -0
- package/dist/types/conductor.d.ts +170 -0
- package/dist/types/workflow.d.ts +165 -0
- package/dist/utils/validationRules.d.ts +85 -0
- package/dist/utils/validator.d.ts +6 -0
- package/dist/vite.svg +1 -0
- package/package.json +71 -0
package/README.md
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Conductor Workflow IDE (ReactFlow UI)
|
|
2
|
+
|
|
3
|
+
基于 React 19, ReactFlow 和 Vite 构建的企业级 [Netflix Conductor](https://conductor-oss.org/) 工作流可视化设计器。
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## ✨ 特性
|
|
8
|
+
|
|
9
|
+
- **从零创建**: 无需预先提供 JSON,通过空状态引导面板即可新建空白工作流或 AI 一键生成。
|
|
10
|
+
- **可视化建模**: 支持 DAG 工作流的拖拽式设计,连接线默认使用清晰的折线样式。
|
|
11
|
+
- **智能布局**: 支持复杂图表的自动布局 (TB/LR),包括针对超大流程优化的"蛇形布局"。
|
|
12
|
+
- **运行态监控**: 实时可视化执行状态,支持路径高亮和任务详情查看。
|
|
13
|
+
- **强大的搜索**: 毫秒级任务搜索与高亮定位。
|
|
14
|
+
- **AI 灵感辅助 (AI Copilot)**:
|
|
15
|
+
- **从零生成**: 空画布下直接通过自然语言描述生成完整工作流。
|
|
16
|
+
- **对话建模**: 通过自然语言描述直接生成 Conductor 流程草图。
|
|
17
|
+
- **智能提示**: 在属性面板中基于上下文自动推荐参数配置 (JSONPath)。
|
|
18
|
+
- **企业级能力**:
|
|
19
|
+
- TypeScript 全量类型定义 (WorkflowDef, TaskDef)
|
|
20
|
+
- 深色/浅色主题支持
|
|
21
|
+
- 只读模式 / 编辑模式切换
|
|
22
|
+
- 撤销/重做 & 智能剪贴板
|
|
23
|
+
- 命令式 API (ref) 支持程序化创建、保存、导出
|
|
24
|
+
|
|
25
|
+
## 📦 安装
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install reactflow-ui
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 🚀 使用指南
|
|
32
|
+
|
|
33
|
+
### 库模式 (集成到 React 应用)
|
|
34
|
+
|
|
35
|
+
```tsx
|
|
36
|
+
import { useRef } from 'react';
|
|
37
|
+
import { WorkflowIDE, WorkflowIDERef } from 'reactflow-ui';
|
|
38
|
+
import 'reactflow-ui/style.css';
|
|
39
|
+
|
|
40
|
+
function App() {
|
|
41
|
+
const ideRef = useRef<WorkflowIDERef>(null);
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<div style={{ height: '100vh' }}>
|
|
45
|
+
{/* 宿主应用可通过 ref 程序化新建工作流 */}
|
|
46
|
+
<button onClick={() => ideRef.current?.createBlankWorkflow('my_flow')}>新建</button>
|
|
47
|
+
|
|
48
|
+
<WorkflowIDE
|
|
49
|
+
ref={ideRef}
|
|
50
|
+
theme="dark"
|
|
51
|
+
onSave={(workflow) => console.log('保存:', workflow)}
|
|
52
|
+
onRequestImport={() => { /* 打开文件选择器 */ }}
|
|
53
|
+
/>
|
|
54
|
+
</div>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
不传 `workflowDef` 时,画布会显示引导面板,支持空白创建、AI 生成或导入 JSON。
|
|
60
|
+
|
|
61
|
+
详细集成步骤和 API 参考,请查阅 **[集成指南](./INTEGRATION.md)**。
|
|
62
|
+
|
|
63
|
+
## 🛠️ 开发指南 (Development Guide)
|
|
64
|
+
|
|
65
|
+
如果您希望参与本项目的开发或进行二次开发,请参考以下步骤。
|
|
66
|
+
|
|
67
|
+
### 环境准备
|
|
68
|
+
- Node.js >= 18.0.0
|
|
69
|
+
- npm 或 yarn
|
|
70
|
+
|
|
71
|
+
### 启动本地开发环境
|
|
72
|
+
本项目包含一个演示应用 (`src/demo`),用于开发和调试 IDE 组件。
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# 1. 克隆仓库
|
|
76
|
+
git clone https://github.com/yiyisf/reactflow-ui.git
|
|
77
|
+
cd reactflow-ui
|
|
78
|
+
|
|
79
|
+
# 2. 安装依赖
|
|
80
|
+
npm install
|
|
81
|
+
|
|
82
|
+
# 3. 启动开发服务器
|
|
83
|
+
npm run dev
|
|
84
|
+
```
|
|
85
|
+
启动后访问 `http://localhost:5173` 即可看到演示页面。
|
|
86
|
+
|
|
87
|
+
### 构建库文件
|
|
88
|
+
打包生成用于发布的 ESM 和 UMD 文件:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
npm run build
|
|
92
|
+
```
|
|
93
|
+
产物将生成在 `dist/` 目录下。
|
|
94
|
+
|
|
95
|
+
### 项目结构
|
|
96
|
+
- `src/components/`: IDE 核心组件 (设计器、属性面板等)。
|
|
97
|
+
- `src/store/`: 基于 Zustand 的状态管理。
|
|
98
|
+
- `src/types/`: TypeScript 类型定义 (Conductor 协议与 UI 状态)。
|
|
99
|
+
- `src/demo/`: 开发阶段使用的演示应用。
|
|
100
|
+
- `src/WorkflowIDE.tsx`: 组件库的主入口文件。
|
|
101
|
+
|
|
102
|
+
## 📚 文档资源
|
|
103
|
+
- [集成指南 (Integration Guide)](./INTEGRATION.md)
|
|
104
|
+
- [最佳实践 (Best Practices)](./docs/best-practices.md)
|
|
105
|
+
|
|
106
|
+
## 📄 许可证
|
|
107
|
+
MIT
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ThemeMode, ThemeColor, LayoutDirection, ValidationResults, ExecutionActions } from './types/workflow';
|
|
3
|
+
import { WorkflowDef } from './types/conductor';
|
|
4
|
+
import { AIServiceConfig } from './services/aiService';
|
|
5
|
+
import './styles/tokens.css';
|
|
6
|
+
import './styles/executionStyles.css';
|
|
7
|
+
/**
|
|
8
|
+
* WorkflowIDE 的命令式 API(通过 ref 调用)
|
|
9
|
+
*/
|
|
10
|
+
export interface WorkflowIDERef {
|
|
11
|
+
/** 获取当前最新的工作流定义 */
|
|
12
|
+
getWorkflowDef: () => WorkflowDef | null;
|
|
13
|
+
/** 获取当前校验结果 */
|
|
14
|
+
getValidationResults: () => ValidationResults;
|
|
15
|
+
/** 触发保存(等同于 Ctrl+S) */
|
|
16
|
+
save: () => void;
|
|
17
|
+
/** 创建空白工作流 */
|
|
18
|
+
createBlankWorkflow: (name?: string) => void;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* WorkflowIDE 组件的属性接口
|
|
22
|
+
*/
|
|
23
|
+
export interface WorkflowIDEProps {
|
|
24
|
+
/**
|
|
25
|
+
* 初始加载的工作流定义 JSON 对象。
|
|
26
|
+
* 如果在组件挂载后通过 Props 更新此值,IDE 内容也会随之更新。
|
|
27
|
+
*/
|
|
28
|
+
workflowDef?: WorkflowDef;
|
|
29
|
+
/**
|
|
30
|
+
* 是否开启只读模式。
|
|
31
|
+
* - `true`: 节点锁定,无法拖拽、连接或编辑。
|
|
32
|
+
* - `false`: 允许完整的编辑功能。
|
|
33
|
+
* @default false
|
|
34
|
+
*/
|
|
35
|
+
readOnly?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* 主题模式。
|
|
38
|
+
* @default 'dark'
|
|
39
|
+
*/
|
|
40
|
+
theme?: ThemeMode;
|
|
41
|
+
/**
|
|
42
|
+
* 品牌主色调。
|
|
43
|
+
* 修改此项会影响按钮、选中框等强调色。
|
|
44
|
+
* @default 'blue'
|
|
45
|
+
*/
|
|
46
|
+
themeColor?: ThemeColor;
|
|
47
|
+
/**
|
|
48
|
+
* 默认布局方向。
|
|
49
|
+
* - `TB`: Top-to-Bottom (从上到下)
|
|
50
|
+
* - `LR`: Left-to-Right (从左到右)
|
|
51
|
+
* @default 'LR'
|
|
52
|
+
*/
|
|
53
|
+
layoutDirection?: LayoutDirection;
|
|
54
|
+
/**
|
|
55
|
+
* 搜索关键词。
|
|
56
|
+
* 传入字符串后,画布中通过 `taskReferenceName` 或 `name` 匹配的任务将被高亮显示。
|
|
57
|
+
*/
|
|
58
|
+
searchQuery?: string;
|
|
59
|
+
/**
|
|
60
|
+
* 运行态数据 (WorkflowInstance)。
|
|
61
|
+
* 当传入此属性时,IDE 会自动切换到 **Run Mode**,展示任务执行状态、连线路径高亮等。
|
|
62
|
+
*/
|
|
63
|
+
workflowExecution?: any;
|
|
64
|
+
/**
|
|
65
|
+
* 点击保存按钮时的回调函数。
|
|
66
|
+
* @param def 最新的工作流定义对象
|
|
67
|
+
*/
|
|
68
|
+
onSave?: (def: WorkflowDef) => void;
|
|
69
|
+
/**
|
|
70
|
+
* 工作流定义发生变更时的实时回调 (可选)。
|
|
71
|
+
*/
|
|
72
|
+
onWorkflowChange?: (def: WorkflowDef) => void;
|
|
73
|
+
/**
|
|
74
|
+
* 空状态面板点击"导入 JSON"时的回调。
|
|
75
|
+
*/
|
|
76
|
+
onRequestImport?: () => void;
|
|
77
|
+
/**
|
|
78
|
+
* 运行态操作回调。
|
|
79
|
+
* 传入后,运行模式下会根据工作流状态显示对应的操作按钮(暂停/恢复/停止/重试/重启)。
|
|
80
|
+
* 未传入的回调对应的按钮不会渲染。
|
|
81
|
+
*/
|
|
82
|
+
executionActions?: ExecutionActions;
|
|
83
|
+
/**
|
|
84
|
+
* AI 配置。通过 Props 注入优先于 localStorage 配置。
|
|
85
|
+
*/
|
|
86
|
+
aiConfig?: Partial<AIServiceConfig>;
|
|
87
|
+
/**
|
|
88
|
+
* 组件容器高度。
|
|
89
|
+
* @default '100%'
|
|
90
|
+
*/
|
|
91
|
+
height?: string | number;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Conductor Workflow IDE 主组件。
|
|
95
|
+
*
|
|
96
|
+
* 这是一个集成了流程设计、查看、搜索及运行态监控的 React 组件。
|
|
97
|
+
* 它内部封装了 ReactFlow 画布、属性面板、状态管理等逻辑。
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```tsx
|
|
101
|
+
* <WorkflowIDE
|
|
102
|
+
* workflowDef={myWorkflow}
|
|
103
|
+
* theme="dark"
|
|
104
|
+
* onSave={(def) => console.log(def)}
|
|
105
|
+
* />
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
export declare const WorkflowIDE: React.ForwardRefExoticComponent<WorkflowIDEProps & React.RefAttributes<WorkflowIDERef>>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './AIChatPanel.css';
|
|
3
|
+
import { AIServiceConfig } from '../../services/aiService';
|
|
4
|
+
interface AIChatPanelProps {
|
|
5
|
+
aiConfig?: Partial<AIServiceConfig>;
|
|
6
|
+
}
|
|
7
|
+
declare const AIChatPanel: React.FC<AIChatPanelProps>;
|
|
8
|
+
export default AIChatPanel;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './ParameterSuggester.css';
|
|
3
|
+
export interface Suggestion {
|
|
4
|
+
label: string;
|
|
5
|
+
value: string;
|
|
6
|
+
description: string;
|
|
7
|
+
}
|
|
8
|
+
interface ParameterSuggesterProps {
|
|
9
|
+
isOpen: boolean;
|
|
10
|
+
onClose: () => void;
|
|
11
|
+
onSelect: (value: string) => void;
|
|
12
|
+
suggestions: Suggestion[];
|
|
13
|
+
anchorRect?: DOMRect;
|
|
14
|
+
}
|
|
15
|
+
declare const ParameterSuggester: React.FC<ParameterSuggesterProps>;
|
|
16
|
+
export default ParameterSuggester;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ExecutionActions } from '../../types/workflow';
|
|
3
|
+
interface ActionBarProps {
|
|
4
|
+
onShowHealthCheck: () => void;
|
|
5
|
+
showHealthCheck: boolean;
|
|
6
|
+
onShowSettings?: () => void;
|
|
7
|
+
executionActions?: ExecutionActions;
|
|
8
|
+
}
|
|
9
|
+
declare const ActionBar: React.FC<ActionBarProps>;
|
|
10
|
+
export default ActionBar;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface ControlButtonProps {
|
|
3
|
+
onClick: () => void;
|
|
4
|
+
icon?: React.ReactNode;
|
|
5
|
+
label?: string;
|
|
6
|
+
title?: string;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
active?: boolean;
|
|
9
|
+
variant?: 'default' | 'primary' | 'danger' | 'secondary';
|
|
10
|
+
style?: React.CSSProperties;
|
|
11
|
+
}
|
|
12
|
+
declare const ControlButton: React.FC<ControlButtonProps>;
|
|
13
|
+
export default ControlButton;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TaskType } from '../../types/conductor';
|
|
2
|
+
interface NodeSelectorProps {
|
|
3
|
+
onSelect: (type: TaskType) => void;
|
|
4
|
+
onCancel: () => void;
|
|
5
|
+
theme?: 'dark' | 'light';
|
|
6
|
+
}
|
|
7
|
+
declare const NodeSelector: ({ onSelect, onCancel }: NodeSelectorProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export default NodeSelector;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { TaskDef } from '../types/conductor';
|
|
2
|
+
interface HealthCheckPanelProps {
|
|
3
|
+
isOpen: boolean;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
theme?: 'dark' | 'light';
|
|
6
|
+
onTaskSelect?: (task: TaskDef) => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 工作流健康检查面板 - 展示错误和警告列表
|
|
10
|
+
*/
|
|
11
|
+
declare const HealthCheckPanel: ({ isOpen, onClose, theme, onTaskSelect }: HealthCheckPanelProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
12
|
+
export default HealthCheckPanel;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TaskDef } from '../types/conductor';
|
|
2
|
+
import { AIServiceConfig } from '../services/aiService';
|
|
3
|
+
interface TaskDetailPanelProps {
|
|
4
|
+
task: TaskDef | null;
|
|
5
|
+
isOpen?: boolean;
|
|
6
|
+
onClose: () => void;
|
|
7
|
+
theme?: 'dark' | 'light';
|
|
8
|
+
aiConfig?: Partial<AIServiceConfig>;
|
|
9
|
+
}
|
|
10
|
+
declare const _default: import("react").MemoExoticComponent<({ task, isOpen, onClose, aiConfig }: TaskDetailPanelProps) => import("react/jsx-runtime").JSX.Element | null>;
|
|
11
|
+
export default _default;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ToastMessage {
|
|
2
|
+
id: string;
|
|
3
|
+
text: string;
|
|
4
|
+
type?: 'success' | 'error' | 'info';
|
|
5
|
+
}
|
|
6
|
+
interface ToastProps {
|
|
7
|
+
messages: ToastMessage[];
|
|
8
|
+
onDismiss: (id: string) => void;
|
|
9
|
+
}
|
|
10
|
+
declare const Toast: ({ messages, onDismiss }: ToastProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
11
|
+
export default Toast;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import 'reactflow/dist/style.css';
|
|
3
|
+
import { ExecutionActions } from '../types/workflow';
|
|
4
|
+
interface WorkflowDesignerProps {
|
|
5
|
+
onNodeClick?: (task: any) => void;
|
|
6
|
+
searchQuery?: string;
|
|
7
|
+
edgeType?: string;
|
|
8
|
+
theme?: 'dark' | 'light';
|
|
9
|
+
nodesLocked?: boolean;
|
|
10
|
+
onSave?: (def: any) => void;
|
|
11
|
+
onRequestImport?: () => void;
|
|
12
|
+
executionActions?: ExecutionActions;
|
|
13
|
+
}
|
|
14
|
+
declare const WorkflowDesigner: React.FC<WorkflowDesignerProps>;
|
|
15
|
+
export default WorkflowDesigner;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface WorkflowSettingsPanelProps {
|
|
2
|
+
isOpen: boolean;
|
|
3
|
+
onClose: () => void;
|
|
4
|
+
theme?: 'dark' | 'light';
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* 工作流设置面板 - Tab 分组形式,编辑工作流级全部配置字段
|
|
8
|
+
*/
|
|
9
|
+
declare const WorkflowSettingsPanel: ({ isOpen, onClose }: WorkflowSettingsPanelProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
10
|
+
export default WorkflowSettingsPanel;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { EdgeProps } from 'reactflow';
|
|
2
|
+
/**
|
|
3
|
+
* 可添加节点的自定义边
|
|
4
|
+
* 优化了悬停稳定性,防止因动画和组件切换导致的闪烁
|
|
5
|
+
* 支持动态切换连线样式 (曲线、阶梯、直线等)
|
|
6
|
+
*/
|
|
7
|
+
declare const AddableEdge: ({ id, source, target, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, style, markerEnd, data }: EdgeProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export default AddableEdge;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { NodeProps } from 'reactflow';
|
|
2
|
+
import { WorkflowNodeData } from '../../types/workflow';
|
|
3
|
+
type DecisionNodeProps = NodeProps<WorkflowNodeData>;
|
|
4
|
+
declare const _default: import("react").MemoExoticComponent<({ id, data, selected }: DecisionNodeProps) => import("react/jsx-runtime").JSX.Element>;
|
|
5
|
+
export default _default;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { NodeProps } from 'reactflow';
|
|
2
|
+
import { WorkflowNodeData } from '../../types/workflow';
|
|
3
|
+
type ForkJoinNodeProps = NodeProps<WorkflowNodeData>;
|
|
4
|
+
/**
|
|
5
|
+
* FORK 节点组件
|
|
6
|
+
*/
|
|
7
|
+
export declare const ForkNode: import("react").MemoExoticComponent<({ id, data, selected }: ForkJoinNodeProps) => import("react/jsx-runtime").JSX.Element>;
|
|
8
|
+
/**
|
|
9
|
+
* JOIN 节点组件
|
|
10
|
+
*/
|
|
11
|
+
export declare const JoinNode: import("react").MemoExoticComponent<({ id, data, selected }: ForkJoinNodeProps) => import("react/jsx-runtime").JSX.Element>;
|
|
12
|
+
declare const ForkJoinNode: {
|
|
13
|
+
ForkNode: import("react").MemoExoticComponent<({ id, data, selected }: ForkJoinNodeProps) => import("react/jsx-runtime").JSX.Element>;
|
|
14
|
+
JoinNode: import("react").MemoExoticComponent<({ id, data, selected }: ForkJoinNodeProps) => import("react/jsx-runtime").JSX.Element>;
|
|
15
|
+
};
|
|
16
|
+
export default ForkJoinNode;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { NodeProps } from 'reactflow';
|
|
2
|
+
import { WorkflowNodeData } from '../../types/workflow';
|
|
3
|
+
type LoopNodeProps = NodeProps<WorkflowNodeData>;
|
|
4
|
+
declare const _default: import("react").MemoExoticComponent<({ id, data, selected }: LoopNodeProps) => import("react/jsx-runtime").JSX.Element>;
|
|
5
|
+
export default _default;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ExecutionStatus } from '../../types/workflow';
|
|
3
|
+
interface NodeLayoutProps {
|
|
4
|
+
icon: React.ElementType;
|
|
5
|
+
header: string;
|
|
6
|
+
title: string;
|
|
7
|
+
meta?: string;
|
|
8
|
+
color: string;
|
|
9
|
+
status?: ExecutionStatus;
|
|
10
|
+
isRunning?: boolean;
|
|
11
|
+
children?: React.ReactNode;
|
|
12
|
+
width?: string | number;
|
|
13
|
+
border?: boolean;
|
|
14
|
+
}
|
|
15
|
+
declare const _default: React.MemoExoticComponent<({ icon: Icon, header, title, meta, color, status, isRunning, children, width, border }: NodeLayoutProps) => import("react/jsx-runtime").JSX.Element>;
|
|
16
|
+
export default _default;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ExecutionStatus } from '../../types/workflow';
|
|
3
|
+
interface NodeWrapperProps {
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
nodeId: string;
|
|
6
|
+
selected?: boolean;
|
|
7
|
+
isStartOrEnd?: boolean;
|
|
8
|
+
isError?: boolean;
|
|
9
|
+
hasWarning?: boolean;
|
|
10
|
+
isDecision?: boolean;
|
|
11
|
+
isHighlighted?: boolean;
|
|
12
|
+
executionStatus?: ExecutionStatus;
|
|
13
|
+
}
|
|
14
|
+
declare const NodeWrapper: ({ children, nodeId, selected, isStartOrEnd, isError, hasWarning, isDecision, isHighlighted, executionStatus }: NodeWrapperProps) => import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export default NodeWrapper;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { NodeProps } from 'reactflow';
|
|
2
|
+
import { WorkflowNodeData } from '../../types/workflow';
|
|
3
|
+
type SubWorkflowNodeProps = NodeProps<WorkflowNodeData>;
|
|
4
|
+
declare const _default: import("react").MemoExoticComponent<({ id, data, selected }: SubWorkflowNodeProps) => import("react/jsx-runtime").JSX.Element>;
|
|
5
|
+
export default _default;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { NodeProps } from 'reactflow';
|
|
2
|
+
import { WorkflowNodeData } from '../../types/workflow';
|
|
3
|
+
type TaskNodeProps = NodeProps<WorkflowNodeData>;
|
|
4
|
+
declare const _default: import("react").MemoExoticComponent<({ id, data, selected }: TaskNodeProps) => import("react/jsx-runtime").JSX.Element>;
|
|
5
|
+
export default _default;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type TaskCategory = 'CORE' | 'SYSTEM' | 'FLOW';
|
|
2
|
+
export interface TaskTypeConfig {
|
|
3
|
+
type: string;
|
|
4
|
+
label: string;
|
|
5
|
+
description: string;
|
|
6
|
+
category: TaskCategory;
|
|
7
|
+
icon: any;
|
|
8
|
+
defaultData?: any;
|
|
9
|
+
}
|
|
10
|
+
export declare const TASK_TYPES: TaskTypeConfig[];
|
|
11
|
+
export declare const TASK_CATEGORIES: {
|
|
12
|
+
key: TaskCategory;
|
|
13
|
+
label: string;
|
|
14
|
+
}[];
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface ConfirmState {
|
|
2
|
+
message: string;
|
|
3
|
+
resolve: (value: boolean) => void;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* 提供 Promise-based confirm 对话框替代 window.confirm
|
|
7
|
+
*/
|
|
8
|
+
export declare const useConfirm: () => {
|
|
9
|
+
confirm: (message: string) => Promise<boolean>;
|
|
10
|
+
confirmState: ConfirmState | null;
|
|
11
|
+
handleConfirm: () => void;
|
|
12
|
+
handleCancel: () => void;
|
|
13
|
+
};
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 获取节点的运行态信息(mode 和 executionData)
|
|
3
|
+
*/
|
|
4
|
+
export declare const useNodeExecution: (taskReferenceName: string) => {
|
|
5
|
+
mode: import("../types/workflow").EditorMode;
|
|
6
|
+
execution: import("../types/workflow").TaskExecutionData | null | undefined;
|
|
7
|
+
isRunning: boolean;
|
|
8
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Position } from 'reactflow';
|
|
2
|
+
import { WorkflowNodeData } from '../types/workflow';
|
|
3
|
+
/**
|
|
4
|
+
* 从节点数据中计算 Handle 的 source/target 位置
|
|
5
|
+
*/
|
|
6
|
+
export declare const useNodeLayout: (data: WorkflowNodeData) => {
|
|
7
|
+
layoutDirection: import("../types/workflow").LayoutDirection;
|
|
8
|
+
sourcePosition: Position;
|
|
9
|
+
targetPosition: Position;
|
|
10
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface ShortcutCallbacks {
|
|
2
|
+
confirm?: (message: string) => Promise<boolean>;
|
|
3
|
+
showToast?: (text: string, type?: 'success' | 'error' | 'info') => void;
|
|
4
|
+
onSave?: (def: any) => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* useShortcuts Hook
|
|
8
|
+
* 管理流程图编辑器的全局键盘快捷键
|
|
9
|
+
*/
|
|
10
|
+
export declare const useShortcuts: (callbacks?: ShortcutCallbacks) => {};
|
|
11
|
+
export {};
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { WorkflowIDE } from './WorkflowIDE';
|
|
2
|
+
export type { WorkflowIDEProps, WorkflowIDERef } from './WorkflowIDE';
|
|
3
|
+
export type { WorkflowDef, TaskDef } from './types/conductor';
|
|
4
|
+
export type { AIServiceConfig } from './services/aiService';
|
|
5
|
+
export type { ExecutionActions } from './types/workflow';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Edge } from 'reactflow';
|
|
2
|
+
import { WorkflowNode, LayoutDirection, EditorMode } from '../types/workflow';
|
|
3
|
+
interface AutoLayoutOptions {
|
|
4
|
+
direction?: LayoutDirection;
|
|
5
|
+
mode?: EditorMode;
|
|
6
|
+
enableSnakeLayout?: boolean;
|
|
7
|
+
snakeColumns?: number;
|
|
8
|
+
snakeMinChainLength?: number;
|
|
9
|
+
snakeMinNodeCount?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 自动布局主函数
|
|
13
|
+
*/
|
|
14
|
+
export declare function getLayoutedElements(nodes: WorkflowNode[], edges: Edge[], options?: AutoLayoutOptions): {
|
|
15
|
+
nodes: WorkflowNode[];
|
|
16
|
+
edges: Edge[];
|
|
17
|
+
};
|
|
18
|
+
export declare function relayout(nodes: WorkflowNode[], edges: Edge[], direction?: LayoutDirection, mode?: EditorMode): {
|
|
19
|
+
nodes: WorkflowNode[];
|
|
20
|
+
edges: Edge[];
|
|
21
|
+
};
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { TaskDef } from '../types/conductor';
|
|
2
|
+
/**
|
|
3
|
+
* Conductor 工作流生成器助手函数
|
|
4
|
+
* 用于操作工作流 JSON 定义
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 根据 taskReferenceName 在任务列表中查找任务
|
|
8
|
+
*/
|
|
9
|
+
export declare function findTaskByRef(tasks: TaskDef[] | undefined, taskRef: string): TaskDef | null;
|
|
10
|
+
/**
|
|
11
|
+
* 从任务列表中删除指定任务
|
|
12
|
+
*/
|
|
13
|
+
export declare function removeTaskFromDef(tasks: TaskDef[] | undefined, taskRef: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* 在指定的 sourceRef 之后插入一个新任务
|
|
16
|
+
*/
|
|
17
|
+
export declare function insertTaskAfter(tasks: TaskDef[] | undefined, sourceRef: string, newTask: TaskDef): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* 专门用于向分支(Decision Case 或 Fork Branch)的首部插入第一个任务
|
|
20
|
+
*/
|
|
21
|
+
export declare function insertFirstTaskIntoBranch(tasks: TaskDef[] | undefined, parentRef: string, branchInfo: {
|
|
22
|
+
branchCase?: string;
|
|
23
|
+
forkIndex?: number;
|
|
24
|
+
}, newTask: TaskDef): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* 同步 FORK_JOIN 与配套 JOIN 任务的 joinOn 字段
|
|
27
|
+
*/
|
|
28
|
+
export declare function syncForkJoinOn(tasks: TaskDef[] | undefined): void;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Edge } from 'reactflow';
|
|
2
|
+
import { WorkflowDef, TaskDef } from '../types/conductor';
|
|
3
|
+
import { WorkflowNode, LayoutDirection } from '../types/workflow';
|
|
4
|
+
/**
|
|
5
|
+
* Conductor 工作流解析器
|
|
6
|
+
* 将 Conductor 工作流 JSON 转换为 React Flow 的 nodes 和 edges
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* 解析 Conductor 工作流定义
|
|
10
|
+
* @param {WorkflowDef} workflowDef - Conductor 工作流定义 JSON
|
|
11
|
+
* @param {LayoutDirection} direction - 布局方向 'TB' | 'LR'
|
|
12
|
+
* @returns {Object} { nodes, edges, taskMap } - React Flow 所需的数据结构
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseConductorWorkflow(workflowDef: WorkflowDef, direction?: LayoutDirection, options?: {
|
|
15
|
+
hideEmptyBranches?: boolean;
|
|
16
|
+
}): {
|
|
17
|
+
nodes: WorkflowNode[];
|
|
18
|
+
edges: Edge[];
|
|
19
|
+
taskMap: Record<string, TaskDef>;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* 别名,兼容旧代码
|
|
23
|
+
*/
|
|
24
|
+
export declare const parseWorkflow: typeof parseConductorWorkflow;
|