feat(frontend): improve provider detail drawer and pool actions

This commit is contained in:
elky
2026-07-25 11:16:59 +08:00
parent 387134ca87
commit 764e9fd131
10 changed files with 158 additions and 31 deletions
@@ -90,6 +90,8 @@
size="icon"
class="h-8 w-8 shrink-0"
:title="action.title"
@pointerenter="action.key === 'viewProvider' && emit('prefetchProvider')"
@focus="action.key === 'viewProvider' && emit('prefetchProvider')"
@click="emit(action.event)"
>
<component
@@ -249,6 +251,8 @@
class="h-8 w-8"
:data-testid="action.key === 'demandMetrics' ? 'pool-demand-metrics-button' : undefined"
:title="action.title"
@pointerenter="action.key === 'viewProvider' && emit('prefetchProvider')"
@focus="action.key === 'viewProvider' && emit('prefetchProvider')"
@click="emit(action.event)"
>
<component
@@ -329,6 +333,7 @@ import {
Settings2,
SlidersHorizontal,
SquareCheckBig,
Upload,
} from 'lucide-vue-next'
import {
Button,
@@ -352,12 +357,14 @@ import {
} from '@/features/pool/utils/poolBatchActions'
type HeaderActionEvent =
| 'import'
| 'scheduling'
| 'viewProvider'
| 'demandMetrics'
| 'advanced'
type HeaderActionKey =
| 'import'
| 'scheduling'
| 'viewProvider'
| 'demandMetrics'
@@ -395,6 +402,8 @@ const emit = defineEmits<{
'update:providerId': [value: string]
'update:status': [value: string]
'update:search': [value: string]
import: []
prefetchProvider: []
scheduling: []
viewProvider: []
demandMetrics: []
@@ -428,6 +437,7 @@ const selectedCountLabel = computed(() => legacyT(`已选 ${Math.max(0, props.se
const mobileActions = computed<HeaderAction[]>(() => {
const actions: HeaderAction[] = [
{ key: 'viewProvider', title: legacyT('查看详情'), event: 'viewProvider', icon: Eye },
{ key: 'import', title: legacyT('导入账号'), event: 'import', icon: Upload },
{ key: 'scheduling', title: legacyT('号池调度'), event: 'scheduling', icon: SlidersHorizontal },
]
if (props.showAdaptiveHotPoolMetricsButton) {
@@ -442,6 +452,7 @@ const mobileActions = computed<HeaderAction[]>(() => {
const desktopActions = computed<HeaderAction[]>(() => {
const actions: HeaderAction[] = [
{ key: 'viewProvider', title: legacyT('查看详情'), event: 'viewProvider', icon: Eye },
{ key: 'import', title: legacyT('导入账号'), event: 'import', icon: Upload },
]
if (props.showAdaptiveHotPoolMetricsButton) {
actions.push({ key: 'demandMetrics', title: legacyT('查看自适应热池指标'), event: 'demandMetrics', icon: Activity })
@@ -35,6 +35,8 @@ describe('PoolManagementHeader', () => {
refreshLoading: false,
refreshTitle: '刷新',
onViewProvider: () => events.push('viewProvider'),
onImport: () => events.push('import'),
onPrefetchProvider: () => events.push('prefetchProvider'),
onScheduling: () => events.push('scheduling'),
onDemandMetrics: () => events.push('demandMetrics'),
onAdvanced: () => events.push('advanced'),
@@ -51,7 +53,10 @@ describe('PoolManagementHeader', () => {
app.use(createI18n())
app.mount(root)
root.querySelector<HTMLButtonElement>('[title="查看详情"]')?.click()
const mobileViewProviderButton = root.querySelector<HTMLButtonElement>('[title="查看详情"]')
mobileViewProviderButton?.dispatchEvent(new Event('pointerenter'))
mobileViewProviderButton?.click()
root.querySelector<HTMLButtonElement>('[title="导入账号"]')?.click()
root.querySelector<HTMLButtonElement>('[title="点击调整号池调度"]')?.click()
root.querySelector<HTMLButtonElement>('[title="查看自适应热池指标"]')?.click()
const desktopActions = root.querySelector('[data-testid="pool-header-actions"]')
@@ -67,7 +72,9 @@ describe('PoolManagementHeader', () => {
root.querySelector<HTMLButtonElement>('[title="刷新"]')?.click()
expect(events).toEqual([
'prefetchProvider',
'viewProvider',
'import',
'scheduling',
'demandMetrics',
'advanced',
@@ -75,8 +82,11 @@ describe('PoolManagementHeader', () => {
'batchAction:refresh_quota',
'refresh',
])
const viewProviderButton = desktopActions?.querySelector<HTMLButtonElement>('[title="查看详情"]')
const importButton = desktopActions?.querySelector<HTMLButtonElement>('[title="导入账号"]')
expect(selectAllButton?.textContent?.trim()).toBe('')
expect(selectAllButton?.getAttribute('title')).toBe('全选')
expect(viewProviderButton?.nextElementSibling).toBe(importButton)
expect(advancedButton?.nextElementSibling).toBe(selectAllButton)
expect(selectAllButton?.nextElementSibling).toBe(batchActionsButton)
expect(batchActionsButton?.getAttribute('title')).toBe('选择执行动作')