diff --git a/src/components/EndpointWizard.tsx b/src/components/EndpointWizard.tsx index 3f50c77c3..db1fc91f7 100644 --- a/src/components/EndpointWizard.tsx +++ b/src/components/EndpointWizard.tsx @@ -9,6 +9,7 @@ import type { import type { ScreenProps } from "../handlers/types"; import { coreOptsFromCtx } from "../handlers/utils"; import { Layout } from "./Layout"; +import { FormRadioGroup, type FormRadioOption } from "./FormRadioGroup"; import { Stepper, type Step } from "./ui/stepper"; import { TextInput } from "./ui/text-input"; import { Spinner } from "./ui/spinner"; @@ -254,10 +255,8 @@ function NameStep({ ); } -interface VersionOption { +interface VersionOption extends FormRadioOption { value: string; - label: string; - detail: string; } function VersionStep({ @@ -285,14 +284,18 @@ function VersionStep({ .map((v) => ({ value: v.harnessVersion ?? "", label: `version ${v.harnessVersion}`, - detail: `${v.status} · updated ${v.updatedAt?.toISOString().slice(0, 10) ?? ""}`, + description: `${v.status} · updated ${v.updatedAt?.toISOString().slice(0, 10) ?? ""}`, })) .sort((a, b) => Number(b.value) - Number(a.value)); // Create mode offers "latest": omitting targetVersion tracks the newest // version at creation time. return mode === "create" ? [ - { value: "", label: "latest", detail: "track the most recent version (default)" }, + { + value: "", + label: "latest", + description: "track the most recent version (default)", + }, ...listed, ] : listed; @@ -322,28 +325,27 @@ function VersionStep({ return ( - {versions.isPending ? ( - + <> + + + ) : versions.isError ? ( - ✗ {(versions.error as Error).message} + <> + + ✗ {(versions.error as Error).message} + ) : options.length === 0 ? ( - this harness has no versions + <> + + this harness has no versions + ) : ( - options.map((option, i) => { - const selected = i === index; - return ( - - - {selected ? "● " : "○ "} - - - {option.label.padEnd(12)} - - {option.detail} - - ); - }) + )} ); diff --git a/src/components/FormRadioGroup.tsx b/src/components/FormRadioGroup.tsx index abe8cfd6a..f3b5ddec6 100644 --- a/src/components/FormRadioGroup.tsx +++ b/src/components/FormRadioGroup.tsx @@ -9,7 +9,7 @@ export interface FormRadioOption { } export interface FormRadioGroupProps { - name: string; + name?: string; helpText: string; options: FormRadioOption[]; // highlighted/hovered row @@ -32,7 +32,7 @@ export function FormRadioGroup({ return ( - {name} + {name && {name}} {helpText} { // Versions listed newest first after the "latest" default. await waitForText(r.lastFrame, "which harness version should this endpoint serve?"); expect(r.lastFrame()).toContain("● latest"); + expect(r.lastFrame()).toContain("│ ● latest"); expect(r.lastFrame()).toContain("version 2"); expect(r.lastFrame()).toContain("version 1"); await r.press("down"); // version 2 diff --git a/src/handlers/harness/endpoint/update/update.screen.test.tsx b/src/handlers/harness/endpoint/update/update.screen.test.tsx index 4fc80137d..e3eb1ee1f 100644 --- a/src/handlers/harness/endpoint/update/update.screen.test.tsx +++ b/src/handlers/harness/endpoint/update/update.screen.test.tsx @@ -90,6 +90,7 @@ describe("harness endpoint update wizard", () => { // The endpoint's current target (version 1) is preselected; no "latest" // option exists in update mode. await waitForText(r.lastFrame, "● version 1"); + expect(r.lastFrame()).toContain("│ ● version 1"); expect(r.lastFrame()).not.toContain("latest"); await r.press("up"); // version 2 (sorted newest first) await waitForText(r.lastFrame, "● version 2");