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");