From 9101d260050f5119b1bc481c1b7ff1907a2e7892 Mon Sep 17 00:00:00 2001 From: lingniu Date: Sat, 18 Jul 2026 20:29:32 +0800 Subject: [PATCH] refine Semi UI track replay workspace --- .../apps/web/src/v2/pages/TrackPage.test.tsx | 11 +++- .../apps/web/src/v2/pages/TrackPage.tsx | 18 +++-- .../apps/web/src/v2/pages/UsersPage.test.tsx | 6 +- .../apps/web/src/v2/styles/workspace.css | 65 +++++++++++++++++-- 4 files changed, 81 insertions(+), 19 deletions(-) diff --git a/vehicle-data-platform/apps/web/src/v2/pages/TrackPage.test.tsx b/vehicle-data-platform/apps/web/src/v2/pages/TrackPage.test.tsx index d24c1da1..6f24a4d8 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/TrackPage.test.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/TrackPage.test.tsx @@ -106,7 +106,7 @@ test('keeps committed track criteria authoritative to same-route navigation and expect((await screen.findAllByText('粤A12345')).length).toBeGreaterThan(0); expect(screen.getByTestId('track-map')).toHaveAttribute('data-point-count', '3'); expect(screen.queryByRole('textbox', { name: '搜索轨迹车辆' })).not.toBeInTheDocument(); - expect(screen.getAllByText(/07-15 00:00/).length).toBeGreaterThan(0); + expect(screen.getByText(/07-15 00:00.*自动来源/)).toBeInTheDocument(); fireEvent.click(screen.getByRole('button', { name: '修改条件' })); expect(screen.getByRole('textbox', { name: '搜索轨迹车辆' })).toHaveValue('LTEST000000000001'); @@ -174,9 +174,12 @@ test('renders a map-first replay workspace and connects stop, event, and panel i expect((await screen.findAllByText('粤A12345')).length).toBeGreaterThan(0); expect(view.container.querySelector('.v2-track-rail-shell.semi-card')).toBeInTheDocument(); expect(screen.getByLabelText('轨迹查询任务栏')).toHaveClass('v2-workspace-command-bar', 'v2-track-query-header'); + expect(screen.getByLabelText('轨迹查询任务栏')).toHaveTextContent('粤A12345'); expect(screen.getByLabelText('轨迹查询任务栏')).toHaveTextContent('3 点'); expect(view.container.querySelector('.v2-track-query-panel')).toHaveClass('is-collapsed'); + expect(view.container.querySelector('.v2-track-query-summary')).not.toBeInTheDocument(); expect(view.container.querySelector('.v2-track-rail-result')).toBeInTheDocument(); + expect(view.container.querySelector('.v2-track-result-header')).toHaveTextContent('轨迹证据粤A12345 · LTEST0000000000018 km'); expect(screen.getByRole('button', { name: '修改条件' })).toHaveAttribute('aria-expanded', 'false'); expect(screen.queryByRole('textbox', { name: '搜索轨迹车辆' })).not.toBeInTheDocument(); expect(view.container.querySelector('.v2-track-current-card.semi-card')).toBeInTheDocument(); @@ -192,6 +195,8 @@ test('renders a map-first replay workspace and connects stop, event, and panel i expect(screen.getByRole('button', { name: /停留 00:05:00/ }).closest('.semi-list-item')).toHaveClass('v2-track-evidence-item'); expect(view.container.querySelector('.v2-track-evidence-list.semi-list')).toBeInTheDocument(); expect(screen.getByRole('slider', { name: '轨迹播放进度' })).toBeInTheDocument(); + expect(view.container.querySelector('.v2-track-dock-summary')).toHaveTextContent('行程里程8 km00:20:00 · 1 次停留'); + expect(view.container.querySelector('.v2-track-progress-meta')).toHaveTextContent('已暂停 · 数据点 1 / 3'); expect(screen.queryByRole('button', { name: '暂停轨迹播放' })).not.toBeInTheDocument(); await waitFor(() => expect(mocks.reverseGeocode).toHaveBeenCalledTimes(1)); expect(client.getQueryCache().findAll({ queryKey: ['track-address'] })).toHaveLength(1); @@ -216,6 +221,7 @@ test('renders a map-first replay workspace and connects stop, event, and panel i fireEvent.change(screen.getByRole('combobox', { name: '速度' }), { target: { value: '4' } }); fireEvent.click(screen.getByRole('button', { name: '开始轨迹播放' })); + expect(view.container.querySelector('.v2-track-progress-meta')).toHaveTextContent(/播放中 · 数据点 [12] \/ 3/); expect(screen.getByTestId('track-map')).toHaveAttribute('data-follow-duration', '65'); fireEvent.click(screen.getByRole('button', { name: '暂停轨迹播放' })); expect(screen.getByTestId('track-map')).toHaveAttribute('data-follow-duration', '180'); @@ -259,7 +265,8 @@ test('uses a Semi bottom SideSheet for mobile track criteria and evidence', asyn }); expect(sheet).toHaveClass('semi-sidesheet-inner'); expect(document.querySelector('.v2-track-detail-sidesheet .v2-track-rail')).toBeInTheDocument(); - expect(document.querySelector('.v2-track-detail-sidesheet .v2-track-query-summary')).toBeInTheDocument(); + expect(document.querySelector('.v2-track-detail-sidesheet .v2-track-query-summary')).not.toBeInTheDocument(); + expect(screen.getByLabelText('轨迹查询任务栏')).toHaveTextContent('粤A12345'); expect(screen.queryByRole('textbox', { name: '搜索轨迹车辆' })).not.toBeInTheDocument(); expect(screen.getByText('07-15 00:00 – 07-15 23:59 · 自动来源')).toBeInTheDocument(); expect(screen.getByText('8 km · 1 个停留 · 3 个事件')).toBeInTheDocument(); diff --git a/vehicle-data-platform/apps/web/src/v2/pages/TrackPage.tsx b/vehicle-data-platform/apps/web/src/v2/pages/TrackPage.tsx index 8eb76d2f..a1ba3836 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/TrackPage.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/TrackPage.tsx @@ -195,13 +195,14 @@ const TrackRail = memo(function TrackRail({ draft, track, loading, activeStopInd const choosePreset = (daysBack: number) => onDraft({ ...draft, ...trackWindow(daysBack, daysBack > 0) }); const appliedWindow = `${draft.dateFrom.replace('T', ' ').slice(5)} – ${draft.dateTo.replace('T', ' ').slice(5)}`; const appliedSource = draft.protocol || '自动来源'; + const contextTitle = queryCollapsed ? track?.plate || draft.keyword || '轨迹查询' : '轨迹查询'; return