diff --git a/vehicle-data-platform/apps/web/src/v2/pages/AlertsPage.test.tsx b/vehicle-data-platform/apps/web/src/v2/pages/AlertsPage.test.tsx index 57cc33f2..01ed7cd1 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/AlertsPage.test.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/AlertsPage.test.tsx @@ -86,7 +86,8 @@ test('loads a paginated notification page and an independent unread total on dir expect(view.container.querySelector('.v2-alert-notification-empty.semi-empty')).toBeInTheDocument(); expect(view.container.querySelector('.v2-alert-notification-pagination')).toBeInTheDocument(); expect(screen.getByRole('combobox', { name: '每页通知数' })).toBeInTheDocument(); - expect(view.container.querySelector('.v2-alert-channel-card.semi-card')).toBeInTheDocument(); + expect(view.container.querySelector('.v2-alert-channel-collapse.semi-collapse')).toBeInTheDocument(); + expect(screen.getByText('3 个 · 未启用')).toBeInTheDocument(); expect(view.container.querySelector('.v2-alert-channel-descriptions.semi-descriptions')).toBeInTheDocument(); expect(mocks.alertRulesV2).not.toHaveBeenCalled(); expect(mocks.metricCatalog).not.toHaveBeenCalled(); @@ -112,6 +113,18 @@ test('ends notification mutation feedback with a visible retryable error instead expect(screen.getByRole('button', { name: '标为已读' })).toBeEnabled(); }); +test('keeps the mobile notification title, count, and compact bulk action visible together', async () => { + layout.mobile = true; + mocks.alertNotificationsV2.mockResolvedValue({ items: [{ id: 8, eventId: 'event-8', title: '车辆告警', content: '移动端告警', severity: 'major', read: false, createdAt: '2026-07-16T04:00:00Z' }], total: 1, limit: 100, offset: 0 }); + const client = new QueryClient({ defaultOptions: { queries: { retry: false } } }); + render(); + + const heading = await screen.findByRole('heading', { level: 5, name: /通知列表/ }); + await waitFor(() => expect(heading).toHaveTextContent('1 条')); + expect(heading.querySelector('.v2-alert-notification-total.semi-tag')).toBeInTheDocument(); + expect(screen.getByRole('button', { name: '本页已读' })).toBeInTheDocument(); +}); + test('clears old alert rows and inspector evidence when the event scope changes', async () => { const oldEvent = alertEvent('old-event', 'OLDVIN', '旧告警车牌'); oldEvent.actions = [{ id: 1, action: 'detect', fromStatus: '', toStatus: 'unprocessed', actor: 'alert-evaluator', note: '规则首次命中', createdAt: '2026-07-16T04:00:00Z' }]; @@ -324,6 +337,7 @@ test('keeps mobile rule selection focused and opens editing in a Semi bottom Sid expect(document.querySelector('.v2-alert-rule-editor-sidesheet .semi-sidesheet-inner')).toHaveStyle({ height: 'min(92dvh, 820px)' }); expect(within(editor).getByDisplayValue('测试超速规则')).toBeInTheDocument(); expect(within(editor).getByRole('button', { name: '保存规则' })).toBeInTheDocument(); + expect(within(editor).queryByRole('region', { name: '告警规则模板' })).not.toBeInTheDocument(); expect(ruleItem).toHaveAttribute('aria-expanded', 'true'); fireEvent.click(within(editor).getByRole('button', { name: '关闭告警规则编辑' })); @@ -337,6 +351,7 @@ test('keeps mobile rule selection focused and opens editing in a Semi bottom Sid await waitFor(() => expect(document.querySelector('.v2-alert-rule-editor')).toBeInTheDocument()); const newEditor = screen.getByRole('dialog', { name: '告警规则编辑' }); expect(within(newEditor).getByText('新建规则')).toBeInTheDocument(); + expect(within(newEditor).getByRole('region', { name: '告警规则模板' })).toBeInTheDocument(); expect(newRule).toHaveAttribute('aria-expanded', 'true'); }); @@ -363,7 +378,9 @@ test('creates auditable drafts from simple offline and hydrogen rule templates', await waitFor(() => expect(ruleItem).toHaveAttribute('aria-pressed', 'true')); expect(within(ruleItem).getByText('重要').closest('.semi-tag')).toBeTruthy(); expect(within(ruleItem).getByText('已启用').closest('.semi-tag')).toBeTruthy(); + expect(screen.queryByRole('region', { name: '告警规则模板' })).not.toBeInTheDocument(); + fireEvent.click(screen.getByRole('button', { name: /新建规则/ })); const offlineTemplate = await screen.findByRole('button', { name: /离线超过 10 小时/ }); expect(offlineTemplate).toHaveClass('semi-button', 'v2-alert-template-card'); expect(within(offlineTemplate).getByText('GB32960 / JT808 / YUTONG_MQTT').closest('.semi-tag')).toBeTruthy(); diff --git a/vehicle-data-platform/apps/web/src/v2/pages/AlertsPage.tsx b/vehicle-data-platform/apps/web/src/v2/pages/AlertsPage.tsx index 9cdfd409..f2f4112a 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/AlertsPage.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/AlertsPage.tsx @@ -368,7 +368,7 @@ function RulesWorkspace({ rules, metrics }: { rules: AlertRule[]; metrics: Metri {toggleButton} } -
+ {!draft.version ?
快速创建从常用业务场景开始,再按车辆、车型或企业收窄范围。
-
+
: null}