From b56769512fc2404f1e5405aef15622884ae3dd9b Mon Sep 17 00:00:00 2001 From: wangbo Date: Mon, 3 Aug 2026 15:43:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E9=BB=98=E8=AE=A4=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E5=AE=9E=E6=97=B6=E8=B4=9F=E8=BD=BD=E7=A6=81=E7=94=A8?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实时负载默认仅展示平台和模型均启用的来源,并增加全部状态、仅看禁用筛选及重置行为测试。 --- .../src/pages/admin/RealtimeLoadPanel.test.ts | 18 ++++++++++++++ .../web/src/pages/admin/RealtimeLoadPanel.tsx | 24 ++++++++++++++++--- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/apps/web/src/pages/admin/RealtimeLoadPanel.test.ts b/apps/web/src/pages/admin/RealtimeLoadPanel.test.ts index 5ab07f3..08de3ab 100644 --- a/apps/web/src/pages/admin/RealtimeLoadPanel.test.ts +++ b/apps/web/src/pages/admin/RealtimeLoadPanel.test.ts @@ -37,6 +37,7 @@ describe('filterAndSortRealtimeLoad', () => { const result = filterAndSortRealtimeLoad(statuses, platforms, { query: '平台', platformId: '', + availability: 'enabled', modelType: '', runtimeState: '', sortField: 'load', @@ -50,6 +51,7 @@ describe('filterAndSortRealtimeLoad', () => { const queued = filterAndSortRealtimeLoad(statuses, platforms, { query: '', platformId: '', + availability: 'enabled', modelType: 'image_generate', runtimeState: 'queued', sortField: 'queued', @@ -59,6 +61,7 @@ describe('filterAndSortRealtimeLoad', () => { const attention = filterAndSortRealtimeLoad(statuses, platforms, { query: '', platformId: '', + availability: 'all', modelType: '', runtimeState: 'attention', sortField: 'load', @@ -69,4 +72,19 @@ describe('filterAndSortRealtimeLoad', () => { expect(attention.map((item) => item.platformModelId)).toEqual(['model-b']); expect(statuses.map((item) => item.platformModelId)).toEqual(['model-a', 'model-b']); }); + + it('hides disabled entries by default and supports all or disabled-only filters', () => { + const base = { + query: '', + platformId: '', + modelType: '', + runtimeState: '', + sortField: 'load' as const, + sortDirection: 'desc' as const, + now: Date.now(), + }; + expect(filterAndSortRealtimeLoad(statuses, platforms, { ...base, availability: 'enabled' }).map((item) => item.platformModelId)).toEqual(['model-a']); + expect(filterAndSortRealtimeLoad(statuses, platforms, { ...base, availability: 'all' }).map((item) => item.platformModelId)).toEqual(['model-b', 'model-a']); + expect(filterAndSortRealtimeLoad(statuses, platforms, { ...base, availability: 'disabled' }).map((item) => item.platformModelId)).toEqual(['model-b']); + }); }); diff --git a/apps/web/src/pages/admin/RealtimeLoadPanel.tsx b/apps/web/src/pages/admin/RealtimeLoadPanel.tsx index 6ac375d..7b18f35 100644 --- a/apps/web/src/pages/admin/RealtimeLoadPanel.tsx +++ b/apps/web/src/pages/admin/RealtimeLoadPanel.tsx @@ -19,6 +19,7 @@ export function RealtimeLoadPanel(props: { const [restoreSavingId, setRestoreSavingId] = useState(null); const [query, setQuery] = useState(''); const [platformId, setPlatformId] = useState(''); + const [availability, setAvailability] = useState('enabled'); const [modelType, setModelType] = useState(''); const [runtimeState, setRuntimeState] = useState(''); const [sortField, setSortField] = useState('load'); @@ -33,21 +34,22 @@ export function RealtimeLoadPanel(props: { () => filterAndSortRealtimeLoad(props.modelRateLimits, platformMap, { query, platformId, + availability, modelType, runtimeState, sortField, sortDirection, now, }), - [modelType, now, platformId, platformMap, props.modelRateLimits, query, runtimeState, sortDirection, sortField], + [availability, modelType, now, platformId, platformMap, props.modelRateLimits, query, runtimeState, sortDirection, sortField], ); - const hasActiveFilters = Boolean(query || platformId || modelType || runtimeState); + const hasActiveFilters = Boolean(query || platformId || modelType || runtimeState || availability !== 'all'); const advancedFilterCount = [ modelType, runtimeState, sortDirection === 'desc' ? '' : sortDirection, ].filter(Boolean).length; - const hasActiveSettings = Boolean(query || platformId || advancedFilterCount || sortField !== 'load'); + const hasActiveSettings = Boolean(query || platformId || availability !== 'enabled' || advancedFilterCount || sortField !== 'load'); useEffect(() => { const timer = window.setInterval(() => setNow(Date.now()), 1000); @@ -112,6 +114,7 @@ export function RealtimeLoadPanel(props: { function resetFilters() { setQuery(''); setPlatformId(''); + setAvailability('enabled'); setModelType(''); setRuntimeState(''); setSortField('load'); @@ -153,6 +156,15 @@ export function RealtimeLoadPanel(props: { +