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)
This commit is contained in:
		| @@ -5,7 +5,6 @@ import { redirectingAuthorizedFetch } from '../authentication'; | |||||||
|  |  | ||||||
| export interface RestControllerProps<D> extends WithSnackbarProps { | export interface RestControllerProps<D> extends WithSnackbarProps { | ||||||
|   handleValueChange: (name: keyof D) => (event: React.ChangeEvent<HTMLInputElement>) => void; |   handleValueChange: (name: keyof D) => (event: React.ChangeEvent<HTMLInputElement>) => void; | ||||||
|   handleCheckboxChange: (name: keyof D) => (event: React.ChangeEvent<HTMLInputElement>, checked: boolean) => void; |  | ||||||
|   handleSliderChange: (name: keyof D) => (event: React.ChangeEvent<{}>, value: number | number[]) => void; |   handleSliderChange: (name: keyof D) => (event: React.ChangeEvent<{}>, value: number | number[]) => void; | ||||||
|  |  | ||||||
|   setData: (data: D) => void; |   setData: (data: D) => void; | ||||||
| @@ -23,6 +22,17 @@ interface RestControllerState<D> { | |||||||
|   errorMessage?: string; |   errorMessage?: string; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | const extractValue = (event: React.ChangeEvent<HTMLInputElement>) => { | ||||||
|  |   switch (event.target.type) { | ||||||
|  |     case "number": | ||||||
|  |       return event.target.valueAsNumber; | ||||||
|  |     case "checkbox": | ||||||
|  |       return event.target.checked; | ||||||
|  |     default: | ||||||
|  |       return event.target.value | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
| export function restController<D, P extends RestControllerProps<D>>(endpointUrl: string, RestController: React.ComponentType<P & RestControllerProps<D>>) { | export function restController<D, P extends RestControllerProps<D>>(endpointUrl: string, RestController: React.ComponentType<P & RestControllerProps<D>>) { | ||||||
|   return withSnackbar( |   return withSnackbar( | ||||||
|     class extends React.Component<Omit<P, keyof RestControllerProps<D>> & WithSnackbarProps, RestControllerState<D>> { |     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: | |||||||
|       } |       } | ||||||
|  |  | ||||||
|       handleValueChange = (name: keyof D) => (event: React.ChangeEvent<HTMLInputElement>) => { |       handleValueChange = (name: keyof D) => (event: React.ChangeEvent<HTMLInputElement>) => { | ||||||
|         const data = { ...this.state.data!, [name]: event.target.value }; |         const data = { ...this.state.data!, [name]: extractValue(event) }; | ||||||
|         this.setState({ data }); |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       handleCheckboxChange = (name: keyof D) => (event: React.ChangeEvent<HTMLInputElement>) => { |  | ||||||
|         const data = { ...this.state.data!, [name]: event.target.checked }; |  | ||||||
|         this.setState({ data }); |         this.setState({ data }); | ||||||
|       } |       } | ||||||
|  |  | ||||||
| @@ -102,7 +107,6 @@ export function restController<D, P extends RestControllerProps<D>>(endpointUrl: | |||||||
|       render() { |       render() { | ||||||
|         return <RestController |         return <RestController | ||||||
|           handleValueChange={this.handleValueChange} |           handleValueChange={this.handleValueChange} | ||||||
|           handleCheckboxChange={this.handleCheckboxChange} |  | ||||||
|           handleSliderChange={this.handleSliderChange} |           handleSliderChange={this.handleSliderChange} | ||||||
|           setData={this.setData} |           setData={this.setData} | ||||||
|           saveData={this.saveData} |           saveData={this.saveData} | ||||||
|   | |||||||
| @@ -28,14 +28,14 @@ class NTPSettingsForm extends React.Component<NTPSettingsFormProps> { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   render() { |   render() { | ||||||
|     const { data, handleValueChange, handleCheckboxChange, saveData, loadData } = this.props; |     const { data, handleValueChange, saveData, loadData } = this.props; | ||||||
|     return ( |     return ( | ||||||
|       <ValidatorForm onSubmit={saveData}> |       <ValidatorForm onSubmit={saveData}> | ||||||
|         <BlockFormControlLabel |         <BlockFormControlLabel | ||||||
|           control={ |           control={ | ||||||
|             <Checkbox |             <Checkbox | ||||||
|               checked={data.enabled} |               checked={data.enabled} | ||||||
|               onChange={handleCheckboxChange('enabled')} |               onChange={handleValueChange('enabled')} | ||||||
|               value="enabled" |               value="enabled" | ||||||
|             /> |             /> | ||||||
|           } |           } | ||||||
|   | |||||||
| @@ -177,7 +177,6 @@ class ManageUsersForm extends React.Component<ManageUsersFormProps, ManageUsersF | |||||||
|             onDoneEditing={this.doneEditingUser} |             onDoneEditing={this.doneEditingUser} | ||||||
|             onCancelEditing={this.cancelEditingUser} |             onCancelEditing={this.cancelEditingUser} | ||||||
|             handleValueChange={this.handleUserValueChange} |             handleValueChange={this.handleUserValueChange} | ||||||
|             handleCheckboxChange={this.handleUserCheckboxChange} |  | ||||||
|             uniqueUsername={this.uniqueUsername} |             uniqueUsername={this.uniqueUsername} | ||||||
|           /> |           /> | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -12,7 +12,6 @@ interface UserFormProps { | |||||||
|   user: User; |   user: User; | ||||||
|   uniqueUsername: (value: any) => boolean; |   uniqueUsername: (value: any) => boolean; | ||||||
|   handleValueChange: (name: keyof User) => (event: React.ChangeEvent<HTMLInputElement>) => void; |   handleValueChange: (name: keyof User) => (event: React.ChangeEvent<HTMLInputElement>) => void; | ||||||
|   handleCheckboxChange: (name: keyof User) => (event: React.ChangeEvent<HTMLInputElement>, checked: boolean) => void; |  | ||||||
|   onDoneEditing: () => void; |   onDoneEditing: () => void; | ||||||
|   onCancelEditing: () => void; |   onCancelEditing: () => void; | ||||||
| } | } | ||||||
| @@ -30,7 +29,7 @@ class UserForm extends React.Component<UserFormProps> { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   render() { |   render() { | ||||||
|     const { user, creating, handleValueChange, handleCheckboxChange, onDoneEditing, onCancelEditing } = this.props; |     const { user, creating, handleValueChange, onDoneEditing, onCancelEditing } = this.props; | ||||||
|     return ( |     return ( | ||||||
|       <ValidatorForm onSubmit={onDoneEditing} ref={this.formRef}> |       <ValidatorForm onSubmit={onDoneEditing} ref={this.formRef}> | ||||||
|         <Dialog onClose={onCancelEditing} aria-labelledby="user-form-dialog-title" open> |         <Dialog onClose={onCancelEditing} aria-labelledby="user-form-dialog-title" open> | ||||||
| @@ -64,7 +63,7 @@ class UserForm extends React.Component<UserFormProps> { | |||||||
|                 <Checkbox |                 <Checkbox | ||||||
|                   value="admin" |                   value="admin" | ||||||
|                   checked={user.admin} |                   checked={user.admin} | ||||||
|                   onChange={handleCheckboxChange('admin')} |                   onChange={handleValueChange('admin')} | ||||||
|                 /> |                 /> | ||||||
|               } |               } | ||||||
|               label="Admin?" |               label="Admin?" | ||||||
|   | |||||||
| @@ -18,14 +18,14 @@ class OTASettingsForm extends React.Component<OTASettingsFormProps> { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   render() { |   render() { | ||||||
|     const { data, handleValueChange, handleCheckboxChange, saveData, loadData } = this.props; |     const { data, handleValueChange, saveData, loadData } = this.props; | ||||||
|     return ( |     return ( | ||||||
|       <ValidatorForm onSubmit={saveData}> |       <ValidatorForm onSubmit={saveData}> | ||||||
|         <BlockFormControlLabel |         <BlockFormControlLabel | ||||||
|           control={ |           control={ | ||||||
|             <Checkbox |             <Checkbox | ||||||
|               checked={data.enabled} |               checked={data.enabled} | ||||||
|               onChange={handleCheckboxChange("enabled")} |               onChange={handleValueChange("enabled")} | ||||||
|             /> |             /> | ||||||
|           } |           } | ||||||
|           label="Enable OTA Updates?" |           label="Enable OTA Updates?" | ||||||
|   | |||||||
| @@ -32,7 +32,7 @@ class WiFiSettingsForm extends React.Component<WiFiStatusFormProps> { | |||||||
|  |  | ||||||
|   render() { |   render() { | ||||||
|     const { selectedNetwork, deselectNetwork } = this.context; |     const { selectedNetwork, deselectNetwork } = this.context; | ||||||
|     const { data, handleValueChange, handleCheckboxChange, saveData, loadData } = this.props; |     const { data, handleValueChange, saveData, loadData } = this.props; | ||||||
|     return ( |     return ( | ||||||
|       <ValidatorForm onSubmit={saveData} ref="WiFiSettingsForm"> |       <ValidatorForm onSubmit={saveData} ref="WiFiSettingsForm"> | ||||||
|         { |         { | ||||||
| @@ -98,7 +98,7 @@ class WiFiSettingsForm extends React.Component<WiFiStatusFormProps> { | |||||||
|             <Checkbox |             <Checkbox | ||||||
|               value="static_ip_config" |               value="static_ip_config" | ||||||
|               checked={data.static_ip_config} |               checked={data.static_ip_config} | ||||||
|               onChange={handleCheckboxChange("static_ip_config")} |               onChange={handleValueChange("static_ip_config")} | ||||||
|             /> |             /> | ||||||
|           } |           } | ||||||
|           label="Static IP Config?" |           label="Static IP Config?" | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user