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';
import { useState, useEffect } from 'react';
import { formatValueNoUOM } from './deviceValue';
import { DeviceValueUOM, DeviceValueUOM_s } from './types';
import type { DeviceValue } from './types';
import type Schema from 'async-validator';
@@ -48,11 +47,6 @@ const DashboarDevicesDialog = ({ open, onClose, onSave, selectedItem, validator
if (open) {
setFieldErrors(undefined);
setEditItem(selectedItem);
// format value and convert to string
setEditItem({
...selectedItem,
v: formatValueNoUOM(selectedItem.v, selectedItem.u)
});
}
}, [open, selectedItem]);
@@ -90,13 +84,20 @@ const DashboarDevicesDialog = ({ open, onClose, onSave, selectedItem, validator
if (dv.l) {
return '[ ' + dv.l.join(' | ') + ' ]';
}
let helperText = '<';
if (dv.u !== DeviceValueUOM.NONE) {
helperText += 'n';
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;
}
return '';
} else {
helperText += 'text';
}
return helperText + '>';
};
return (
@@ -108,7 +109,7 @@ const DashboarDevicesDialog = ({ open, onClose, onSave, selectedItem, validator
</Box>
<Grid>
<Grid item>
{editItem.l && (
{editItem.l ? (
<TextField
name="v"
label={LL.VALUE(1)}
@@ -124,8 +125,22 @@ const DashboarDevicesDialog = ({ open, onClose, onSave, selectedItem, validator
</MenuItem>
))}
</TextField>
)}
{!editItem.l && (
) : editItem.u !== DeviceValueUOM.NONE ? (
<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
fieldErrors={fieldErrors}
name="v"
@@ -135,9 +150,6 @@ const DashboarDevicesDialog = ({ open, onClose, onSave, selectedItem, validator
sx={{ width: '30ch' }}
multiline={editItem.u ? false : true}
onChange={updateFormValue}
InputProps={{
startAdornment: <InputAdornment position="start">{setUom(editItem.u)}</InputAdornment>
}}
/>
)}
</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];
}
}
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 {
id: string; // index, contains mask+name
v: any; // value, in any format
v: any; // value, Number or String
u: number; // uom
c?: string; // command, optional
l?: string[]; // list, optional

View File

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