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 30fb0513..30ddcf44 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 @@ -171,8 +171,10 @@ test('renders mobile access vehicles as selectable Semi cards', async () => { expect(within(action).getByText('宇通')).toBeInTheDocument(); expect(screen.queryByLabelText('每页车辆数')).not.toBeInTheDocument(); expect(screen.getByRole('button', { name: '打开接入治理' })).toHaveTextContent('治理'); + expect(screen.getByRole('button', { name: '打开接入治理' })).toHaveClass('v2-workspace-mobile-tool-button', 'is-muted'); const toolsButton = screen.getByRole('button', { name: '打开接入管理工具' }); expect(toolsButton).toHaveTextContent('工具'); + expect(toolsButton).toHaveClass('v2-workspace-mobile-tool-button', 'is-muted'); expect(screen.queryByRole('menuitem', { name: /导出当前页/ })).not.toBeInTheDocument(); fireEvent.click(toolsButton); await waitFor(() => expect(toolsButton).toHaveAttribute('aria-expanded', 'true')); 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 c1dcf243..6027f5fa 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/AccessPage.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/AccessPage.tsx @@ -267,7 +267,7 @@ export default function AccessPage() { status={summary ? `${summary.totalVehicles.toLocaleString('zh-CN')} 辆主车辆` : '正在读取车辆'} meta={数据时间 } actions={mobileLayout ? <> - {editable ? : null} + {editable ? : null} } onClick={() => { setMobileToolsOpen(false); void refresh(); }}>刷新数据 } > - + : <>{editable ? : null}} /> diff --git a/vehicle-data-platform/apps/web/src/v2/pages/HistoryPage.test.tsx b/vehicle-data-platform/apps/web/src/v2/pages/HistoryPage.test.tsx index c0dbd954..b3585a28 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/HistoryPage.test.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/HistoryPage.test.tsx @@ -216,7 +216,9 @@ test('renders only selectable Semi history cards on mobile', async () => { expect(view.container.querySelector('.v2-history-side')).not.toBeInTheDocument(); expect(mocks.historyExports).not.toHaveBeenCalled(); expect(screen.getByRole('button', { name: '展开趋势' })).toHaveTextContent('趋势'); + expect(screen.getByRole('button', { name: '展开趋势' })).toHaveClass('v2-workspace-mobile-tool-button', 'is-muted'); expect(screen.getByRole('button', { name: '打开历史数据工具' })).toHaveTextContent('工具'); + expect(screen.getByRole('button', { name: '打开历史数据工具' })).toHaveClass('v2-workspace-mobile-tool-button', 'is-muted'); expect(screen.queryByText('坐标、速度、里程及设备/服务时间通过基础校验')).not.toBeInTheDocument(); fireEvent.click(action); expect(action).toHaveAttribute('aria-pressed', 'true'); diff --git a/vehicle-data-platform/apps/web/src/v2/pages/HistoryPage.tsx b/vehicle-data-platform/apps/web/src/v2/pages/HistoryPage.tsx index 81b87d81..d07b609d 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/HistoryPage.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/HistoryPage.tsx @@ -430,7 +430,7 @@ export default function HistoryPage() { meta={{visibleMetrics.length} / {allMetrics.length} 字段{resultSummary ? {resultSummary.queryDurationMs} ms : null}} actionsClassName={`v2-history-result-actions${mobileLayout ? ' is-mobile-actions' : ''}`} actions={mobileLayout ? <> - + } onClick={() => { setMobileToolsOpen(false); void dataQuery.refetch(); }}>刷新数据 } > - + : <> diff --git a/vehicle-data-platform/apps/web/src/v2/pages/OperationsPage.test.tsx b/vehicle-data-platform/apps/web/src/v2/pages/OperationsPage.test.tsx index b19290f6..693b99f6 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/OperationsPage.test.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/OperationsPage.test.tsx @@ -71,6 +71,7 @@ test('renders reconciliation queue, loads evidence on demand and records review expect(await screen.findByText('质量问题队列')).toBeInTheDocument(); expect(screen.getByRole('heading', { name: '运行与数据质量', level: 5 })).toBeInTheDocument(); expect(screen.getByLabelText('运维质量操作')).toHaveClass('v2-workspace-command-bar', 'v2-ops-command-bar'); + expect(screen.getByRole('button', { name: '刷新全局证据' })).toHaveClass('v2-workspace-mobile-tool-button', 'is-muted'); const navigation = screen.getByRole('navigation', { name: '运维质量视图' }); expect(navigation).toHaveClass('v2-ops-navigation'); expect(within(navigation).getByText('每日自动对账')).toBeInTheDocument(); @@ -87,6 +88,8 @@ test('renders reconciliation queue, loads evidence on demand and records review expect(screen.queryByText('活跃问题', { exact: true })).not.toBeInTheDocument(); expect(screen.queryByText('近 30 天趋势')).not.toBeInTheDocument(); const trendButton = screen.getByRole('button', { name: '30 天趋势' }); + expect(trendButton).toHaveClass('v2-workspace-mobile-tool-button', 'is-muted'); + expect(screen.getByRole('button', { name: '刷新结果' })).toHaveClass('v2-workspace-mobile-tool-button', 'is-muted'); expect(trendButton).toHaveAttribute('aria-expanded', 'false'); fireEvent.click(trendButton); expect(screen.getByText('近 30 天趋势').closest('.semi-card')).toHaveClass('v2-reconcile-trend'); @@ -148,6 +151,8 @@ test('renders only the compact mobile reconciliation surface and defers secondar fireEvent.click(mobileIssueAction); expect(await screen.findByRole('dialog', { name: '差异证据与处置' })).toBeInTheDocument(); expect(document.querySelector('.v2-reconcile-detail-sidesheet .v2-reconcile-detail.is-sheet')).toBeInTheDocument(); + expect(document.querySelector('.v2-reconcile-detail-sidesheet')).toHaveClass('semi-sidesheet-bottom'); + expect(document.querySelector('.v2-reconcile-detail-sidesheet .semi-sidesheet-inner')).toHaveStyle({ height: 'min(84dvh, 740px)' }); expect(await screen.findByRole('button', { name: '关闭差异详情' })).toBeInTheDocument(); expect(mobileIssueAction).toHaveAttribute('aria-expanded', 'true'); fireEvent.click(screen.getByRole('button', { name: '关闭差异详情' })); @@ -161,6 +166,8 @@ test('renders only the compact mobile reconciliation surface and defers secondar expect(screen.queryByText('近 30 天趋势')).not.toBeInTheDocument(); fireEvent.click(screen.getByRole('button', { name: '30 天趋势' })); expect(await screen.findByRole('dialog', { name: '30 天差异趋势' })).toBeInTheDocument(); + expect(document.querySelector('.v2-reconcile-trend-sidesheet')).toHaveClass('semi-sidesheet-bottom'); + expect(document.querySelector('.v2-reconcile-trend-sidesheet .semi-sidesheet-inner')).toHaveStyle({ height: 'min(62dvh, 560px)' }); const trend = screen.getByText('近 30 天趋势').closest('.v2-reconcile-trend'); expect(trend).toBeInTheDocument(); expect(screen.getByText(/最近运行/)).toBeInTheDocument(); diff --git a/vehicle-data-platform/apps/web/src/v2/pages/OperationsPage.tsx b/vehicle-data-platform/apps/web/src/v2/pages/OperationsPage.tsx index 389a7d3a..d59b3581 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/OperationsPage.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/OperationsPage.tsx @@ -375,7 +375,7 @@ export default function OperationsPage() { status={data?.runtime.dataMode === 'production' ? '生产模式' : '状态待确认'} statusColor={data?.runtime.dataMode === 'production' ? 'green' : 'orange'} meta={上海时间 · {data?.runtime.platformRelease ? `版本 ${data.runtime.platformRelease}` : '正在读取运行版本'}} - actions={} + actions={} />