()
| 290 | document.addEventListener('paste', paste_node) |
| 291 | |
| 292 | const delete_node = () => { |
| 293 | const elements = graph.getSelectElements(true) |
| 294 | lf.clearSelectElements() |
| 295 | if (elements.nodes.length == 0 && elements.edges.length == 0) { |
| 296 | return |
| 297 | } |
| 298 | if (elements.edges.length > 0 && elements.nodes.length == 0) { |
| 299 | elements.edges |
| 300 | .filter((edge) => !['loop-edge'].includes(edge.type || '')) |
| 301 | .forEach((edge: any) => lf.deleteEdge(edge.id)) |
| 302 | return |
| 303 | } |
| 304 | const nodes = elements.nodes.filter((node) => |
| 305 | [ |
| 306 | 'start-node', |
| 307 | 'tool-start-node', |
| 308 | 'tool-base-node', |
| 309 | 'base-node', |
| 310 | 'loop-body-node', |
| 311 | 'loop-start-node', |
| 312 | 'knowledge-base-node', |
| 313 | ].includes(node.type), |
| 314 | ) |
| 315 | if (nodes.length > 0) { |
| 316 | MsgError(`${nodes[0].properties?.stepName}${t('workflow.delete.deleteMessage')}`) |
| 317 | return |
| 318 | } |
| 319 | MsgConfirm(t('common.tip'), t('workflow.delete.confirmTitle'), { |
| 320 | confirmButtonText: t('common.confirm'), |
| 321 | confirmButtonClass: 'danger', |
| 322 | }).then(() => { |
| 323 | if (!keyboardOptions?.enabled) return true |
| 324 | if (graph.textEditElement) return true |
| 325 | |
| 326 | elements.edges.forEach((edge: any) => lf.deleteEdge(edge.id)) |
| 327 | elements.nodes.forEach((node: any) => { |
| 328 | if (node.type === 'loop-node') { |
| 329 | const next = lf.getNodeOutgoingNode(node.id) |
| 330 | next.forEach((n: any) => { |
| 331 | if (n.type === 'loop-body-node') { |
| 332 | lf.deleteNode(n.id) |
| 333 | } |
| 334 | }) |
| 335 | } |
| 336 | lf.deleteNode(node.id) |
| 337 | }) |
| 338 | }) |
| 339 | |
| 340 | return false |
| 341 | } |
| 342 | graph.eventCenter.on('copy_node', copy_node) |
| 343 | // 复制 |
| 344 | keyboard.on(['cmd + c', 'ctrl + c'], copy_node) |
nothing calls this directly
no test coverage detected