Commit Graph

139 Commits

Author SHA1 Message Date
rcourtman b35eec9773 fix(ui): format dates and times in the viewer's locale
Fixes #1685.

The "Last refresh" clock in the app shell was built with a hardcoded en-US
locale and hour12 true, so every reader saw a US 12 hour clock regardless of
their system settings. #1279 already fixed this once in App.tsx; the v6
rewrite that moved the logic into useAppRuntimeState.ts reinstated the
hardcoded form, and it has shipped that way since GA. The reporter spotted
the regression and named the original PR.

Swept the rest of the frontend for the same defect. One other site remained,
the alert history day group full-date label, which rendered "Thursday,
August 6, 2026" to a reader whose own rows are ordered day-month. Both now
pass undefined so the runtime resolves the viewer's locale and clock
convention.

Because this is a regression that already survived one fix, add a
canonical-shared/no-hardcoded-format-locale audit rule covering
toLocaleString, toLocaleDateString, toLocaleTimeString and the Intl
constructors, with an allowFiles escape for any call that genuinely needs a
fixed locale. Confirmed the rule fires on the exact reintroduced regression
and passes once reverted.

Verified in an en-GB browser: the footer now reads 20:52:55 rather than
8:52:55 PM, and the history day header title reads "Thursday, 6 August 2026".

Contract-Neutral: Contract deltas staged where the change actually lands: frontend-primitives.md gains the shared date/number formatting-locale rule and names the audit that enforces it, and alerts.md extends the existing timestamp paragraph to the day group label. Residual demands are inapplicable. cloud-paid.md names useAppRuntimeState.ts for hosted org-context bootstrap and licence boundaries and performance-and-scalability.md names it as an app-shell performance boundary; grepped both and neither documents date formatting, and swapping a locale argument moves neither boundary. The alerts frontend surface proof is the same fixed policy list as a0113b964 and does not name alertHistoryModel.branchcov.test.ts, which is the file that actually covers this model; editing an unrelated listed proof would be fabrication.
2026-08-06 20:56:44 +01:00
rcourtman 737bde7362 fix(ui): refine responsive platform tables
Contract-Neutral: responsive presentation and touch-target adjustments only; no API or payload changes
2026-08-06 15:55:11 +01:00
courtmanr@gmail.com a38d21bb86 feat(alerts): add initial delivery routing 2026-07-30 15:37:53 +01:00
rcourtman 478a9e933d Complete canonical web interface links
Preserve tenant-scoped metadata through partial URL updates and project stable URLs across runtime identities. Use a safe adjacent launch control across overview tables with desktop and mobile regression coverage.
2026-07-24 12:42:16 +01:00
rcourtman c8b1e9d07b Re-home Agent Doctor from a settings modal to a routed page
Agent Doctor now lives at /settings/infrastructure/agent-doctor as a
full page in the settings shell instead of a max-w-lg dialog stacked
over the Infrastructure workspace, which was cramped on phones. The
per-agent card pile becomes one fleet table (agent, system, status,
reported and target versions, last seen) with per-row expansions
holding the diagnosis reasons, identity evidence, repair actions, and
the host-local update command. A lone scoped target auto-expands so
platform-page deep links land straight on the diagnosis.

Legacy ?agentDoctor=1 / ?agentUpdates=1 workspace links redirect onto
the route with their agents scope preserved, and closing the page is
now ordinary back navigation. The dialog component is renamed to
InfrastructureAgentDoctorPage; shared-template registry, the
agent-lifecycle subsystem inventory, and the frontend-primitives
settings deep-link clause follow the change.
2026-07-22 10:26:06 +01:00
rcourtman 69533c7afb Build canonical availability resource facets 2026-07-19 15:11:01 +01:00
rcourtman 3e477b25d9 feat(alerts): group related alerts by resource hierarchy on overview
Alerts that share a resource ancestor (e.g., ZFS pool + device within
that pool) are now grouped on the alerts overview page. The primary
alert (highest severity, most recent) is shown by default with a
'+N related' toggle that expands to reveal the related alerts.

Grouping uses resourceId nesting: alerts with 3+ path segments are
sub-components and share the group key of their parent (first 2
segments). Alerts on different subsystems remain separate.

Single-alert groups render exactly as before — no visual change when
there's nothing to group.
2026-06-27 14:51:45 +01:00
rcourtman 47d6ad94db test: fix 4 pre-existing frontend test failures blocking clean suite
recoveryDatePresentation: locale-independent date assertion (en-GB
systems produce '9 Mar 2026' not 'Mar 9, 2026')
quickstartCopyContract: update 'tools' to 'capabilities' matching
docs/AI.md copy change
AIIntelligence: update stale empty-state text to full current copy
SharedPrimitives.guardrails: align guardrail + registry with
d79640c41 migration of ProxmoxBackupsTable from FilterButtonGroup to
FilterSegmentedControl

Full suite: 659 files, 6719 tests, 0 failures.
2026-06-26 11:26:16 +01:00
rcourtman 27ba85ddc6 frontend: Patrol intelligence surface, shared primitives, and platform parity
Patrol operator UI (header, workspace, banners, findings, autonomy controls); convergence of shared primitives (buttons, spinners, notices, badges); settings information architecture (Pulse Intelligence, plans and billing, agent integrations); platform parity restoration across Proxmox, Kubernetes, Docker, storage, memory, and alerts; i18n foundation.
2026-06-23 17:15:58 +01:00
rcourtman 6559c37626 Converge AI Chat message actions on shared Button primitives 2026-06-13 23:48:55 +01:00
rcourtman dbb936e623 Converge standalone machine actions on ActionIconButton 2026-06-13 23:35:23 +01:00
rcourtman 52f094f11f Converge AI Chat icon actions on ActionIconButton 2026-06-13 23:27:33 +01:00
rcourtman 05f1a3298e Converge Patrol approval actions on shared Button primitives 2026-06-13 22:59:58 +01:00
rcourtman 85ae9ad540 Converge organization settings actions on shared Button primitives 2026-06-13 22:48:05 +01:00
rcourtman 418cf1648d Converge RBAC settings actions on shared Button primitives 2026-06-13 22:31:23 +01:00
rcourtman a418b8da27 Converge security auth actions on shared Button primitive 2026-06-13 22:20:03 +01:00
rcourtman e73420d4d5 Converge Proxmox backup view selector on shared primitive 2026-06-13 22:08:09 +01:00
rcourtman 55e058d1e6 Converge API token scope pills on shared selectable primitive 2026-06-13 21:52:18 +01:00
rcourtman 9578cd7368 Converge billing admin row actions on shared Button primitives 2026-06-13 21:37:30 +01:00
rcourtman 1af7d47792 Converge SSO actions on shared Button primitives 2026-06-13 21:23:21 +01:00
rcourtman 03b593461f Converge panel empty states on shared primitive 2026-06-13 21:11:57 +01:00
rcourtman c48dfa8261 Converge standalone metrics on platform table helper 2026-06-13 20:50:06 +01:00
rcourtman 66002e8ba7 Converge Pro license actions on shared Button primitives 2026-06-13 20:37:12 +01:00
rcourtman 51c47a2279 Converge GitHub star banner on shared action primitives 2026-06-13 20:24:17 +01:00
rcourtman 5330ce40c7 Converge commercial migration banner on shared notice primitive 2026-06-13 20:13:17 +01:00
rcourtman 0f58d9d9d4 Converge demo banner notice on InlineNotice primitive 2026-06-13 20:00:56 +01:00
rcourtman 0bc0b8a346 Converge toast notification chrome on shared primitives 2026-06-13 19:50:55 +01:00
rcourtman 14eda65f2e Converge update modal chrome on shared primitives 2026-06-13 19:40:04 +01:00
rcourtman 9418dbb330 Converge error fallback chrome on shared primitives 2026-06-13 19:26:56 +01:00
rcourtman 761127018e Converge alert web links on shared primitive 2026-06-13 19:14:49 +01:00
rcourtman 9802cf9dbc Add shared discovery loading fallback 2026-06-13 19:01:26 +01:00
rcourtman bcec5ac1fa Converge shared primitive spinners on LoadingSpinner 2026-06-13 18:43:53 +01:00
rcourtman a39e209918 Converge login spinners on LoadingSpinner 2026-06-13 18:31:58 +01:00
rcourtman 8c1c7dfda4 Converge settings spinners on LoadingSpinner 2026-06-13 18:18:51 +01:00
rcourtman d1262c31e5 Converge settings loading skeletons on shared primitive 2026-06-13 17:57:31 +01:00
rcourtman 4e7d7ddb4f Converge connection editor notices on CalloutCard 2026-06-13 17:36:27 +01:00
rcourtman cb53fd6b60 Converge settings external links on shared primitives 2026-06-13 17:16:11 +01:00
rcourtman 9ee313b8a7 Converge platform notices on shared primitive 2026-06-13 16:45:48 +01:00
rcourtman 09ed857869 Converge UI primitives and readiness guards 2026-06-13 16:31:52 +01:00
rcourtman 241ac9feaf Converge textarea fields on shared primitive 2026-06-13 15:15:55 +01:00
rcourtman 5a16a777bd Converge VMware detail sections 2026-06-13 14:59:13 +01:00
rcourtman 9712150c1e Converge resource detail numeric formatting 2026-06-13 14:46:06 +01:00
rcourtman 1aec698bc7 Converge platform table width calculation 2026-06-13 14:26:58 +01:00
rcourtman 6c60146372 Converge platform duration cells 2026-06-13 14:15:59 +01:00
rcourtman 1b5f5e16de Converge standalone relative-time cells 2026-06-13 14:00:54 +01:00
rcourtman ca7ecae86a Converge platform uptime cells 2026-06-13 13:48:03 +01:00
rcourtman 65d0f4b917 Converge backup relative-age cells 2026-06-13 13:29:55 +01:00
rcourtman df3177c2f0 Converge platform byte-size cells 2026-06-13 13:19:47 +01:00
rcourtman 12b896bd7a Converge platform relative timestamps 2026-06-13 13:03:44 +01:00
rcourtman 15eed88ed1 Converge platform uptime values 2026-06-13 12:47:14 +01:00