115 lines
2.8 KiB
TypeScript
115 lines
2.8 KiB
TypeScript
|
|
/**
|
||
|
|
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
||
|
|
* SPDX-License-Identifier: MIT
|
||
|
|
*/
|
||
|
|
|
||
|
|
import { nanoid } from 'nanoid';
|
||
|
|
import {
|
||
|
|
WorkflowNodeEntity,
|
||
|
|
PositionSchema,
|
||
|
|
FlowNodeTransformData,
|
||
|
|
} from '@flowgram.ai/free-layout-editor';
|
||
|
|
|
||
|
|
import { FlowNodeRegistry } from '../../typings';
|
||
|
|
import iconLoop from '../../assets/icon-loop.jpg';
|
||
|
|
import { formMeta } from './form-meta';
|
||
|
|
import { WorkflowNodeType } from '../constants';
|
||
|
|
|
||
|
|
let index = 0;
|
||
|
|
export const LoopNodeRegistry: FlowNodeRegistry = {
|
||
|
|
type: WorkflowNodeType.Loop,
|
||
|
|
info: {
|
||
|
|
icon: iconLoop,
|
||
|
|
description:
|
||
|
|
'Used to repeatedly execute a series of tasks by setting the number of iterations and logic.',
|
||
|
|
},
|
||
|
|
meta: {
|
||
|
|
/**
|
||
|
|
* Mark as subcanvas
|
||
|
|
* 子画布标记
|
||
|
|
*/
|
||
|
|
isContainer: true,
|
||
|
|
/**
|
||
|
|
* The subcanvas default size setting
|
||
|
|
* 子画布默认大小设置
|
||
|
|
*/
|
||
|
|
size: {
|
||
|
|
width: 424,
|
||
|
|
height: 244,
|
||
|
|
},
|
||
|
|
// autoResizeDisable: true,
|
||
|
|
/**
|
||
|
|
* The subcanvas padding setting
|
||
|
|
* 子画布 padding 设置
|
||
|
|
*/
|
||
|
|
padding: (transform) => {
|
||
|
|
if (!transform.isContainer) {
|
||
|
|
return {
|
||
|
|
top: 0,
|
||
|
|
bottom: 0,
|
||
|
|
left: 0,
|
||
|
|
right: 0,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
return {
|
||
|
|
top: 120,
|
||
|
|
bottom: 80,
|
||
|
|
left: 80,
|
||
|
|
right: 80,
|
||
|
|
};
|
||
|
|
},
|
||
|
|
/**
|
||
|
|
* Controls the node selection status within the subcanvas
|
||
|
|
* 控制子画布内的节点选中状态
|
||
|
|
*/
|
||
|
|
selectable(node: WorkflowNodeEntity, mousePos?: PositionSchema): boolean {
|
||
|
|
if (!mousePos) {
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
const transform = node.getData<FlowNodeTransformData>(FlowNodeTransformData);
|
||
|
|
// 鼠标开始时所在位置不包括当前节点时才可选中
|
||
|
|
return !transform.bounds.contains(mousePos.x, mousePos.y);
|
||
|
|
},
|
||
|
|
// expandable: false, // disable expanded
|
||
|
|
wrapperStyle: {
|
||
|
|
minWidth: 'unset',
|
||
|
|
width: '100%',
|
||
|
|
},
|
||
|
|
// defaultPorts: [{ type: 'output', location: 'right' }, { type: 'input', location: 'left'}, { type: 'output', location: 'bottom', portID: 'bottom' }, { type: 'input', location: 'top', portID: 'top'}]
|
||
|
|
},
|
||
|
|
onAdd() {
|
||
|
|
return {
|
||
|
|
id: `loop_${nanoid(5)}`,
|
||
|
|
type: WorkflowNodeType.Loop,
|
||
|
|
data: {
|
||
|
|
title: `Loop_${++index}`,
|
||
|
|
},
|
||
|
|
blocks: [
|
||
|
|
{
|
||
|
|
id: `block_start_${nanoid(5)}`,
|
||
|
|
type: WorkflowNodeType.BlockStart,
|
||
|
|
meta: {
|
||
|
|
position: {
|
||
|
|
x: 32,
|
||
|
|
y: 0,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
data: {},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: `block_end_${nanoid(5)}`,
|
||
|
|
type: WorkflowNodeType.BlockEnd,
|
||
|
|
meta: {
|
||
|
|
position: {
|
||
|
|
x: 192,
|
||
|
|
y: 0,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
data: {},
|
||
|
|
},
|
||
|
|
],
|
||
|
|
};
|
||
|
|
},
|
||
|
|
formMeta,
|
||
|
|
};
|