improve dv validation, add back ugly step

This commit is contained in:
Proddy
2023-05-03 08:54:57 +02:00
parent 310bb53985
commit e84a3bc99a
4 changed files with 32 additions and 42 deletions

View File

@@ -17,7 +17,6 @@ import {
} from '@mui/material'; } from '@mui/material';
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import { formatValueNoUOM } from './deviceValue';
import { DeviceValueUOM, DeviceValueUOM_s } from './types'; import { DeviceValueUOM, DeviceValueUOM_s } from './types';
import type { DeviceValue } from './types'; import type { DeviceValue } from './types';
import type Schema from 'async-validator'; import type Schema from 'async-validator';
@@ -48,11 +47,6 @@ const DashboarDevicesDialog = ({ open, onClose, onSave, selectedItem, validator
if (open) { if (open) {
setFieldErrors(undefined); setFieldErrors(undefined);
setEditItem(selectedItem); setEditItem(selectedItem);
// format value and convert to string
setEditItem({
...selectedItem,
v: formatValueNoUOM(selectedItem.v, selectedItem.u)
});
} }
}, [open, selectedItem]); }, [open, selectedItem]);
@@ -90,13 +84,20 @@ const DashboarDevicesDialog = ({ open, onClose, onSave, selectedItem, validator
if (dv.l) { if (dv.l) {
return '[ ' + dv.l.join(' | ') + ' ]'; return '[ ' + dv.l.join(' | ') + ' ]';
} }
let helperText = '<';
if (dv.u !== DeviceValueUOM.NONE) { if (dv.u !== DeviceValueUOM.NONE) {
helperText += 'n';
if (dv.m && dv.x) { if (dv.m && dv.x) {
return '<number between ' + dv.m + ' and ' + dv.x + '>'; helperText += ' between ' + dv.m + ' and ' + dv.x;
} }
return '<number>'; if (dv.s) {
helperText += ' , step ' + dv.s;
}
} else {
helperText += 'text';
} }
return ''; return helperText + '>';
}; };
return ( return (
@@ -108,7 +109,7 @@ const DashboarDevicesDialog = ({ open, onClose, onSave, selectedItem, validator
</Box> </Box>
<Grid> <Grid>
<Grid item> <Grid item>
{editItem.l && ( {editItem.l ? (
<TextField <TextField
name="v" name="v"
label={LL.VALUE(1)} label={LL.VALUE(1)}
@@ -124,8 +125,22 @@ const DashboarDevicesDialog = ({ open, onClose, onSave, selectedItem, validator
</MenuItem> </MenuItem>
))} ))}
</TextField> </TextField>
)} ) : editItem.u !== DeviceValueUOM.NONE ? (
{!editItem.l && ( <ValidatedTextField
fieldErrors={fieldErrors}
name="v"
label={LL.VALUE(1)}
value={Math.round(editItem.v * 10) / 10}
autoFocus
type="number"
sx={{ width: '30ch' }}
onChange={updateFormValue}
inputProps={editItem.u ? { min: editItem.m, max: editItem.x, step: editItem.s } : {}}
InputProps={{
startAdornment: <InputAdornment position="start">{setUom(editItem.u)}</InputAdornment>
}}
/>
) : (
<ValidatedTextField <ValidatedTextField
fieldErrors={fieldErrors} fieldErrors={fieldErrors}
name="v" name="v"
@@ -135,9 +150,6 @@ const DashboarDevicesDialog = ({ open, onClose, onSave, selectedItem, validator
sx={{ width: '30ch' }} sx={{ width: '30ch' }}
multiline={editItem.u ? false : true} multiline={editItem.u ? false : true}
onChange={updateFormValue} onChange={updateFormValue}
InputProps={{
startAdornment: <InputAdornment position="start">{setUom(editItem.u)}</InputAdornment>
}}
/> />
)} )}
</Grid> </Grid>

View File

@@ -54,23 +54,3 @@ export function formatValue(LL: TranslationFunctions, value: any, uom: number) {
return new Intl.NumberFormat().format(value) + ' ' + DeviceValueUOM_s[uom]; return new Intl.NumberFormat().format(value) + ' ' + DeviceValueUOM_s[uom];
} }
} }
export const formatValueNoUOM = (value: any, uom: number) => {
if (value === undefined) {
return '';
}
switch (uom) {
case DeviceValueUOM.NONE:
if (typeof value === 'number') {
return Number(value);
}
return value;
case DeviceValueUOM.DEGREES:
case DeviceValueUOM.DEGREES_R:
case DeviceValueUOM.FAHRENHEIT:
return Number(value).toFixed(1);
default:
return value;
}
};

View File

@@ -123,7 +123,7 @@ export interface Devices {
export interface DeviceValue { export interface DeviceValue {
id: string; // index, contains mask+name id: string; // index, contains mask+name
v: any; // value, in any format v: any; // value, Number or String
u: number; // uom u: number; // uom
c?: string; // command, optional c?: string; // command, optional
l?: string[]; // list, optional l?: string[]; // list, optional

View File

@@ -168,13 +168,11 @@ export const deviceValueItemValidation = (dv: DeviceValue) =>
v: [ v: [
{ required: true, message: 'Value is required' }, { required: true, message: 'Value is required' },
{ {
validator(rule: InternalRuleItem, value: string, callback: (error?: string) => void) { validator(rule: InternalRuleItem, value: any, callback: (error?: string) => void) {
if (dv.u !== DeviceValueUOM.NONE && isNaN(+value)) { if (typeof value === 'number' && dv.m && dv.x && (value < dv.m || value > dv.x)) {
callback('Not a valid number'); callback('Value out of range');
} }
(dv.m && Number(value) < dv.m) || (dv.x && Number(value) > dv.x) callback();
? callback('Value out of range')
: callback();
} }
} }
] ]