diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx
index 30934d629735b..0dc0f65482548 100644
--- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx
+++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx
@@ -1,4 +1,5 @@
import { useMachine } from "@xstate/react"
+import { TemplateVersionParameter } from "api/typesGenerated"
import { useMe } from "hooks/useMe"
import { useOrganizationId } from "hooks/useOrganizationId"
import { FC } from "react"
@@ -58,7 +59,7 @@ const CreateWorkspacePage: FC = () => {
templateName={templateName}
templates={templates}
selectedTemplate={selectedTemplate}
- templateParameters={templateParameters}
+ templateParameters={orderedTemplateParameters(templateParameters)}
templateSchema={templateSchema}
createWorkspaceErrors={{
[CreateWorkspaceErrors.GET_TEMPLATES_ERROR]: getTemplatesError,
@@ -104,4 +105,18 @@ const getDefaultParameterValues = (
return paramValues
}
+export const orderedTemplateParameters = (
+ templateParameters?: TemplateVersionParameter[],
+): TemplateVersionParameter[] => {
+ if (!templateParameters) {
+ return []
+ }
+
+ const immutables = templateParameters.filter(
+ (parameter) => !parameter.mutable,
+ )
+ const mutables = templateParameters.filter((parameter) => parameter.mutable)
+ return [...immutables, ...mutables]
+}
+
export default CreateWorkspacePage
diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx
index b2518fb3e743f..4bea8b3009753 100644
--- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx
+++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx
@@ -257,48 +257,107 @@ export const CreateWorkspacePageView: FC<
)}
- {/* Rich parameters */}
- {props.templateParameters && props.templateParameters.length > 0 && (
-
-
-
- Rich template params
-
-
- Those values are provided by your template‘s Terraform
- configuration.
-
+ {/* Immutable rich parameters */}
+ {props.templateParameters &&
+ props.templateParameters.filter((p) => !p.mutable).length > 0 && (
+
+
+
+ Immutable parameters
+
+
+ Those values are provided by your template‘s Terraform
+ configuration. Values cannot be changed after creating the
+ workspace.
+
+
+
+
+ {props.templateParameters.map(
+ (parameter, index) =>
+ !parameter.mutable && (
+ {
+ form.setFieldValue(
+ "rich_parameter_values." + index,
+ {
+ name: parameter.name,
+ value: value,
+ },
+ )
+ }}
+ parameter={parameter}
+ initialValue={workspaceBuildParameterValue(
+ initialRichParameterValues,
+ parameter,
+ )}
+ />
+ ),
+ )}
+
-
-
- {props.templateParameters.map((parameter, index) => (
- {
- form.setFieldValue("rich_parameter_values." + index, {
- name: parameter.name,
- value: value,
- })
- }}
- parameter={parameter}
- initialValue={workspaceBuildParameterValue(
- initialRichParameterValues,
- parameter,
- )}
- />
- ))}
-
-
- )}
+ )}
+
+ {/* Mutable rich parameters */}
+ {props.templateParameters &&
+ props.templateParameters.filter((p) => p.mutable).length > 0 && (
+
+
+
+ Mutable parameters
+
+
+ Those values are provided by your template‘s Terraform
+ configuration. Values can be changed after creating the
+ workspace.
+
+
+
+
+ {props.templateParameters.map(
+ (parameter, index) =>
+ parameter.mutable && (
+ {
+ form.setFieldValue(
+ "rich_parameter_values." + index,
+ {
+ name: parameter.name,
+ value: value,
+ },
+ )
+ }}
+ parameter={parameter}
+ initialValue={workspaceBuildParameterValue(
+ initialRichParameterValues,
+ parameter,
+ )}
+ />
+ ),
+ )}
+
+
+ )}
{
const { t } = useTranslation("workspaceBuildParametersPage")
@@ -48,8 +49,13 @@ export const WorkspaceBuildParametersPage: FC = () => {
updatingWorkspace: boolean
onCancel: () => void
@@ -150,7 +151,9 @@ export const WorkspaceBuildParametersPageView: FC<
@@ -161,7 +164,8 @@ export const WorkspaceBuildParametersPageView: FC<
- {props.templateParameters &&
+ {!props.isLoading &&
+ props.templateParameters &&
props.templateParameters.length > 0 &&
props.workspaceBuildParameters && (
@@ -171,27 +175,67 @@ export const WorkspaceBuildParametersPageView: FC<
spacing={4} // Spacing here is diff because the fields here don't have the MUI floating label spacing
className={styles.formSectionFields}
>
- {props.templateParameters.map((parameter, index) => (
-
{
- form.setFieldValue("rich_parameter_values." + index, {
- name: parameter.name,
- value: value,
- })
- }}
- parameter={parameter}
- initialValue={workspaceBuildParameterValue(
- initialRichParameterValues,
- parameter,
- )}
- />
- ))}
+ {props.templateParameters.filter((p) => !p.mutable).length >
+ 0 && (
+
+ Immutable parameters
+
+ )}
+ {props.templateParameters.map(
+ (parameter, index) =>
+ !parameter.mutable && (
+ {
+ form.setFieldValue("rich_parameter_values." + index, {
+ name: parameter.name,
+ value: value,
+ })
+ }}
+ parameter={parameter}
+ initialValue={workspaceBuildParameterValue(
+ initialRichParameterValues,
+ parameter,
+ )}
+ />
+ ),
+ )}
+
+ {props.templateParameters.filter((p) => p.mutable).length >
+ 0 && (
+
+ Mutable parameters
+
+ )}
+ {props.templateParameters.map(
+ (parameter, index) =>
+ parameter.mutable && (
+ {
+ form.setFieldValue("rich_parameter_values." + index, {
+ name: parameter.name,
+ value: value,
+ })
+ }}
+ parameter={parameter}
+ initialValue={workspaceBuildParameterValue(
+ initialRichParameterValues,
+ parameter,
+ )}
+ />
+ ),
+ )}
({
+const useStyles = makeStyles((theme) => ({
goBackSection: {
display: "flex",
width: "100%",
@@ -292,6 +336,13 @@ const useStyles = makeStyles(() => ({
formSectionFields: {
width: "100%",
},
+ formSectionParameterTitle: {
+ fontSize: 20,
+ color: theme.palette.text.primary,
+ fontWeight: 400,
+ margin: 0,
+ marginBottom: theme.spacing(1),
+ },
}))
const useFormFooterStyles = makeStyles((theme) => ({