Skip to content

Commit 880e171

Browse files
perf: Optimization of modifying node names in workflow
1 parent 18fa066 commit 880e171

File tree

8 files changed

+155
-103
lines changed

8 files changed

+155
-103
lines changed

ui/src/locales/lang/en-US/common.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,6 @@ export default {
5757

5858
inputPlaceholder: 'Please input',
5959
title: 'Title',
60-
content: 'Content'
60+
content: 'Content',
61+
rename: 'Rename'
6162
}

ui/src/locales/lang/en-US/views/application-workflow.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export default {
22
node: 'Node',
3+
nodeName: 'Node Name',
34
baseComponent: 'Basic',
45
nodeSetting: 'Node Settings',
56
workflow: 'Workflow',

ui/src/locales/lang/zh-CN/common.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,6 @@ export default {
5656
param: {
5757
outputParam: '输出参数',
5858
inputParam:'输入参数'
59-
}
59+
},
60+
rename:'重命名'
6061
}

ui/src/locales/lang/zh-CN/views/application-workflow.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export default {
22
node: '节点',
3+
nodeName: '节点名称',
34
baseComponent: '基础组件',
45
nodeSetting: '节点设置',
56
workflow: '工作流',

ui/src/locales/lang/zh-Hant/common.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ export default {
5555
content: '内容',
5656
param: {
5757
outputParam: '輸出參數',
58-
inputParam:'輸入參數'
59-
}
58+
inputParam: '輸入參數'
59+
},
60+
rename: '重命名'
6061
}

ui/src/locales/lang/zh-Hant/views/application-workflow.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export default {
22
node: '節點',
3+
nodeName: '節點名稱',
34
baseComponent: '基礎組件',
45
nodeSetting: '節點設置',
56
workflow: '工作流',

ui/src/workflow/common/NodeContainer.vue

+68-27
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,14 @@
77
>
88
<div v-resize="resizeStepContainer">
99
<div class="flex-between">
10-
<div
11-
class="flex align-center"
12-
:style="{ maxWidth: node_status == 200 ? 'calc(100% - 85px)' : 'calc(100% - 85px)' }"
13-
>
10+
<div class="flex align-center" style="width: 70%;">
1411
<component
1512
:is="iconComponent(`${nodeModel.type}-icon`)"
1613
class="mr-8"
1714
:size="24"
1815
:item="nodeModel?.properties.node_data"
1916
/>
20-
<h4 v-if="showOperate(nodeModel.type)" style="max-width: 90%">
21-
<ReadWrite
22-
@mousemove.stop
23-
@mousedown.stop
24-
@keydown.stop
25-
@click.stop
26-
@change="editName"
27-
:data="nodeModel.properties.stepName"
28-
trigger="dblclick"
29-
/>
30-
</h4>
31-
<h4 v-else>{{ nodeModel.properties.stepName }}</h4>
17+
<h4 class="ellipsis-1 break-all">{{ nodeModel.properties.stepName }}</h4>
3218
</div>
3319

3420
<div @mousemove.stop @mousedown.stop @keydown.stop @click.stop>
@@ -70,6 +56,9 @@
7056
</el-button>
7157
<template #dropdown>
7258
<el-dropdown-menu style="min-width: 80px">
59+
<el-dropdown-item @click="renameNode" class="p-8">{{
60+
$t('common.rename')
61+
}}</el-dropdown-item>
7362
<el-dropdown-item @click="copyNode" class="p-8">{{
7463
$t('common.copy')
7564
}}</el-dropdown-item>
@@ -138,6 +127,40 @@
138127
@clickNodes="clickNodes"
139128
/>
140129
</el-collapse-transition>
130+
131+
<el-dialog
132+
:title="$t('views.applicationWorkflow.nodeName')"
133+
v-model="nodeNameDialogVisible"
134+
:close-on-click-modal="false"
135+
:close-on-press-escape="false"
136+
:destroy-on-close="true"
137+
append-to-body
138+
>
139+
<el-form label-position="top" ref="titleFormRef" :model="form">
140+
<el-form-item
141+
prop="title"
142+
:rules="[
143+
{
144+
required: true,
145+
message: $t('common.inputPlaceholder'),
146+
trigger: 'blur'
147+
}
148+
]"
149+
>
150+
<el-input v-model="form.title" @blur="form.title = form.title.trim()" />
151+
</el-form-item>
152+
</el-form>
153+
<template #footer>
154+
<span class="dialog-footer">
155+
<el-button @click.prevent="nodeNameDialogVisible = false">
156+
{{ $t('common.cancel') }}
157+
</el-button>
158+
<el-button type="primary" @click="editName(titleFormRef)">
159+
{{ $t('common.save') }}
160+
</el-button>
161+
</span>
162+
</template>
163+
</el-dialog>
141164
</div>
142165
</template>
143166
<script setup lang="ts">
@@ -149,6 +172,7 @@ import { iconComponent } from '../icons/utils'
149172
import { copyClick } from '@/utils/clipboard'
150173
import { WorkflowType } from '@/enums/workflow'
151174
import { MsgError, MsgConfirm } from '@/utils/message'
175+
import type { FormInstance } from 'element-plus'
152176
import { t } from '@/locales'
153177
const {
154178
params: { id }
@@ -165,6 +189,11 @@ const height = ref<{
165189
})
166190
const showAnchor = ref<boolean>(false)
167191
const anchorData = ref<any>()
192+
const titleFormRef = ref()
193+
const nodeNameDialogVisible = ref<boolean>(false)
194+
const form = ref<any>({
195+
title: ''
196+
})
168197
169198
const condition = computed({
170199
set: (v) => {
@@ -190,6 +219,7 @@ const showNode = computed({
190219
return true
191220
}
192221
})
222+
193223
const handleWheel = (event: any) => {
194224
const isCombinationKeyPressed = event.ctrlKey || event.metaKey
195225
if (!isCombinationKeyPressed) {
@@ -202,19 +232,30 @@ const node_status = computed(() => {
202232
}
203233
return 200
204234
})
205-
function editName(val: string) {
206-
if (val.trim() && val.trim() !== props.nodeModel.properties.stepName) {
207-
if (
208-
!props.nodeModel.graphModel.nodes?.some(
209-
(node: any) => node.properties.stepName === val.trim()
210-
)
211-
) {
212-
set(props.nodeModel.properties, 'stepName', val.trim())
213-
} else {
214-
MsgError(t('views.applicationWorkflow.tip.repeatedNodeError'))
235+
236+
function renameNode() {
237+
form.value.title = props.nodeModel.properties.stepName
238+
nodeNameDialogVisible.value = true
239+
}
240+
const editName = async (formEl: FormInstance | undefined) => {
241+
if (!formEl) return
242+
await formEl.validate((valid) => {
243+
if (valid) {
244+
if (
245+
!props.nodeModel.graphModel.nodes?.some(
246+
(node: any) => node.properties.stepName === form.value.title
247+
)
248+
) {
249+
set(props.nodeModel.properties, 'stepName', form.value.title)
250+
nodeNameDialogVisible.value = false
251+
formEl.resetFields()
252+
} else {
253+
MsgError(t('views.applicationWorkflow.tip.repeatedNodeError'))
254+
}
215255
}
216-
}
256+
})
217257
}
258+
218259
const mousedown = () => {
219260
props.nodeModel.graphModel.clearSelectElements()
220261
set(props.nodeModel, 'isSelected', true)

ui/src/workflow/nodes/variable-assign-node/index.vue

+77-72
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
<div class="flex-between">
4040
<div>
4141
<span
42-
>{{ $t('views.applicationWorkflow.nodes.variableAssignNode.assign')
42+
>{{ $t('views.applicationWorkflow.nodes.variableAssignNode.assign')
4343
}}<span class="danger">*</span></span
4444
>
4545
</div>
@@ -60,85 +60,90 @@
6060
</el-select>
6161
</div>
6262
</template>
63-
</el-form-item>
64-
<div v-if="item.source === 'custom'" class="flex">
65-
<el-row :gutter="8">
66-
<el-col :span="8">
67-
<el-select v-model="item.type" style="width: 130px;">
68-
<el-option v-for="item in typeOptions" :key="item" :label="item"
69-
:value="item" />
70-
</el-select>
71-
</el-col>
72-
<el-col :span="16">
73-
<el-form-item v-if="item.type === 'string'"
74-
:prop="'variable_list.' + index + '.value'"
75-
:rules="{
76-
message: t('dynamicsForm.tip.requiredMessage'),
77-
trigger: 'blur',
78-
required: true
79-
}"
80-
>
81-
<el-input
82-
class="ml-4"
83-
v-model="item.value"
84-
:placeholder="$t('common.inputPlaceholder')"
85-
show-word-limit
86-
clearable
87-
@wheel="wheel"
88-
></el-input>
89-
</el-form-item>
90-
<el-form-item v-else-if="item.type ==='num'"
91-
:prop="'variable_list.' + index + '.value'"
92-
:rules="{
93-
message: t('dynamicsForm.tip.requiredMessage'),
94-
trigger: 'blur',
95-
required: true
96-
}"
97-
>
98-
<el-input-number
99-
class="ml-4"
100-
v-model="item.value"
101-
></el-input-number>
102-
</el-form-item>
103-
<el-form-item v-else-if="item.type === 'json'"
104-
:prop="'variable_list.' + index + '.value'"
105-
:rules="[{
106-
message: t('dynamicsForm.tip.requiredMessage'),
107-
trigger: 'blur',
108-
required: true
109-
},
110-
{
111-
validator: (rule:any, value:any, callback:any) => {
112-
try {
113-
JSON.parse(value);
114-
callback(); // Valid JSON
115-
} catch (e) {
116-
callback(new Error('Invalid JSON format'));
117-
}
118-
},
119-
trigger: 'blur',
120-
}]"
121-
>
122-
<el-input
123-
class="ml-4"
124-
v-model="item.value"
125-
:placeholder="$t('common.inputPlaceholder')"
126-
type="textarea"
127-
></el-input>
128-
</el-form-item>
129-
</el-col>
130-
</el-row>
131-
</div>
132-
<el-form-item v-else>
63+
<div v-if="item.source === 'custom'" class="flex">
64+
<el-row :gutter="8">
65+
<el-col :span="8">
66+
<el-select v-model="item.type" style="width: 85px">
67+
<el-option
68+
v-for="item in typeOptions"
69+
:key="item"
70+
:label="item"
71+
:value="item"
72+
/>
73+
</el-select>
74+
</el-col>
75+
<el-col :span="16">
76+
<el-form-item
77+
v-if="item.type === 'string'"
78+
:prop="'variable_list.' + index + '.value'"
79+
:rules="{
80+
message: t('dynamicsForm.tip.requiredMessage'),
81+
trigger: 'blur',
82+
required: true
83+
}"
84+
>
85+
<el-input
86+
class="ml-4"
87+
v-model="item.value"
88+
:placeholder="$t('common.inputPlaceholder')"
89+
show-word-limit
90+
clearable
91+
@wheel="wheel"
92+
></el-input>
93+
</el-form-item>
94+
<el-form-item
95+
v-else-if="item.type === 'num'"
96+
:prop="'variable_list.' + index + '.value'"
97+
:rules="{
98+
message: $t('common.inputPlaceholder'),
99+
trigger: 'blur',
100+
required: true
101+
}"
102+
>
103+
<el-input-number class="ml-4" v-model="item.value"></el-input-number>
104+
</el-form-item>
105+
<el-form-item
106+
v-else-if="item.type === 'json'"
107+
:prop="'variable_list.' + index + '.value'"
108+
:rules="[
109+
{
110+
message: $t('common.inputPlaceholder'),
111+
trigger: 'blur',
112+
required: true
113+
},
114+
{
115+
validator: (rule: any, value: any, callback: any) => {
116+
try {
117+
JSON.parse(value)
118+
callback() // Valid JSON
119+
} catch (e) {
120+
callback(new Error('Invalid JSON format'))
121+
}
122+
},
123+
trigger: 'blur'
124+
}
125+
]"
126+
>
127+
<el-input
128+
class="ml-4"
129+
v-model="item.value"
130+
:placeholder="$t('common.inputPlaceholder')"
131+
type="textarea"
132+
autosize
133+
></el-input>
134+
</el-form-item>
135+
</el-col>
136+
</el-row>
137+
</div>
133138
<NodeCascader
139+
v-else
134140
ref="nodeCascaderRef2"
135141
:nodeModel="nodeModel"
136142
class="w-full"
137143
:placeholder="$t('views.applicationWorkflow.variable.placeholder')"
138144
v-model="item.reference"
139145
/>
140146
</el-form-item>
141-
142147
</el-card>
143148
</template>
144149
<el-button link type="primary" @click="addVariable">

0 commit comments

Comments
 (0)