From 96e32d60a2ec90d6d96bf8e8f76b0dd33d719426 Mon Sep 17 00:00:00 2001 From: Susana Ferreira Date: Wed, 30 Jul 2025 18:02:59 +0100 Subject: [PATCH] chore(site): add preset combobox to dynamic parameters page (#19100) ## Description This PR updates the `CreateWorkspacePageViewExperimental` page to use the `Combobox` React component for preset selection. This aligns it with the implementation used in the standard `CreateWorkspacePageView`, ensuring consistency in UI behavior and component usage across both pages. Screenshot 2025-07-30 at 13 58 23 Related to `CreateWorkspacePageView` changes: https://github.com/coder/coder/pull/19063 --- .../CreateWorkspacePageViewExperimental.tsx | 78 +++++++++---------- 1 file changed, 35 insertions(+), 43 deletions(-) diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx index c478acd50e..b029863077 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx @@ -5,16 +5,10 @@ import { ErrorAlert } from "components/Alert/ErrorAlert"; import { Avatar } from "components/Avatar/Avatar"; import { Badge } from "components/Badge/Badge"; import { Button } from "components/Button/Button"; +import { Combobox } from "components/Combobox/Combobox"; import { Input } from "components/Input/Input"; import { Label } from "components/Label/Label"; import { Link } from "components/Link/Link"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "components/Select/Select"; import { Spinner } from "components/Spinner/Spinner"; import { Switch } from "components/Switch/Switch"; import { @@ -186,30 +180,31 @@ export const CreateWorkspacePageViewExperimental: FC< }, [form.submitCount, form.errors]); const [presetOptions, setPresetOptions] = useState([ - { label: "None", value: "None" }, + { displayName: "None", value: "undefined", icon: "", description: "" }, ]); - useEffect(() => { - setPresetOptions([ - { label: "None", value: "None" }, - ...presets.map((preset) => ({ - label: preset.Default ? `${preset.Name} (Default)` : preset.Name, - value: preset.ID, - })), - ]); - }, [presets]); - const [selectedPresetIndex, setSelectedPresetIndex] = useState(0); - - // Set default preset when presets are loaded + // Build options and keep default label/value in sync useEffect(() => { - const defaultPreset = presets.find((preset) => preset.Default); + const options = [ + { displayName: "None", value: "undefined", icon: "", description: "" }, + ...presets.map((preset) => ({ + displayName: preset.Default ? `${preset.Name} (Default)` : preset.Name, + value: preset.ID, + icon: preset.Icon, + description: preset.Description, + })), + ]; + setPresetOptions(options); + const defaultPreset = presets.find((p) => p.Default); if (defaultPreset) { - // +1 because "None" is at index 0 - const defaultIndex = - presets.findIndex((preset) => preset.ID === defaultPreset.ID) + 1; - setSelectedPresetIndex(defaultIndex); + const idx = presets.indexOf(defaultPreset) + 1; // +1 for "None" + setSelectedPresetIndex(idx); + form.setFieldValue("template_version_preset_id", defaultPreset.ID); + } else { + setSelectedPresetIndex(0); // Explicitly set to "None" + form.setFieldValue("template_version_preset_id", undefined); } - }, [presets]); + }, [presets, form.setFieldValue]); const [presetParameterNames, setPresetParameterNames] = useState( [], @@ -572,11 +567,15 @@ export const CreateWorkspacePageViewExperimental: FC<
- + />
{/* Only show the preset parameter visibility toggle if preset parameters are actually being modified, otherwise it is ineffectual */} {presetParameterNames.length > 0 && (