diff --git a/vehicle-data-platform/apps/web/src/v2/pages/MonitorPage.test.tsx b/vehicle-data-platform/apps/web/src/v2/pages/MonitorPage.test.tsx index a853dc2c..b4b4a599 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/MonitorPage.test.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/MonitorPage.test.tsx @@ -179,6 +179,26 @@ test('pastes, deduplicates, and submits multiple plates as one batch search', as }); }); +test('opens an explicit batch editor and applies copied plate rows', async () => { + const vehicleRealtime = vi.spyOn(api, 'vehicleRealtime').mockResolvedValue({ items: vehicles, total: 2, limit: 50, offset: 0 }); + const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }); + render(); + + fireEvent.click(screen.getByRole('button', { name: '批量' })); + const editor = screen.getByRole('textbox', { name: /每行一个车牌/ }); + fireEvent.change(editor, { target: { value: '粤a12345\n粤B67890\n粤A12345' } }); + expect(screen.getByText('2', { selector: '.v2-batch-search-summary strong' })).toBeInTheDocument(); + fireEvent.click(screen.getByRole('button', { name: '应用搜索(2)' })); + + expect(screen.queryByRole('dialog', { name: '批量搜索车辆' })).not.toBeInTheDocument(); + expect(screen.getByRole('textbox', { name: '搜索车辆' })).toHaveValue('粤A12345,粤B67890'); + fireEvent.click(screen.getByRole('button', { name: /列表/ })); + await waitFor(() => { + const params = vehicleRealtime.mock.calls[vehicleRealtime.mock.calls.length - 1]?.[0]; + expect(params?.get('keywords')).toBe('粤A12345,粤B67890'); + }); +}); + test('hides stale fleet rows while a pasted batch is still loading', () => { monitorQueryFlags.isPlaceholderData = true; const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }); diff --git a/vehicle-data-platform/apps/web/src/v2/pages/MonitorPage.tsx b/vehicle-data-platform/apps/web/src/v2/pages/MonitorPage.tsx index 6e92e9c2..18821d2c 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/MonitorPage.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/MonitorPage.tsx @@ -16,6 +16,26 @@ const statuses = ['', 'online', 'offline', 'driving', 'idle']; const EMPTY_VEHICLES: VehicleRealtimeRow[] = []; const MOBILE_MONITOR_QUERY = '(max-width: 760px)'; +function BatchVehicleSearchDialog({ initialValue, onApply, onClose }: { initialValue: string; onApply: (value: string) => void; onClose: () => void }) { + const [draft, setDraft] = useState(initialValue); + const terms = useMemo(() => parseMonitorSearchTerms(draft), [draft]); + useEffect(() => { + const closeOnEscape = (event: KeyboardEvent) => { if (event.key === 'Escape') onClose(); }; + window.addEventListener('keydown', closeOnEscape); + return () => window.removeEventListener('keydown', closeOnEscape); + }, [onClose]); + + return
{ if (event.target === event.currentTarget) onClose(); }}> +
+
批量搜索车辆从 Excel、文本或聊天记录中直接粘贴车牌
+ +