feat:AdditionalOutputCard.vue未开发完毕版本
This commit is contained in:
@@ -0,0 +1,148 @@
|
||||
<!-- AdditionalOutputCard.vue -->
|
||||
<script setup lang="ts">
|
||||
import { computed, ref, nextTick } from 'vue'
|
||||
import { useAgentsStore } from '@/stores'
|
||||
import SvgIcon from '@/components/SvgIcon/index.vue'
|
||||
|
||||
const agentsStore = useAgentsStore()
|
||||
const props = defineProps<{
|
||||
index: number
|
||||
}>()
|
||||
|
||||
// 获取产物名称
|
||||
const currentOutput = computed(() => {
|
||||
return agentsStore.additionalOutputs[props.index] || ''
|
||||
})
|
||||
|
||||
// 编辑状态
|
||||
const isEditing = ref(false)
|
||||
const inputValue = ref('')
|
||||
const originalValue = ref('')
|
||||
const inputRef = ref<HTMLElement>()
|
||||
|
||||
// 点击编辑图标
|
||||
const handleEditClick = () => {
|
||||
isEditing.value = true
|
||||
originalValue.value = inputValue.value
|
||||
|
||||
// 等待 DOM 更新后聚焦输入框
|
||||
nextTick(() => {
|
||||
if (inputRef.value) {
|
||||
const inputEl = inputRef.value.querySelector('input')
|
||||
if (inputEl) {
|
||||
inputEl.focus()
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 保存编辑
|
||||
const handleSave = () => {
|
||||
if (isEditing.value) {
|
||||
isEditing.value = false
|
||||
}
|
||||
}
|
||||
|
||||
// 取消编辑
|
||||
const handleCancel = () => {
|
||||
if (isEditing.value) {
|
||||
inputValue.value = originalValue.value // 恢复原始值
|
||||
isEditing.value = false
|
||||
}
|
||||
}
|
||||
|
||||
// 处理键盘事件
|
||||
const handleKeydown = (event: KeyboardEvent) => {
|
||||
if (event.key === 'Enter') {
|
||||
event.preventDefault()
|
||||
handleSave()
|
||||
} else if (event.key === 'Escape') {
|
||||
event.preventDefault()
|
||||
handleCancel()
|
||||
}
|
||||
}
|
||||
|
||||
// 输入框失去焦点处理
|
||||
const handleBlur = () => {
|
||||
// 延迟处理,避免点击按钮时立即触发
|
||||
setTimeout(() => {
|
||||
if (isEditing.value) {
|
||||
handleSave()
|
||||
}
|
||||
}, 200)
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<!-- 当产物存在时才显示 -->
|
||||
<div v-if="currentOutput" class="card-item">
|
||||
<el-card
|
||||
class="card-item w-full relative output-object-card"
|
||||
:shadow="true"
|
||||
:id="`additional-output-${index}`"
|
||||
>
|
||||
<!-- 显示产物名称 -->
|
||||
<div class="text-start w-[100%]">
|
||||
<div class="text-[18px] font-bold text-[var(--color-text)] mb-2">
|
||||
{{ currentOutput }}
|
||||
</div>
|
||||
<div ref="inputRef">
|
||||
<el-input
|
||||
v-model="inputValue"
|
||||
:readonly="!isEditing"
|
||||
:placeholder="isEditing ? '请输入内容...' : '点击编辑图标开始编辑...'"
|
||||
@keydown="handleKeydown"
|
||||
@blur="handleBlur"
|
||||
:class="{ editing: isEditing }"
|
||||
>
|
||||
<template #suffix>
|
||||
<!-- 只读状态:显示编辑图标 -->
|
||||
<div v-if="!isEditing" class="flex items-center">
|
||||
<svg-icon
|
||||
icon-class="Edit"
|
||||
size="20px"
|
||||
class="cursor-pointer hover:text-[#409eff] transition-colors"
|
||||
@click="handleEditClick"
|
||||
title="点击编辑"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
</el-input>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.card-item {
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.output-object-card {
|
||||
:deep(.el-card__body) {
|
||||
min-height: 80px;
|
||||
display: flex;
|
||||
align-items: start;
|
||||
justify-content: start;
|
||||
}
|
||||
}
|
||||
|
||||
/* 输入框样式 */
|
||||
:deep(.el-input .el-input__wrapper) {
|
||||
box-shadow: none;
|
||||
background-color: var(--color-bg-three);
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
/* 编辑状态下的输入框样式 */
|
||||
:deep(.el-input.editing .el-input__wrapper) {
|
||||
border: 1px solid #dcdfe6;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
:deep(.el-input.editing .el-input__wrapper.is-focus) {
|
||||
border-color: #c0c4cc;
|
||||
box-shadow: 0 0 0 1px #c0c4cc;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user