Align Pulse Pro route header copy

This commit is contained in:
rcourtman 2026-03-27 08:24:35 +00:00
parent e8d2d59226
commit 2935440e1e
4 changed files with 22 additions and 4 deletions

View file

@ -485,6 +485,9 @@ That same boundary also owns the shell and section framing copy for the
self-hosted Pro billing surface. `ProLicensePanel.tsx` must consume shared
presentation for its shell title/description, refresh CTA label, and section
headings rather than carrying those commercial labels inline.
The same description should also feed the `system-billing` route header
metadata so the settings shell and the route header do not narrate the same
commercial surface differently.
Paid Pulse Pro v5 grandfathering is now part of that same canonical boundary:
when a recurring v5 customer migrates into v6, billing persistence,
entitlement evaluation, renewal handling, and Pro-license presentation must

View file

@ -154,6 +154,10 @@ work extends shared components instead of creating new local variants.
plus `tests/integration/tests/15-settings-shell-consistency.spec.ts`
3. Update this contract when a new canonical UI pattern is adopted
4. Remove local forks after the shared primitive is introduced
5. When a settings route header and a top-level settings shell describe the same
commercial surface, keep them on the same shared presentation owner instead
of allowing route metadata in `settingsHeaderMeta.ts` to drift into
independent copy.
## Current State
@ -1240,6 +1244,15 @@ is the shell, `useSSOProvidersState.ts` owns the reactive/API lifecycle, and
`frontend-modern/src/components/Settings/UpdatesSettingsPanel.tsx` must keep
page-shell titles, descriptions, and lead panel framing aligned instead of
letting navigation/header labels drift away from the actual settings surface.
The self-hosted Pulse Pro route header metadata for
`frontend-modern/src/components/Settings/settingsHeaderMeta.ts` is part of that
same shell boundary as
`frontend-modern/src/components/Settings/ProLicensePanel.tsx` and the shared
commercial presentation owner in
`frontend-modern/src/utils/licensePresentation.ts`; the `system-billing`
header description must reuse
`SELF_HOSTED_PRO_BILLING_PRESENTATION.shellDescription` so the route header and
the billing shell do not narrate the same commercial surface differently.
`frontend-modern/src/components/Settings/NetworkSettingsPanel.tsx` is now a
shell only. `frontend-modern/src/components/Settings/NetworkDiscoverySection.tsx`
owns discovery controls and shared subnet presets, while

View file

@ -1,4 +1,5 @@
import { describe, expect, it } from 'vitest';
import { SELF_HOSTED_PRO_BILLING_PRESENTATION } from '@/utils/licensePresentation';
import settingsSource from '../Settings.tsx?raw';
import settingsDialogsSource from '../SettingsDialogs.tsx?raw';
import settingsShellSource from '../SettingsPageShell.tsx?raw';
@ -1271,8 +1272,9 @@ describe('Settings architecture guardrails', () => {
expect(SETTINGS_HEADER_META['infrastructure-operations'].description).not.toContain(
'installed-agent',
);
expect(SETTINGS_HEADER_META['system-billing'].description).toContain('license status');
expect(SETTINGS_HEADER_META['system-billing'].description).not.toContain('allocation');
expect(SETTINGS_HEADER_META['system-billing'].description).toBe(
SELF_HOSTED_PRO_BILLING_PRESENTATION.shellDescription,
);
expect(SETTINGS_HEADER_META['organization-billing'].description).toContain(
'subscription status',
);

View file

@ -1,4 +1,5 @@
import type { SettingsHeaderMetaMap } from './settingsNavigationModel';
import { SELF_HOSTED_PRO_BILLING_PRESENTATION } from '@/utils/licensePresentation';
export const SETTINGS_HEADER_META: SettingsHeaderMetaMap = {
proxmox: {
@ -38,8 +39,7 @@ export const SETTINGS_HEADER_META: SettingsHeaderMetaMap = {
},
'system-billing': {
title: 'Pulse Pro',
description:
'Manage self-hosted Pulse Pro billing, monitored-system limits, and license status for paid features.',
description: SELF_HOSTED_PRO_BILLING_PRESENTATION.shellDescription,
},
'organization-overview': {
title: 'Organization Overview',