@yh-ui/flow 0.1.21
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/LICENSE +21 -0
- package/README.md +234 -0
- package/dist/Flow.d.vue.ts +306 -0
- package/dist/Flow.vue +959 -0
- package/dist/Flow.vue.d.ts +306 -0
- package/dist/__tests__/ai-workflow.ssr.test.cjs +352 -0
- package/dist/__tests__/ai-workflow.ssr.test.d.ts +1 -0
- package/dist/__tests__/ai-workflow.ssr.test.mjs +283 -0
- package/dist/__tests__/ai-workflow.test.cjs +109 -0
- package/dist/__tests__/ai-workflow.test.d.ts +1 -0
- package/dist/__tests__/ai-workflow.test.mjs +112 -0
- package/dist/__tests__/bpmn.ssr.test.cjs +278 -0
- package/dist/__tests__/bpmn.ssr.test.d.ts +1 -0
- package/dist/__tests__/bpmn.ssr.test.mjs +237 -0
- package/dist/__tests__/bpmn.test.cjs +103 -0
- package/dist/__tests__/bpmn.test.d.ts +1 -0
- package/dist/__tests__/bpmn.test.mjs +106 -0
- package/dist/__tests__/custom-types.test.cjs +300 -0
- package/dist/__tests__/custom-types.test.d.ts +1 -0
- package/dist/__tests__/custom-types.test.mjs +248 -0
- package/dist/__tests__/edge.test.cjs +56 -0
- package/dist/__tests__/edge.test.d.ts +1 -0
- package/dist/__tests__/edge.test.mjs +69 -0
- package/dist/__tests__/event-bus.test.cjs +80 -0
- package/dist/__tests__/event-bus.test.d.ts +1 -0
- package/dist/__tests__/event-bus.test.mjs +51 -0
- package/dist/__tests__/flow.ssr.test.cjs +156 -0
- package/dist/__tests__/flow.ssr.test.d.ts +1 -0
- package/dist/__tests__/flow.ssr.test.mjs +112 -0
- package/dist/__tests__/geometry.test.cjs +191 -0
- package/dist/__tests__/geometry.test.d.ts +1 -0
- package/dist/__tests__/geometry.test.mjs +105 -0
- package/dist/__tests__/graph.test.cjs +115 -0
- package/dist/__tests__/graph.test.d.ts +1 -0
- package/dist/__tests__/graph.test.mjs +85 -0
- package/dist/__tests__/history-plugin.test.cjs +191 -0
- package/dist/__tests__/history-plugin.test.d.ts +1 -0
- package/dist/__tests__/history-plugin.test.mjs +161 -0
- package/dist/__tests__/history.test.cjs +81 -0
- package/dist/__tests__/history.test.d.ts +1 -0
- package/dist/__tests__/history.test.mjs +43 -0
- package/dist/__tests__/layout.test.cjs +213 -0
- package/dist/__tests__/layout.test.d.ts +1 -0
- package/dist/__tests__/layout.test.mjs +170 -0
- package/dist/__tests__/node-edit-panel.ssr.test.cjs +168 -0
- package/dist/__tests__/node-edit-panel.ssr.test.d.ts +1 -0
- package/dist/__tests__/node-edit-panel.ssr.test.mjs +118 -0
- package/dist/__tests__/node-group-plugin.test.cjs +235 -0
- package/dist/__tests__/node-group-plugin.test.d.ts +1 -0
- package/dist/__tests__/node-group-plugin.test.mjs +187 -0
- package/dist/__tests__/node-handles.test.cjs +340 -0
- package/dist/__tests__/node-handles.test.d.ts +1 -0
- package/dist/__tests__/node-handles.test.mjs +230 -0
- package/dist/__tests__/plugin.test.cjs +151 -0
- package/dist/__tests__/plugin.test.d.ts +1 -0
- package/dist/__tests__/plugin.test.mjs +116 -0
- package/dist/__tests__/transform.test.cjs +58 -0
- package/dist/__tests__/transform.test.d.ts +1 -0
- package/dist/__tests__/transform.test.mjs +38 -0
- package/dist/__tests__/useAlignment.test.cjs +91 -0
- package/dist/__tests__/useAlignment.test.d.ts +1 -0
- package/dist/__tests__/useAlignment.test.mjs +52 -0
- package/dist/__tests__/useEdges.test.cjs +117 -0
- package/dist/__tests__/useEdges.test.d.ts +1 -0
- package/dist/__tests__/useEdges.test.mjs +80 -0
- package/dist/__tests__/useKeyboard.test.cjs +88 -0
- package/dist/__tests__/useKeyboard.test.d.ts +1 -0
- package/dist/__tests__/useKeyboard.test.mjs +56 -0
- package/dist/__tests__/useNodes.test.cjs +150 -0
- package/dist/__tests__/useNodes.test.d.ts +1 -0
- package/dist/__tests__/useNodes.test.mjs +80 -0
- package/dist/__tests__/useSelection.test.cjs +112 -0
- package/dist/__tests__/useSelection.test.d.ts +1 -0
- package/dist/__tests__/useSelection.test.mjs +76 -0
- package/dist/__tests__/useViewport.test.cjs +171 -0
- package/dist/__tests__/useViewport.test.d.ts +1 -0
- package/dist/__tests__/useViewport.test.mjs +82 -0
- package/dist/__tests__/utils/ssr.cjs +124 -0
- package/dist/__tests__/utils/ssr.d.ts +33 -0
- package/dist/__tests__/utils/ssr.mjs +129 -0
- package/dist/__tests__/validation.test.cjs +95 -0
- package/dist/__tests__/validation.test.d.ts +1 -0
- package/dist/__tests__/validation.test.mjs +36 -0
- package/dist/components/AiNodeEditPanel.d.vue.ts +13 -0
- package/dist/components/AiNodeEditPanel.vue +413 -0
- package/dist/components/AiNodeEditPanel.vue.d.ts +13 -0
- package/dist/components/EdgeEditPanel.d.vue.ts +14 -0
- package/dist/components/EdgeEditPanel.vue +205 -0
- package/dist/components/EdgeEditPanel.vue.d.ts +14 -0
- package/dist/components/NodeEditPanel.d.vue.ts +13 -0
- package/dist/components/NodeEditPanel.vue +214 -0
- package/dist/components/NodeEditPanel.vue.d.ts +13 -0
- package/dist/components/edges/BaseEdge.d.vue.ts +23 -0
- package/dist/components/edges/BaseEdge.vue +55 -0
- package/dist/components/edges/BaseEdge.vue.d.ts +23 -0
- package/dist/components/edges/BezierEdge.d.vue.ts +22 -0
- package/dist/components/edges/BezierEdge.vue +57 -0
- package/dist/components/edges/BezierEdge.vue.d.ts +22 -0
- package/dist/components/edges/DataFlowEdge.d.vue.ts +41 -0
- package/dist/components/edges/DataFlowEdge.vue +211 -0
- package/dist/components/edges/DataFlowEdge.vue.d.ts +41 -0
- package/dist/components/edges/SmoothEdge.d.vue.ts +22 -0
- package/dist/components/edges/SmoothEdge.vue +53 -0
- package/dist/components/edges/SmoothEdge.vue.d.ts +22 -0
- package/dist/components/edges/StepEdge.d.vue.ts +22 -0
- package/dist/components/edges/StepEdge.vue +42 -0
- package/dist/components/edges/StepEdge.vue.d.ts +22 -0
- package/dist/components/edges/index.cjs +41 -0
- package/dist/components/edges/index.d.ts +5 -0
- package/dist/components/edges/index.mjs +5 -0
- package/dist/components/nodes/BaseNode.d.vue.ts +25 -0
- package/dist/components/nodes/BaseNode.vue +93 -0
- package/dist/components/nodes/BaseNode.vue.d.ts +25 -0
- package/dist/components/nodes/CustomNode.d.vue.ts +36 -0
- package/dist/components/nodes/CustomNode.vue +44 -0
- package/dist/components/nodes/CustomNode.vue.d.ts +36 -0
- package/dist/components/nodes/DatabaseNode.d.vue.ts +19 -0
- package/dist/components/nodes/DatabaseNode.vue +62 -0
- package/dist/components/nodes/DatabaseNode.vue.d.ts +19 -0
- package/dist/components/nodes/DiamondNode.d.vue.ts +19 -0
- package/dist/components/nodes/DiamondNode.vue +62 -0
- package/dist/components/nodes/DiamondNode.vue.d.ts +19 -0
- package/dist/components/nodes/GroupNode.d.vue.ts +31 -0
- package/dist/components/nodes/GroupNode.vue +48 -0
- package/dist/components/nodes/GroupNode.vue.d.ts +31 -0
- package/dist/components/nodes/InputNode.d.vue.ts +23 -0
- package/dist/components/nodes/InputNode.vue +63 -0
- package/dist/components/nodes/InputNode.vue.d.ts +23 -0
- package/dist/components/nodes/NodeResizer.d.vue.ts +27 -0
- package/dist/components/nodes/NodeResizer.vue +89 -0
- package/dist/components/nodes/NodeResizer.vue.d.ts +27 -0
- package/dist/components/nodes/NodeToolbar.d.vue.ts +32 -0
- package/dist/components/nodes/NodeToolbar.vue +101 -0
- package/dist/components/nodes/NodeToolbar.vue.d.ts +32 -0
- package/dist/components/nodes/OutputNode.d.vue.ts +21 -0
- package/dist/components/nodes/OutputNode.vue +53 -0
- package/dist/components/nodes/OutputNode.vue.d.ts +21 -0
- package/dist/components/nodes/ai-workflow/AiAgentNode.d.vue.ts +20 -0
- package/dist/components/nodes/ai-workflow/AiAgentNode.vue +59 -0
- package/dist/components/nodes/ai-workflow/AiAgentNode.vue.d.ts +20 -0
- package/dist/components/nodes/ai-workflow/AiConditionNode.d.vue.ts +19 -0
- package/dist/components/nodes/ai-workflow/AiConditionNode.vue +65 -0
- package/dist/components/nodes/ai-workflow/AiConditionNode.vue.d.ts +19 -0
- package/dist/components/nodes/ai-workflow/AiEndNode.d.vue.ts +19 -0
- package/dist/components/nodes/ai-workflow/AiEndNode.vue +47 -0
- package/dist/components/nodes/ai-workflow/AiEndNode.vue.d.ts +19 -0
- package/dist/components/nodes/ai-workflow/AiLlmNode.d.vue.ts +19 -0
- package/dist/components/nodes/ai-workflow/AiLlmNode.vue +64 -0
- package/dist/components/nodes/ai-workflow/AiLlmNode.vue.d.ts +19 -0
- package/dist/components/nodes/ai-workflow/AiMemoryNode.d.vue.ts +19 -0
- package/dist/components/nodes/ai-workflow/AiMemoryNode.vue +59 -0
- package/dist/components/nodes/ai-workflow/AiMemoryNode.vue.d.ts +19 -0
- package/dist/components/nodes/ai-workflow/AiPromptNode.d.vue.ts +19 -0
- package/dist/components/nodes/ai-workflow/AiPromptNode.vue +61 -0
- package/dist/components/nodes/ai-workflow/AiPromptNode.vue.d.ts +19 -0
- package/dist/components/nodes/ai-workflow/AiStartNode.d.vue.ts +19 -0
- package/dist/components/nodes/ai-workflow/AiStartNode.vue +47 -0
- package/dist/components/nodes/ai-workflow/AiStartNode.vue.d.ts +19 -0
- package/dist/components/nodes/ai-workflow/AiToolNode.d.vue.ts +19 -0
- package/dist/components/nodes/ai-workflow/AiToolNode.vue +59 -0
- package/dist/components/nodes/ai-workflow/AiToolNode.vue.d.ts +19 -0
- package/dist/components/nodes/ai-workflow/index.cjs +109 -0
- package/dist/components/nodes/ai-workflow/index.d.ts +23 -0
- package/dist/components/nodes/ai-workflow/index.mjs +37 -0
- package/dist/components/nodes/bpmn/BpmnEndEvent.d.vue.ts +19 -0
- package/dist/components/nodes/bpmn/BpmnEndEvent.vue +50 -0
- package/dist/components/nodes/bpmn/BpmnEndEvent.vue.d.ts +19 -0
- package/dist/components/nodes/bpmn/BpmnExclusiveGateway.d.vue.ts +19 -0
- package/dist/components/nodes/bpmn/BpmnExclusiveGateway.vue +60 -0
- package/dist/components/nodes/bpmn/BpmnExclusiveGateway.vue.d.ts +19 -0
- package/dist/components/nodes/bpmn/BpmnInclusiveGateway.d.vue.ts +19 -0
- package/dist/components/nodes/bpmn/BpmnInclusiveGateway.vue +60 -0
- package/dist/components/nodes/bpmn/BpmnInclusiveGateway.vue.d.ts +19 -0
- package/dist/components/nodes/bpmn/BpmnParallelGateway.d.vue.ts +19 -0
- package/dist/components/nodes/bpmn/BpmnParallelGateway.vue +60 -0
- package/dist/components/nodes/bpmn/BpmnParallelGateway.vue.d.ts +19 -0
- package/dist/components/nodes/bpmn/BpmnServiceTask.d.vue.ts +19 -0
- package/dist/components/nodes/bpmn/BpmnServiceTask.vue +55 -0
- package/dist/components/nodes/bpmn/BpmnServiceTask.vue.d.ts +19 -0
- package/dist/components/nodes/bpmn/BpmnStartEvent.d.vue.ts +19 -0
- package/dist/components/nodes/bpmn/BpmnStartEvent.vue +50 -0
- package/dist/components/nodes/bpmn/BpmnStartEvent.vue.d.ts +19 -0
- package/dist/components/nodes/bpmn/BpmnTask.d.vue.ts +19 -0
- package/dist/components/nodes/bpmn/BpmnTask.vue +54 -0
- package/dist/components/nodes/bpmn/BpmnTask.vue.d.ts +19 -0
- package/dist/components/nodes/bpmn/BpmnUserTask.d.vue.ts +19 -0
- package/dist/components/nodes/bpmn/BpmnUserTask.vue +55 -0
- package/dist/components/nodes/bpmn/BpmnUserTask.vue.d.ts +19 -0
- package/dist/components/nodes/bpmn/index.cjs +109 -0
- package/dist/components/nodes/bpmn/index.d.ts +23 -0
- package/dist/components/nodes/bpmn/index.mjs +37 -0
- package/dist/components/nodes/index.cjs +246 -0
- package/dist/components/nodes/index.d.ts +13 -0
- package/dist/components/nodes/index.mjs +44 -0
- package/dist/core/FlowContext.cjs +21 -0
- package/dist/core/FlowContext.d.ts +10 -0
- package/dist/core/FlowContext.mjs +13 -0
- package/dist/core/index.cjs +104 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.mjs +9 -0
- package/dist/core/useAlignment.cjs +81 -0
- package/dist/core/useAlignment.d.ts +33 -0
- package/dist/core/useAlignment.mjs +71 -0
- package/dist/core/useEdges.cjs +132 -0
- package/dist/core/useEdges.d.ts +29 -0
- package/dist/core/useEdges.mjs +89 -0
- package/dist/core/useFlow.cjs +40 -0
- package/dist/core/useFlow.d.ts +31 -0
- package/dist/core/useFlow.mjs +32 -0
- package/dist/core/useHistory.cjs +63 -0
- package/dist/core/useHistory.d.ts +15 -0
- package/dist/core/useHistory.mjs +54 -0
- package/dist/core/useKeyboard.cjs +54 -0
- package/dist/core/useKeyboard.d.ts +18 -0
- package/dist/core/useKeyboard.mjs +45 -0
- package/dist/core/useNodeDistribution.cjs +171 -0
- package/dist/core/useNodeDistribution.d.ts +12 -0
- package/dist/core/useNodeDistribution.mjs +145 -0
- package/dist/core/useNodes.cjs +146 -0
- package/dist/core/useNodes.d.ts +26 -0
- package/dist/core/useNodes.mjs +101 -0
- package/dist/core/useSelection.cjs +83 -0
- package/dist/core/useSelection.d.ts +18 -0
- package/dist/core/useSelection.mjs +53 -0
- package/dist/core/useViewport.cjs +157 -0
- package/dist/core/useViewport.d.ts +65 -0
- package/dist/core/useViewport.mjs +125 -0
- package/dist/flow.cjs +240 -0
- package/dist/flow.d.ts +276 -0
- package/dist/flow.mjs +230 -0
- package/dist/index.cjs +378 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.mjs +50 -0
- package/dist/plugins/index.cjs +96 -0
- package/dist/plugins/index.d.ts +34 -0
- package/dist/plugins/index.mjs +47 -0
- package/dist/plugins/plugin.cjs +117 -0
- package/dist/plugins/plugin.d.ts +72 -0
- package/dist/plugins/plugin.mjs +110 -0
- package/dist/plugins/plugins/controls.cjs +38 -0
- package/dist/plugins/plugins/controls.d.ts +12 -0
- package/dist/plugins/plugins/controls.mjs +28 -0
- package/dist/plugins/plugins/export.cjs +102 -0
- package/dist/plugins/plugins/export.d.ts +12 -0
- package/dist/plugins/plugins/export.mjs +89 -0
- package/dist/plugins/plugins/grid.cjs +36 -0
- package/dist/plugins/plugins/grid.d.ts +11 -0
- package/dist/plugins/plugins/grid.mjs +26 -0
- package/dist/plugins/plugins/history.cjs +140 -0
- package/dist/plugins/plugins/history.d.ts +53 -0
- package/dist/plugins/plugins/history.mjs +132 -0
- package/dist/plugins/plugins/index.cjs +104 -0
- package/dist/plugins/plugins/index.d.ts +9 -0
- package/dist/plugins/plugins/index.mjs +9 -0
- package/dist/plugins/plugins/keyboard.cjs +27 -0
- package/dist/plugins/plugins/keyboard.d.ts +10 -0
- package/dist/plugins/plugins/keyboard.mjs +18 -0
- package/dist/plugins/plugins/layout.cjs +275 -0
- package/dist/plugins/plugins/layout.d.ts +34 -0
- package/dist/plugins/plugins/layout.mjs +246 -0
- package/dist/plugins/plugins/minimap.cjs +60 -0
- package/dist/plugins/plugins/minimap.d.ts +25 -0
- package/dist/plugins/plugins/minimap.mjs +50 -0
- package/dist/plugins/plugins/node-group.cjs +209 -0
- package/dist/plugins/plugins/node-group.d.ts +26 -0
- package/dist/plugins/plugins/node-group.mjs +178 -0
- package/dist/plugins/plugins/snap.cjs +36 -0
- package/dist/plugins/plugins/snap.d.ts +12 -0
- package/dist/plugins/plugins/snap.mjs +26 -0
- package/dist/renderer/AlignmentLines.d.vue.ts +5 -0
- package/dist/renderer/AlignmentLines.vue +113 -0
- package/dist/renderer/AlignmentLines.vue.d.ts +5 -0
- package/dist/renderer/Background.d.vue.ts +7 -0
- package/dist/renderer/Background.vue +86 -0
- package/dist/renderer/Background.vue.d.ts +7 -0
- package/dist/renderer/Controls.d.vue.ts +13 -0
- package/dist/renderer/Controls.vue +82 -0
- package/dist/renderer/Controls.vue.d.ts +13 -0
- package/dist/renderer/EdgeHandlesRenderer.d.vue.ts +11 -0
- package/dist/renderer/EdgeHandlesRenderer.vue +75 -0
- package/dist/renderer/EdgeHandlesRenderer.vue.d.ts +11 -0
- package/dist/renderer/EdgeRenderer.d.vue.ts +39 -0
- package/dist/renderer/EdgeRenderer.vue +204 -0
- package/dist/renderer/EdgeRenderer.vue.d.ts +39 -0
- package/dist/renderer/FlowBackground.d.vue.ts +11 -0
- package/dist/renderer/FlowBackground.vue +82 -0
- package/dist/renderer/FlowBackground.vue.d.ts +11 -0
- package/dist/renderer/Minimap.d.vue.ts +30 -0
- package/dist/renderer/Minimap.vue +290 -0
- package/dist/renderer/Minimap.vue.d.ts +30 -0
- package/dist/renderer/NodeRenderer.d.vue.ts +56 -0
- package/dist/renderer/NodeRenderer.vue +328 -0
- package/dist/renderer/NodeRenderer.vue.d.ts +56 -0
- package/dist/renderer/SelectionBox.d.vue.ts +11 -0
- package/dist/renderer/SelectionBox.vue +28 -0
- package/dist/renderer/SelectionBox.vue.d.ts +11 -0
- package/dist/types/edge.cjs +13 -0
- package/dist/types/edge.d.ts +65 -0
- package/dist/types/edge.mjs +6 -0
- package/dist/types/events.cjs +1 -0
- package/dist/types/events.d.ts +115 -0
- package/dist/types/events.mjs +0 -0
- package/dist/types/index.cjs +1 -0
- package/dist/types/index.d.ts +366 -0
- package/dist/types/index.mjs +0 -0
- package/dist/types/node.cjs +9 -0
- package/dist/types/node.d.ts +90 -0
- package/dist/types/node.mjs +3 -0
- package/dist/types/viewport.cjs +42 -0
- package/dist/types/viewport.d.ts +62 -0
- package/dist/types/viewport.mjs +36 -0
- package/dist/utils/bpmn-engine.cjs +390 -0
- package/dist/utils/bpmn-engine.d.ts +164 -0
- package/dist/utils/bpmn-engine.mjs +378 -0
- package/dist/utils/bpmn.cjs +492 -0
- package/dist/utils/bpmn.d.ts +53 -0
- package/dist/utils/bpmn.mjs +430 -0
- package/dist/utils/collaboration.cjs +537 -0
- package/dist/utils/collaboration.d.ts +189 -0
- package/dist/utils/collaboration.mjs +521 -0
- package/dist/utils/custom-types.cjs +138 -0
- package/dist/utils/custom-types.d.ts +78 -0
- package/dist/utils/custom-types.mjs +108 -0
- package/dist/utils/edge.cjs +235 -0
- package/dist/utils/edge.d.ts +79 -0
- package/dist/utils/edge.mjs +172 -0
- package/dist/utils/event-bus.cjs +91 -0
- package/dist/utils/event-bus.d.ts +39 -0
- package/dist/utils/event-bus.mjs +82 -0
- package/dist/utils/geometry.cjs +178 -0
- package/dist/utils/geometry.d.ts +186 -0
- package/dist/utils/geometry.mjs +144 -0
- package/dist/utils/graph.cjs +158 -0
- package/dist/utils/graph.d.ts +40 -0
- package/dist/utils/graph.mjs +147 -0
- package/dist/utils/index.cjs +137 -0
- package/dist/utils/index.d.ts +12 -0
- package/dist/utils/index.mjs +12 -0
- package/dist/utils/performance.cjs +94 -0
- package/dist/utils/performance.d.ts +18 -0
- package/dist/utils/performance.mjs +82 -0
- package/dist/utils/screenshot.cjs +87 -0
- package/dist/utils/screenshot.d.ts +22 -0
- package/dist/utils/screenshot.mjs +66 -0
- package/dist/utils/theme.cjs +228 -0
- package/dist/utils/theme.d.ts +92 -0
- package/dist/utils/theme.mjs +217 -0
- package/dist/utils/transform.cjs +76 -0
- package/dist/utils/transform.d.ts +45 -0
- package/dist/utils/transform.mjs +57 -0
- package/dist/utils/validation.cjs +107 -0
- package/dist/utils/validation.d.ts +29 -0
- package/dist/utils/validation.mjs +85 -0
- package/package.json +61 -0
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { ref, watch, computed } from "vue";
|
|
3
|
+
const props = defineProps({
|
|
4
|
+
node: { type: [Object, null], required: true },
|
|
5
|
+
visible: { type: Boolean, required: true }
|
|
6
|
+
});
|
|
7
|
+
const emit = defineEmits(["update", "close"]);
|
|
8
|
+
const localNode = ref({
|
|
9
|
+
label: "",
|
|
10
|
+
description: ""
|
|
11
|
+
});
|
|
12
|
+
const isAiWorkflowNode = computed(() => {
|
|
13
|
+
if (!props.node) return false;
|
|
14
|
+
const type = props.node.type;
|
|
15
|
+
return type?.startsWith("ai-");
|
|
16
|
+
});
|
|
17
|
+
const isAiLlmNode = computed(() => props.node?.type === "ai-llm");
|
|
18
|
+
const isAiPromptNode = computed(() => props.node?.type === "ai-prompt");
|
|
19
|
+
const isAiAgentNode = computed(() => props.node?.type === "ai-agent");
|
|
20
|
+
const isAiToolNode = computed(() => props.node?.type === "ai-tool");
|
|
21
|
+
const isAiConditionNode = computed(() => props.node?.type === "ai-condition");
|
|
22
|
+
const isAiMemoryNode = computed(() => props.node?.type === "ai-memory");
|
|
23
|
+
const llmModels = [
|
|
24
|
+
{ value: "gpt-4", label: "GPT-4" },
|
|
25
|
+
{ value: "gpt-4-turbo", label: "GPT-4 Turbo" },
|
|
26
|
+
{ value: "gpt-3.5-turbo", label: "GPT-3.5 Turbo" },
|
|
27
|
+
{ value: "claude-3-opus", label: "Claude 3 Opus" },
|
|
28
|
+
{ value: "claude-3-sonnet", label: "Claude 3 Sonnet" },
|
|
29
|
+
{ value: "claude-3-haiku", label: "Claude 3 Haiku" }
|
|
30
|
+
];
|
|
31
|
+
const availableTools = [
|
|
32
|
+
{ value: "search", label: "\u{1F50D} \u641C\u7D22" },
|
|
33
|
+
{ value: "calculator", label: "\u{1F9EE} \u8BA1\u7B97\u5668" },
|
|
34
|
+
{ value: "weather", label: "\u{1F324}\uFE0F \u5929\u6C14\u67E5\u8BE2" },
|
|
35
|
+
{ value: "code_interpreter", label: "\u{1F4BB} \u4EE3\u7801\u6267\u884C" },
|
|
36
|
+
{ value: "web_fetch", label: "\u{1F310} \u7F51\u9875\u83B7\u53D6" }
|
|
37
|
+
];
|
|
38
|
+
const memoryTypes = [
|
|
39
|
+
{ value: "short", label: "\u77ED\u671F\u8BB0\u5FC6" },
|
|
40
|
+
{ value: "long", label: "\u957F\u671F\u8BB0\u5FC6" },
|
|
41
|
+
{ value: "session", label: "\u4F1A\u8BDD\u8BB0\u5FC6" }
|
|
42
|
+
];
|
|
43
|
+
watch(
|
|
44
|
+
() => props.node,
|
|
45
|
+
(node) => {
|
|
46
|
+
if (node) {
|
|
47
|
+
const data = node.data;
|
|
48
|
+
const displayLabel = data.label || data.title || data.name || data.text || node.id;
|
|
49
|
+
localNode.value = {
|
|
50
|
+
label: String(displayLabel),
|
|
51
|
+
description: data.description || data.desc || "",
|
|
52
|
+
style: { ...node.style },
|
|
53
|
+
width: node.width,
|
|
54
|
+
height: node.height,
|
|
55
|
+
type: node.type,
|
|
56
|
+
// AI workflow fields - explicitly cast to correct types
|
|
57
|
+
model: data?.model || "gpt-4",
|
|
58
|
+
prompt: data?.prompt || "",
|
|
59
|
+
temperature: data?.temperature ?? 0.7,
|
|
60
|
+
maxTokens: data?.maxTokens ?? 2e3,
|
|
61
|
+
tools: data?.tools || [],
|
|
62
|
+
toolName: data?.toolName || "",
|
|
63
|
+
condition: data?.condition || "",
|
|
64
|
+
memoryType: data?.memoryType || "short",
|
|
65
|
+
status: data?.status || "pending",
|
|
66
|
+
streamOutput: data?.streamOutput || ""
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{ immediate: true }
|
|
71
|
+
);
|
|
72
|
+
const updateField = (field, value) => {
|
|
73
|
+
const updateData = { ...props.node?.data };
|
|
74
|
+
updateData[field] = value;
|
|
75
|
+
emit("update", { data: updateData });
|
|
76
|
+
};
|
|
77
|
+
const handleLabelBlur = () => {
|
|
78
|
+
if (!props.node) return;
|
|
79
|
+
const data = { ...props.node.data };
|
|
80
|
+
if ("label" in data || !("title" in data || "name" in data || "text" in data)) {
|
|
81
|
+
data.label = localNode.value.label;
|
|
82
|
+
} else if ("title" in data) {
|
|
83
|
+
data.title = localNode.value.label;
|
|
84
|
+
} else if ("name" in data) {
|
|
85
|
+
data.name = localNode.value.label;
|
|
86
|
+
} else if ("text" in data) {
|
|
87
|
+
data.text = localNode.value.label;
|
|
88
|
+
}
|
|
89
|
+
emit("update", { data });
|
|
90
|
+
};
|
|
91
|
+
const handleModelChange = (event) => {
|
|
92
|
+
const value = event.target.value;
|
|
93
|
+
updateField("model", value);
|
|
94
|
+
};
|
|
95
|
+
const handlePromptBlur = () => {
|
|
96
|
+
updateField("prompt", localNode.value.prompt);
|
|
97
|
+
};
|
|
98
|
+
const handleTemperatureChange = (event) => {
|
|
99
|
+
const value = parseFloat(event.target.value);
|
|
100
|
+
updateField("temperature", value);
|
|
101
|
+
};
|
|
102
|
+
const handleMaxTokensChange = (event) => {
|
|
103
|
+
const value = parseInt(event.target.value);
|
|
104
|
+
updateField("maxTokens", value);
|
|
105
|
+
};
|
|
106
|
+
const toggleTool = (toolValue) => {
|
|
107
|
+
const currentTools = localNode.value.tools || [];
|
|
108
|
+
const newTools = currentTools.includes(toolValue) ? currentTools.filter((t) => t !== toolValue) : [...currentTools, toolValue];
|
|
109
|
+
localNode.value.tools = newTools;
|
|
110
|
+
updateField("tools", newTools);
|
|
111
|
+
};
|
|
112
|
+
const handleToolNameBlur = () => {
|
|
113
|
+
updateField("toolName", localNode.value.toolName);
|
|
114
|
+
};
|
|
115
|
+
const handleConditionBlur = () => {
|
|
116
|
+
updateField("condition", localNode.value.condition);
|
|
117
|
+
};
|
|
118
|
+
const handleMemoryTypeChange = (event) => {
|
|
119
|
+
const value = event.target.value;
|
|
120
|
+
updateField("memoryType", value);
|
|
121
|
+
};
|
|
122
|
+
const handleClose = () => {
|
|
123
|
+
emit("close");
|
|
124
|
+
};
|
|
125
|
+
const updateStyle = (key, value) => {
|
|
126
|
+
const newStyle = { ...props.node?.style, [key]: value };
|
|
127
|
+
emit("update", { style: newStyle });
|
|
128
|
+
};
|
|
129
|
+
const updateSize = () => {
|
|
130
|
+
emit("update", {
|
|
131
|
+
width: localNode.value.width,
|
|
132
|
+
height: localNode.value.height
|
|
133
|
+
});
|
|
134
|
+
};
|
|
135
|
+
const colors = [
|
|
136
|
+
"#fff",
|
|
137
|
+
"#f8f9fa",
|
|
138
|
+
"#e9ecef",
|
|
139
|
+
"#dee2e6",
|
|
140
|
+
"#ced4da",
|
|
141
|
+
"#3b82f6",
|
|
142
|
+
"#10b981",
|
|
143
|
+
"#f59e0b",
|
|
144
|
+
"#ef4444",
|
|
145
|
+
"#8b5cf6"
|
|
146
|
+
];
|
|
147
|
+
const borderColors = [
|
|
148
|
+
"#ddd",
|
|
149
|
+
"#3b82f6",
|
|
150
|
+
"#10b981",
|
|
151
|
+
"#f59e0b",
|
|
152
|
+
"#ef4444",
|
|
153
|
+
"#8b5cf6",
|
|
154
|
+
"#ec4899",
|
|
155
|
+
"#06b6d4"
|
|
156
|
+
];
|
|
157
|
+
</script>
|
|
158
|
+
|
|
159
|
+
<template>
|
|
160
|
+
<Teleport to="body">
|
|
161
|
+
<Transition name="slide-fade">
|
|
162
|
+
<div v-if="visible && node" class="ai-node-edit-panel">
|
|
163
|
+
<div class="panel-header">
|
|
164
|
+
<span class="panel-title">
|
|
165
|
+
<span v-if="isAiLlmNode">🧠 LLM 配置</span>
|
|
166
|
+
<span v-else-if="isAiPromptNode">💬 提示词配置</span>
|
|
167
|
+
<span v-else-if="isAiAgentNode">🤖 Agent 配置</span>
|
|
168
|
+
<span v-else-if="isAiToolNode">🔧 工具配置</span>
|
|
169
|
+
<span v-else-if="isAiConditionNode">🔀 条件配置</span>
|
|
170
|
+
<span v-else-if="isAiMemoryNode">💾 记忆配置</span>
|
|
171
|
+
<span v-else>编辑节点</span>
|
|
172
|
+
</span>
|
|
173
|
+
<button class="close-btn" @click="handleClose">×</button>
|
|
174
|
+
</div>
|
|
175
|
+
|
|
176
|
+
<div class="panel-content">
|
|
177
|
+
<!-- 通用字段 -->
|
|
178
|
+
<div class="form-group">
|
|
179
|
+
<label>标签</label>
|
|
180
|
+
<input
|
|
181
|
+
v-model="localNode.label"
|
|
182
|
+
type="text"
|
|
183
|
+
placeholder="节点标签"
|
|
184
|
+
@blur="handleLabelBlur"
|
|
185
|
+
@keyup.enter="handleLabelBlur"
|
|
186
|
+
/>
|
|
187
|
+
</div>
|
|
188
|
+
|
|
189
|
+
<!-- LLM 节点配置 -->
|
|
190
|
+
<template v-if="isAiLlmNode">
|
|
191
|
+
<div class="form-group">
|
|
192
|
+
<label>模型</label>
|
|
193
|
+
<select :value="localNode.model" class="form-select" @change="handleModelChange">
|
|
194
|
+
<option v-for="model in llmModels" :key="model.value" :value="model.value">
|
|
195
|
+
{{ model.label }}
|
|
196
|
+
</option>
|
|
197
|
+
</select>
|
|
198
|
+
</div>
|
|
199
|
+
|
|
200
|
+
<div class="form-group">
|
|
201
|
+
<label>Temperature ({{ localNode.temperature }})</label>
|
|
202
|
+
<input
|
|
203
|
+
:value="localNode.temperature"
|
|
204
|
+
type="range"
|
|
205
|
+
min="0"
|
|
206
|
+
max="2"
|
|
207
|
+
step="0.1"
|
|
208
|
+
@input="handleTemperatureChange"
|
|
209
|
+
/>
|
|
210
|
+
<div class="range-labels">
|
|
211
|
+
<span>精确</span>
|
|
212
|
+
<span>创意</span>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
|
|
216
|
+
<div class="form-group">
|
|
217
|
+
<label>Max Tokens</label>
|
|
218
|
+
<input
|
|
219
|
+
:value="localNode.maxTokens"
|
|
220
|
+
type="number"
|
|
221
|
+
min="100"
|
|
222
|
+
max="32000"
|
|
223
|
+
@change="handleMaxTokensChange"
|
|
224
|
+
/>
|
|
225
|
+
</div>
|
|
226
|
+
|
|
227
|
+
<div class="form-group">
|
|
228
|
+
<label>状态</label>
|
|
229
|
+
<div class="status-badges">
|
|
230
|
+
<span
|
|
231
|
+
class="status-badge"
|
|
232
|
+
:class="{
|
|
233
|
+
active: localNode.status === 'pending',
|
|
234
|
+
'status-pending': true
|
|
235
|
+
}"
|
|
236
|
+
>○ 待运行</span
|
|
237
|
+
>
|
|
238
|
+
<span
|
|
239
|
+
class="status-badge"
|
|
240
|
+
:class="{
|
|
241
|
+
active: localNode.status === 'running',
|
|
242
|
+
'status-running': true
|
|
243
|
+
}"
|
|
244
|
+
>● 运行中</span
|
|
245
|
+
>
|
|
246
|
+
<span
|
|
247
|
+
class="status-badge"
|
|
248
|
+
:class="{
|
|
249
|
+
active: localNode.status === 'success',
|
|
250
|
+
'status-success': true
|
|
251
|
+
}"
|
|
252
|
+
>✓ 成功</span
|
|
253
|
+
>
|
|
254
|
+
<span
|
|
255
|
+
class="status-badge"
|
|
256
|
+
:class="{
|
|
257
|
+
active: localNode.status === 'error',
|
|
258
|
+
'status-error': true
|
|
259
|
+
}"
|
|
260
|
+
>✗ 错误</span
|
|
261
|
+
>
|
|
262
|
+
</div>
|
|
263
|
+
</div>
|
|
264
|
+
|
|
265
|
+
<!-- 流式输出预览 -->
|
|
266
|
+
<div class="form-group" v-if="localNode.status === 'running'">
|
|
267
|
+
<label>流式输出</label>
|
|
268
|
+
<div class="stream-preview">
|
|
269
|
+
<span class="streaming-cursor">▊</span>
|
|
270
|
+
<span class="stream-text">{{ localNode.streamOutput || "\u6B63\u5728\u751F\u6210..." }}</span>
|
|
271
|
+
</div>
|
|
272
|
+
</div>
|
|
273
|
+
</template>
|
|
274
|
+
|
|
275
|
+
<!-- 提示词节点配置 -->
|
|
276
|
+
<template v-if="isAiPromptNode">
|
|
277
|
+
<div class="form-group">
|
|
278
|
+
<label>提示词内容</label>
|
|
279
|
+
<textarea
|
|
280
|
+
v-model="localNode.prompt"
|
|
281
|
+
placeholder="输入提示词模板,可以使用 {{variable}} 语法"
|
|
282
|
+
rows="6"
|
|
283
|
+
@blur="handlePromptBlur"
|
|
284
|
+
/>
|
|
285
|
+
<div class="form-hint">支持 {{variable}} 变量语法</div>
|
|
286
|
+
</div>
|
|
287
|
+
</template>
|
|
288
|
+
|
|
289
|
+
<!-- Agent 节点配置 -->
|
|
290
|
+
<template v-if="isAiAgentNode">
|
|
291
|
+
<div class="form-group">
|
|
292
|
+
<label>选择工具</label>
|
|
293
|
+
<div class="tools-checkboxes">
|
|
294
|
+
<label v-for="tool in availableTools" :key="tool.value" class="tool-checkbox">
|
|
295
|
+
<input
|
|
296
|
+
type="checkbox"
|
|
297
|
+
:checked="localNode.tools?.includes(tool.value)"
|
|
298
|
+
@change="toggleTool(tool.value)"
|
|
299
|
+
/>
|
|
300
|
+
<span>{{ tool.label }}</span>
|
|
301
|
+
</label>
|
|
302
|
+
</div>
|
|
303
|
+
</div>
|
|
304
|
+
</template>
|
|
305
|
+
|
|
306
|
+
<!-- 工具节点配置 -->
|
|
307
|
+
<template v-if="isAiToolNode">
|
|
308
|
+
<div class="form-group">
|
|
309
|
+
<label>工具名称</label>
|
|
310
|
+
<input
|
|
311
|
+
v-model="localNode.toolName"
|
|
312
|
+
type="text"
|
|
313
|
+
placeholder="输入工具名称"
|
|
314
|
+
@blur="handleToolNameBlur"
|
|
315
|
+
/>
|
|
316
|
+
</div>
|
|
317
|
+
</template>
|
|
318
|
+
|
|
319
|
+
<!-- 条件节点配置 -->
|
|
320
|
+
<template v-if="isAiConditionNode">
|
|
321
|
+
<div class="form-group">
|
|
322
|
+
<label>条件表达式</label>
|
|
323
|
+
<input
|
|
324
|
+
v-model="localNode.condition"
|
|
325
|
+
type="text"
|
|
326
|
+
placeholder="例如: score > 60"
|
|
327
|
+
@blur="handleConditionBlur"
|
|
328
|
+
/>
|
|
329
|
+
<div class="form-hint">满足条件走下方输出,不满足走右侧输出</div>
|
|
330
|
+
</div>
|
|
331
|
+
</template>
|
|
332
|
+
|
|
333
|
+
<!-- 记忆节点配置 -->
|
|
334
|
+
<template v-if="isAiMemoryNode">
|
|
335
|
+
<div class="form-group">
|
|
336
|
+
<label>记忆类型</label>
|
|
337
|
+
<select
|
|
338
|
+
:value="localNode.memoryType"
|
|
339
|
+
class="form-select"
|
|
340
|
+
@change="handleMemoryTypeChange"
|
|
341
|
+
>
|
|
342
|
+
<option v-for="mem in memoryTypes" :key="mem.value" :value="mem.value">
|
|
343
|
+
{{ mem.label }}
|
|
344
|
+
</option>
|
|
345
|
+
</select>
|
|
346
|
+
</div>
|
|
347
|
+
</template>
|
|
348
|
+
|
|
349
|
+
<!-- 通用样式配置 -->
|
|
350
|
+
<template v-if="!isAiWorkflowNode">
|
|
351
|
+
<div class="form-group">
|
|
352
|
+
<label>尺寸</label>
|
|
353
|
+
<div class="size-inputs">
|
|
354
|
+
<input
|
|
355
|
+
v-model.number="localNode.width"
|
|
356
|
+
type="number"
|
|
357
|
+
min="50"
|
|
358
|
+
max="800"
|
|
359
|
+
@blur="updateSize"
|
|
360
|
+
/>
|
|
361
|
+
<span>×</span>
|
|
362
|
+
<input
|
|
363
|
+
v-model.number="localNode.height"
|
|
364
|
+
type="number"
|
|
365
|
+
min="30"
|
|
366
|
+
max="600"
|
|
367
|
+
@blur="updateSize"
|
|
368
|
+
/>
|
|
369
|
+
</div>
|
|
370
|
+
</div>
|
|
371
|
+
|
|
372
|
+
<div class="form-group">
|
|
373
|
+
<label>背景色</label>
|
|
374
|
+
<div class="color-picker">
|
|
375
|
+
<button
|
|
376
|
+
v-for="color in colors"
|
|
377
|
+
:key="color"
|
|
378
|
+
class="color-swatch"
|
|
379
|
+
:class="{
|
|
380
|
+
active: node.style?.backgroundColor === color
|
|
381
|
+
}"
|
|
382
|
+
:style="{
|
|
383
|
+
backgroundColor: color
|
|
384
|
+
}"
|
|
385
|
+
@click="updateStyle('backgroundColor', color)"
|
|
386
|
+
/>
|
|
387
|
+
</div>
|
|
388
|
+
</div>
|
|
389
|
+
|
|
390
|
+
<div class="form-group">
|
|
391
|
+
<label>边框颜色</label>
|
|
392
|
+
<div class="color-picker">
|
|
393
|
+
<button
|
|
394
|
+
v-for="color in borderColors"
|
|
395
|
+
:key="color"
|
|
396
|
+
class="color-swatch"
|
|
397
|
+
:style="{
|
|
398
|
+
backgroundColor: color
|
|
399
|
+
}"
|
|
400
|
+
@click="updateStyle('border', `1px solid ${color}`)"
|
|
401
|
+
/>
|
|
402
|
+
</div>
|
|
403
|
+
</div>
|
|
404
|
+
</template>
|
|
405
|
+
</div>
|
|
406
|
+
</div>
|
|
407
|
+
</Transition>
|
|
408
|
+
</Teleport>
|
|
409
|
+
</template>
|
|
410
|
+
|
|
411
|
+
<style scoped>
|
|
412
|
+
.ai-node-edit-panel{background:#fff;border-radius:12px;box-shadow:0 8px 30px rgba(0,0,0,.12);position:fixed;right:20px;top:100px;width:320px;z-index:1000}.panel-header{align-items:center;background:linear-gradient(135deg,#667eea,#764ba2);border-bottom:1px solid #eee;border-radius:12px 12px 0 0;color:#fff;display:flex;justify-content:space-between;padding:14px 18px}.panel-title{font-size:14px;font-weight:600}.close-btn{background:hsla(0,0%,100%,.2);border:none;border-radius:4px;color:#fff;cursor:pointer;font-size:18px;line-height:1;padding:4px 8px}.close-btn:hover{background:hsla(0,0%,100%,.3)}.panel-content{max-height:70vh;overflow-y:auto;padding:18px}.form-group{margin-bottom:18px}.form-group label{color:#374151;display:block;font-size:12px;font-weight:500;margin-bottom:6px}.form-group input[type=number],.form-group input[type=text],.form-group textarea,.form-select{border:1px solid #d1d5db;border-radius:6px;box-sizing:border-box;font-size:13px;padding:10px 12px;transition:border-color .2s,box-shadow .2s;width:100%}.form-group input:focus,.form-group textarea:focus,.form-select:focus{border-color:#8b5cf6;box-shadow:0 0 0 3px rgba(139,92,246,.1);outline:none}.form-group textarea{font-family:Monaco,Consolas,monospace;resize:vertical}.form-hint{color:#9ca3af;font-size:11px;margin-top:4px}.form-group input[type=range]{width:100%}.range-labels{color:#9ca3af;display:flex;font-size:11px;justify-content:space-between;margin-top:4px}.status-badges{display:flex;flex-wrap:wrap;gap:8px}.status-badge{border-radius:12px;cursor:pointer;font-size:12px;opacity:.5;padding:4px 10px;transition:all .2s}.status-badge.active{opacity:1}.status-badge.status-pending{background:#f3f4f6;color:#6b7280}.status-badge.status-running{background:#fef3c7;color:#d97706}.status-badge.status-success{background:#d1fae5;color:#059669}.status-badge.status-error{background:#fee2e2;color:#dc2626}.stream-preview{background:#1f2937;border-radius:6px;color:#10b981;font-family:monospace;font-size:12px;min-height:60px;padding:12px}.streaming-cursor{animation:blink 1s infinite}@keyframes blink{0%,50%{opacity:1}51%,to{opacity:0}}.tools-checkboxes{display:flex;flex-direction:column;gap:8px}.tool-checkbox{align-items:center;cursor:pointer;display:flex;font-size:13px;gap:8px}.tool-checkbox input{width:auto}.size-inputs{align-items:center;display:flex;gap:8px}.size-inputs input{flex:1}.size-inputs span{color:#9ca3af}.color-picker{display:flex;flex-wrap:wrap;gap:6px}.color-swatch{border:2px solid transparent;border-radius:6px;cursor:pointer;height:28px;padding:0;transition:transform .2s;width:28px}.color-swatch:hover{transform:scale(1.1)}.color-swatch.active{border-color:#8b5cf6}.slide-fade-enter-active,.slide-fade-leave-active{transition:all .3s ease}.slide-fade-enter-from,.slide-fade-leave-to{opacity:0;transform:translateX(20px)}
|
|
413
|
+
</style>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Node, NodeData } from '../types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
node: Node | null;
|
|
4
|
+
visible: boolean;
|
|
5
|
+
};
|
|
6
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
7
|
+
close: () => any;
|
|
8
|
+
update: (node: Partial<Node<NodeData>>) => any;
|
|
9
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
10
|
+
onClose?: (() => any) | undefined;
|
|
11
|
+
onUpdate?: ((node: Partial<Node<NodeData>>) => any) | undefined;
|
|
12
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
13
|
+
export default _default;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Edge, EdgeTypes } from '../types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
edge: Edge | null;
|
|
4
|
+
visible: boolean;
|
|
5
|
+
edgeTypes?: EdgeTypes;
|
|
6
|
+
};
|
|
7
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
8
|
+
close: () => any;
|
|
9
|
+
update: (edge: Partial<Edge<import("../types").EdgeData>>) => any;
|
|
10
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
11
|
+
onClose?: (() => any) | undefined;
|
|
12
|
+
onUpdate?: ((edge: Partial<Edge<import("../types").EdgeData>>) => any) | undefined;
|
|
13
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
14
|
+
export default _default;
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { ref, watch, computed } from "vue";
|
|
3
|
+
import { getAllCustomEdges, getAllEdgeTemplates } from "../utils/custom-types";
|
|
4
|
+
const props = defineProps({
|
|
5
|
+
edge: { type: [Object, null], required: true },
|
|
6
|
+
visible: { type: Boolean, required: true },
|
|
7
|
+
edgeTypes: { type: Object, required: false }
|
|
8
|
+
});
|
|
9
|
+
const emit = defineEmits(["update", "close"]);
|
|
10
|
+
const localEdge = ref({});
|
|
11
|
+
watch(
|
|
12
|
+
() => props.edge,
|
|
13
|
+
(edge) => {
|
|
14
|
+
if (edge) {
|
|
15
|
+
localEdge.value = {
|
|
16
|
+
label: edge.label || "",
|
|
17
|
+
type: edge.type || "bezier",
|
|
18
|
+
animated: edge.animated || false,
|
|
19
|
+
style: { ...edge.style },
|
|
20
|
+
labelStyle: { ...edge.labelStyle },
|
|
21
|
+
labelColor: edge.labelColor || "#000000",
|
|
22
|
+
labelShowBg: !!edge.labelShowBg,
|
|
23
|
+
labelBgColor: edge.labelBgColor || "#ffffff"
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
{ immediate: true }
|
|
28
|
+
);
|
|
29
|
+
const updateLabel = () => {
|
|
30
|
+
emit("update", { label: localEdge.value.label });
|
|
31
|
+
};
|
|
32
|
+
const updateType = () => {
|
|
33
|
+
emit("update", { type: localEdge.value.type });
|
|
34
|
+
};
|
|
35
|
+
const updateAnimated = () => {
|
|
36
|
+
emit("update", { animated: localEdge.value.animated });
|
|
37
|
+
};
|
|
38
|
+
const updateStyle = (key, value) => {
|
|
39
|
+
const newStyle = { ...props.edge?.style, [key]: value };
|
|
40
|
+
emit("update", { style: newStyle });
|
|
41
|
+
};
|
|
42
|
+
const updateLabelColor = (color) => {
|
|
43
|
+
localEdge.value.labelColor = color;
|
|
44
|
+
emit("update", { labelColor: color });
|
|
45
|
+
};
|
|
46
|
+
const updateLabelBg = (color) => {
|
|
47
|
+
if (color === null) {
|
|
48
|
+
localEdge.value.labelShowBg = false;
|
|
49
|
+
emit("update", { labelShowBg: false });
|
|
50
|
+
} else {
|
|
51
|
+
localEdge.value.labelShowBg = true;
|
|
52
|
+
localEdge.value.labelBgColor = color;
|
|
53
|
+
emit("update", { labelShowBg: true, labelBgColor: color });
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const handleClose = () => {
|
|
57
|
+
emit("close");
|
|
58
|
+
};
|
|
59
|
+
const handleStrokeWidth = (event) => {
|
|
60
|
+
const value = parseFloat(event.target.value);
|
|
61
|
+
updateStyle("strokeWidth", value);
|
|
62
|
+
};
|
|
63
|
+
const allEdgeTypes = computed(() => {
|
|
64
|
+
const typeMap = /* @__PURE__ */ new Map();
|
|
65
|
+
const presets = [
|
|
66
|
+
{ value: "bezier", label: "\u8D1D\u585E\u5C14\u66F2\u7EBF" },
|
|
67
|
+
{ value: "smoothstep", label: "\u5E73\u6ED1\u9636\u68AF" },
|
|
68
|
+
{ value: "step", label: "\u9636\u68AF" },
|
|
69
|
+
{ value: "straight", label: "\u76F4\u7EBF" }
|
|
70
|
+
];
|
|
71
|
+
presets.forEach((p) => typeMap.set(p.value, p));
|
|
72
|
+
getAllCustomEdges().forEach((e) => {
|
|
73
|
+
if (!typeMap.has(e.type)) {
|
|
74
|
+
typeMap.set(e.type, { value: e.type, label: e.label || `\u81EA\u5B9A\u4E49: ${e.type}` });
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
getAllEdgeTemplates().forEach((t) => {
|
|
78
|
+
if (!typeMap.has(t.type)) {
|
|
79
|
+
typeMap.set(t.type, { value: t.type, label: t.label || `\u6A21\u677F: ${t.type}` });
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
if (props.edgeTypes) {
|
|
83
|
+
Object.keys(props.edgeTypes).forEach((type) => {
|
|
84
|
+
if (!typeMap.has(type)) {
|
|
85
|
+
typeMap.set(type, { value: type, label: `\u5C40\u90E8\u7EC4\u4EF6: ${type}` });
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
if (props.edge?.type && !typeMap.has(props.edge.type)) {
|
|
90
|
+
typeMap.set(props.edge.type, { value: props.edge.type, label: `\u672A\u77E5\u7C7B\u578B: ${props.edge.type}` });
|
|
91
|
+
}
|
|
92
|
+
return Array.from(typeMap.values());
|
|
93
|
+
});
|
|
94
|
+
</script>
|
|
95
|
+
|
|
96
|
+
<template>
|
|
97
|
+
<Teleport to="body">
|
|
98
|
+
<Transition name="slide-fade">
|
|
99
|
+
<div v-if="visible && edge" class="edge-edit-panel">
|
|
100
|
+
<div class="panel-header">
|
|
101
|
+
<span class="panel-title">编辑连线</span>
|
|
102
|
+
<button class="close-btn" @click="handleClose">×</button>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<div class="panel-content">
|
|
106
|
+
<div class="form-group">
|
|
107
|
+
<label>标签</label>
|
|
108
|
+
<input
|
|
109
|
+
v-model="localEdge.label"
|
|
110
|
+
type="text"
|
|
111
|
+
placeholder="连线标签"
|
|
112
|
+
@blur="updateLabel"
|
|
113
|
+
@keyup.enter="updateLabel"
|
|
114
|
+
/>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
<div class="form-group">
|
|
118
|
+
<label>连线类型</label>
|
|
119
|
+
<select v-model="localEdge.type" @change="updateType">
|
|
120
|
+
<option v-for="t in allEdgeTypes" :key="t.value" :value="t.value">
|
|
121
|
+
{{ t.label }}
|
|
122
|
+
</option>
|
|
123
|
+
</select>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
<div class="form-group">
|
|
127
|
+
<label class="checkbox-label">
|
|
128
|
+
<input v-model="localEdge.animated" type="checkbox" @change="updateAnimated" />
|
|
129
|
+
动画连线
|
|
130
|
+
</label>
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
<div class="form-group">
|
|
134
|
+
<label>线条颜色</label>
|
|
135
|
+
<div class="color-picker-row">
|
|
136
|
+
<input
|
|
137
|
+
type="color"
|
|
138
|
+
:value="edge.style?.stroke || '#b1b1b7'"
|
|
139
|
+
class="modern-color-picker"
|
|
140
|
+
@input="e => updateStyle('stroke', e.target.value)"
|
|
141
|
+
/>
|
|
142
|
+
<span class="color-value">{{ edge.style?.stroke || "#b1b1b7" }}</span>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
|
|
146
|
+
<div class="form-group">
|
|
147
|
+
<label>线条宽度</label>
|
|
148
|
+
<input
|
|
149
|
+
:value="edge.style?.strokeWidth || 1.5"
|
|
150
|
+
type="range"
|
|
151
|
+
min="1"
|
|
152
|
+
max="6"
|
|
153
|
+
step="0.5"
|
|
154
|
+
@input="handleStrokeWidth"
|
|
155
|
+
/>
|
|
156
|
+
</div>
|
|
157
|
+
|
|
158
|
+
<div class="form-group">
|
|
159
|
+
<label>标签文字颜色</label>
|
|
160
|
+
<div class="color-picker-row">
|
|
161
|
+
<input
|
|
162
|
+
type="color"
|
|
163
|
+
:value="localEdge.labelColor"
|
|
164
|
+
class="modern-color-picker"
|
|
165
|
+
@input="e => updateLabelColor(e.target.value)"
|
|
166
|
+
/>
|
|
167
|
+
<span class="color-value">{{ localEdge.labelColor }}</span>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
|
|
171
|
+
<div class="form-group">
|
|
172
|
+
<label>标签背景颜色</label>
|
|
173
|
+
<div class="color-picker-row">
|
|
174
|
+
<button
|
|
175
|
+
class="color-swatch none-swatch"
|
|
176
|
+
:class="{
|
|
177
|
+
active: !localEdge.labelShowBg
|
|
178
|
+
}"
|
|
179
|
+
@click="updateLabelBg(null)"
|
|
180
|
+
>
|
|
181
|
+
×
|
|
182
|
+
</button>
|
|
183
|
+
<template v-if="localEdge.labelShowBg">
|
|
184
|
+
<input
|
|
185
|
+
type="color"
|
|
186
|
+
v-model="localEdge.labelBgColor"
|
|
187
|
+
class="modern-color-picker"
|
|
188
|
+
@input="updateLabelBg(localEdge.labelBgColor || '#ffffff')"
|
|
189
|
+
/>
|
|
190
|
+
<span class="color-value">{{ localEdge.labelBgColor }}</span>
|
|
191
|
+
</template>
|
|
192
|
+
<button v-else class="add-bg-btn" @click="updateLabelBg('#ffffff')">
|
|
193
|
+
启用背景
|
|
194
|
+
</button>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
</div>
|
|
198
|
+
</div>
|
|
199
|
+
</Transition>
|
|
200
|
+
</Teleport>
|
|
201
|
+
</template>
|
|
202
|
+
|
|
203
|
+
<style scoped>
|
|
204
|
+
.edge-edit-panel{background:#fff;border-radius:8px;box-shadow:0 4px 20px rgba(0,0,0,.15);position:fixed;right:20px;top:100px;width:280px;z-index:1000}.panel-header{align-items:center;border-bottom:1px solid #eee;display:flex;justify-content:space-between;padding:12px 16px}.panel-title{color:#333;font-size:14px;font-weight:600}.close-btn{background:none;border:none;color:#999;cursor:pointer;font-size:20px;line-height:1;padding:0}.close-btn:hover{color:#333}.panel-content{max-height:70vh;overflow-y:auto;padding:16px}.form-group{margin-bottom:16px}.form-group label{color:#666;display:block;font-size:12px;margin-bottom:6px}.form-group input[type=text],.form-group select{border:1px solid #ddd;border-radius:4px;box-sizing:border-box;font-size:13px;padding:8px 10px;width:100%}.form-group input:focus,.form-group select:focus{border-color:#3b82f6;outline:none}.checkbox-label{align-items:center;cursor:pointer;display:flex!important;gap:8px}.checkbox-label input[type=checkbox]{width:auto}.color-picker-row{align-items:center;display:flex;gap:12px}.modern-color-picker{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:none;cursor:pointer;height:36px;padding:0;width:36px}.modern-color-picker::-webkit-color-swatch{border:1px solid #e2e8f0;border-radius:6px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}.modern-color-picker::-moz-color-swatch{border:1px solid #e2e8f0;border-radius:6px}.color-value{color:#64748b;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px;text-transform:uppercase}.add-bg-btn{background:#fff;border:1px solid #3b82f6;border-radius:4px;color:#3b82f6;cursor:pointer;font-size:12px;padding:6px 12px;transition:all .2s}.add-bg-btn:hover{background:#eff6ff;border-color:#2563eb;color:#2563eb}.color-swatch{border:2px solid transparent;border-radius:4px;cursor:pointer;height:32px;padding:0;width:32px}.color-swatch.active{border-color:#3b82f6!important;box-shadow:0 0 0 2px rgba(59,130,246,.3)}.none-swatch{align-items:center;background:#f8f9fa;border:1px dashed #ccc!important;color:#999;display:flex;font-size:16px;font-weight:700;justify-content:center}.form-group input[type=range]{width:100%}.form-group input[type=color]{border:1px solid #ddd;border-radius:4px;cursor:pointer;height:32px;padding:2px;width:100%}.slide-fade-enter-active,.slide-fade-leave-active{transition:all .3s ease}.slide-fade-enter-from,.slide-fade-leave-to{opacity:0;transform:translateX(20px)}
|
|
205
|
+
</style>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Edge, EdgeTypes } from '../types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
edge: Edge | null;
|
|
4
|
+
visible: boolean;
|
|
5
|
+
edgeTypes?: EdgeTypes;
|
|
6
|
+
};
|
|
7
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
8
|
+
close: () => any;
|
|
9
|
+
update: (edge: Partial<Edge<import("../types").EdgeData>>) => any;
|
|
10
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
11
|
+
onClose?: (() => any) | undefined;
|
|
12
|
+
onUpdate?: ((edge: Partial<Edge<import("../types").EdgeData>>) => any) | undefined;
|
|
13
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
14
|
+
export default _default;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Node, NodeData } from '../types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
node: Node | null;
|
|
4
|
+
visible: boolean;
|
|
5
|
+
};
|
|
6
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
7
|
+
close: () => any;
|
|
8
|
+
update: (node: Partial<Node<NodeData>>) => any;
|
|
9
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
10
|
+
onClose?: (() => any) | undefined;
|
|
11
|
+
onUpdate?: ((node: Partial<Node<NodeData>>) => any) | undefined;
|
|
12
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
13
|
+
export default _default;
|