对话记录和工作空间链路确认

This commit is contained in:
2026-07-07 16:00:08 +08:00
parent 4679280e45
commit 5f0d860d27
6 changed files with 144 additions and 140 deletions
+3 -3
View File
@@ -39,7 +39,7 @@
<div class="toolbar-right">
<span class="hint-text">Shift+Enter 换行</span>
<button class="send-btn" :disabled="!message.trim() && selectedWorkflowId === null" @click="handleSend">
<button class="send-btn" :disabled="selectedWorkflowId === null" @click="handleSend">
<el-icon><Top /></el-icon>
</button>
</div>
@@ -100,8 +100,8 @@ const fetchWorkflows = async () => {
};
const handleSend = () => {
if (selectedWorkflowId.value === null) return;
const msg = message.value.trim();
if (!msg && selectedWorkflowId.value === null) return;
emit('send', msg || '');
message.value = '';
selectedWorkflowId.value = null;
@@ -133,7 +133,7 @@ onMounted(() => {
fetchWorkflows();
});
defineExpose({ resetAll, clearWorkflow, selectedWorkflowId });
defineExpose({ resetAll, clearWorkflow, selectedWorkflowId, commonWorkflows });
</script>
<style scoped lang="scss">
+9 -5
View File
@@ -395,7 +395,10 @@ watch(
Object.keys(formValues).forEach((key) => delete formValues[key]);
Object.keys(fieldFiles).forEach((key) => delete fieldFiles[key]);
Object.keys(uploadingFields).forEach((key) => delete uploadingFields[key]);
templates.value = [];
// 尝试从执行详情恢复贴片模板
const ext = (detail as any)?.extension;
const restoredTemplates = ext?.templates || (detail as any)?.templates || detail?.flowContent?.templates || [];
templates.value = Array.isArray(restoredTemplates) ? restoredTemplates : [];
if (!detail?.nodeInputParams) return;
detail.nodeInputParams.forEach((node: any) => {
@@ -419,14 +422,15 @@ watch(
}
const key = getFieldKey(node, field);
const hasValue = field.value !== undefined && field.value !== null;
if (field.type === 'number' || field.type === 'inputNumber') {
formValues[key] = field.default ?? null;
formValues[key] = hasValue ? Number(field.value) : (field.default ?? null);
} else if (field.type === 'switch') {
formValues[key] = field.default ?? false;
formValues[key] = hasValue ? Boolean(field.value) : (field.default ?? false);
} else if (field.type === 'upload' || field.type === 'uploadMultiple' || field.type === 'fileUpload') {
formValues[key] = field.default ?? (field.type === 'upload' ? '' : []);
formValues[key] = hasValue ? field.value : (field.default ?? (field.type === 'upload' ? '' : []));
} else {
formValues[key] = field.default ?? '';
formValues[key] = hasValue ? field.value : (field.default ?? '');
}
});
});
+10 -43
View File
@@ -58,21 +58,15 @@
<div v-else class="panel-list">
<div v-for="dateNode in treeNodes" :key="dateNode.id" class="tree-date-group">
<div class="tree-date-label">{{ dateNode.label }}</div>
<div v-for="flowNode in dateNode.children" :key="flowNode.id" class="tree-flow-group">
<div class="tree-flow-label">
<el-icon><Promotion /></el-icon>
<span>{{ flowNode.label }}</span>
</div>
<div v-for="fileNode in flowNode.children" :key="fileNode.id" class="tree-file-item">
<el-icon class="file-type-icon">
<component :is="getFileIcon(fileNode.fileType)" />
</el-icon>
<span class="file-name">{{ fileNode.label }}</span>
<div v-if="fileNode.fileUrl" class="file-actions">
<button class="file-action-btn" @click.stop="handlePreviewNode(fileNode)">预览</button>
<button class="file-action-btn" @click.stop="handleDownloadNode(fileNode)">下载</button>
<button class="file-action-btn file-action-btn--del" @click.stop="handleDeleteNode(fileNode)">删除</button>
</div>
<div v-for="fileNode in dateNode.children" :key="fileNode.id" class="tree-file-item">
<el-icon class="file-type-icon">
<component :is="getFileIcon(fileNode.fileType)" />
</el-icon>
<span class="file-name">{{ fileNode.label }}</span>
<div v-if="fileNode.fileUrl" class="file-actions">
<button class="file-action-btn" @click.stop="handlePreviewNode(fileNode)">预览</button>
<button class="file-action-btn" @click.stop="handleDownloadNode(fileNode)">下载</button>
<button class="file-action-btn file-action-btn--del" @click.stop="handleDeleteNode(fileNode)">删除</button>
</div>
</div>
</div>
@@ -87,7 +81,7 @@
<script setup lang="ts">
import { ref } from 'vue';
import { Delete, ChatDotRound, ChatLineRound, EditPen, ArrowDown, Promotion, Document, VideoPlay, Headset, Picture, FolderOpened } from '@element-plus/icons-vue';
import { Delete, ChatDotRound, ChatLineRound, EditPen, ArrowDown, Document, VideoPlay, Headset, Picture, FolderOpened } from '@element-plus/icons-vue';
interface TreeNode {
id: string;
@@ -414,33 +408,6 @@ const handleDeleteNode = (data: TreeNode) => emit('delete-node', data);
text-transform: uppercase;
}
.tree-flow-group {
margin-bottom: 2px;
}
.tree-flow-label {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 8px;
border-radius: 6px;
font-size: 12px;
font-weight: 600;
color: #475569;
.el-icon {
font-size: 13px;
color: #7c3aed;
flex-shrink: 0;
}
span {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.tree-file-item {
display: flex;
align-items: center;