Skip to content

Commit e87b0bb

Browse files
toshikishmatifali
andauthored
fix(site): set min and max attributes for workspace number parameters (#15182)
Implements #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

Lines changed: 32 additions & 0 deletions
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

Lines changed: 28 additions & 0 deletions
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

Lines changed: 3 additions & 0 deletions
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

Lines changed: 2 additions & 2 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy