validators, names when editing sensors

This commit is contained in:
MichaelDvP
2024-07-25 14:32:34 +02:00
parent cfecb390f9
commit 51d323a41d
4 changed files with 58 additions and 9 deletions

View File

@@ -160,6 +160,9 @@ const Scheduler: FC = () => {
setCreating(false); setCreating(false);
setSelectedScheduleItem(si); setSelectedScheduleItem(si);
setDialogOpen(true); setDialogOpen(true);
if (si.o_name === undefined) {
si.o_name = si.name;
}
}, []); }, []);
const onDialogClose = () => { const onDialogClose = () => {

View File

@@ -255,6 +255,7 @@ const Sensors: FC = () => {
const updateTemperatureSensor = (ts: TemperatureSensor) => { const updateTemperatureSensor = (ts: TemperatureSensor) => {
if (me.admin) { if (me.admin) {
ts.o_n = ts.n;
setSelectedTemperatureSensor(ts); setSelectedTemperatureSensor(ts);
setTemperatureDialogOpen(true); setTemperatureDialogOpen(true);
} }
@@ -282,6 +283,7 @@ const Sensors: FC = () => {
const updateAnalogSensor = (as: AnalogSensor) => { const updateAnalogSensor = (as: AnalogSensor) => {
if (me.admin) { if (me.admin) {
setCreating(false); setCreating(false);
as.o_n = as.n;
setSelectedAnalogSensor(as); setSelectedAnalogSensor(as);
setAnalogDialogOpen(true); setAnalogDialogOpen(true);
} }
@@ -302,7 +304,8 @@ const Sensors: FC = () => {
o: 0, o: 0,
t: 0, t: 0,
f: 1, f: 1,
d: false d: false,
o_n: ''
}); });
setAnalogDialogOpen(true); setAnalogDialogOpen(true);
}; };
@@ -465,7 +468,10 @@ const Sensors: FC = () => {
onClose={onTemperatureDialogClose} onClose={onTemperatureDialogClose}
onSave={onTemperatureDialogSave} onSave={onTemperatureDialogSave}
selectedItem={selectedTemperatureSensor} selectedItem={selectedTemperatureSensor}
validator={temperatureSensorItemValidation(sensorData.ts)} validator={temperatureSensorItemValidation(
sensorData.ts,
selectedTemperatureSensor
)}
/> />
)} )}
{sensorData?.analog_enabled === true && ( {sensorData?.analog_enabled === true && (
@@ -483,6 +489,7 @@ const Sensors: FC = () => {
selectedItem={selectedAnalogSensor} selectedItem={selectedAnalogSensor}
validator={analogSensorItemValidation( validator={analogSensorItemValidation(
sensorData.as, sensorData.as,
selectedAnalogSensor,
creating, creating,
sensorData.platform sensorData.platform
)} )}

View File

@@ -79,6 +79,7 @@ export interface TemperatureSensor {
t?: number; // temp, optional t?: number; // temp, optional
o: number; // offset o: number; // offset
u: number; // uom u: number; // uom
o_n?: string;
} }
export interface AnalogSensor { export interface AnalogSensor {
@@ -91,6 +92,7 @@ export interface AnalogSensor {
f: number; f: number;
t: number; t: number;
d: boolean; // deleted flag d: boolean; // deleted flag
o_n?: string;
} }
export interface WriteTemperatureSensor { export interface WriteTemperatureSensor {

View File

@@ -241,6 +241,25 @@ export const createSettingsValidator = (settings: Settings) =>
{ type: 'number', min: 0, max: 10, message: 'Must be between 0 and 10' } { type: 'number', min: 0, max: 10, message: 'Must be between 0 and 10' }
] ]
}), }),
...(settings.modbus_enabled && {
modbus_max_clients: [
{ required: true, message: 'Max clients is required' },
{ type: 'number', min: 0, max: 50, message: 'Invalid number' }
],
modbus_port: [
{ required: true, message: 'Port is required' },
{ type: 'number', min: 0, max: 65535, message: 'Invalid Port' }
],
modbus_timeout: [
{ required: true, message: 'Timeout is required' },
{
type: 'number',
min: 100,
max: 20000,
message: 'Must be between 100 and 20000'
}
]
}),
...(settings.shower_timer && { ...(settings.shower_timer && {
shower_min_duration: [ shower_min_duration: [
{ {
@@ -388,9 +407,16 @@ export const entityItemValidation = (entity: EntityItem[], entityItem: EntityIte
] ]
}); });
export const uniqueTemperatureNameValidator = (sensors: TemperatureSensor[]) => ({ export const uniqueTemperatureNameValidator = (
sensors: TemperatureSensor[],
o_name?: string
) => ({
validator(rule: InternalRuleItem, n: string, callback: (error?: string) => void) { validator(rule: InternalRuleItem, n: string, callback: (error?: string) => void) {
if (n !== '' && sensors.find((ts) => ts.n.toLowerCase() === n.toLowerCase())) { if (
(o_name === undefined || o_name.toLowerCase() !== n.toLowerCase()) &&
n !== '' &&
sensors.find((ts) => ts.n.toLowerCase() === n.toLowerCase())
) {
callback('Name already in use'); callback('Name already in use');
} else { } else {
callback(); callback();
@@ -398,7 +424,10 @@ export const uniqueTemperatureNameValidator = (sensors: TemperatureSensor[]) =>
} }
}); });
export const temperatureSensorItemValidation = (sensors: TemperatureSensor[]) => export const temperatureSensorItemValidation = (
sensors: TemperatureSensor[],
sensor: TemperatureSensor
) =>
new Schema({ new Schema({
n: [ n: [
{ {
@@ -406,7 +435,7 @@ export const temperatureSensorItemValidation = (sensors: TemperatureSensor[]) =>
pattern: /^[a-zA-Z0-9_]{0,19}$/, pattern: /^[a-zA-Z0-9_]{0,19}$/,
message: "Must be <20 characters: alphanumeric or '_'" message: "Must be <20 characters: alphanumeric or '_'"
}, },
...[uniqueTemperatureNameValidator(sensors)] ...[uniqueTemperatureNameValidator(sensors, sensor.o_n)]
] ]
}); });
@@ -424,9 +453,16 @@ export const isGPIOUniqueValidator = (sensors: AnalogSensor[]) => ({
} }
}); });
export const uniqueAnalogNameValidator = (sensors: AnalogSensor[]) => ({ export const uniqueAnalogNameValidator = (
sensors: AnalogSensor[],
o_name?: string
) => ({
validator(rule: InternalRuleItem, n: string, callback: (error?: string) => void) { validator(rule: InternalRuleItem, n: string, callback: (error?: string) => void) {
if (n !== '' && sensors.find((as) => as.n.toLowerCase() === n.toLowerCase())) { if (
(o_name === undefined || o_name.toLowerCase() !== n.toLowerCase()) &&
n !== '' &&
sensors.find((as) => as.n.toLowerCase() === n.toLowerCase())
) {
callback('Name already in use'); callback('Name already in use');
} else { } else {
callback(); callback();
@@ -436,6 +472,7 @@ export const uniqueAnalogNameValidator = (sensors: AnalogSensor[]) => ({
export const analogSensorItemValidation = ( export const analogSensorItemValidation = (
sensors: AnalogSensor[], sensors: AnalogSensor[],
sensor: AnalogSensor,
creating: boolean, creating: boolean,
platform: string platform: string
) => ) =>
@@ -446,7 +483,7 @@ export const analogSensorItemValidation = (
pattern: /^[a-zA-Z0-9_]{0,19}$/, pattern: /^[a-zA-Z0-9_]{0,19}$/,
message: "Must be <20 characters: alphanumeric or '_'" message: "Must be <20 characters: alphanumeric or '_'"
}, },
...[uniqueAnalogNameValidator(sensors)] ...[uniqueAnalogNameValidator(sensors, sensor.o_n)]
], ],
g: [ g: [
{ required: true, message: 'GPIO is required' }, { required: true, message: 'GPIO is required' },