diff --git a/site/src/pages/TemplateBuilder/ModuleConfiguration.tsx b/site/src/pages/TemplateBuilder/ModuleConfiguration.tsx index 4052f5ea78..6fdb7fb430 100644 --- a/site/src/pages/TemplateBuilder/ModuleConfiguration.tsx +++ b/site/src/pages/TemplateBuilder/ModuleConfiguration.tsx @@ -1,4 +1,5 @@ import { TrashIcon } from "lucide-react"; +import type { PropsWithChildren } from "react"; import { Button } from "#/components/Button/Button"; import { Link } from "#/components/Link/Link"; import { @@ -6,14 +7,14 @@ import { type ConfigurationFieldDefinition, } from "./ConfigurationField"; -type ModuleConfigurationProps = { +type ModuleConfigurationProps = PropsWithChildren<{ name: string; description: string; iconUrl?: string; detailsUrl?: string; onRemove?: () => void; fields?: ConfigurationFieldDefinition[]; -}; +}>; export const ModuleConfiguration: React.FC = ({ name, @@ -22,6 +23,7 @@ export const ModuleConfiguration: React.FC = ({ detailsUrl, onRemove, fields, + children, }) => { return (
@@ -77,6 +79,8 @@ export const ModuleConfiguration: React.FC = ({ ))} )} + + {children}
); }; diff --git a/site/src/pages/TemplateBuilder/ModuleSettingsStep.tsx b/site/src/pages/TemplateBuilder/ModuleSettingsStep.tsx index 71046a449e..acfa21ea81 100644 --- a/site/src/pages/TemplateBuilder/ModuleSettingsStep.tsx +++ b/site/src/pages/TemplateBuilder/ModuleSettingsStep.tsx @@ -7,7 +7,9 @@ import type { TemplateBuilderModulesResponse, TemplateBuilderModuleVariable, } from "#/api/typesGenerated"; +import { CollapsibleSummary } from "#/components/CollapsibleSummary/CollapsibleSummary"; import type { ConfigurationFieldDefinition } from "./ConfigurationField"; +import { ConfigurationField } from "./ConfigurationField"; import { ModuleConfiguration } from "./ModuleConfiguration"; interface ModuleSettingsStepProps { @@ -122,12 +124,16 @@ export const ModuleSettingsStep: FC = ({ const sensitiveVars = mod.variables.filter((v) => v.sensitive); const vars = moduleVariables[mod.id] ?? {}; - const fields: ConfigurationFieldDefinition[] = configurableVars.map( - (v) => - variableToField(mod.id, v, vars[v.name] ?? "", (name, val) => - handleChange(mod.id, name, val), - ), - ); + const toField = (v: TemplateBuilderModuleVariable) => + variableToField(mod.id, v, vars[v.name] ?? "", (name, val) => + handleChange(mod.id, name, val), + ); + + const requiredVars = configurableVars.filter((v) => v.required); + const optionalVars = configurableVars.filter((v) => !v.required); + + const requiredFields = requiredVars.map(toField); + const optionalFields = optionalVars.map(toField); return (
@@ -136,8 +142,19 @@ export const ModuleSettingsStep: FC = ({ description={mod.description} iconUrl={mod.icon} detailsUrl={moduleDetailsUrl(mod.id)} - fields={fields} - /> + fields={requiredFields} + > + {optionalFields.length > 0 && ( + + {optionalFields.map((f) => ( + + ))} + + )} + {sensitiveVars.length > 0 && (