diff --git a/vehicle-data-platform/apps/web/src/v2/pages/AccessPage.test.tsx b/vehicle-data-platform/apps/web/src/v2/pages/AccessPage.test.tsx index 4dadd886..883362d3 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/AccessPage.test.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/AccessPage.test.tsx @@ -52,9 +52,11 @@ test('removes old access rows immediately when the vehicle filter scope changes' expect(await screen.findByText('旧接入车牌')).toBeInTheDocument(); expect(screen.getByRole('heading', { name: '真实来源与接入健康', level: 5 })).toBeInTheDocument(); expect(screen.getByLabelText('接入管理操作')).toHaveClass('v2-workspace-command-bar', 'v2-access-command-bar'); - for (const className of ['v2-access-filter-card-v3', 'v2-access-kpis-card-v3', 'v2-access-table-v3']) { + expect(view.container.querySelector('.v2-access-discovery-shell')).toBeInTheDocument(); + for (const className of ['v2-access-filter-card-v3', 'v2-access-table-v3']) { expect(view.container.querySelector(`.${className}.semi-card`)).toBeInTheDocument(); } + expect(screen.getByRole('navigation', { name: '接入差异筛选' })).toHaveClass('v2-access-status-tabs'); const filterActions = view.container.querySelector('.v2-access-filter-actions'); expect(filterActions).toBeInTheDocument(); expect(within(filterActions!).getByRole('button', { name: '查询' })).toBeInTheDocument(); @@ -66,6 +68,7 @@ test('removes old access rows immediately when the vehicle filter scope changes' expect(desktopRow).toHaveAttribute('aria-expanded', 'false'); fireEvent.keyDown(desktopRow, { key: 'Enter' }); expect(await screen.findByRole('button', { name: '关闭车辆接入详情' })).toBeInTheDocument(); + expect(screen.getByRole('dialog', { name: '车辆接入详情' })).toBeInTheDocument(); expect(desktopRow).toHaveAttribute('aria-expanded', 'true'); const inspectorHeader = screen.getByRole('heading', { level: 5, name: '旧接入车牌' }).closest('.v2-workspace-panel-header'); expect(inspectorHeader).toBeInTheDocument(); @@ -143,9 +146,9 @@ test('renders mobile access vehicles as selectable Semi cards', async () => { expect(action.closest('.semi-card')).toHaveClass('v2-access-mobile-card'); expect(view.container.querySelector('.v2-access-table-scroll-v3.is-mobile-scroll')).toHaveAttribute('tabindex', '0'); expect(view.container.querySelector('.v2-access-table-scroll-v3.is-mobile-scroll')).toHaveAttribute('aria-label', '车辆接入列表,可上下滚动'); - expect(within(action).getByText('GB32960')).toBeInTheDocument(); - expect(within(action).getByText('JT808')).toBeInTheDocument(); - expect(within(action).getByText('YUTONG_MQTT')).toBeInTheDocument(); + expect(within(action).getByText('32960')).toBeInTheDocument(); + expect(within(action).getByText('808')).toBeInTheDocument(); + expect(within(action).getByText('宇通')).toBeInTheDocument(); expect(action).toHaveAttribute('aria-pressed', 'false'); expect(action).toHaveAttribute('aria-expanded', 'false'); fireEvent.click(action); diff --git a/vehicle-data-platform/apps/web/src/v2/pages/AccessPage.tsx b/vehicle-data-platform/apps/web/src/v2/pages/AccessPage.tsx index c29c35f5..1a5de412 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/AccessPage.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/AccessPage.tsx @@ -29,10 +29,27 @@ const connectionLabels: Record = { healthy: '已接来源正常', degraded: '部分来源异常', incomplete: '资料待维护', offline: '已接来源离线', not_connected: '尚无来源' }; +const scopeLabels: Record = { + '': '全部主车辆', + attention: '需关注车辆', + master_data: '资料待维护', + healthy: '已接来源正常', + degraded: '部分来源异常', + offline: '已接来源离线', + not_connected: '尚无来源' +}; + function statusByProtocol(row: AccessVehicleRow, protocol: string) { return row.protocolStatuses.find((item) => item.protocol === protocol); } +function compactProtocolLabel(protocol: string) { + if (protocol === 'GB32960') return '32960'; + if (protocol === 'JT808') return '808'; + if (protocol === 'YUTONG_MQTT') return '宇通'; + return protocol; +} + function compactTime(value: string) { if (!value) return '—'; const parsed = new Date(value); @@ -193,7 +210,7 @@ export default function AccessPage() { setOffset(0); }, [mobileLayout]); const rows = vehiclesQuery.data?.items ?? []; const selected = rows.find((row) => row.vin === selectedVIN); - useSideSheetA11y(mobileLayout && Boolean(selected), '.v2-access-detail-sidesheet', 'v2-access-detail', '车辆接入详情', '关闭车辆接入详情'); + useSideSheetA11y(Boolean(selected), '.v2-access-detail-sidesheet', 'v2-access-detail', '车辆接入详情', '关闭车辆接入详情'); useSideSheetA11y(editable && governanceOpen, '.v2-access-governance-sidesheet', 'v2-access-governance', '接入治理配置', '关闭接入治理配置'); const syncURL = (filters: Filters) => { const next = new URLSearchParams(); Object.entries(filters).forEach(([key, value]) => { if (value) next.set(key, value); }); setSearchParams(next, { replace: true }); }; const apply = (next: Filters) => { setDraft(next); setCriteria(next); setOffset(0); setSelectedVIN(''); syncURL(next); }; @@ -202,78 +219,80 @@ export default function AccessPage() { const refresh = () => Promise.all([summaryQuery.refetch(), vehiclesQuery.refetch(), ...(editable ? [unresolvedQuery.refetch(), thresholdQuery.refetch()] : [])]); return
- 数据时间 {summary?.asOf ? formatAccessTime(summary.asOf) : '—'}} - actions={<>{editable ? : null}} - /> - setFiltersCollapsed((value) => !value)} - > -
- - - + +