From 8fafc2cb6e9f7a9a4210f3e7f5a90b249c0846bc Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Mon, 9 Jun 2025 14:34:24 +0000 Subject: [PATCH 01/11] chore: remove dynamic-parameters experiment --- site/src/pages/WorkspacesPage/WorkspacesPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/pages/WorkspacesPage/WorkspacesPage.tsx b/site/src/pages/WorkspacesPage/WorkspacesPage.tsx index 22ba0d15f1f9a..f54fd3df060ff 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPage.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPage.tsx @@ -164,7 +164,7 @@ const WorkspacesPage: FC = () => { onConfirm={async () => { await batchActions.updateAll({ workspaces: checkedWorkspaces, - isDynamicParametersEnabled: false, + isDynamicParametersEnabled: true, }); setConfirmingBatchAction(null); }} From a06e5ca477250b389aa32bf2a873af2ec01531d9 Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Mon, 9 Jun 2025 20:50:55 +0000 Subject: [PATCH 02/11] fix: fix tests --- coderd/templates_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/templates_test.go b/coderd/templates_test.go index f8f2b1372263c..f5fbe49741838 100644 --- a/coderd/templates_test.go +++ b/coderd/templates_test.go @@ -1548,7 +1548,7 @@ func TestPatchTemplateMeta(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - require.True(t, template.UseClassicParameterFlow, "default is true") + require.False(t, template.UseClassicParameterFlow, "default is false") bTrue := true bFalse := false From bb2aab2db539d743a622196172d914ae11d2b7a0 Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Mon, 9 Jun 2025 21:19:24 +0000 Subject: [PATCH 03/11] fix: fix jest tests --- site/src/pages/WorkspacesPage/WorkspacesPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/pages/WorkspacesPage/WorkspacesPage.tsx b/site/src/pages/WorkspacesPage/WorkspacesPage.tsx index f54fd3df060ff..22ba0d15f1f9a 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPage.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPage.tsx @@ -164,7 +164,7 @@ const WorkspacesPage: FC = () => { onConfirm={async () => { await batchActions.updateAll({ workspaces: checkedWorkspaces, - isDynamicParametersEnabled: true, + isDynamicParametersEnabled: false, }); setConfirmingBatchAction(null); }} From a808c03ff37e919143ccfd76cfec8a15488fb497 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Mon, 9 Jun 2025 16:34:34 -0500 Subject: [PATCH 04/11] update db mock --- coderd/wsbuilder/wsbuilder_test.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/coderd/wsbuilder/wsbuilder_test.go b/coderd/wsbuilder/wsbuilder_test.go index 58999a33e6e5e..9bc45e6c0a1d9 100644 --- a/coderd/wsbuilder/wsbuilder_test.go +++ b/coderd/wsbuilder/wsbuilder_test.go @@ -57,6 +57,7 @@ func TestBuilder_NoOptions(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, + withTerraformValuesErrNoRows, withInactiveVersion(nil), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, nil), @@ -113,6 +114,7 @@ func TestBuilder_Initiator(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, + withTerraformValuesErrNoRows, withInactiveVersion(nil), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, nil), @@ -159,6 +161,7 @@ func TestBuilder_Baggage(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, + withTerraformValuesErrNoRows, withInactiveVersion(nil), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, nil), @@ -197,6 +200,7 @@ func TestBuilder_Reason(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, + withTerraformValuesErrNoRows, withInactiveVersion(nil), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, nil), @@ -235,6 +239,7 @@ func TestBuilder_ActiveVersion(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, + withTerraformValuesErrNoRows, withActiveVersion(nil), withLastBuildNotFound, withTemplateVersionVariables(activeVersionID, nil), @@ -338,6 +343,7 @@ func TestWorkspaceBuildWithTags(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, + withTerraformValuesErrNoRows, withInactiveVersion(richParameters), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, templateVersionVariables), @@ -433,6 +439,7 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, + withTerraformValuesErrNoRows, withInactiveVersion(richParameters), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, nil), @@ -480,6 +487,7 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, + withTerraformValuesErrNoRows, withInactiveVersion(richParameters), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, nil), @@ -533,6 +541,7 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, + withTerraformValuesErrNoRows, withInactiveVersion(richParameters), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, nil), @@ -565,6 +574,7 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, + withTerraformValuesErrNoRows, withInactiveVersion(richParameters), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, nil), @@ -617,6 +627,7 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, + withTerraformValuesErrNoRows, withActiveVersion(version2params), withLastBuildFound, withTemplateVersionVariables(activeVersionID, nil), @@ -680,6 +691,7 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, + withTerraformValuesErrNoRows, withActiveVersion(version2params), withLastBuildFound, withTemplateVersionVariables(activeVersionID, nil), @@ -741,6 +753,7 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, + withTerraformValuesErrNoRows, withActiveVersion(version2params), withLastBuildFound, withTemplateVersionVariables(activeVersionID, nil), @@ -788,6 +801,7 @@ func TestWorkspaceBuildWithPreset(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, + withTerraformValuesErrNoRows, withActiveVersion(nil), // building workspaces using presets with different combinations of parameters // is tested at the API layer, in TestWorkspace. Here, it is sufficient to @@ -902,6 +916,12 @@ func withTemplate(mTx *dbmock.MockStore) { }, nil) } +func withTerraformValuesErrNoRows(mTx *dbmock.MockStore) { + mTx.EXPECT().GetTemplateVersionTerraformValues(gomock.Any(), gomock.Any()). + Times(1). + Return(database.TemplateVersionTerraformValue{}, sql.ErrNoRows) +} + // withInTx runs the given functions on the same db mock. func withInTx(mTx *dbmock.MockStore) { mTx.EXPECT().InTx(gomock.Any(), gomock.Any()).Times(1).DoAndReturn( From 8d64a3778e5bf7c4a546b47114435c05bf139784 Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Tue, 10 Jun 2025 19:38:37 +0000 Subject: [PATCH 05/11] fix: fix tests --- coderd/parameters_test.go | 1 + coderd/templates_test.go | 2 +- coderd/wsbuilder/wsbuilder_test.go | 20 -------------------- 3 files changed, 2 insertions(+), 21 deletions(-) diff --git a/coderd/parameters_test.go b/coderd/parameters_test.go index da2c19ba20e3c..640dc3ad22e55 100644 --- a/coderd/parameters_test.go +++ b/coderd/parameters_test.go @@ -249,6 +249,7 @@ func TestDynamicParametersWithTerraformValues(t *testing.T) { Value: "GO", }, } + request.EnableDynamicParameters = true }) coderdtest.AwaitWorkspaceBuildJobCompleted(t, setup.client, wrk.LatestBuild.ID) diff --git a/coderd/templates_test.go b/coderd/templates_test.go index f5fbe49741838..f8f2b1372263c 100644 --- a/coderd/templates_test.go +++ b/coderd/templates_test.go @@ -1548,7 +1548,7 @@ func TestPatchTemplateMeta(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - require.False(t, template.UseClassicParameterFlow, "default is false") + require.True(t, template.UseClassicParameterFlow, "default is true") bTrue := true bFalse := false diff --git a/coderd/wsbuilder/wsbuilder_test.go b/coderd/wsbuilder/wsbuilder_test.go index 9bc45e6c0a1d9..58999a33e6e5e 100644 --- a/coderd/wsbuilder/wsbuilder_test.go +++ b/coderd/wsbuilder/wsbuilder_test.go @@ -57,7 +57,6 @@ func TestBuilder_NoOptions(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, - withTerraformValuesErrNoRows, withInactiveVersion(nil), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, nil), @@ -114,7 +113,6 @@ func TestBuilder_Initiator(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, - withTerraformValuesErrNoRows, withInactiveVersion(nil), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, nil), @@ -161,7 +159,6 @@ func TestBuilder_Baggage(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, - withTerraformValuesErrNoRows, withInactiveVersion(nil), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, nil), @@ -200,7 +197,6 @@ func TestBuilder_Reason(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, - withTerraformValuesErrNoRows, withInactiveVersion(nil), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, nil), @@ -239,7 +235,6 @@ func TestBuilder_ActiveVersion(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, - withTerraformValuesErrNoRows, withActiveVersion(nil), withLastBuildNotFound, withTemplateVersionVariables(activeVersionID, nil), @@ -343,7 +338,6 @@ func TestWorkspaceBuildWithTags(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, - withTerraformValuesErrNoRows, withInactiveVersion(richParameters), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, templateVersionVariables), @@ -439,7 +433,6 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, - withTerraformValuesErrNoRows, withInactiveVersion(richParameters), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, nil), @@ -487,7 +480,6 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, - withTerraformValuesErrNoRows, withInactiveVersion(richParameters), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, nil), @@ -541,7 +533,6 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, - withTerraformValuesErrNoRows, withInactiveVersion(richParameters), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, nil), @@ -574,7 +565,6 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, - withTerraformValuesErrNoRows, withInactiveVersion(richParameters), withLastBuildFound, withTemplateVersionVariables(inactiveVersionID, nil), @@ -627,7 +617,6 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, - withTerraformValuesErrNoRows, withActiveVersion(version2params), withLastBuildFound, withTemplateVersionVariables(activeVersionID, nil), @@ -691,7 +680,6 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, - withTerraformValuesErrNoRows, withActiveVersion(version2params), withLastBuildFound, withTemplateVersionVariables(activeVersionID, nil), @@ -753,7 +741,6 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, - withTerraformValuesErrNoRows, withActiveVersion(version2params), withLastBuildFound, withTemplateVersionVariables(activeVersionID, nil), @@ -801,7 +788,6 @@ func TestWorkspaceBuildWithPreset(t *testing.T) { mDB := expectDB(t, // Inputs withTemplate, - withTerraformValuesErrNoRows, withActiveVersion(nil), // building workspaces using presets with different combinations of parameters // is tested at the API layer, in TestWorkspace. Here, it is sufficient to @@ -916,12 +902,6 @@ func withTemplate(mTx *dbmock.MockStore) { }, nil) } -func withTerraformValuesErrNoRows(mTx *dbmock.MockStore) { - mTx.EXPECT().GetTemplateVersionTerraformValues(gomock.Any(), gomock.Any()). - Times(1). - Return(database.TemplateVersionTerraformValue{}, sql.ErrNoRows) -} - // withInTx runs the given functions on the same db mock. func withInTx(mTx *dbmock.MockStore) { mTx.EXPECT().InTx(gomock.Any(), gomock.Any()).Times(1).DoAndReturn( From 6f0ee1dbf24a0f50956b35b53ebb51edcf5f8401 Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Thu, 12 Jun 2025 12:02:03 +0000 Subject: [PATCH 06/11] chore: remove local storage based optin/optout --- .../useDynamicParametersOptOut.ts | 37 ------------------ .../WorkspaceMoreActions.tsx | 16 +++----- .../workspaces/WorkspaceUpdateDialogs.tsx | 30 +------------- .../CreateWorkspaceExperimentRouter.tsx | 35 ++--------------- .../CreateWorkspacePageView.tsx | 28 ++----------- .../CreateWorkspacePageViewExperimental.tsx | 15 +------ .../ExperimentalFormContext.tsx | 5 --- .../WorkspaceParametersExperimentRouter.tsx | 39 ++----------------- .../WorkspaceParametersPage.tsx | 14 +------ .../WorkspaceParametersPageExperimental.tsx | 17 +------- 10 files changed, 23 insertions(+), 213 deletions(-) delete mode 100644 site/src/modules/workspaces/DynamicParameter/useDynamicParametersOptOut.ts delete mode 100644 site/src/pages/CreateWorkspacePage/ExperimentalFormContext.tsx diff --git a/site/src/modules/workspaces/DynamicParameter/useDynamicParametersOptOut.ts b/site/src/modules/workspaces/DynamicParameter/useDynamicParametersOptOut.ts deleted file mode 100644 index 22364edb0c70f..0000000000000 --- a/site/src/modules/workspaces/DynamicParameter/useDynamicParametersOptOut.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { useQuery } from "react-query"; - -export const optOutKey = (id: string): string => `parameters.${id}.optOut`; - -interface UseDynamicParametersOptOutOptions { - templateId: string | undefined; - templateUsesClassicParameters: boolean | undefined; - enabled: boolean; -} - -export const useDynamicParametersOptOut = ({ - templateId, - templateUsesClassicParameters, - enabled, -}: UseDynamicParametersOptOutOptions) => { - return useQuery({ - enabled: !!templateId && enabled, - queryKey: ["dynamicParametersOptOut", templateId], - queryFn: () => { - if (!templateId) { - // This should not happen if enabled is working correctly, - // but as a type guard and sanity check. - throw new Error("templateId is required"); - } - const localStorageKey = optOutKey(templateId); - const storedOptOutString = localStorage.getItem(localStorageKey); - - // Since the dynamic-parameters experiment was removed, always use classic parameters - const optedOut = true; - - return { - templateId, - optedOut, - }; - }, - }); -}; diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx index ff20aea807bf4..d2d916f71e9e8 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx @@ -21,7 +21,6 @@ import { SettingsIcon, TrashIcon, } from "lucide-react"; -import { useDynamicParametersOptOut } from "modules/workspaces/DynamicParameter/useDynamicParametersOptOut"; import { type FC, useEffect, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { Link as RouterLink } from "react-router-dom"; @@ -43,13 +42,6 @@ export const WorkspaceMoreActions: FC = ({ }) => { const queryClient = useQueryClient(); - const optOutQuery = useDynamicParametersOptOut({ - templateId: workspace.template_id, - templateUsesClassicParameters: - workspace.template_use_classic_parameter_flow, - enabled: true, - }); - // Permissions const { data: permissions } = useQuery(workspacePermissions(workspace)); @@ -59,7 +51,11 @@ export const WorkspaceMoreActions: FC = ({ // Change version const [changeVersionDialogOpen, setChangeVersionDialogOpen] = useState(false); const changeVersionMutation = useMutation( - changeVersion(workspace, queryClient, optOutQuery.data?.optedOut === false), + changeVersion( + workspace, + queryClient, + !workspace.template_use_classic_parameter_flow, + ), ); // Delete @@ -151,7 +147,7 @@ export const WorkspaceMoreActions: FC = ({ onClose={() => setIsDownloadDialogOpen(false)} /> - {optOutQuery.data?.optedOut ? ( + {workspace.template_use_classic_parameter_flow ? ( { updateWorkspaceMutation.mutate({ buildParameters, - isDynamicParametersEnabled: optOutQuery.data?.optedOut === false, + isDynamicParametersEnabled: workspace.template_use_classic_parameter_flow, }); setIsConfirmingUpdate(false); }; @@ -160,29 +150,13 @@ const MissingBuildParametersDialog: FC = ({ error, ...dialogProps }) => { - const optOutQuery = useDynamicParametersOptOut({ - templateId: workspace.template_id, - templateUsesClassicParameters: - workspace.template_use_classic_parameter_flow, - enabled: true, - }); - const missedParameters = error instanceof MissingBuildParameters ? error.parameters : []; const versionId = error instanceof MissingBuildParameters ? error.versionId : undefined; const isOpen = error instanceof MissingBuildParameters; - if (optOutQuery.isError) { - return ; - } - if (!optOutQuery.data) { - return ; - } - - const shouldUseClassicDialog = optOutQuery.data?.optedOut; - - return shouldUseClassicDialog ? ( + return workspace.template_use_classic_parameter_flow ? ( { const { organization: organizationName = "default", template: templateName } = @@ -19,43 +14,21 @@ const CreateWorkspaceExperimentRouter: FC = () => { templateByName(organizationName, templateName), ); - const optOutQuery = useDynamicParametersOptOut({ - templateId: templateQuery.data?.id, - templateUsesClassicParameters: - templateQuery.data?.use_classic_parameter_flow, - enabled: !!templateQuery.data, - }); - if (templateQuery.isError) { return ; } - if (optOutQuery.isError) { - return ; - } - if (!optOutQuery.data) { + if (!templateQuery.data) { return ; } - const toggleOptedOut = () => { - const key = optOutKey(optOutQuery.data?.templateId ?? ""); - const storedValue = localStorage.getItem(key); - - const current = storedValue - ? storedValue === "true" - : Boolean(templateQuery.data?.use_classic_parameter_flow); - - localStorage.setItem(key, (!current).toString()); - optOutQuery.refetch(); - }; - return ( - - {optOutQuery.data.optedOut ? ( + <> + {templateQuery.data?.use_classic_parameter_flow ? ( ) : ( )} - + ); }; diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx index 64ea110709cf4..d365a565afcdb 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx @@ -28,14 +28,7 @@ import { Switch } from "components/Switch/Switch"; import { UserAutocomplete } from "components/UserAutocomplete/UserAutocomplete"; import { type FormikContextType, useFormik } from "formik"; import { generateWorkspaceName } from "modules/workspaces/generateWorkspaceName"; -import { - type FC, - useCallback, - useContext, - useEffect, - useMemo, - useState, -} from "react"; +import { type FC, useCallback, useEffect, useMemo, useState } from "react"; import { getFormHelpers, nameValidator, @@ -51,7 +44,6 @@ import type { CreateWorkspaceMode, ExternalAuthPollingState, } from "./CreateWorkspacePage"; -import { ExperimentalFormContext } from "./ExperimentalFormContext"; import { ExternalAuthButton } from "./ExternalAuthButton"; import type { CreateWorkspacePermissions } from "./permissions"; @@ -106,7 +98,6 @@ export const CreateWorkspacePageView: FC = ({ onSubmit, onCancel, }) => { - const experimentalFormContext = useContext(ExperimentalFormContext); const [owner, setOwner] = useState(defaultOwner); const [suggestedName, setSuggestedName] = useState(() => generateWorkspaceName(), @@ -220,20 +211,9 @@ export const CreateWorkspacePageView: FC = ({ - {experimentalFormContext && ( - - )} - - + } > diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx index c2b6807a5833f..4fff4db92e21d 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx @@ -26,7 +26,7 @@ import { } from "components/Tooltip/Tooltip"; import { UserAutocomplete } from "components/UserAutocomplete/UserAutocomplete"; import { type FormikContextType, useFormik } from "formik"; -import { ArrowLeft, CircleHelp, Undo2 } from "lucide-react"; +import { ArrowLeft, CircleHelp } from "lucide-react"; import { useSyncFormParameters } from "modules/hooks/useSyncFormParameters"; import { Diagnostics } from "modules/workspaces/DynamicParameter/DynamicParameter"; import { @@ -38,7 +38,6 @@ import { generateWorkspaceName } from "modules/workspaces/generateWorkspaceName" import { type FC, useCallback, - useContext, useEffect, useId, useRef, @@ -52,7 +51,6 @@ import type { CreateWorkspaceMode, ExternalAuthPollingState, } from "./CreateWorkspacePage"; -import { ExperimentalFormContext } from "./ExperimentalFormContext"; import { ExternalAuthButton } from "./ExternalAuthButton"; import type { CreateWorkspacePermissions } from "./permissions"; @@ -112,7 +110,6 @@ export const CreateWorkspacePageViewExperimental: FC< owner, setOwner, }) => { - const experimentalFormContext = useContext(ExperimentalFormContext); const [suggestedName, setSuggestedName] = useState(() => generateWorkspaceName(), ); @@ -372,16 +369,6 @@ export const CreateWorkspacePageViewExperimental: FC< )} - {experimentalFormContext && ( - - )}

New workspace

diff --git a/site/src/pages/CreateWorkspacePage/ExperimentalFormContext.tsx b/site/src/pages/CreateWorkspacePage/ExperimentalFormContext.tsx deleted file mode 100644 index f79665a0e4a01..0000000000000 --- a/site/src/pages/CreateWorkspacePage/ExperimentalFormContext.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { createContext } from "react"; - -export const ExperimentalFormContext = createContext< - { toggleOptedOut: () => void } | undefined ->(undefined); diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersExperimentRouter.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersExperimentRouter.tsx index 8e47b0105664d..0a01c9907bd00 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersExperimentRouter.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersExperimentRouter.tsx @@ -1,11 +1,4 @@ -import { ErrorAlert } from "components/Alert/ErrorAlert"; -import { Loader } from "components/Loader/Loader"; -import { - optOutKey, - useDynamicParametersOptOut, -} from "modules/workspaces/DynamicParameter/useDynamicParametersOptOut"; import type { FC } from "react"; -import { ExperimentalFormContext } from "../../CreateWorkspacePage/ExperimentalFormContext"; import { useWorkspaceSettings } from "../WorkspaceSettingsLayout"; import WorkspaceParametersPage from "./WorkspaceParametersPage"; import WorkspaceParametersPageExperimental from "./WorkspaceParametersPageExperimental"; @@ -13,40 +6,14 @@ import WorkspaceParametersPageExperimental from "./WorkspaceParametersPageExperi const WorkspaceParametersExperimentRouter: FC = () => { const workspace = useWorkspaceSettings(); - const optOutQuery = useDynamicParametersOptOut({ - templateId: workspace.template_id, - templateUsesClassicParameters: - workspace.template_use_classic_parameter_flow, - enabled: true, - }); - - if (optOutQuery.isError) { - return ; - } - if (!optOutQuery.data) { - return ; - } - - const toggleOptedOut = () => { - const key = optOutKey(optOutQuery.data.templateId); - const storedValue = localStorage.getItem(key); - - const current = storedValue - ? storedValue === "true" - : Boolean(workspace.template_use_classic_parameter_flow); - - localStorage.setItem(key, (!current).toString()); - optOutQuery.refetch(); - }; - return ( - - {optOutQuery.data.optedOut ? ( + <> + {workspace.template_use_classic_parameter_flow ? ( ) : ( )} - + ); }; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.tsx index 56720292957ff..50f2eedaeec26 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.tsx @@ -4,11 +4,10 @@ import { isApiValidationError } from "api/errors"; import { checkAuthorization } from "api/queries/authCheck"; import type { Workspace, WorkspaceBuildParameter } from "api/typesGenerated"; import { ErrorAlert } from "components/Alert/ErrorAlert"; -import { Button as ShadcnButton } from "components/Button/Button"; import { EmptyState } from "components/EmptyState/EmptyState"; import { Loader } from "components/Loader/Loader"; import { ExternalLinkIcon } from "lucide-react"; -import { type FC, useContext } from "react"; +import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery } from "react-query"; import { useNavigate } from "react-router-dom"; @@ -18,7 +17,6 @@ import { type WorkspacePermissions, workspaceChecks, } from "../../../modules/workspaces/permissions"; -import { ExperimentalFormContext } from "../../CreateWorkspacePage/ExperimentalFormContext"; import { useWorkspaceSettings } from "../WorkspaceSettingsLayout"; import { WorkspaceParametersForm, @@ -113,21 +111,11 @@ export const WorkspaceParametersPageView: FC< isSubmitting, onCancel, }) => { - const experimentalFormContext = useContext(ExperimentalFormContext); return (

Workspace parameters

- {experimentalFormContext && ( - - Try out the new workspace parameters ✨ - - )}
diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx index 5fa3033542782..755291ec28629 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx @@ -7,7 +7,6 @@ import type { WorkspaceBuildParameter, } from "api/typesGenerated"; import { ErrorAlert } from "components/Alert/ErrorAlert"; -import { Button } from "components/Button/Button"; import { EmptyState } from "components/EmptyState/EmptyState"; import { FeatureStageBadge } from "components/FeatureStageBadge/FeatureStageBadge"; import { Link } from "components/Link/Link"; @@ -19,9 +18,9 @@ import { TooltipTrigger, } from "components/Tooltip/Tooltip"; import { useEffectEvent } from "hooks/hookPolyfills"; -import { CircleHelp, Undo2 } from "lucide-react"; +import { CircleHelp } from "lucide-react"; import type { FC } from "react"; -import { useContext, useEffect, useMemo, useRef, useState } from "react"; +import { useEffect, useMemo, useRef, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery } from "react-query"; import { useNavigate, useSearchParams } from "react-router-dom"; @@ -32,14 +31,12 @@ import { type WorkspacePermissions, workspaceChecks, } from "../../../modules/workspaces/permissions"; -import { ExperimentalFormContext } from "../../CreateWorkspacePage/ExperimentalFormContext"; import { useWorkspaceSettings } from "../WorkspaceSettingsLayout"; import { WorkspaceParametersPageViewExperimental } from "./WorkspaceParametersPageViewExperimental"; const WorkspaceParametersPageExperimental: FC = () => { const workspace = useWorkspaceSettings(); const navigate = useNavigate(); - const experimentalFormContext = useContext(ExperimentalFormContext); const [searchParams] = useSearchParams(); const templateVersionId = searchParams.get("templateVersionId") ?? undefined; @@ -236,16 +233,6 @@ const WorkspaceParametersPageExperimental: FC = () => { - {experimentalFormContext && ( - - )} Date: Thu, 12 Jun 2025 16:36:30 +0000 Subject: [PATCH 07/11] fix: fix test --- site/src/pages/WorkspacePage/WorkspacePage.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/pages/WorkspacePage/WorkspacePage.test.tsx b/site/src/pages/WorkspacePage/WorkspacePage.test.tsx index fb95d0c883627..348dd09bff07d 100644 --- a/site/src/pages/WorkspacePage/WorkspacePage.test.tsx +++ b/site/src/pages/WorkspacePage/WorkspacePage.test.tsx @@ -317,7 +317,7 @@ describe("WorkspacePage", () => { value: "2", }, ], - false, + true, ); }); }); From ad3506535e0fd75389102fe4c625455a722b7c44 Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Thu, 12 Jun 2025 17:16:28 +0000 Subject: [PATCH 08/11] fix: fix e2e tests --- site/e2e/helpers.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index 52e9f5e820f23..0d6c10df500b0 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -1011,6 +1011,8 @@ export const updateWorkspace = async ( await page.getByTestId("workspace-update-button").click(); await page.getByTestId("confirm-button").click(); + await page.waitForSelector('[data-testid="dialog"]', { state: "visible" }); + await fillParameters(page, richParameters, buildParameters); await page.getByRole("button", { name: /update parameters/i }).click(); From aa3dd7937acdd0905e3debe5a80bcd1baeee42d0 Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Thu, 12 Jun 2025 17:16:44 +0000 Subject: [PATCH 09/11] fix: pass correct value for isDynamicParametersEnabled --- site/src/modules/workspaces/WorkspaceUpdateDialogs.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/modules/workspaces/WorkspaceUpdateDialogs.tsx b/site/src/modules/workspaces/WorkspaceUpdateDialogs.tsx index 05d705947a6a4..d3ce24537e723 100644 --- a/site/src/modules/workspaces/WorkspaceUpdateDialogs.tsx +++ b/site/src/modules/workspaces/WorkspaceUpdateDialogs.tsx @@ -55,7 +55,7 @@ export const useWorkspaceUpdate = ({ const confirmUpdate = (buildParameters: WorkspaceBuildParameter[] = []) => { updateWorkspaceMutation.mutate({ buildParameters, - isDynamicParametersEnabled: workspace.template_use_classic_parameter_flow, + isDynamicParametersEnabled: !workspace.template_use_classic_parameter_flow, }); setIsConfirmingUpdate(false); }; From 85ed811c395ee7fa0a64570e3e21613050450edd Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Thu, 12 Jun 2025 17:24:04 +0000 Subject: [PATCH 10/11] fix: fix test --- site/src/pages/WorkspacePage/WorkspacePage.test.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/src/pages/WorkspacePage/WorkspacePage.test.tsx b/site/src/pages/WorkspacePage/WorkspacePage.test.tsx index 348dd09bff07d..67a1a460dcd45 100644 --- a/site/src/pages/WorkspacePage/WorkspacePage.test.tsx +++ b/site/src/pages/WorkspacePage/WorkspacePage.test.tsx @@ -305,7 +305,7 @@ describe("WorkspacePage", () => { // Check if the update was called using the values from the form await waitFor(() => { - expect(API.updateWorkspace).toBeCalledWith( + expect(API.updateWorkspace).toHaveBeenCalledWith( MockOutdatedWorkspace, [ { @@ -317,7 +317,7 @@ describe("WorkspacePage", () => { value: "2", }, ], - true, + false, ); }); }); From 9fe37baa80f409c4aa4cac4323d1a1ddcf2db7f5 Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Thu, 12 Jun 2025 17:24:28 +0000 Subject: [PATCH 11/11] fix: format --- site/src/modules/workspaces/WorkspaceUpdateDialogs.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/site/src/modules/workspaces/WorkspaceUpdateDialogs.tsx b/site/src/modules/workspaces/WorkspaceUpdateDialogs.tsx index d3ce24537e723..bdad9e405bd48 100644 --- a/site/src/modules/workspaces/WorkspaceUpdateDialogs.tsx +++ b/site/src/modules/workspaces/WorkspaceUpdateDialogs.tsx @@ -55,7 +55,8 @@ export const useWorkspaceUpdate = ({ const confirmUpdate = (buildParameters: WorkspaceBuildParameter[] = []) => { updateWorkspaceMutation.mutate({ buildParameters, - isDynamicParametersEnabled: !workspace.template_use_classic_parameter_flow, + isDynamicParametersEnabled: + !workspace.template_use_classic_parameter_flow, }); setIsConfirmingUpdate(false); };