@@ -10,6 +10,7 @@ import NodeContainer from '@/workflow-canvas/core/node-container/index.vue'
1010import { createAnchorGuard , handleNodeWheel } from ' @/workflow-canvas/core/utils'
1111import { compareList } from ' @/workflow-canvas/config/constants'
1212import { randomId } from ' @/utils/common'
13+ import { useSortable } from ' @/utils/use-sortable'
1314
1415defineOptions ({ name: ' WorkflowConditionNode' })
1516const getModel = inject (' getModel' ) as () => BaseNodeModel
@@ -52,6 +53,26 @@ const formData = computed(() => model.properties.node_data as { branch: BranchIt
5253const conditionNodeFormRef = useTemplateRef <FormInstance >(' conditionNodeFormRef' )
5354const nodeCascaderRefs = useTemplateRef <InstanceType <typeof NodeCascader >[]>(' nodeCascaderRefs' )
5455
56+ // 仅排序条件分支,ELSE 保留在独立容器和数据末尾。
57+ const branchListRef = useTemplateRef <HTMLElement >(' branchListRef' )
58+ const elseBranch = computed (() => formData .value .branch .at (- 1 ))
59+ const sortableBranches = computed ({
60+ get : () => formData .value .branch .slice (0 , - 1 ),
61+ set : (branches : BranchItem []) => {
62+ const reorderedBranches = cloneDeep ([... branches , ... formData .value .branch .slice (- 1 )])
63+ reorderedBranches .slice (0 , - 1 ).forEach ((branch , index ) => {
64+ branch .type = index === 0 ? ' IF' : ` ELSE IF ${index } `
65+ })
66+ formData .value .branch = reorderedBranches
67+ refreshBranchAnchors ()
68+ },
69+ })
70+ useSortable (branchListRef , sortableBranches , () => ({
71+ disabled: sortableBranches .value .length < 2 ,
72+ handle: ' .condition-branch-handle' ,
73+ draggable: ' > .condition-branch' ,
74+ }))
75+
5576// 新分支插入 ELSE 之前,并保留稳定的锚点 ID。
5677function addBranch() {
5778 const branches = cloneDeep (formData .value .branch )
@@ -134,11 +155,16 @@ onBeforeUnmount(() => {
134155<template >
135156 <NodeContainer :node-model =" model " >
136157 <el-form ref =" conditionNodeFormRef" :model =" formData" label-position =" top" require-asterisk-position =" right" @submit.prevent >
137- <template v-for =" (branch , branchIndex ) in formData .branch " :key =" branch .id " >
138- <div class =" mb-2 flex items-center gap-1" >
139- <div v-branch-resize =" branch.id" class =" mk-gray-card min-w-0 flex-1" >
140- <div class =" flex-between min-h-6" >
141- <span >{{ branch.type }}</span >
158+ <div ref =" branchListRef" >
159+ <div v-for =" (branch, branchIndex) in sortableBranches" :key =" branch.id" class =" condition-branch mb-2 flex items-center gap-1" >
160+ <div v-branch-resize =" branch.id" class =" mk-gray-card group/branch min-w-0 flex-1" >
161+ <div class =" condition-branch-handle flex-between min-h-6" >
162+ <div class =" flex items-center" >
163+ <el-button v-if =" sortableBranches.length > 1" link class =" hidden! group-hover/branch:inline-flex!" aria-label =" 拖拽排序分支" >
164+ <MkIcon name="icon_drag_outlined" />
165+ </el-button >
166+ <span >{{ branch.type }}</span >
167+ </div >
142168 <div v-if =" branch.conditions.length > 1" class =" flex items-center gap-2 text-N600" >
143169 <span >符合以下</span >
144170 <el-select
@@ -156,63 +182,63 @@ onBeforeUnmount(() => {
156182 </div >
157183 </div >
158184
159- <template v-if =" branchIndex !== formData .branch .length - 1 " >
160- <div class =" mt-2" >
161- <MkFormList v-model =" branch .conditions " :default-item =" createCondition ()" :first-row-has-label =" false " add-text="添加条件">
162- <template #default =" { item: condition , index: conditionIndex } " >
163- <el-form-item
164- class =" small min-w-0 flex-2"
165- :prop =" `branch.${branchIndex}.conditions.${conditionIndex}.field`"
166- :rules =" { type: 'array', required: true, message: '请选择变量', trigger: 'change' }"
185+ <div class =" mt-2" >
186+ <MkFormList v-model =" branch .conditions " :default-item =" createCondition ()" :first-row-has-label =" false " add-text="添加条件">
187+ <template #default =" { item: condition , index: conditionIndex } " >
188+ <el-form-item
189+ class =" small min-w-0 flex-2"
190+ :prop =" `branch.${branchIndex}.conditions.${conditionIndex}.field`"
191+ :rules =" { type: 'array', required: true, message: '请选择变量', trigger: 'change' }"
192+ >
193+ <NodeCascader ref="nodeCascaderRefs" v-model =" condition .field " :node-model =" model " placeholder="请选择变量" />
194+ </el-form-item >
195+ <el-form-item
196+ class =" small min-w-0 flex-1"
197+ :prop =" `branch.${branchIndex}.conditions.${conditionIndex}.compare`"
198+ :rules =" { required: true, message: '请选择', trigger: 'change' }"
199+ >
200+ <el-select
201+ v-model =" condition.compare"
202+ :teleported =" false"
203+ placeholder =" 请选择"
204+ clearable
205+ @change =" changeComparison(condition)"
206+ @visible-change =" anchorGuard.setOverlayVisible(`${branch.id}:${conditionIndex}:compare`, $event)"
207+ @wheel =" handleNodeWheel"
167208 >
168- <NodeCascader ref="nodeCascaderRefs" v-model =" condition .field " :node-model =" model " placeholder="请选择变量" />
169- </el-form-item >
209+ <el-option v-for =" comparison in compareList" :key =" comparison.value" :label =" comparison.label" :value =" comparison.value" />
210+ </el-select >
211+ </el-form-item >
212+ <div class =" min-w-0 flex-1" >
170213 <el-form-item
171- class =" small min-w-0 flex-1"
172- :prop =" `branch.${branchIndex}.conditions.${conditionIndex}.compare`"
173- :rules =" { required: true, message: '请选择', trigger: 'change' }"
214+ v-if =" !valueLessComparisons.has(condition.compare)"
215+ :prop =" `branch.${branchIndex}.conditions.${conditionIndex}.value`"
216+ :rules =" { required: true, message: '请输入比较值', trigger: 'blur' }"
217+ class =" small"
174218 >
175- <el-select
176- v-model =" condition.compare"
177- :teleported =" false"
178- placeholder =" 请选择"
179- clearable
180- @change =" changeComparison(condition)"
181- @visible-change =" anchorGuard.setOverlayVisible(`${branch.id}:${conditionIndex}:compare`, $event)"
182- @wheel =" handleNodeWheel"
183- >
184- <el-option v-for =" comparison in compareList" :key =" comparison.value" :label =" comparison.label" :value =" comparison.value" />
185- </el-select >
219+ <el-input v-model =" condition.value" placeholder =" 请输入比较值" />
186220 </el-form-item >
187- <div class =" min-w-0 flex-1" >
188- <el-form-item
189- v-if =" !valueLessComparisons.has(condition.compare)"
190- :prop =" `branch.${branchIndex}.conditions.${conditionIndex}.value`"
191- :rules =" { required: true, message: '请输入比较值', trigger: 'blur' }"
192- class =" small"
193- >
194- <el-input v-model =" condition.value" placeholder =" 请输入比较值" />
195- </el-form-item >
196- </div >
197- </template >
198- </MkFormList >
199- </div >
200- </template >
221+ </div >
222+ </template >
223+ </MkFormList >
224+ </div >
201225 </div >
202226 <!-- 删除分支 -->
203227 <div v-if =" formData.branch.length > 2" class =" h-6 w-6 shrink-0" >
204- <el-button
205- v-if =" branchIndex < formData.branch.length - 1"
206- text
207- class =" h-6! w-6! p-0!"
208- aria-label =" 删除分支"
209- @click =" deleteBranch(branchIndex)"
210- >
228+ <el-button text class =" h-6! w-6! p-0!" aria-label =" 删除分支" @click =" deleteBranch(branchIndex)" >
211229 <MkIcon name="icon_delete-trash_outlined" />
212230 </el-button >
213231 </div >
214232 </div >
215- </template >
233+ </div >
234+ <div v-if =" elseBranch" class =" mb-2 flex items-center gap-1" >
235+ <div :key =" elseBranch.id" v-branch-resize =" elseBranch.id" class =" mk-gray-card min-w-0 flex-1" >
236+ <div class =" flex-between min-h-6" >
237+ <span >{{ elseBranch.type }}</span >
238+ </div >
239+ </div >
240+ <div v-if =" formData.branch.length > 2" class =" h-6 w-6 shrink-0" />
241+ </div >
216242
217243 <el-button link type =" primary" @click =" addBranch" >
218244 <MkIcon name="icon_add_outlined" class="mr-1" />
0 commit comments