perf: Optimization of modifying node names in workflow
This commit is contained in:
parent
18fa06678c
commit
880e171933
@ -57,5 +57,6 @@ export default {
|
|||||||
|
|
||||||
inputPlaceholder: 'Please input',
|
inputPlaceholder: 'Please input',
|
||||||
title: 'Title',
|
title: 'Title',
|
||||||
content: 'Content'
|
content: 'Content',
|
||||||
|
rename: 'Rename'
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
node: 'Node',
|
node: 'Node',
|
||||||
|
nodeName: 'Node Name',
|
||||||
baseComponent: 'Basic',
|
baseComponent: 'Basic',
|
||||||
nodeSetting: 'Node Settings',
|
nodeSetting: 'Node Settings',
|
||||||
workflow: 'Workflow',
|
workflow: 'Workflow',
|
||||||
|
|||||||
@ -56,5 +56,6 @@ export default {
|
|||||||
param: {
|
param: {
|
||||||
outputParam: '输出参数',
|
outputParam: '输出参数',
|
||||||
inputParam:'输入参数'
|
inputParam:'输入参数'
|
||||||
}
|
},
|
||||||
|
rename:'重命名'
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
node: '节点',
|
node: '节点',
|
||||||
|
nodeName: '节点名称',
|
||||||
baseComponent: '基础组件',
|
baseComponent: '基础组件',
|
||||||
nodeSetting: '节点设置',
|
nodeSetting: '节点设置',
|
||||||
workflow: '工作流',
|
workflow: '工作流',
|
||||||
|
|||||||
@ -55,6 +55,7 @@ export default {
|
|||||||
content: '内容',
|
content: '内容',
|
||||||
param: {
|
param: {
|
||||||
outputParam: '輸出參數',
|
outputParam: '輸出參數',
|
||||||
inputParam:'輸入參數'
|
inputParam: '輸入參數'
|
||||||
}
|
},
|
||||||
|
rename: '重命名'
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
node: '節點',
|
node: '節點',
|
||||||
|
nodeName: '節點名稱',
|
||||||
baseComponent: '基礎組件',
|
baseComponent: '基礎組件',
|
||||||
nodeSetting: '節點設置',
|
nodeSetting: '節點設置',
|
||||||
workflow: '工作流',
|
workflow: '工作流',
|
||||||
|
|||||||
@ -7,28 +7,14 @@
|
|||||||
>
|
>
|
||||||
<div v-resize="resizeStepContainer">
|
<div v-resize="resizeStepContainer">
|
||||||
<div class="flex-between">
|
<div class="flex-between">
|
||||||
<div
|
<div class="flex align-center" style="width: 70%;">
|
||||||
class="flex align-center"
|
|
||||||
:style="{ maxWidth: node_status == 200 ? 'calc(100% - 85px)' : 'calc(100% - 85px)' }"
|
|
||||||
>
|
|
||||||
<component
|
<component
|
||||||
:is="iconComponent(`${nodeModel.type}-icon`)"
|
:is="iconComponent(`${nodeModel.type}-icon`)"
|
||||||
class="mr-8"
|
class="mr-8"
|
||||||
:size="24"
|
:size="24"
|
||||||
:item="nodeModel?.properties.node_data"
|
:item="nodeModel?.properties.node_data"
|
||||||
/>
|
/>
|
||||||
<h4 v-if="showOperate(nodeModel.type)" style="max-width: 90%">
|
<h4 class="ellipsis-1 break-all">{{ nodeModel.properties.stepName }}</h4>
|
||||||
<ReadWrite
|
|
||||||
@mousemove.stop
|
|
||||||
@mousedown.stop
|
|
||||||
@keydown.stop
|
|
||||||
@click.stop
|
|
||||||
@change="editName"
|
|
||||||
:data="nodeModel.properties.stepName"
|
|
||||||
trigger="dblclick"
|
|
||||||
/>
|
|
||||||
</h4>
|
|
||||||
<h4 v-else>{{ nodeModel.properties.stepName }}</h4>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div @mousemove.stop @mousedown.stop @keydown.stop @click.stop>
|
<div @mousemove.stop @mousedown.stop @keydown.stop @click.stop>
|
||||||
@ -70,6 +56,9 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
<template #dropdown>
|
<template #dropdown>
|
||||||
<el-dropdown-menu style="min-width: 80px">
|
<el-dropdown-menu style="min-width: 80px">
|
||||||
|
<el-dropdown-item @click="renameNode" class="p-8">{{
|
||||||
|
$t('common.rename')
|
||||||
|
}}</el-dropdown-item>
|
||||||
<el-dropdown-item @click="copyNode" class="p-8">{{
|
<el-dropdown-item @click="copyNode" class="p-8">{{
|
||||||
$t('common.copy')
|
$t('common.copy')
|
||||||
}}</el-dropdown-item>
|
}}</el-dropdown-item>
|
||||||
@ -138,6 +127,40 @@
|
|||||||
@clickNodes="clickNodes"
|
@clickNodes="clickNodes"
|
||||||
/>
|
/>
|
||||||
</el-collapse-transition>
|
</el-collapse-transition>
|
||||||
|
|
||||||
|
<el-dialog
|
||||||
|
:title="$t('views.applicationWorkflow.nodeName')"
|
||||||
|
v-model="nodeNameDialogVisible"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
:close-on-press-escape="false"
|
||||||
|
:destroy-on-close="true"
|
||||||
|
append-to-body
|
||||||
|
>
|
||||||
|
<el-form label-position="top" ref="titleFormRef" :model="form">
|
||||||
|
<el-form-item
|
||||||
|
prop="title"
|
||||||
|
:rules="[
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: $t('common.inputPlaceholder'),
|
||||||
|
trigger: 'blur'
|
||||||
|
}
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<el-input v-model="form.title" @blur="form.title = form.title.trim()" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<span class="dialog-footer">
|
||||||
|
<el-button @click.prevent="nodeNameDialogVisible = false">
|
||||||
|
{{ $t('common.cancel') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button type="primary" @click="editName(titleFormRef)">
|
||||||
|
{{ $t('common.save') }}
|
||||||
|
</el-button>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
@ -149,6 +172,7 @@ import { iconComponent } from '../icons/utils'
|
|||||||
import { copyClick } from '@/utils/clipboard'
|
import { copyClick } from '@/utils/clipboard'
|
||||||
import { WorkflowType } from '@/enums/workflow'
|
import { WorkflowType } from '@/enums/workflow'
|
||||||
import { MsgError, MsgConfirm } from '@/utils/message'
|
import { MsgError, MsgConfirm } from '@/utils/message'
|
||||||
|
import type { FormInstance } from 'element-plus'
|
||||||
import { t } from '@/locales'
|
import { t } from '@/locales'
|
||||||
const {
|
const {
|
||||||
params: { id }
|
params: { id }
|
||||||
@ -165,6 +189,11 @@ const height = ref<{
|
|||||||
})
|
})
|
||||||
const showAnchor = ref<boolean>(false)
|
const showAnchor = ref<boolean>(false)
|
||||||
const anchorData = ref<any>()
|
const anchorData = ref<any>()
|
||||||
|
const titleFormRef = ref()
|
||||||
|
const nodeNameDialogVisible = ref<boolean>(false)
|
||||||
|
const form = ref<any>({
|
||||||
|
title: ''
|
||||||
|
})
|
||||||
|
|
||||||
const condition = computed({
|
const condition = computed({
|
||||||
set: (v) => {
|
set: (v) => {
|
||||||
@ -190,6 +219,7 @@ const showNode = computed({
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const handleWheel = (event: any) => {
|
const handleWheel = (event: any) => {
|
||||||
const isCombinationKeyPressed = event.ctrlKey || event.metaKey
|
const isCombinationKeyPressed = event.ctrlKey || event.metaKey
|
||||||
if (!isCombinationKeyPressed) {
|
if (!isCombinationKeyPressed) {
|
||||||
@ -202,19 +232,30 @@ const node_status = computed(() => {
|
|||||||
}
|
}
|
||||||
return 200
|
return 200
|
||||||
})
|
})
|
||||||
function editName(val: string) {
|
|
||||||
if (val.trim() && val.trim() !== props.nodeModel.properties.stepName) {
|
function renameNode() {
|
||||||
if (
|
form.value.title = props.nodeModel.properties.stepName
|
||||||
!props.nodeModel.graphModel.nodes?.some(
|
nodeNameDialogVisible.value = true
|
||||||
(node: any) => node.properties.stepName === val.trim()
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
set(props.nodeModel.properties, 'stepName', val.trim())
|
|
||||||
} else {
|
|
||||||
MsgError(t('views.applicationWorkflow.tip.repeatedNodeError'))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
const editName = async (formEl: FormInstance | undefined) => {
|
||||||
|
if (!formEl) return
|
||||||
|
await formEl.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
if (
|
||||||
|
!props.nodeModel.graphModel.nodes?.some(
|
||||||
|
(node: any) => node.properties.stepName === form.value.title
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
set(props.nodeModel.properties, 'stepName', form.value.title)
|
||||||
|
nodeNameDialogVisible.value = false
|
||||||
|
formEl.resetFields()
|
||||||
|
} else {
|
||||||
|
MsgError(t('views.applicationWorkflow.tip.repeatedNodeError'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const mousedown = () => {
|
const mousedown = () => {
|
||||||
props.nodeModel.graphModel.clearSelectElements()
|
props.nodeModel.graphModel.clearSelectElements()
|
||||||
set(props.nodeModel, 'isSelected', true)
|
set(props.nodeModel, 'isSelected', true)
|
||||||
|
|||||||
@ -39,7 +39,7 @@
|
|||||||
<div class="flex-between">
|
<div class="flex-between">
|
||||||
<div>
|
<div>
|
||||||
<span
|
<span
|
||||||
>{{ $t('views.applicationWorkflow.nodes.variableAssignNode.assign')
|
>{{ $t('views.applicationWorkflow.nodes.variableAssignNode.assign')
|
||||||
}}<span class="danger">*</span></span
|
}}<span class="danger">*</span></span
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
@ -60,77 +60,83 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-form-item>
|
<div v-if="item.source === 'custom'" class="flex">
|
||||||
<div v-if="item.source === 'custom'" class="flex">
|
<el-row :gutter="8">
|
||||||
<el-row :gutter="8">
|
<el-col :span="8">
|
||||||
<el-col :span="8">
|
<el-select v-model="item.type" style="width: 85px">
|
||||||
<el-select v-model="item.type" style="width: 130px;">
|
<el-option
|
||||||
<el-option v-for="item in typeOptions" :key="item" :label="item"
|
v-for="item in typeOptions"
|
||||||
:value="item" />
|
:key="item"
|
||||||
</el-select>
|
:label="item"
|
||||||
</el-col>
|
:value="item"
|
||||||
<el-col :span="16">
|
/>
|
||||||
<el-form-item v-if="item.type === 'string'"
|
</el-select>
|
||||||
:prop="'variable_list.' + index + '.value'"
|
</el-col>
|
||||||
:rules="{
|
<el-col :span="16">
|
||||||
message: t('dynamicsForm.tip.requiredMessage'),
|
<el-form-item
|
||||||
trigger: 'blur',
|
v-if="item.type === 'string'"
|
||||||
required: true
|
:prop="'variable_list.' + index + '.value'"
|
||||||
}"
|
:rules="{
|
||||||
>
|
message: t('dynamicsForm.tip.requiredMessage'),
|
||||||
<el-input
|
trigger: 'blur',
|
||||||
class="ml-4"
|
required: true
|
||||||
v-model="item.value"
|
}"
|
||||||
:placeholder="$t('common.inputPlaceholder')"
|
>
|
||||||
show-word-limit
|
<el-input
|
||||||
clearable
|
class="ml-4"
|
||||||
@wheel="wheel"
|
v-model="item.value"
|
||||||
></el-input>
|
:placeholder="$t('common.inputPlaceholder')"
|
||||||
</el-form-item>
|
show-word-limit
|
||||||
<el-form-item v-else-if="item.type ==='num'"
|
clearable
|
||||||
:prop="'variable_list.' + index + '.value'"
|
@wheel="wheel"
|
||||||
:rules="{
|
></el-input>
|
||||||
message: t('dynamicsForm.tip.requiredMessage'),
|
</el-form-item>
|
||||||
trigger: 'blur',
|
<el-form-item
|
||||||
required: true
|
v-else-if="item.type === 'num'"
|
||||||
}"
|
:prop="'variable_list.' + index + '.value'"
|
||||||
>
|
:rules="{
|
||||||
<el-input-number
|
message: $t('common.inputPlaceholder'),
|
||||||
class="ml-4"
|
trigger: 'blur',
|
||||||
v-model="item.value"
|
required: true
|
||||||
></el-input-number>
|
}"
|
||||||
</el-form-item>
|
>
|
||||||
<el-form-item v-else-if="item.type === 'json'"
|
<el-input-number class="ml-4" v-model="item.value"></el-input-number>
|
||||||
:prop="'variable_list.' + index + '.value'"
|
</el-form-item>
|
||||||
:rules="[{
|
<el-form-item
|
||||||
message: t('dynamicsForm.tip.requiredMessage'),
|
v-else-if="item.type === 'json'"
|
||||||
trigger: 'blur',
|
:prop="'variable_list.' + index + '.value'"
|
||||||
required: true
|
:rules="[
|
||||||
},
|
{
|
||||||
{
|
message: $t('common.inputPlaceholder'),
|
||||||
validator: (rule:any, value:any, callback:any) => {
|
trigger: 'blur',
|
||||||
try {
|
required: true
|
||||||
JSON.parse(value);
|
},
|
||||||
callback(); // Valid JSON
|
{
|
||||||
} catch (e) {
|
validator: (rule: any, value: any, callback: any) => {
|
||||||
callback(new Error('Invalid JSON format'));
|
try {
|
||||||
}
|
JSON.parse(value)
|
||||||
},
|
callback() // Valid JSON
|
||||||
trigger: 'blur',
|
} catch (e) {
|
||||||
}]"
|
callback(new Error('Invalid JSON format'))
|
||||||
>
|
}
|
||||||
<el-input
|
},
|
||||||
class="ml-4"
|
trigger: 'blur'
|
||||||
v-model="item.value"
|
}
|
||||||
:placeholder="$t('common.inputPlaceholder')"
|
]"
|
||||||
type="textarea"
|
>
|
||||||
></el-input>
|
<el-input
|
||||||
</el-form-item>
|
class="ml-4"
|
||||||
</el-col>
|
v-model="item.value"
|
||||||
</el-row>
|
:placeholder="$t('common.inputPlaceholder')"
|
||||||
</div>
|
type="textarea"
|
||||||
<el-form-item v-else>
|
autosize
|
||||||
|
></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
<NodeCascader
|
<NodeCascader
|
||||||
|
v-else
|
||||||
ref="nodeCascaderRef2"
|
ref="nodeCascaderRef2"
|
||||||
:nodeModel="nodeModel"
|
:nodeModel="nodeModel"
|
||||||
class="w-full"
|
class="w-full"
|
||||||
@ -138,7 +144,6 @@
|
|||||||
v-model="item.reference"
|
v-model="item.reference"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
</el-card>
|
</el-card>
|
||||||
</template>
|
</template>
|
||||||
<el-button link type="primary" @click="addVariable">
|
<el-button link type="primary" @click="addVariable">
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user