Skip to content

Commit e87b0bb

Browse files
toshikishmatifali
andauthored
fix(site): set min and max attributes for workspace number parameters (coder#15182)
Implements coder#14532. This PR sets `min` and `max` attributes for workspace number parameter `<input>` elements using [inputProps](https://mui.com/material-ui/api/text-field/#text-field-prop-inputProps). Note: When we update MUI to v6 or later, it is better to use `slotProps.htmlInput` instead. --------- Co-authored-by: Muhammad Atif Ali <atif@coder.com>
1 parent e3cc3be commit e87b0bb

File tree

4 files changed

+65
-2
lines changed

4 files changed

+65
-2
lines changed

site/src/components/RichParameterInput/RichParameterInput.stories.tsx

+32
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,38 @@ export const NumberType: Story = {
9999
},
100100
};
101101

102+
export const NumberTypeWithIncreasingMonotonicity: Story = {
103+
args: {
104+
value: 4,
105+
id: "number_parameter",
106+
parameter: createTemplateVersionParameter({
107+
name: "number_parameter",
108+
type: "number",
109+
description: "Numeric parameter",
110+
default_value: "",
111+
validation_min: 0,
112+
validation_max: 10,
113+
validation_monotonic: "increasing",
114+
}),
115+
},
116+
};
117+
118+
export const NumberTypeWithDecreasingMonotonicity: Story = {
119+
args: {
120+
value: 4,
121+
id: "number_parameter",
122+
parameter: createTemplateVersionParameter({
123+
name: "number_parameter",
124+
type: "number",
125+
description: "Numeric parameter",
126+
default_value: "",
127+
validation_min: 0,
128+
validation_max: 10,
129+
validation_monotonic: "decreasing",
130+
}),
131+
},
132+
};
133+
102134
export const BooleanType: Story = {
103135
args: {
104136
value: "false",

site/src/components/RichParameterInput/RichParameterInput.tsx

+28
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import ErrorOutline from "@mui/icons-material/ErrorOutline";
33
import Button from "@mui/material/Button";
44
import FormControlLabel from "@mui/material/FormControlLabel";
55
import FormHelperText from "@mui/material/FormHelperText";
6+
import type { InputBaseComponentProps } from "@mui/material/InputBase";
67
import Radio from "@mui/material/Radio";
78
import RadioGroup from "@mui/material/RadioGroup";
89
import TextField, { type TextFieldProps } from "@mui/material/TextField";
@@ -217,6 +218,7 @@ export const RichParameterInput: FC<RichParameterInputProps> = ({
217218
onChange={onChange}
218219
size={size}
219220
parameter={parameter}
221+
parameterAutofill={parameterAutofill}
220222
/>
221223
{!parameter.ephemeral &&
222224
autofillSource === "user_history" &&
@@ -250,6 +252,7 @@ const RichParameterField: FC<RichParameterInputProps> = ({
250252
disabled,
251253
onChange,
252254
parameter,
255+
parameterAutofill,
253256
value,
254257
size,
255258
...props
@@ -375,6 +378,30 @@ const RichParameterField: FC<RichParameterInputProps> = ({
375378
);
376379
}
377380

381+
let inputProps: InputBaseComponentProps = {};
382+
if (parameter.type === "number") {
383+
switch (parameter.validation_monotonic) {
384+
case "increasing":
385+
inputProps = {
386+
max: parameter.validation_max,
387+
min: parameterAutofill?.value,
388+
};
389+
break;
390+
case "decreasing":
391+
inputProps = {
392+
max: parameterAutofill?.value,
393+
min: parameter.validation_min,
394+
};
395+
break;
396+
default:
397+
inputProps = {
398+
max: parameter.validation_max,
399+
min: parameter.validation_min,
400+
};
401+
break;
402+
}
403+
}
404+
378405
// A text field can technically handle all cases!
379406
// As other cases become more prominent (like filtering for numbers),
380407
// we should break this out into more finely scoped input fields.
@@ -389,6 +416,7 @@ const RichParameterField: FC<RichParameterInputProps> = ({
389416
required={parameter.required}
390417
placeholder={parameter.default_value}
391418
value={value}
419+
inputProps={inputProps}
392420
onChange={(event) => {
393421
onChange(event.target.value);
394422
}}

site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersForm.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ export const WorkspaceParametersForm: FC<WorkspaceParameterFormProps> = ({
112112
);
113113
}}
114114
parameter={parameter}
115+
parameterAutofill={autofillParams?.find(
116+
({ name }) => name === parameter.name,
117+
)}
115118
/>
116119
) : null,
117120
)}

site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.test.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ test("Submit the workspace settings page successfully", async () => {
6060
{ exact: false },
6161
);
6262
await user.clear(parameter2);
63-
await user.type(parameter2, "1");
63+
await user.type(parameter2, "3");
6464
await user.click(
6565
within(form).getByRole("button", { name: "Submit and restart" }),
6666
);
@@ -70,7 +70,7 @@ test("Submit the workspace settings page successfully", async () => {
7070
transition: "start",
7171
rich_parameter_values: [
7272
{ name: MockTemplateVersionParameter1.name, value: "new-value" },
73-
{ name: MockTemplateVersionParameter2.name, value: "1" },
73+
{ name: MockTemplateVersionParameter2.name, value: "3" },
7474
],
7575
});
7676
});

0 commit comments

Comments
 (0)