mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 07:49:52 +03:00
improve dv validation, add back ugly step
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user