已选字段
diff --git a/vehicle-data-platform/apps/web/src/v2/pages/StatisticsPage.test.tsx b/vehicle-data-platform/apps/web/src/v2/pages/StatisticsPage.test.tsx
index ec326ba8..1e930dd4 100644
--- a/vehicle-data-platform/apps/web/src/v2/pages/StatisticsPage.test.tsx
+++ b/vehicle-data-platform/apps/web/src/v2/pages/StatisticsPage.test.tsx
@@ -265,15 +265,15 @@ test('paginates all unique vehicles when no license plate is selected', async ()
expect((await screen.findAllByText('粤A00001')).length).toBeGreaterThan(0);
expect(screen.getByText('共 32 辆 · 每页 20 辆')).toBeInTheDocument();
- expect(document.querySelector('.v2-table-pagination-current')).toHaveTextContent('1/2');
+ expect(document.querySelector('.v2-table-pagination .semi-page-item-small')).toHaveTextContent('1/2');
expect(screen.getByText('档案口径 · 1 辆有里程')).toBeInTheDocument();
expect(mocks.vehicleCoverage.mock.calls[0][0].get('bindingStatus')).toBe('bound');
await waitFor(() => expect(mocks.dailyMileage.mock.calls[mocks.dailyMileage.mock.calls.length - 1]?.[0].get('vins')).toContain('VIN00000000000001'));
- fireEvent.click(screen.getByRole('button', { name: '下一页' }));
+ fireEvent.click(screen.getByRole('button', { name: 'Next' }));
expect((await screen.findAllByText('粤A00021')).length).toBeGreaterThan(0);
expect(screen.getByText('共 32 辆 · 每页 20 辆')).toBeInTheDocument();
- expect(document.querySelector('.v2-table-pagination-current')).toHaveTextContent('2/2');
+ expect(document.querySelector('.v2-table-pagination .semi-page-item-small')).toHaveTextContent('2/2');
await waitFor(() => expect(mocks.vehicleCoverage.mock.calls[mocks.vehicleCoverage.mock.calls.length - 1]?.[0].get('offset')).toBe('20'));
});
diff --git a/vehicle-data-platform/apps/web/src/v2/pages/UsersPage.test.tsx b/vehicle-data-platform/apps/web/src/v2/pages/UsersPage.test.tsx
index e4e47c29..23f8d639 100644
--- a/vehicle-data-platform/apps/web/src/v2/pages/UsersPage.test.tsx
+++ b/vehicle-data-platform/apps/web/src/v2/pages/UsersPage.test.tsx
@@ -120,7 +120,7 @@ test('pages and filters large vehicle grants without nesting a vehicle-list scro
expect(screen.getAllByRole('button', { name: /^移除 / })).toHaveLength(10);
expect(screen.getByText('第 1–10 条,共 12 辆')).toBeInTheDocument();
expect(view.container.querySelector('.v2-assigned-pagination')).toBeInTheDocument();
- fireEvent.click(screen.getByRole('button', { name: '下一页' }));
+ fireEvent.click(screen.getByRole('button', { name: 'Next' }));
expect(await screen.findByRole('button', { name: '移除 粤A00012' })).toBeInTheDocument();
expect(screen.getAllByRole('button', { name: /^移除 / })).toHaveLength(2);
diff --git a/vehicle-data-platform/apps/web/src/v2/productionEntry.test.ts b/vehicle-data-platform/apps/web/src/v2/productionEntry.test.ts
index 4c8300b6..2ee46d22 100644
--- a/vehicle-data-platform/apps/web/src/v2/productionEntry.test.ts
+++ b/vehicle-data-platform/apps/web/src/v2/productionEntry.test.ts
@@ -15,6 +15,7 @@ const reconciliationSource = readFileSync(resolve(process.cwd(), 'src/v2/pages/R
const profileSyncPanelSource = readFileSync(resolve(process.cwd(), 'src/v2/pages/VehicleProfileSyncPanel.tsx'), 'utf8');
const sourceEvidenceSource = readFileSync(resolve(process.cwd(), 'src/v2/shared/VehicleSourceEvidencePanel.tsx'), 'utf8');
const mobileFilterToggleSource = readFileSync(resolve(process.cwd(), 'src/v2/shared/MobileFilterToggle.tsx'), 'utf8');
+const workspaceFilterPanelSource = readFileSync(resolve(process.cwd(), 'src/v2/shared/WorkspaceFilterPanel.tsx'), 'utf8');
const segmentedTabsSource = readFileSync(resolve(process.cwd(), 'src/v2/shared/SegmentedTabs.tsx'), 'utf8');
const metricActionSource = readFileSync(resolve(process.cwd(), 'src/v2/shared/MetricActionButton.tsx'), 'utf8');
const tablePaginationSource = readFileSync(resolve(process.cwd(), 'src/v2/shared/TablePagination.tsx'), 'utf8');
@@ -122,7 +123,8 @@ describe('V2 production entry', () => {
for (const surface of ['v2-export-jobs', 'v2-history-evidence', 'v2-history-metrics-card', 'v2-history-summary']) {
expect(corePageSources.HistoryPage).toContain(`
{
expect(corePageSources.AlertsPage).toContain('className="v2-alert-event-table"');
expect(corePageSources.AlertsPage).toContain('detailTriggerRow({');
expect(corePageSources.AlertsPage).not.toContain(' | ');
- expect(corePageSources.AlertsPage).toContain(' {
expect(corePageSources.AccessPage).toContain(' {
expect(metricActionSource).toContain("from '@douyinfe/semi-ui'");
expect(metricActionSource).toContain('aria-pressed={active}');
expect(tablePaginationSource).toContain("from '@douyinfe/semi-ui'");
- expect(tablePaginationSource).toContain('aria-label="上一页"');
- expect(tablePaginationSource).toContain('aria-label="下一页"');
+ expect(tablePaginationSource).toContain(' {
expect(workspaceStyles).toContain('color: #f8fbff;');
expect(v2Styles).toContain('.v2-track-current-card > .semi-card-body > div strong { margin-top: 4px; color: var(--track-overlay-text);');
expect(v2Styles).toContain('.v2-track-current-card.semi-card { top: auto; right: 8px; bottom: 126px; left: 8px; width: auto; height: auto;');
- for (const name of ['HistoryPage', 'StatisticsPage', 'AlertsPage', 'AccessPage']) {
+ expect(workspaceFilterPanelSource).toContain("from './MobileFilterToggle'");
+ expect(workspaceFilterPanelSource).toContain(' {
diff --git a/vehicle-data-platform/apps/web/src/v2/shared/TablePagination.test.tsx b/vehicle-data-platform/apps/web/src/v2/shared/TablePagination.test.tsx
index 5203cca2..e676d687 100644
--- a/vehicle-data-platform/apps/web/src/v2/shared/TablePagination.test.tsx
+++ b/vehicle-data-platform/apps/web/src/v2/shared/TablePagination.test.tsx
@@ -7,14 +7,13 @@ describe('TablePagination', () => {
test('renders one shared Semi pagination pattern and changes pages', () => {
const onPageChange = vi.fn();
- render();
+ const { container } = render();
expect(screen.getByText('共 80 条')).toHaveClass('v2-table-pagination-info');
- expect(screen.getByText('2').closest('.v2-table-pagination-current')).toHaveTextContent('2/4');
- const previous = screen.getByRole('button', { name: '上一页' });
- const next = screen.getByRole('button', { name: '下一页' });
- expect(previous).toHaveClass('semi-button');
- expect(next).toHaveClass('semi-button');
+ expect(container.querySelector('.v2-table-pagination')).toHaveClass('semi-page');
+ expect(container.querySelector('.semi-page-item-small')).toHaveTextContent('2/4');
+ const previous = screen.getByRole('button', { name: 'Previous' });
+ const next = screen.getByRole('button', { name: 'Next' });
fireEvent.click(previous);
fireEvent.click(next);
expect(onPageChange).toHaveBeenNthCalledWith(1, 1);
@@ -23,8 +22,8 @@ describe('TablePagination', () => {
test('clamps invalid pages and disables both boundaries for a single page', () => {
render();
- expect(screen.getByRole('button', { name: '上一页' })).toBeDisabled();
- expect(screen.getByRole('button', { name: '下一页' })).toBeDisabled();
- expect(document.querySelector('.v2-table-pagination-current')).toHaveTextContent('1/1');
+ expect(screen.getByRole('button', { name: 'Previous' })).toHaveAttribute('aria-disabled', 'true');
+ expect(screen.getByRole('button', { name: 'Next' })).toHaveAttribute('aria-disabled', 'true');
+ expect(document.querySelector('.semi-page-item-small')).toHaveTextContent('1/1');
});
});
diff --git a/vehicle-data-platform/apps/web/src/v2/shared/TablePagination.tsx b/vehicle-data-platform/apps/web/src/v2/shared/TablePagination.tsx
index 3ec50515..9c4e6414 100644
--- a/vehicle-data-platform/apps/web/src/v2/shared/TablePagination.tsx
+++ b/vehicle-data-platform/apps/web/src/v2/shared/TablePagination.tsx
@@ -1,5 +1,4 @@
-import { IconChevronLeft, IconChevronRight } from '@douyinfe/semi-icons';
-import { Button, Select } from '@douyinfe/semi-ui';
+import { Pagination, Select } from '@douyinfe/semi-ui';
import { useId, type ReactNode } from 'react';
type PageSizeOption = {
@@ -37,30 +36,17 @@ export function TablePagination({
return <>
{info}
-
}
- disabled={disabled || safePage <= 1}
- aria-label="上一页"
- onClick={() => onPageChange(safePage - 1)}
- >
- 上一页
-
-
- {safePage}/{safeTotalPages}
-
-
}
- iconPosition="right"
- disabled={disabled || safePage >= safeTotalPages}
- aria-label="下一页"
- onClick={() => onPageChange(safePage + 1)}
- >
- 下一页
-
+
{pageSize != null && pageSizeOptions?.length && onPageSizeChange ? <>
{pageSizeLabel}
|---|