|
|
@ -13,7 +13,7 @@ |
|
|
:pagination="{ current: currentPage, total: total, pageSize: pageSize, showJumper: true }" @page-change="onPageChange" @sort-change="onSortChange"> |
|
|
:pagination="{ current: currentPage, total: total, pageSize: pageSize, showJumper: true }" @page-change="onPageChange" @sort-change="onSortChange"> |
|
|
<template #transport_type="{ row }"><t-tag size="small" :theme="row.transport_type==='sse'?'primary':'default'" variant="light">{{ row.transport_type==='sse'?'SSE':'Stdio' }}</t-tag></template> |
|
|
<template #transport_type="{ row }"><t-tag size="small" :theme="row.transport_type==='sse'?'primary':'default'" variant="light">{{ row.transport_type==='sse'?'SSE':'Stdio' }}</t-tag></template> |
|
|
<template #displayUrl="{ row }"><span class="ellipsis" :title="getDisplayUrl(row)">{{ getDisplayUrl(row)||'-' }}</span></template> |
|
|
<template #displayUrl="{ row }"><span class="ellipsis" :title="getDisplayUrl(row)">{{ getDisplayUrl(row)||'-' }}</span></template> |
|
|
<template #is_active="{ row }"><t-switch v-model="row._active" size="small" @change="toggleActive(row)" /></template> |
|
|
|
|
|
|
|
|
<template #is_active="{ row }"><t-switch v-model="row._active" size="small" :disabled="!!row._toggling" @change="toggleActive(row)" /></template> |
|
|
<template #op="{ row }"> |
|
|
<template #op="{ row }"> |
|
|
<t-space :size="4"> |
|
|
<t-space :size="4"> |
|
|
<t-button size="small" variant="text" @click="testConnection(row)" :disabled="testLoading[row.id]">{{ testLoading[row.id]?'测试中...':'测试' }}</t-button> |
|
|
<t-button size="small" variant="text" @click="testConnection(row)" :disabled="testLoading[row.id]">{{ testLoading[row.id]?'测试中...':'测试' }}</t-button> |
|
|
@ -108,8 +108,11 @@ async function save(){ |
|
|
async function remove(id:string,name:string){if(!await confirm('确定删除「'+(name||id)+'」?'))return |
|
|
async function remove(id:string,name:string){if(!await confirm('确定删除「'+(name||id)+'」?'))return |
|
|
try{const r=await api.deleteMcpServer(id);if(r.success){toast('删除成功','success');load(currentPage.value)}else toast(r.message||'删除失败','error')}catch(e:any){toast('删除失败:'+e.message,'error')}} |
|
|
try{const r=await api.deleteMcpServer(id);if(r.success){toast('删除成功','success');load(currentPage.value)}else toast(r.message||'删除失败','error')}catch(e:any){toast('删除失败:'+e.message,'error')}} |
|
|
|
|
|
|
|
|
async function toggleActive(s:any){const na=!s.is_active |
|
|
|
|
|
try{const r=await api.toggleMcpServer(s.id,na);if(r.success){toast(na?'已启用':'已禁用','success');s.is_active=na;s._active=na}else toast(r.message||'操作失败','error')}catch(e:any){toast('操作失败:'+e.message,'error')}} |
|
|
|
|
|
|
|
|
async function toggleActive(s:any){ |
|
|
|
|
|
if(s._toggling)return // 防连点:上一次请求未返回前忽略新切换 |
|
|
|
|
|
const na=!s.is_active |
|
|
|
|
|
s._toggling=true |
|
|
|
|
|
try{const r=await api.toggleMcpServer(s.id,na);if(r.success){toast(na?'已启用':'已禁用','success');s.is_active=na;s._active=na}else{s._active=s.is_active;toast(r.message||'操作失败','error')}}catch(e:any){s._active=s.is_active;toast('操作失败:'+e.message,'error')}finally{s._toggling=false}} |
|
|
|
|
|
|
|
|
async function testConnection(s:any){testLoading.value={...testLoading.value,[s.id]:true} |
|
|
async function testConnection(s:any){testLoading.value={...testLoading.value,[s.id]:true} |
|
|
try{const r=await api.testMcpServer(s.id);showResult(r)}catch(e:any){showResult({success:false,message:e.message})}finally{testLoading.value={...testLoading.value,[s.id]:false}}} |
|
|
try{const r=await api.testMcpServer(s.id);showResult(r)}catch(e:any){showResult({success:false,message:e.message})}finally{testLoading.value={...testLoading.value,[s.id]:false}}} |
|
|
|