+
+
+
+
+
+
+
+
+ {props.templateParameters &&
+ props.templateParameters.length > 0 &&
+ props.workspaceBuildParameters && (
+
+
+
+ )}
+
+ )
+}
+
+const selectInitialRichParametersValues = (
+ templateParameters?: TypesGen.TemplateVersionParameter[],
+ workspaceBuildParameters?: TypesGen.WorkspaceBuildParameter[],
+): TypesGen.WorkspaceBuildParameter[] => {
+ const defaults: TypesGen.WorkspaceBuildParameter[] = []
+ if (!templateParameters) {
+ return defaults
+ }
+
+ templateParameters.forEach((parameter) => {
+ if (parameter.options.length > 0) {
+ let parameterValue = parameter.options[0].value
+ if (workspaceBuildParameters) {
+ const foundBuildParameter = workspaceBuildParameters.find(
+ (buildParameter) => {
+ return buildParameter.name === parameter.name
+ },
+ )
+ if (foundBuildParameter) {
+ parameterValue = foundBuildParameter.value
+ }
+ }
+
+ const buildParameter: TypesGen.WorkspaceBuildParameter = {
+ name: parameter.name,
+ value: parameterValue,
+ }
+ defaults.push(buildParameter)
+ return
+ }
+
+ let parameterValue = parameter.default_value
+ if (workspaceBuildParameters) {
+ const foundBuildParameter = workspaceBuildParameters.find(
+ (buildParameter) => {
+ return buildParameter.name === parameter.name
+ },
+ )
+ if (foundBuildParameter) {
+ parameterValue = foundBuildParameter.value
+ }
+ }
+
+ const buildParameter: TypesGen.WorkspaceBuildParameter = {
+ name: parameter.name,
+ value: parameterValue || "",
+ }
+ defaults.push(buildParameter)
+ })
+ return defaults
+}
+
+const stripImmutableParameters = (
+ request: TypesGen.CreateWorkspaceBuildRequest,
+ templateParameters?: TypesGen.TemplateVersionParameter[],
+): TypesGen.CreateWorkspaceBuildRequest => {
+ if (!templateParameters || !request.rich_parameter_values) {
+ return request
+ }
+
+ const mutableBuildParameters = request.rich_parameter_values.filter(
+ (buildParameter) =>
+ templateParameters.find(
+ (templateParameter) => templateParameter.name === buildParameter.name,
+ )?.mutable,
+ )
+
+ return {
+ ...request,
+ rich_parameter_values: mutableBuildParameters,
+ }
+}
+
+const useStyles = makeStyles(() => ({
+ goBackSection: {
+ display: "flex",
+ width: "100%",
+ marginTop: 32,
+ },
+ formSection: {
+ marginTop: 20,
+ },
+
+ formSectionFields: {
+ width: "100%",
+ },
+}))
+
+const useFormFooterStyles = makeStyles((theme) => ({
+ button: {
+ minWidth: theme.spacing(23),
+
+ [theme.breakpoints.down("sm")]: {
+ width: "100%",
+ },
+ },
+ footer: {
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "flex-start",
+ flexDirection: "row-reverse",
+ gap: theme.spacing(2),
+
+ [theme.breakpoints.down("sm")]: {
+ flexDirection: "column",
+ gap: theme.spacing(1),
+ },
+ },
+}))
diff --git a/site/src/pages/WorkspacePage/WorkspacePage.test.tsx b/site/src/pages/WorkspacePage/WorkspacePage.test.tsx
index 2110e27ada732..c793863b16d9d 100644
--- a/site/src/pages/WorkspacePage/WorkspacePage.test.tsx
+++ b/site/src/pages/WorkspacePage/WorkspacePage.test.tsx
@@ -30,6 +30,7 @@ const { t } = i18next
// It renders the workspace page and waits for it be loaded
const renderWorkspacePage = async () => {
jest.spyOn(api, "getTemplate").mockResolvedValueOnce(MockTemplate)
+ jest.spyOn(api, "getTemplateVersionRichParameters").mockResolvedValueOnce([])
renderWithAuth(