feat: 调整失焦的问题的

This commit is contained in:
zhanghao 2026-04-20 15:21:15 +08:00
parent 57d2686738
commit 6d18c510b8
2 changed files with 158 additions and 8 deletions

View File

@ -5,11 +5,18 @@
<img :src="imageUrl()" alt="" /> <img :src="imageUrl()" alt="" />
<div class="text__container"> <div class="text__container">
<div class="text__title" v-if="showTextTitle"> <div class="text__title" v-if="showTextTitle">
<span class="text">{{ nodeName }}</span> <span class="text">{{ localName }}</span>
<el-icon class="editIcon" @click="showTextTitle = false"><EditPen/></el-icon> <el-icon class="editIcon" @click="startEditing"><EditPen/></el-icon>
</div> </div>
<div class="input_name_container" v-else > <div class="input_name_container" v-else >
<el-input v-model="nodeName" @keydown="handleInputKeydown" /> <el-input
v-model="localName"
@focus="handleInputFocus"
@blur="handleInputBlur"
@keydown="handleInputKeydown"
@click.stop
@mousedown.stop
/>
<el-button <el-button
class="input_name_select" class="input_name_select"
circle circle
@ -94,15 +101,31 @@ const props = defineProps({
const emits = defineEmits(['setNodeName']) const emits = defineEmits(['setNodeName'])
const showTextTitle = ref(true) const showTextTitle = ref(true)
const nodeName = ref(props.nodeProperties.name || props.nodeName) const localName = ref('')
const isEditing = ref(false)
//
const startEditing = () => {
isEditing.value = true
showTextTitle.value = false
// 使 nextTick DOM
nextTick(() => {
if (inputRef.value && inputRef.value.input) {
inputRef.value.input.focus()
//
inputRef.value.input.select()
}
})
}
const confirmNodeName = () => { const confirmNodeName = () => {
emits('setNodeName', nodeName.value) emits('setNodeName', localName.value)
showTextTitle.value = true showTextTitle.value = true
} }
const cancelNodeName = () => { const cancelNodeName = () => {
nodeName.value = props.nodeProperties?.name || props.nodeName localName.value = props.nodeProperties?.name || props.nodeName
showTextTitle.value = true showTextTitle.value = true
} }
@ -138,6 +161,32 @@ const execute = () => {
document.dispatchEvent(myEvent); document.dispatchEvent(myEvent);
} }
const handleInputFocus = (e) => {
console.log('Input focused')
// LogicFlow
e.stopPropagation()
e.preventDefault()
//
isEditing.value = true
//
setTimeout(() => {
if (inputRef.value && inputRef.value.input) {
inputRef.value.input.focus()
}
}, 0)
}
const handleInputBlur = (e) => {
console.log('Input blurred')
//
if (isEditing.value) {
//
//
}
}
const handleInputKeydown = (e) => { const handleInputKeydown = (e) => {
// Logic Flow // Logic Flow
e.stopPropagation(); e.stopPropagation();
@ -151,7 +200,12 @@ const imageUrl = () => {
return new URL(props.icon, import.meta.url).href; return new URL(props.icon, import.meta.url).href;
} }
onMounted(() => {
localName.value = props.nodeProperties?.name || props.nodeName
})
onUnmounted(() => { onUnmounted(() => {
console.log(34566)
emitter.off("deleteNode"); emitter.off("deleteNode");
}) })
</script> </script>
@ -164,6 +218,7 @@ onUnmounted(() => {
.left { .left {
display: flex; display: flex;
align-items: center; //
img { img {
width: 24px; width: 24px;
@ -193,6 +248,18 @@ onUnmounted(() => {
.el-input { .el-input {
margin-left: 12px; margin-left: 12px;
width: 120px; width: 120px;
// z-index
position: relative;
z-index: 1000;
// Element Plus
:deep(.el-input__wrapper) {
box-shadow: 0 0 0 1px #409eff !important;
&:focus-within {
box-shadow: 0 0 0 2px #409eff !important;
}
}
} }
.input_name_select { .input_name_select {
@ -226,4 +293,11 @@ onUnmounted(() => {
margin: 8px 0; margin: 8px 0;
} }
} }
//
:global(.lf-node) {
.el-input__inner {
user-select: text !important;
}
}
</style> </style>

View File

@ -72,6 +72,10 @@
v-model="params.withOr" v-model="params.withOr"
placeholder="Select" placeholder="Select"
style="width: 240px" style="width: 240px"
@focus="handleInputFocus"
@blur="handleInputBlur"
@click.stop
@mousedown.stop
> >
<el-option key="and" label="AND" value="and" /> <el-option key="and" label="AND" value="and" />
<el-option key="or" label="OR" value="or" /> <el-option key="or" label="OR" value="or" />
@ -88,6 +92,11 @@
<!-- <el-input v-model="property.name" placeholder="请输入" clearable /> --> <!-- <el-input v-model="property.name" placeholder="请输入" clearable /> -->
<el-select <el-select
v-model="property.nameType" v-model="property.nameType"
@focus="handleInputFocus"
@blur="handleInputBlur"
@keydown="handleInputKeydown"
@click.stop
@mousedown.stop
@change="handleTypeChange(index, pIndex)" @change="handleTypeChange(index, pIndex)"
> >
<el-option label="引用" value="quote" /> <el-option label="引用" value="quote" />
@ -108,6 +117,11 @@
v-model="property.name" v-model="property.name"
placeholder="请输入" placeholder="请输入"
clearable clearable
@focus="handleInputFocus"
@blur="handleInputBlur"
@keydown="handleInputKeydown"
@click.stop
@mousedown.stop
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
@ -126,6 +140,11 @@
:options="quoteOptions" :options="quoteOptions"
placeholder="请选择" placeholder="请选择"
@visible-change="visibleChange" @visible-change="visibleChange"
@focus="handleInputFocus"
@blur="handleInputBlur"
@keydown="handleInputKeydown"
@click.stop
@mousedown.stop
/> />
</el-form-item> </el-form-item>
</el-form-item> </el-form-item>
@ -136,7 +155,14 @@
{ required: true, message: '请输入变量名', trigger: 'blur' }, { required: true, message: '请输入变量名', trigger: 'blur' },
]" ]"
> >
<el-select v-model="property.condition"> <el-select
v-model="property.condition"
@focus="handleInputFocus"
@blur="handleInputBlur"
@keydown="handleInputKeydown"
@click.stop
@mousedown.stop
>
<el-option label="等于" value="equal" /> <el-option label="等于" value="equal" />
<el-option label="不等于" value="notEqualTo" /> <el-option label="不等于" value="notEqualTo" />
<el-option label="为空" value="null" /> <el-option label="为空" value="null" />
@ -156,6 +182,11 @@
<el-select <el-select
v-model="property.type" v-model="property.type"
@change="handleTypeChange(index, pIndex)" @change="handleTypeChange(index, pIndex)"
@focus="handleInputFocus"
@blur="handleInputBlur"
@keydown="handleInputKeydown"
@click.stop
@mousedown.stop
> >
<el-option label="引用" value="quote" /> <el-option label="引用" value="quote" />
<el-option label="输入" value="input" /> <el-option label="输入" value="input" />
@ -175,6 +206,11 @@
v-model="property.input" v-model="property.input"
placeholder="请输入" placeholder="请输入"
clearable clearable
@focus="handleInputFocus"
@blur="handleInputBlur"
@keydown="handleInputKeydown"
@click.stop
@mousedown.stop
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
@ -193,6 +229,11 @@
:options="quoteOptions" :options="quoteOptions"
placeholder="请选择" placeholder="请选择"
@visible-change="visibleChange" @visible-change="visibleChange"
@focus="handleInputFocus"
@blur="handleInputBlur"
@keydown="handleInputKeydown"
@click.stop
@mousedown.stop
/> />
</el-form-item> </el-form-item>
</el-form-item> </el-form-item>
@ -415,6 +456,41 @@ const closePopover = () => {
} }
} }
const handleInputFocus = (e) => {
console.log('Input focused')
// LogicFlow
e.stopPropagation()
e.preventDefault()
//
isEditing.value = true
//
setTimeout(() => {
if (inputRef.value && inputRef.value.input) {
inputRef.value.input.focus()
}
}, 0)
}
const handleInputBlur = (e) => {
console.log('Input blurred')
//
if (isEditing.value) {
//
//
}
}
const handleInputKeydown = (e) => {
// Logic Flow
e.stopPropagation();
// Ctrl+V
if ((e.ctrlKey || e.metaKey) && e.key === "v") {
e.returnValue = true; //
}
}
onMounted(() => { onMounted(() => {
emits("addAnchor", 280, "".concat(props.model.id, "_else")); emits("addAnchor", 280, "".concat(props.model.id, "_else"));