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';
|
} 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>
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user