对话记录和工作空间链路确认
This commit is contained in:
@@ -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">
|
||||
|
||||
@@ -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 ?? '');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user