feat(web): 优化智能体管理分组展示
This commit is contained in:
parent
b991d4d75d
commit
07137be6db
@ -240,11 +240,11 @@ const showCopiedFeedback = (btn) => {
|
|||||||
|
|
||||||
cite {
|
cite {
|
||||||
position: relative;
|
position: relative;
|
||||||
margin-left: 4px;
|
margin: 0 4px;
|
||||||
padding: 0 0.25rem;
|
padding: 0 0.25rem;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
outline: 2px solid var(--gray-200);
|
outline: 2px solid var(--gray-100);
|
||||||
background-color: var(--gray-200);
|
background-color: var(--gray-100);
|
||||||
color: var(--gray-800);
|
color: var(--gray-800);
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
|
|||||||
@ -103,6 +103,15 @@ const filteredAgents = computed(() => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const groupedAgents = computed(() => {
|
||||||
|
const agents = filteredAgents.value.filter((agent) => !agent.is_subagent)
|
||||||
|
const subagents = filteredAgents.value.filter((agent) => agent.is_subagent)
|
||||||
|
return [
|
||||||
|
{ key: 'agents', title: '智能体', agents },
|
||||||
|
{ key: 'subagents', title: '子智能体', agents: subagents }
|
||||||
|
].filter((group) => group.agents.length > 0)
|
||||||
|
})
|
||||||
|
|
||||||
const agentStats = computed(() => ({
|
const agentStats = computed(() => ({
|
||||||
total: managedAgents.value.length,
|
total: managedAgents.value.length,
|
||||||
builtin: managedAgents.value.filter(isBuiltinAgent).length,
|
builtin: managedAgents.value.filter(isBuiltinAgent).length,
|
||||||
@ -394,62 +403,76 @@ defineExpose({
|
|||||||
</template>
|
</template>
|
||||||
</PageShoulder>
|
</PageShoulder>
|
||||||
|
|
||||||
<ExtensionCardGrid :min-width="320">
|
<div v-if="groupedAgents.length === 0" class="agent-empty-state">
|
||||||
<InfoCard
|
<a-empty :image="false" :description="searchQuery ? '没有匹配的智能体' : '暂无智能体'" />
|
||||||
v-for="agent in filteredAgents"
|
</div>
|
||||||
:key="agent.id"
|
|
||||||
:title="agent.name"
|
|
||||||
:subtitle="agent.slug || agent.id"
|
|
||||||
:description="agent.description || '暂无描述'"
|
|
||||||
:default-icon="Bot"
|
|
||||||
:tags="getAgentTags(agent)"
|
|
||||||
class="config-card agent-card"
|
|
||||||
@click="canManageAgent(agent) && openEditAgentModal(agent)"
|
|
||||||
>
|
|
||||||
<template #icon>
|
|
||||||
<img
|
|
||||||
v-if="getAgentIconSrc(agent)"
|
|
||||||
class="agent-card-icon-image"
|
|
||||||
:src="getAgentIconSrc(agent)"
|
|
||||||
:alt="`${agent.name || '智能体'}图标`"
|
|
||||||
/>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template #status>
|
<template v-else>
|
||||||
<a-dropdown v-if="canManageAgent(agent)" :trigger="['click']" placement="bottomRight">
|
<section v-for="group in groupedAgents" :key="group.key" class="agent-group-section">
|
||||||
<template #overlay>
|
<div class="agent-group-header">
|
||||||
<a-menu>
|
<span>{{ group.title }}</span>
|
||||||
<a-menu-item key="edit" @click.stop="openEditAgentModal(agent)">
|
</div>
|
||||||
<span class="agent-card-menu-item">
|
<ExtensionCardGrid :min-width="320">
|
||||||
<Edit3 :size="14" />
|
<InfoCard
|
||||||
编辑智能体
|
v-for="agent in group.agents"
|
||||||
</span>
|
:key="agent.id"
|
||||||
</a-menu-item>
|
:title="agent.name"
|
||||||
<a-menu-item
|
:subtitle="agent.slug || agent.id"
|
||||||
key="delete"
|
:description="agent.description || '暂无描述'"
|
||||||
:disabled="isBuiltinAgent(agent)"
|
:default-icon="Bot"
|
||||||
@click.stop="deleteAgent(agent)"
|
:tags="getAgentTags(agent)"
|
||||||
>
|
class="config-card agent-card"
|
||||||
<span class="agent-card-menu-item" :class="{ danger: !isBuiltinAgent(agent) }">
|
@click="canManageAgent(agent) && openEditAgentModal(agent)"
|
||||||
<Trash2 :size="14" />
|
>
|
||||||
删除智能体
|
<template #icon>
|
||||||
</span>
|
<img
|
||||||
</a-menu-item>
|
v-if="getAgentIconSrc(agent)"
|
||||||
</a-menu>
|
class="agent-card-icon-image"
|
||||||
|
:src="getAgentIconSrc(agent)"
|
||||||
|
:alt="`${agent.name || '智能体'}图标`"
|
||||||
|
/>
|
||||||
</template>
|
</template>
|
||||||
<a-button
|
|
||||||
type="text"
|
<template #status>
|
||||||
size="small"
|
<a-dropdown v-if="canManageAgent(agent)" :trigger="['click']" placement="bottomRight">
|
||||||
class="agent-card-menu-trigger"
|
<template #overlay>
|
||||||
aria-label="智能体操作"
|
<a-menu>
|
||||||
@click.stop
|
<a-menu-item key="edit" @click.stop="openEditAgentModal(agent)">
|
||||||
>
|
<span class="agent-card-menu-item">
|
||||||
<MoreVertical :size="16" />
|
<Edit3 :size="14" />
|
||||||
</a-button>
|
编辑智能体
|
||||||
</a-dropdown>
|
</span>
|
||||||
</template>
|
</a-menu-item>
|
||||||
</InfoCard>
|
<a-menu-item
|
||||||
</ExtensionCardGrid>
|
key="delete"
|
||||||
|
:disabled="isBuiltinAgent(agent)"
|
||||||
|
@click.stop="deleteAgent(agent)"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="agent-card-menu-item"
|
||||||
|
:class="{ danger: !isBuiltinAgent(agent) }"
|
||||||
|
>
|
||||||
|
<Trash2 :size="14" />
|
||||||
|
删除智能体
|
||||||
|
</span>
|
||||||
|
</a-menu-item>
|
||||||
|
</a-menu>
|
||||||
|
</template>
|
||||||
|
<a-button
|
||||||
|
type="text"
|
||||||
|
size="small"
|
||||||
|
class="agent-card-menu-trigger"
|
||||||
|
aria-label="智能体操作"
|
||||||
|
@click.stop
|
||||||
|
>
|
||||||
|
<MoreVertical :size="16" />
|
||||||
|
</a-button>
|
||||||
|
</a-dropdown>
|
||||||
|
</template>
|
||||||
|
</InfoCard>
|
||||||
|
</ExtensionCardGrid>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
<!-- Agent Edit Modal -->
|
<!-- Agent Edit Modal -->
|
||||||
<a-modal
|
<a-modal
|
||||||
@ -617,6 +640,30 @@ defineExpose({
|
|||||||
min-height: 0;
|
min-height: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.agent-empty-state {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 100px 20px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.agent-group-section + .agent-group-section {
|
||||||
|
padding-top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.agent-group-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
padding: 12px var(--page-padding) 0;
|
||||||
|
color: var(--gray-500);
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 0.4px;
|
||||||
|
line-height: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
.agent-card-icon-image {
|
.agent-card-icon-image {
|
||||||
display: block;
|
display: block;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user