diff --git a/ui/src/locales/lang/en-US/common.ts b/ui/src/locales/lang/en-US/common.ts index 7c2996d3561..e8fbb87e9b4 100644 --- a/ui/src/locales/lang/en-US/common.ts +++ b/ui/src/locales/lang/en-US/common.ts @@ -57,5 +57,6 @@ export default { inputPlaceholder: 'Please input', title: 'Title', - content: 'Content' + content: 'Content', + rename: 'Rename' } diff --git a/ui/src/locales/lang/en-US/views/application-workflow.ts b/ui/src/locales/lang/en-US/views/application-workflow.ts index 3ac6c265c83..6e1aa8c673c 100644 --- a/ui/src/locales/lang/en-US/views/application-workflow.ts +++ b/ui/src/locales/lang/en-US/views/application-workflow.ts @@ -1,5 +1,6 @@ export default { node: 'Node', + nodeName: 'Node Name', baseComponent: 'Basic', nodeSetting: 'Node Settings', workflow: 'Workflow', diff --git a/ui/src/locales/lang/zh-CN/common.ts b/ui/src/locales/lang/zh-CN/common.ts index 1bd88784f5c..cdcde3d6072 100644 --- a/ui/src/locales/lang/zh-CN/common.ts +++ b/ui/src/locales/lang/zh-CN/common.ts @@ -56,5 +56,6 @@ export default { param: { outputParam: '输出参数', inputParam:'输入参数' - } + }, + rename:'重命名' } diff --git a/ui/src/locales/lang/zh-CN/views/application-workflow.ts b/ui/src/locales/lang/zh-CN/views/application-workflow.ts index 95d73605fd7..010964bb004 100644 --- a/ui/src/locales/lang/zh-CN/views/application-workflow.ts +++ b/ui/src/locales/lang/zh-CN/views/application-workflow.ts @@ -1,5 +1,6 @@ export default { node: '节点', + nodeName: '节点名称', baseComponent: '基础组件', nodeSetting: '节点设置', workflow: '工作流', diff --git a/ui/src/locales/lang/zh-Hant/common.ts b/ui/src/locales/lang/zh-Hant/common.ts index 9adcf372b25..3281456de96 100644 --- a/ui/src/locales/lang/zh-Hant/common.ts +++ b/ui/src/locales/lang/zh-Hant/common.ts @@ -55,6 +55,7 @@ export default { content: '内容', param: { outputParam: '輸出參數', - inputParam:'輸入參數' - } + inputParam: '輸入參數' + }, + rename: '重命名' } diff --git a/ui/src/locales/lang/zh-Hant/views/application-workflow.ts b/ui/src/locales/lang/zh-Hant/views/application-workflow.ts index e3491eb77f7..b8cf464693a 100644 --- a/ui/src/locales/lang/zh-Hant/views/application-workflow.ts +++ b/ui/src/locales/lang/zh-Hant/views/application-workflow.ts @@ -1,5 +1,6 @@ export default { node: '節點', + nodeName: '節點名稱', baseComponent: '基礎組件', nodeSetting: '節點設置', workflow: '工作流', diff --git a/ui/src/workflow/common/NodeContainer.vue b/ui/src/workflow/common/NodeContainer.vue index 82665934595..265634ad016 100644 --- a/ui/src/workflow/common/NodeContainer.vue +++ b/ui/src/workflow/common/NodeContainer.vue @@ -7,28 +7,14 @@ > <div v-resize="resizeStepContainer"> <div class="flex-between"> - <div - class="flex align-center" - :style="{ maxWidth: node_status == 200 ? 'calc(100% - 85px)' : 'calc(100% - 85px)' }" - > + <div class="flex align-center" style="width: 70%;"> <component :is="iconComponent(`${nodeModel.type}-icon`)" class="mr-8" :size="24" :item="nodeModel?.properties.node_data" /> - <h4 v-if="showOperate(nodeModel.type)" style="max-width: 90%"> - <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> + <h4 class="ellipsis-1 break-all">{{ nodeModel.properties.stepName }}</h4> </div> <div @mousemove.stop @mousedown.stop @keydown.stop @click.stop> @@ -70,6 +56,9 @@ </el-button> <template #dropdown> <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">{{ $t('common.copy') }}</el-dropdown-item> @@ -138,6 +127,40 @@ @clickNodes="clickNodes" /> </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> </template> <script setup lang="ts"> @@ -149,6 +172,7 @@ import { iconComponent } from '../icons/utils' import { copyClick } from '@/utils/clipboard' import { WorkflowType } from '@/enums/workflow' import { MsgError, MsgConfirm } from '@/utils/message' +import type { FormInstance } from 'element-plus' import { t } from '@/locales' const { params: { id } @@ -165,6 +189,11 @@ const height = ref<{ }) const showAnchor = ref<boolean>(false) const anchorData = ref<any>() +const titleFormRef = ref() +const nodeNameDialogVisible = ref<boolean>(false) +const form = ref<any>({ + title: '' +}) const condition = computed({ set: (v) => { @@ -190,6 +219,7 @@ const showNode = computed({ return true } }) + const handleWheel = (event: any) => { const isCombinationKeyPressed = event.ctrlKey || event.metaKey if (!isCombinationKeyPressed) { @@ -202,19 +232,30 @@ const node_status = computed(() => { } return 200 }) -function editName(val: string) { - if (val.trim() && val.trim() !== props.nodeModel.properties.stepName) { - if ( - !props.nodeModel.graphModel.nodes?.some( - (node: any) => node.properties.stepName === val.trim() - ) - ) { - set(props.nodeModel.properties, 'stepName', val.trim()) - } else { - MsgError(t('views.applicationWorkflow.tip.repeatedNodeError')) + +function renameNode() { + form.value.title = props.nodeModel.properties.stepName + nodeNameDialogVisible.value = true +} +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 = () => { props.nodeModel.graphModel.clearSelectElements() set(props.nodeModel, 'isSelected', true) diff --git a/ui/src/workflow/nodes/variable-assign-node/index.vue b/ui/src/workflow/nodes/variable-assign-node/index.vue index 4c24bd6c7fc..ecd8fd31ba1 100644 --- a/ui/src/workflow/nodes/variable-assign-node/index.vue +++ b/ui/src/workflow/nodes/variable-assign-node/index.vue @@ -39,7 +39,7 @@ <div class="flex-between"> <div> <span - >{{ $t('views.applicationWorkflow.nodes.variableAssignNode.assign') + >{{ $t('views.applicationWorkflow.nodes.variableAssignNode.assign') }}<span class="danger">*</span></span > </div> @@ -60,77 +60,83 @@ </el-select> </div> </template> - </el-form-item> - <div v-if="item.source === 'custom'" class="flex"> - <el-row :gutter="8"> - <el-col :span="8"> - <el-select v-model="item.type" style="width: 130px;"> - <el-option v-for="item in typeOptions" :key="item" :label="item" - :value="item" /> - </el-select> - </el-col> - <el-col :span="16"> - <el-form-item v-if="item.type === 'string'" - :prop="'variable_list.' + index + '.value'" - :rules="{ - message: t('dynamicsForm.tip.requiredMessage'), - trigger: 'blur', - required: true - }" - > - <el-input - class="ml-4" - v-model="item.value" - :placeholder="$t('common.inputPlaceholder')" - show-word-limit - clearable - @wheel="wheel" - ></el-input> - </el-form-item> - <el-form-item v-else-if="item.type ==='num'" - :prop="'variable_list.' + index + '.value'" - :rules="{ - message: t('dynamicsForm.tip.requiredMessage'), - trigger: 'blur', - required: true - }" - > - <el-input-number - class="ml-4" - v-model="item.value" - ></el-input-number> - </el-form-item> - <el-form-item v-else-if="item.type === 'json'" - :prop="'variable_list.' + index + '.value'" - :rules="[{ - message: t('dynamicsForm.tip.requiredMessage'), - trigger: 'blur', - required: true - }, - { - validator: (rule:any, value:any, callback:any) => { - try { - JSON.parse(value); - callback(); // Valid JSON - } catch (e) { - callback(new Error('Invalid JSON format')); - } - }, - trigger: 'blur', - }]" - > - <el-input - class="ml-4" - v-model="item.value" - :placeholder="$t('common.inputPlaceholder')" - type="textarea" - ></el-input> - </el-form-item> - </el-col> - </el-row> - </div> - <el-form-item v-else> + <div v-if="item.source === 'custom'" class="flex"> + <el-row :gutter="8"> + <el-col :span="8"> + <el-select v-model="item.type" style="width: 85px"> + <el-option + v-for="item in typeOptions" + :key="item" + :label="item" + :value="item" + /> + </el-select> + </el-col> + <el-col :span="16"> + <el-form-item + v-if="item.type === 'string'" + :prop="'variable_list.' + index + '.value'" + :rules="{ + message: t('dynamicsForm.tip.requiredMessage'), + trigger: 'blur', + required: true + }" + > + <el-input + class="ml-4" + v-model="item.value" + :placeholder="$t('common.inputPlaceholder')" + show-word-limit + clearable + @wheel="wheel" + ></el-input> + </el-form-item> + <el-form-item + v-else-if="item.type === 'num'" + :prop="'variable_list.' + index + '.value'" + :rules="{ + message: $t('common.inputPlaceholder'), + trigger: 'blur', + required: true + }" + > + <el-input-number class="ml-4" v-model="item.value"></el-input-number> + </el-form-item> + <el-form-item + v-else-if="item.type === 'json'" + :prop="'variable_list.' + index + '.value'" + :rules="[ + { + message: $t('common.inputPlaceholder'), + trigger: 'blur', + required: true + }, + { + validator: (rule: any, value: any, callback: any) => { + try { + JSON.parse(value) + callback() // Valid JSON + } catch (e) { + callback(new Error('Invalid JSON format')) + } + }, + trigger: 'blur' + } + ]" + > + <el-input + class="ml-4" + v-model="item.value" + :placeholder="$t('common.inputPlaceholder')" + type="textarea" + autosize + ></el-input> + </el-form-item> + </el-col> + </el-row> + </div> <NodeCascader + v-else ref="nodeCascaderRef2" :nodeModel="nodeModel" class="w-full" @@ -138,7 +144,6 @@ v-model="item.reference" /> </el-form-item> - </el-card> </template> <el-button link type="primary" @click="addVariable">