Skip to content

Commit 46152d3

Browse files
committed
fix: enhance PersonaForm layout and improve tool selection display
1 parent ed4cacf commit 46152d3

File tree

2 files changed

+72
-38
lines changed

2 files changed

+72
-38
lines changed

dashboard/src/components/shared/PersonaForm.vue

Lines changed: 53 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,30 @@
11
<template>
2-
<v-dialog
3-
v-model="showDialog"
4-
:max-width="$vuetify.display.smAndDown ? undefined : '760px'"
5-
scrollable
6-
>
2+
<v-dialog v-model="showDialog" :max-width="$vuetify.display.smAndDown ? undefined : '1200px'" scrollable>
73
<v-card class="persona-form-card" :class="{ 'persona-form-card-mobile': $vuetify.display.smAndDown }">
8-
<v-card-title class="persona-form-title text-h2">
4+
<v-card-title class="persona-form-title text-h2 px-6 pt-6 pl-6">
95
{{ editingPersona ? tm('dialog.edit.title') : tm('dialog.create.title') }}
106
</v-card-title>
117

128
<v-card-text class="persona-form-content">
139
<!-- 创建位置提示 -->
14-
<v-alert
15-
v-if="!editingPersona"
16-
type="info"
17-
variant="tonal"
18-
density="compact"
19-
class="mb-4"
20-
icon="mdi-folder-outline"
21-
>
10+
<v-alert v-if="!editingPersona" type="info" variant="tonal" density="compact" class="mb-4"
11+
icon="mdi-folder-outline">
2212
{{ tm('form.createInFolder', { folder: folderDisplayName }) }}
2313
</v-alert>
2414

2515
<v-form ref="personaForm" v-model="formValid">
26-
<v-text-field v-model="personaForm.persona_id" :label="tm('form.personaId')"
27-
:rules="personaIdRules" :disabled="editingPersona" variant="outlined" density="comfortable"
28-
class="mb-4" />
29-
30-
<v-textarea v-model="personaForm.system_prompt" :label="tm('form.systemPrompt')"
31-
:rules="systemPromptRules" variant="outlined" rows="6" class="mb-4" />
32-
33-
<v-expansion-panels v-model="expandedPanels" multiple>
16+
<v-row class="persona-form-layout">
17+
<v-col cols="12" md="6" class="persona-basic-col">
18+
<v-text-field v-model="personaForm.persona_id" :label="tm('form.personaId')"
19+
:rules="personaIdRules" :disabled="editingPersona" variant="outlined"
20+
density="comfortable" class="mb-4" />
21+
22+
<v-textarea v-model="personaForm.system_prompt" :label="tm('form.systemPrompt')"
23+
:rules="systemPromptRules" variant="outlined" rows="16" class="mb-4" />
24+
</v-col>
25+
26+
<v-col cols="12" md="6" class="persona-panels-col">
27+
<v-expansion-panels v-model="expandedPanels" multiple>
3428
<!-- 工具选择面板 -->
3529
<v-expansion-panel value="tools">
3630
<v-expansion-panel-title>
@@ -69,8 +63,8 @@
6963
<div class="d-flex flex-wrap ga-2">
7064
<v-chip v-for="server in mcpServers" :key="server.name"
7165
:color="isServerSelected(server) ? 'primary' : 'default'"
72-
:variant="isServerSelected(server) ? 'flat' : 'outlined'"
73-
size="small" clickable @click="toggleMcpServer(server)"
66+
:variant="isServerSelected(server) ? 'flat' : 'outlined'" size="small"
67+
clickable @click="toggleMcpServer(server)"
7468
:disabled="!server.tools || server.tools.length === 0">
7569
<v-icon start size="small">mdi-server</v-icon>
7670
{{ server.name }}
@@ -83,7 +77,7 @@
8377

8478
<!-- 工具选择列表 -->
8579
<div v-if="filteredTools.length > 0" class="tools-selection">
86-
<v-virtual-scroll :items="filteredTools" height="300" item-height="48">
80+
<v-virtual-scroll :items="filteredTools" height="300" item-height="72">
8781
<template v-slot:default="{ item }">
8882
<v-list-item :key="item.name" density="comfortable"
8983
@click="toggleTool(item.name)">
@@ -94,10 +88,16 @@
9488

9589
<v-list-item-title>
9690
{{ item.name }}
97-
<v-chip v-if="item.mcp_server_name" size="x-small"
98-
color="secondary" variant="tonal" class="ml-2">
99-
{{ item.mcp_server_name }}
91+
92+
<v-chip v-if="item.origin" size="x-small" color="info" class="mr-2"
93+
variant="tonal">
94+
{{ item.origin }}
95+
</v-chip>
96+
<v-chip v-if="item.origin_name" size="x-small" color="info"
97+
variant="outlined">
98+
{{ item.origin_name }}
10099
</v-chip>
100+
101101
</v-list-item-title>
102102

103103
<v-list-item-subtitle v-if="item.description">
@@ -112,7 +112,7 @@
112112
class="text-center pa-4">
113113
<v-icon size="48" color="grey-lighten-2" class="mb-2">mdi-tools</v-icon>
114114
<p class="text-body-2 text-medium-emphasis">{{ tm('form.noToolsAvailable')
115-
}}
115+
}}
116116
</p>
117117
</div>
118118

@@ -127,7 +127,7 @@
127127
<div v-if="loadingTools" class="text-center pa-4">
128128
<v-progress-circular indeterminate color="primary" />
129129
<p class="text-body-2 text-medium-emphasis mt-2">{{ tm('form.loadingTools')
130-
}}
130+
}}
131131
</p>
132132
</div>
133133

@@ -143,9 +143,9 @@
143143
</span>
144144
</h4>
145145
<div v-if="Array.isArray(personaForm.tools) && personaForm.tools.length > 0"
146-
class="d-flex flex-wrap ga-1" style="max-height: 100px; overflow-y: auto;">
147-
<v-chip v-for="toolName in personaForm.tools" :key="toolName"
148-
size="small" color="primary" variant="tonal" closable
146+
class="d-flex flex-wrap ga-1" style="max-height: 100px; overflow-y: auto;">
147+
<v-chip v-for="toolName in personaForm.tools" :key="toolName" size="small"
148+
color="primary" variant="tonal" closable
149149
@click:close="removeTool(toolName)">
150150
{{ toolName }}
151151
</v-chip>
@@ -209,7 +209,8 @@
209209

210210
<div v-else-if="!loadingSkills && availableSkills.length === 0"
211211
class="text-center pa-4">
212-
<v-icon size="48" color="grey-lighten-2" class="mb-2">mdi-lightning-bolt</v-icon>
212+
<v-icon size="48" color="grey-lighten-2"
213+
class="mb-2">mdi-lightning-bolt</v-icon>
213214
<p class="text-body-2 text-medium-emphasis">{{ tm('form.noSkillsAvailable') }}
214215
</p>
215216
</div>
@@ -288,7 +289,9 @@
288289
</v-btn>
289290
</v-expansion-panel-text>
290291
</v-expansion-panel>
291-
</v-expansion-panels>
292+
</v-expansion-panels>
293+
</v-col>
294+
</v-row>
292295
</v-form>
293296
</v-card-text>
294297

@@ -484,7 +487,7 @@ export default {
484487
};
485488
this.toolSelectValue = '0';
486489
this.skillSelectValue = '0';
487-
this.expandedPanels = [];
490+
this.expandedPanels = this.getDefaultExpandedPanels();
488491
},
489492
490493
initFormWithPersona(persona) {
@@ -499,7 +502,11 @@ export default {
499502
// 根据 tools 的值设置 toolSelectValue
500503
this.toolSelectValue = persona.tools === null ? '0' : '1';
501504
this.skillSelectValue = persona.skills === null ? '0' : '1';
502-
this.expandedPanels = [];
505+
this.expandedPanels = this.getDefaultExpandedPanels();
506+
},
507+
508+
getDefaultExpandedPanels() {
509+
return this.$vuetify.display.smAndDown ? [] : ['tools', 'skills', 'dialogs'];
503510
},
504511
505512
closeDialog() {
@@ -829,6 +836,10 @@ export default {
829836
margin-left: 32px;
830837
}
831838
839+
.persona-form-layout {
840+
align-items: flex-start;
841+
}
842+
832843
.tools-selection {
833844
max-height: 300px;
834845
overflow-y: auto;
@@ -853,6 +864,11 @@ export default {
853864
padding: 16px !important;
854865
}
855866
867+
.persona-basic-col,
868+
.persona-panels-col {
869+
padding-top: 0 !important;
870+
}
871+
856872
.persona-form-title {
857873
font-size: 1.15rem !important;
858874
padding: 12px 16px !important;

dashboard/src/views/persona/PersonaManager.vue

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,18 @@
117117
<v-card v-if="viewingPersona">
118118
<v-card-title class="d-flex justify-space-between align-center">
119119
<span class="text-h5">{{ viewingPersona.persona_id }}</span>
120-
<v-btn icon="mdi-close" variant="text" @click="showViewDialog = false" />
120+
<div class="d-flex align-center ga-1">
121+
<v-btn
122+
color="primary"
123+
variant="tonal"
124+
size="small"
125+
prepend-icon="mdi-pencil"
126+
@click="openEditFromViewDialog"
127+
>
128+
{{ tm('buttons.edit') }}
129+
</v-btn>
130+
<v-btn icon="mdi-close" variant="text" @click="showViewDialog = false" />
131+
</div>
121132
</v-card-title>
122133

123134
<v-card-text>
@@ -414,6 +425,13 @@ export default defineComponent({
414425
this.showViewDialog = true;
415426
},
416427
428+
openEditFromViewDialog() {
429+
if (!this.viewingPersona) return;
430+
this.editingPersona = this.viewingPersona;
431+
this.showViewDialog = false;
432+
this.showPersonaDialog = true;
433+
},
434+
417435
handlePersonaSaved(message: string) {
418436
this.showSuccess(message);
419437
this.refreshCurrentFolder();

0 commit comments

Comments
 (0)