mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 15:59:52 +03:00
validators, names when editing sensors
This commit is contained in:
@@ -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 = () => {
|
||||||
|
|||||||
@@ -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
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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' },
|
||||||
|
|||||||
Reference in New Issue
Block a user