Order the endpoint step as address, then name (#2982)

## What changes for users

#2979 moved **Endpoint URL** ahead of **Node Name** in the Add Proxmox
VE/PBS/PMG form. The step summary above the form still read **Endpoint —
Name and API address**, the old order. It now reads **Endpoint — API
address and name**.

## Verification

- **Tests:**
- `NodeCredentialSlot.test.tsx` checks the rendered step text in the
endpoint-first test.
  - `settingsArchitecture.test.ts` pins the source copy.
  - Both fail against `main`.
- **Suites and static checks:** Settings plus the boundary and
presentation suites, 2463 tests, all pass. tsc, formatting, the copy,
canonical-platform and form-label audits, and the bundle check are
clean.
- **Live, private mock stack:** at 1024px the sequence reads "1 Endpoint
API address and name". At 375px the step text fits on one line and
there's no sideways scroll.
- **Receipt:** the browser receipt is included.
This commit is contained in:
rcourtman
2026-10-15 23:39:50 +01:00
committed by GitHub
6 changed files with 46 additions and 1 deletions
@@ -582,6 +582,10 @@ duplicates with the host IP. The help copy therefore says only that an empty
name is named after the host, and makes no uniqueness demand. This adds no
agent authority and changes no setup or save payload.
The connection sequence above the form follows the same order: its first step
reads "Endpoint — API address and name" (`NodeCredentialSlot.tsx`), so the
summary never asks for the name before the address it is derived from.
### Explicit filesystem selections survive the report boundary
Disk reports carry optional `explicitlyIncluded` evidence when the collector
@@ -362,6 +362,10 @@ so registration falls back to the reported server name, and
new empty-name request shape. `NodeCredentialSlot.test.tsx` pins endpoint-first
order, the optional name and the derivation as the endpoint is typed.
The sequence summary in `NodeCredentialSlot.tsx` names the endpoint step "API
address and name" to match that field order; it is copy only and changes no
request.
### Canonical incident-history query contract
Incident APIs discover canonical-only occurrences and retain exact-start
@@ -0,0 +1,34 @@
{
"version": 1,
"base_sha": "de7fc078fc561f2e4b9d6e816b19f42ef626dd58",
"verified_at": "2026-10-15T22:20:00Z",
"result": "passed",
"changed_paths": [
"frontend-modern/src/components/Settings/ConnectionEditor/CredentialSlots/NodeCredentialSlot.tsx"
],
"content_sha256": {
"frontend-modern/src/components/Settings/ConnectionEditor/CredentialSlots/NodeCredentialSlot.tsx": "372cb93c01b8de3d1cdfcfc516b5f78e04cdbaa425849fb45a335ffd0654937f"
},
"routes": [
"/settings/infrastructure?add=pve"
],
"viewports": [
{
"width": 1024,
"height": 768
},
{
"width": 375,
"height": 812
}
],
"states": [
"Before (main): the connection sequence above Add Proxmox VE read \"Endpoint \u2014 Name and API address\" while the form below asks for Endpoint URL first and Node Name second",
"After: the first step reads \"Endpoint \u2014 API address and name\", matching the field order",
"At 375px the step text fits on one line (126px, not clipped) and the page has no sideways scroll"
],
"interactions": [
"Signed in to a private mock stack, opened Add infrastructure for Proxmox VE, read the sequence text from the DOM and looked at a full screenshot",
"Resized to the mobile preset and measured the step text and page width"
]
}
@@ -173,7 +173,7 @@ export const NodeCredentialSlot: Component<NodeCredentialSlotProps> = (props) =>
</span>
<div>
<div class="font-medium text-base-content">Endpoint</div>
<div class="text-xs text-muted">Name and API address</div>
<div class="text-xs text-muted">API address and name</div>
</div>
</div>
<div class="flex items-start gap-2">
@@ -211,6 +211,7 @@ describe('NodeCredentialSlot', () => {
/>
));
expect(screen.getByText('API address and name')).toBeInTheDocument();
const endpoint = screen.getByLabelText(/^Endpoint URL/);
const name = screen.getByLabelText(/^Node Name/);
expect(endpoint.compareDocumentPosition(name) & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy();
@@ -1798,6 +1798,8 @@ describe('settings architecture guardrails', () => {
expect(nodeCredentialSlotSource).toContain('get savingTemperatureSetting()');
expect(nodeCredentialSlotSource).not.toContain('editingNode: props.editingNode');
expect(nodeCredentialSlotSource).toContain('<NodeModalBasicInfoSection');
// The step summary follows the form's field order: endpoint, then name.
expect(nodeCredentialSlotSource).toContain('API address and name');
expect(nodeCredentialSlotSource).toContain('<NodeModalAuthenticationSection');
expect(nodeCredentialSlotSource).toContain('<NodeModalMonitoringSection');
expect(nodeCredentialSlotSource).toContain('<NodeModalStatusFooter');