feat: support reordering workflow modules
This commit is contained in:
parent
83c31b600c
commit
cc53eee037
@ -1860,6 +1860,29 @@ export function AgentWorkflowSettingsClient({
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleMoveTopLevelStep = (stepKey: string, direction: "up" | "down") => {
|
||||||
|
setConfig((prev) => {
|
||||||
|
const sortedRootSteps = [...prev.steps].sort((left, right) => left.sortOrder - right.sortOrder);
|
||||||
|
const currentIndex = sortedRootSteps.findIndex((step) => step.key === stepKey);
|
||||||
|
if (currentIndex < 0) {
|
||||||
|
return prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
const targetIndex = direction === "up" ? currentIndex - 1 : currentIndex + 1;
|
||||||
|
if (targetIndex < 0 || targetIndex >= sortedRootSteps.length) {
|
||||||
|
return prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
return normalizeConfigOrdering({
|
||||||
|
...prev,
|
||||||
|
steps: moveArrayItem(sortedRootSteps, currentIndex, targetIndex).map((step, index) => ({
|
||||||
|
...step,
|
||||||
|
sortOrder: index,
|
||||||
|
})),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const handleUploadPreview = async (stepKey: string, optionKey: string, file: File) => {
|
const handleUploadPreview = async (stepKey: string, optionKey: string, file: File) => {
|
||||||
if (!file.type.startsWith("image/")) {
|
if (!file.type.startsWith("image/")) {
|
||||||
toast.error("请上传图片文件");
|
toast.error("请上传图片文件");
|
||||||
@ -2665,12 +2688,16 @@ export function AgentWorkflowSettingsClient({
|
|||||||
const renderWorkflowStepCard = (
|
const renderWorkflowStepCard = (
|
||||||
step: AgentWorkflowStepUiConfig,
|
step: AgentWorkflowStepUiConfig,
|
||||||
depth: number,
|
depth: number,
|
||||||
indexPath: number[]
|
indexPath: number[],
|
||||||
|
siblingCount = 0
|
||||||
) => {
|
) => {
|
||||||
const stepLabel = indexPath.join(".");
|
const stepLabel = indexPath.join(".");
|
||||||
const levelLabel = getWorkflowLevelLabel(depth, "模块");
|
const levelLabel = getWorkflowLevelLabel(depth, "模块");
|
||||||
const rootOptions = [...(step.options || [])].sort((left, right) => left.sortOrder - right.sortOrder);
|
const rootOptions = [...(step.options || [])].sort((left, right) => left.sortOrder - right.sortOrder);
|
||||||
const optionCardCount = countAgentWorkflowOptionTree(step.options || []);
|
const optionCardCount = countAgentWorkflowOptionTree(step.options || []);
|
||||||
|
const isTopLevelStep = depth === 1;
|
||||||
|
const canMoveTopLevelStepUp = isTopLevelStep && indexPath[0] > 1;
|
||||||
|
const canMoveTopLevelStepDown = isTopLevelStep && indexPath[0] < siblingCount;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<motion.div
|
<motion.div
|
||||||
@ -2729,6 +2756,30 @@ export function AgentWorkflowSettingsClient({
|
|||||||
<div className="flex flex-wrap items-center gap-2">
|
<div className="flex flex-wrap items-center gap-2">
|
||||||
<Badge variant="secondary">{optionCardCount} 张卡片</Badge>
|
<Badge variant="secondary">{optionCardCount} 张卡片</Badge>
|
||||||
<Badge variant="outline">卡片树结构</Badge>
|
<Badge variant="outline">卡片树结构</Badge>
|
||||||
|
{isTopLevelStep ? (
|
||||||
|
<>
|
||||||
|
<Button
|
||||||
|
type="button"
|
||||||
|
variant="outline"
|
||||||
|
size="icon"
|
||||||
|
className="h-8 w-8"
|
||||||
|
onClick={() => handleMoveTopLevelStep(step.key, "up")}
|
||||||
|
disabled={!canMoveTopLevelStepUp}
|
||||||
|
>
|
||||||
|
<ArrowUp className="h-4 w-4" />
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
type="button"
|
||||||
|
variant="outline"
|
||||||
|
size="icon"
|
||||||
|
className="h-8 w-8"
|
||||||
|
onClick={() => handleMoveTopLevelStep(step.key, "down")}
|
||||||
|
disabled={!canMoveTopLevelStepDown}
|
||||||
|
>
|
||||||
|
<ArrowDown className="h-4 w-4" />
|
||||||
|
</Button>
|
||||||
|
</>
|
||||||
|
) : null}
|
||||||
<Switch
|
<Switch
|
||||||
checked={step.enabled}
|
checked={step.enabled}
|
||||||
onCheckedChange={(checked) =>
|
onCheckedChange={(checked) =>
|
||||||
@ -4355,7 +4406,7 @@ export function AgentWorkflowSettingsClient({
|
|||||||
|
|
||||||
{sortedSteps.length > 0 ? (
|
{sortedSteps.length > 0 ? (
|
||||||
sortedSteps.map((step, stepIndex) =>
|
sortedSteps.map((step, stepIndex) =>
|
||||||
renderWorkflowStepCard(step, 1, [stepIndex + 1])
|
renderWorkflowStepCard(step, 1, [stepIndex + 1], sortedSteps.length)
|
||||||
)
|
)
|
||||||
) : (
|
) : (
|
||||||
<motion.div variants={itemVariants}>
|
<motion.div variants={itemVariants}>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user