Skip to content

Commit fb70536

Browse files
authored
fix issue with number inputs not serializing correctly due to setting values as strings instead of numbers (#94)
consolidate number, string and checkbox value change functions (cherry picked from commit 22c1590885db0534afabff74be7504ca9a0998b5)
1 parent a042633 commit fb70536

File tree

6 files changed

+20
-18
lines changed

6 files changed

+20
-18
lines changed

interface/src/components/RestController.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { redirectingAuthorizedFetch } from '../authentication';
55

66
export interface RestControllerProps<D> extends WithSnackbarProps {
77
handleValueChange: (name: keyof D) => (event: React.ChangeEvent<HTMLInputElement>) => void;
8-
handleCheckboxChange: (name: keyof D) => (event: React.ChangeEvent<HTMLInputElement>, checked: boolean) => void;
98
handleSliderChange: (name: keyof D) => (event: React.ChangeEvent<{}>, value: number | number[]) => void;
109

1110
setData: (data: D) => void;
@@ -23,6 +22,17 @@ interface RestControllerState<D> {
2322
errorMessage?: string;
2423
}
2524

25+
const extractValue = (event: React.ChangeEvent<HTMLInputElement>) => {
26+
switch (event.target.type) {
27+
case "number":
28+
return event.target.valueAsNumber;
29+
case "checkbox":
30+
return event.target.checked;
31+
default:
32+
return event.target.value
33+
}
34+
}
35+
2636
export function restController<D, P extends RestControllerProps<D>>(endpointUrl: string, RestController: React.ComponentType<P & RestControllerProps<D>>) {
2737
return withSnackbar(
2838
class extends React.Component<Omit<P, keyof RestControllerProps<D>> & WithSnackbarProps, RestControllerState<D>> {
@@ -85,12 +95,7 @@ export function restController<D, P extends RestControllerProps<D>>(endpointUrl:
8595
}
8696

8797
handleValueChange = (name: keyof D) => (event: React.ChangeEvent<HTMLInputElement>) => {
88-
const data = { ...this.state.data!, [name]: event.target.value };
89-
this.setState({ data });
90-
}
91-
92-
handleCheckboxChange = (name: keyof D) => (event: React.ChangeEvent<HTMLInputElement>) => {
93-
const data = { ...this.state.data!, [name]: event.target.checked };
98+
const data = { ...this.state.data!, [name]: extractValue(event) };
9499
this.setState({ data });
95100
}
96101

@@ -102,7 +107,6 @@ export function restController<D, P extends RestControllerProps<D>>(endpointUrl:
102107
render() {
103108
return <RestController
104109
handleValueChange={this.handleValueChange}
105-
handleCheckboxChange={this.handleCheckboxChange}
106110
handleSliderChange={this.handleSliderChange}
107111
setData={this.setData}
108112
saveData={this.saveData}

interface/src/ntp/NTPSettingsForm.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ class NTPSettingsForm extends React.Component<NTPSettingsFormProps> {
2828
}
2929

3030
render() {
31-
const { data, handleValueChange, handleCheckboxChange, saveData, loadData } = this.props;
31+
const { data, handleValueChange, saveData, loadData } = this.props;
3232
return (
3333
<ValidatorForm onSubmit={saveData}>
3434
<BlockFormControlLabel
3535
control={
3636
<Checkbox
3737
checked={data.enabled}
38-
onChange={handleCheckboxChange('enabled')}
38+
onChange={handleValueChange('enabled')}
3939
value="enabled"
4040
/>
4141
}

interface/src/security/ManageUsersForm.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,6 @@ class ManageUsersForm extends React.Component<ManageUsersFormProps, ManageUsersF
177177
onDoneEditing={this.doneEditingUser}
178178
onCancelEditing={this.cancelEditingUser}
179179
handleValueChange={this.handleUserValueChange}
180-
handleCheckboxChange={this.handleUserCheckboxChange}
181180
uniqueUsername={this.uniqueUsername}
182181
/>
183182
}

interface/src/security/UserForm.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ interface UserFormProps {
1212
user: User;
1313
uniqueUsername: (value: any) => boolean;
1414
handleValueChange: (name: keyof User) => (event: React.ChangeEvent<HTMLInputElement>) => void;
15-
handleCheckboxChange: (name: keyof User) => (event: React.ChangeEvent<HTMLInputElement>, checked: boolean) => void;
1615
onDoneEditing: () => void;
1716
onCancelEditing: () => void;
1817
}
@@ -30,7 +29,7 @@ class UserForm extends React.Component<UserFormProps> {
3029
}
3130

3231
render() {
33-
const { user, creating, handleValueChange, handleCheckboxChange, onDoneEditing, onCancelEditing } = this.props;
32+
const { user, creating, handleValueChange, onDoneEditing, onCancelEditing } = this.props;
3433
return (
3534
<ValidatorForm onSubmit={onDoneEditing} ref={this.formRef}>
3635
<Dialog onClose={onCancelEditing} aria-labelledby="user-form-dialog-title" open>
@@ -64,7 +63,7 @@ class UserForm extends React.Component<UserFormProps> {
6463
<Checkbox
6564
value="admin"
6665
checked={user.admin}
67-
onChange={handleCheckboxChange('admin')}
66+
onChange={handleValueChange('admin')}
6867
/>
6968
}
7069
label="Admin?"

interface/src/system/OTASettingsForm.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ class OTASettingsForm extends React.Component<OTASettingsFormProps> {
1818
}
1919

2020
render() {
21-
const { data, handleValueChange, handleCheckboxChange, saveData, loadData } = this.props;
21+
const { data, handleValueChange, saveData, loadData } = this.props;
2222
return (
2323
<ValidatorForm onSubmit={saveData}>
2424
<BlockFormControlLabel
2525
control={
2626
<Checkbox
2727
checked={data.enabled}
28-
onChange={handleCheckboxChange("enabled")}
28+
onChange={handleValueChange("enabled")}
2929
/>
3030
}
3131
label="Enable OTA Updates?"

interface/src/wifi/WiFiSettingsForm.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class WiFiSettingsForm extends React.Component<WiFiStatusFormProps> {
3232

3333
render() {
3434
const { selectedNetwork, deselectNetwork } = this.context;
35-
const { data, handleValueChange, handleCheckboxChange, saveData, loadData } = this.props;
35+
const { data, handleValueChange, saveData, loadData } = this.props;
3636
return (
3737
<ValidatorForm onSubmit={saveData} ref="WiFiSettingsForm">
3838
{
@@ -98,7 +98,7 @@ class WiFiSettingsForm extends React.Component<WiFiStatusFormProps> {
9898
<Checkbox
9999
value="static_ip_config"
100100
checked={data.static_ip_config}
101-
onChange={handleCheckboxChange("static_ip_config")}
101+
onChange={handleValueChange("static_ip_config")}
102102
/>
103103
}
104104
label="Static IP Config?"

0 commit comments

Comments
 (0)