fix: Wordflow implements multi-select nodes (#4183)

Co-authored-by: wangdan-fit2cloud <dan.wang@fit2cloud.com>
v3.2
shaohuzhang1 2025-10-14 14:54:43 +08:00 committed by GitHub
parent 70cfd7eb59
commit d39e8aa36a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 15 additions and 11 deletions

View File

@ -19,7 +19,7 @@
<template v-for="(item, index) in paragraphList" :key="index"> <template v-for="(item, index) in paragraphList" :key="index">
<CardBox <CardBox
:title="item.title || '-'" :title="item.title || '-'"
class="cursor mb-8" class="cursor mb-8 w-full"
:showIcon="false" :showIcon="false"
@click.stop="permissionPrecise.doc_edit(id as string) && editParagraph(item)" @click.stop="permissionPrecise.doc_edit(id as string) && editParagraph(item)"
style="height: 210px" style="height: 210px"

View File

@ -265,8 +265,10 @@ const editName = async (formEl: FormInstance | undefined) => {
}) })
} }
const mousedown = () => { const mousedown = (event?: any) => {
props.nodeModel.graphModel.clearSelectElements() if (!event?.shiftKey) {
props.nodeModel.graphModel.clearSelectElements()
}
set(props.nodeModel, 'isSelected', true) set(props.nodeModel, 'isSelected', true)
set(props.nodeModel, 'isHovered', true) set(props.nodeModel, 'isHovered', true)
props.nodeModel.graphModel.toFront(props.nodeModel.id) props.nodeModel.graphModel.toFront(props.nodeModel.id)

View File

@ -100,12 +100,12 @@ export function initDefaultShortcut(lf: LogicFlow, graph: GraphModel) {
const nodes = elements.nodes.filter((node) => const nodes = elements.nodes.filter((node) =>
['start-node', 'base-node', 'loop-body-node'].includes(node.type), ['start-node', 'base-node', 'loop-body-node'].includes(node.type),
) )
if (nodes.length > 0) { // if (nodes.length > 0) {
MsgError( // MsgError(
`${nodes[0].properties?.stepName}${t('views.applicationWorkflow.delete.deleteMessage')}`, // `${nodes[0].properties?.stepName}${t('views.applicationWorkflow.delete.deleteMessage')}`,
) // )
return // return
} // }
MsgConfirm(t('common.tip'), t('views.applicationWorkflow.delete.confirmTitle'), { MsgConfirm(t('common.tip'), t('views.applicationWorkflow.delete.confirmTitle'), {
confirmButtonText: t('common.confirm'), confirmButtonText: t('common.confirm'),
confirmButtonClass: 'danger', confirmButtonClass: 'danger',

View File

@ -10,6 +10,7 @@ import { ref, onMounted, onUnmounted } from 'vue'
import AppEdge from './common/edge' import AppEdge from './common/edge'
import loopEdge from './common/loopEdge' import loopEdge from './common/loopEdge'
import Control from './common/NodeControl.vue' import Control from './common/NodeControl.vue'
import { SelectionSelect } from '@logicflow/extension'
import '@logicflow/extension/lib/style/index.css' import '@logicflow/extension/lib/style/index.css'
import '@logicflow/core/dist/style/index.css' import '@logicflow/core/dist/style/index.css'
import { initDefaultShortcut } from '@/workflow/common/shortcut' import { initDefaultShortcut } from '@/workflow/common/shortcut'
@ -50,7 +51,7 @@ const renderGraphData = (data?: any) => {
const container: any = document.querySelector('#container') const container: any = document.querySelector('#container')
if (container) { if (container) {
lf.value = new LogicFlow({ lf.value = new LogicFlow({
plugins: [Dagre], plugins: [Dagre, SelectionSelect],
textEdit: false, textEdit: false,
adjustEdge: false, adjustEdge: false,
adjustEdgeStartAndEnd: false, adjustEdgeStartAndEnd: false,
@ -107,12 +108,13 @@ const renderGraphData = (data?: any) => {
// //
data.nodeModel.clear_next_node_field(false) data.nodeModel.clear_next_node_field(false)
}) })
lf.value.openSelectionSelect()
setTimeout(() => { setTimeout(() => {
lf.value?.fitView() lf.value?.fitView()
}, 500) }, 500)
} }
} }
const validate = () => { const validate = () => {
return Promise.all(lf.value.graphModel.nodes.map((element: any) => element?.validate?.())) return Promise.all(lf.value.graphModel.nodes.map((element: any) => element?.validate?.()))
} }