Skip to content

Commit 2c2626a

Browse files
committed
Merge branch '3.5.x'
2 parents 3156697 + 02fef53 commit 2c2626a

File tree

3 files changed

+90
-25
lines changed

3 files changed

+90
-25
lines changed

framework/elsa/fit-elsa-react/src/components/flowRunComponent/SectionFactory.jsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
* Licensed under the MIT License. See License.txt in the project root for license information.
55
*--------------------------------------------------------------------------------------------*/
66

7-
import SectionHeader from "@/components/flowRunComponent/SectionHeader.jsx";
8-
import SectionContent from "@/components/flowRunComponent/SectionContent.jsx";
9-
import {v4 as uuidv4} from "uuid";
10-
import {Card} from "antd";
7+
import SectionHeader from '@/components/flowRunComponent/SectionHeader.jsx';
8+
import SectionContent from '@/components/flowRunComponent/SectionContent.jsx';
9+
import {v4 as uuidv4} from 'uuid';
10+
import {Card} from 'antd';
1111
import {DATA_TYPES, SECTION_TYPE, UNARY_OPERATOR, VIRTUAL_CONTEXT_NODE} from '@/common/Consts.js';
12-
import {useTranslation} from "react-i18next";
12+
import {useTranslation} from 'react-i18next';
1313

1414
/**
1515
* 构造运行报告的章节
@@ -87,7 +87,7 @@ export default function SectionFactory({shape}) {
8787
const rightValue = _convertRightValue(condition);
8888
const separatorIndex = key.indexOf(".");
8989
const referenceNodeId = key.substring(0, separatorIndex);
90-
const text = referenceNodeId === VIRTUAL_CONTEXT_NODE.id ? t('systemEnv') : shape.page.getShapeById(referenceNodeId).text;
90+
const text = referenceNodeId === VIRTUAL_CONTEXT_NODE.id ? t('systemEnv') : shape.page.getShapeById(referenceNodeId)?.text ?? '';
9191
const newKey = text + key.substring(separatorIndex);
9292
let isShowLogic = section.data.conditions.length > 1 && index < section.data.conditions.length - 1;
9393
return (<div key={`condition-container-${section.no}-${uuidv4()}`}

framework/elsa/fit-elsa-react/src/components/llm/LlmFormWrapper.jsx

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -103,16 +103,42 @@ export default function LlmFormWrapper({data, shapeStatus}) {
103103
return;
104104
}
105105
const urlSuffix = uniqueNameList.map(uniqueName => `uniqueNames=${uniqueName}`).join('&');
106-
httpUtil.get(`${config.urls.toolListEndpoint}?${urlSuffix}`, new Map(), (jsonData) =>
107-
setToolOptions(jsonData.data.map(item => {
108-
return {
109-
id: uuidv4(),
110-
name: item.name,
111-
tags: item.tags,
112-
version: item.version,
113-
value: item.uniqueName,
114-
};
115-
})));
106+
httpUtil.get(`${config.urls.toolListEndpoint}?${urlSuffix}`, new Map(), (jsonData) => {
107+
processToolData(jsonData.data);
108+
},
109+
() => {
110+
processToolData([]);
111+
},
112+
);
113+
114+
const processToolData = (responseData) => {
115+
const responseMap = new Map(responseData.map(item => [item.uniqueName, item]));
116+
117+
const toolOptions = uniqueNameList.map(uniqueName => {
118+
if (responseMap.has(uniqueName)) {
119+
const item = responseMap.get(uniqueName);
120+
return {
121+
id: uuidv4(),
122+
name: item.name,
123+
tags: item.tags,
124+
version: item.version,
125+
value: item.uniqueName,
126+
};
127+
} else {
128+
// 若请求返回体中没有该 uniqueName 或请求失败,则从 toolItem 中获取信息
129+
const fallbackItem = tool.value.find(toolItem => toolItem.value === uniqueName);
130+
return fallbackItem ? {
131+
id: fallbackItem.id,
132+
name: fallbackItem.name || 'Unknown',
133+
tags: fallbackItem.tags || [],
134+
version: fallbackItem.version || 'Unknown',
135+
value: fallbackItem.value,
136+
} : null;
137+
}
138+
}).filter(Boolean); // 过滤掉 null 值
139+
140+
setToolOptions(toolOptions);
141+
};
116142
};
117143

118144
useEffect(() => {

framework/elsa/fit-elsa-react/src/flow/jadeFlowPage.js

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -399,28 +399,67 @@ export const jadeFlowPage = (div, graph, name, id) => {
399399
self.removeEventListener('shape_rendered', listener);
400400
};
401401

402+
/**
403+
* 按照指定的有序节点列表对节点数组进行重排。
404+
*
405+
* 该函数会根据 `orderedNodes` 的顺序对 `nodes` 中的节点进行排序。
406+
* 如果 `nodes` 中的某些节点不在 `orderedNodes` 中,这些节点会被附加到排序后的数组末尾。
407+
*
408+
* @param {Array} nodes - 需要重排的节点数组,可能包含游离节点。
409+
* @param {Array} orderedNodes - 有序节点列表,表示期望的节点顺序。
410+
* @returns {Array} - 返回按照 `orderedNodes` 顺序重排后的节点数组,游离节点会附加到末尾。
411+
*
412+
* @example
413+
* const nodes = ['F', 'E', 'D', 'C', 'B', 'A'];
414+
* const orderedNodes = ['B', 'D', 'A', 'C'];
415+
* const sortedNodes = reorderNodes(nodes, orderedNodes);
416+
* console.log(sortedNodes); // 输出: ['B', 'D', 'A', 'C', 'F', 'E']
417+
*
418+
* @example
419+
* const nodes = ['X', 'Y', 'Z', 'A', 'B'];
420+
* const orderedNodes = ['A', 'B', 'C'];
421+
* const sortedNodes = reorderNodes(nodes, orderedNodes);
422+
* console.log(sortedNodes); // 输出: ['A', 'B', 'X', 'Y', 'Z']
423+
*/
424+
const reorderNodes = (nodes, orderedNodes) => {
425+
// 创建一个 Map,用于快速查找节点在 reachableNodes 中的索引
426+
const nodeOrder = new Map();
427+
orderedNodes.forEach((node, index) => {
428+
nodeOrder.set(node, index);
429+
});
430+
431+
// 将 nodes 中的节点按照 orderedNodes 的顺序进行排序
432+
// 不在 orderedNodes 中的节点会被放在最后
433+
return nodes.slice().sort((a, b) => {
434+
const indexA = nodeOrder.has(a) ? nodeOrder.get(a) : orderedNodes.length;
435+
const indexB = nodeOrder.has(b) ? nodeOrder.get(b) : orderedNodes.length;
436+
return indexA - indexB;
437+
});
438+
};
439+
402440
/**
403441
* 启动调试.
404442
*
405443
* @return {*} 调试的节点列表.
406444
*/
407445
self.testRun = () => {
408-
self.getNodes().forEach(node => {
446+
const allNodes = self.getNodes();
447+
allNodes.forEach(node => {
409448
node.isActiveInFlow = false;
410449
});
411450
const startNode = self.getStartNode();
412-
self.getReachableNodes(startNode).forEach(node => {
451+
const reachableNodes = self.getReachableNodes(startNode);
452+
reachableNodes.forEach(node => {
413453
node.isActiveInFlow = true;
414454
});
415455
self.isRunning = true;
416-
const nodes = self.sm.getShapes().filter(s => s.isTypeof('jadeNode')).filter(s => s.runnable !== false);
417-
nodes.map(n => {
418-
const h = self.createRunner(n);
419-
n.ignoreChange(() => {
420-
h.testRun();
421-
});
456+
const nodes = allNodes.filter(s => s.runnable !== false);
457+
const orderedNodes = reorderNodes(nodes, reachableNodes);
458+
orderedNodes.map(n => {
459+
const runner = self.createRunner(n);
460+
n.ignoreChange(() => runner.testRun());
422461
});
423-
return nodes;
462+
return orderedNodes;
424463
};
425464

426465
/**

0 commit comments

Comments
 (0)