- Lokale useState-Variablen für alle Eingabefelder in KueEinstellung.tsx eingeführt
- Fokusverlust beim Tippen verhindert, Redux-Update erfolgt erst bei onBlur
- handleSave.ts angepasst: Jede Änderung wird einzeln als CGI-Request gesendet
- Fehlerhafte Namensspeicherung ("Test;KL_0=13") korrigiert
- Zuverlässigkeit der Bedienung und Speicherung auf CPL-Webserver verbessert
166 lines
4.3 KiB
TypeScript
166 lines
4.3 KiB
TypeScript
// components/modales/kueModal/handlers/handleSave.ts
|
||
import { setKueData } from "../../../../../redux/slices/kueDataSlice";
|
||
|
||
export interface OriginalValues {
|
||
kueID: string[];
|
||
isolationsgrenzwerte: number[];
|
||
verzoegerung: number[];
|
||
untereSchleifenGrenzwerte: number[];
|
||
obereSchleifenGrenzwerte: number[];
|
||
schleifenintervall: number[];
|
||
speicherintervall: number[];
|
||
}
|
||
|
||
interface HandleSaveParams {
|
||
ids: string[];
|
||
isolationsgrenzwerte: number[];
|
||
verzoegerung: number[];
|
||
untereSchleifenGrenzwerte: number[];
|
||
obereSchleifenGrenzwerte: number[];
|
||
schleifenintervall: number[];
|
||
speicherintervall: number[];
|
||
originalValues: OriginalValues;
|
||
slot: number;
|
||
dispatch: (action: any) => void;
|
||
onModulNameChange: (id: string) => void;
|
||
onClose: () => void;
|
||
}
|
||
|
||
const isDifferent = (a: any, b: any): boolean => {
|
||
const aNum = Number(a);
|
||
const bNum = Number(b);
|
||
if (!isNaN(aNum) && !isNaN(bNum)) {
|
||
return Math.abs(aNum - bNum) > 0.0001;
|
||
}
|
||
return String(a).trim() !== String(b).trim();
|
||
};
|
||
|
||
const handleSave = async ({
|
||
ids,
|
||
isolationsgrenzwerte,
|
||
verzoegerung,
|
||
untereSchleifenGrenzwerte,
|
||
obereSchleifenGrenzwerte,
|
||
schleifenintervall,
|
||
speicherintervall,
|
||
originalValues,
|
||
slot,
|
||
dispatch,
|
||
onModulNameChange,
|
||
onClose,
|
||
}: HandleSaveParams): Promise<void> => {
|
||
const changesForFile: Record<string, any> = {};
|
||
|
||
if (isDifferent(ids[slot], originalValues.kueID[slot])) {
|
||
changesForFile.KID = ids[slot];
|
||
}
|
||
if (
|
||
isDifferent(
|
||
isolationsgrenzwerte[slot],
|
||
originalValues.isolationsgrenzwerte[slot]
|
||
)
|
||
) {
|
||
changesForFile.KL_ = isolationsgrenzwerte[slot];
|
||
}
|
||
if (isDifferent(verzoegerung[slot], originalValues.verzoegerung[slot])) {
|
||
changesForFile.KD_ = verzoegerung[slot];
|
||
}
|
||
if (
|
||
isDifferent(
|
||
untereSchleifenGrenzwerte[slot],
|
||
originalValues.untereSchleifenGrenzwerte[slot]
|
||
)
|
||
) {
|
||
changesForFile.KR_ = untereSchleifenGrenzwerte[slot];
|
||
}
|
||
if (
|
||
isDifferent(
|
||
obereSchleifenGrenzwerte[slot],
|
||
originalValues.obereSchleifenGrenzwerte[slot]
|
||
)
|
||
) {
|
||
changesForFile.KRO_ = obereSchleifenGrenzwerte[slot];
|
||
}
|
||
if (
|
||
isDifferent(
|
||
schleifenintervall[slot],
|
||
originalValues.schleifenintervall[slot]
|
||
)
|
||
) {
|
||
changesForFile.KRI = schleifenintervall[slot];
|
||
}
|
||
if (
|
||
isDifferent(speicherintervall[slot], originalValues.speicherintervall[slot])
|
||
) {
|
||
changesForFile.KLO = speicherintervall[slot];
|
||
}
|
||
|
||
if (Object.keys(changesForFile).length > 0) {
|
||
const isDev = window.location.hostname === "localhost";
|
||
const isProd = !isDev;
|
||
|
||
if (isDev) {
|
||
for (const [key, value] of Object.entries(changesForFile)) {
|
||
const params = new URLSearchParams({
|
||
key: `win_kue${key}`,
|
||
value: String(value),
|
||
slot: String(slot),
|
||
});
|
||
|
||
const response = await fetch(
|
||
`/api/cpl/updateKueDataAPIHandler?${params.toString()}`
|
||
);
|
||
if (!response.ok) {
|
||
alert(`❌ Fehler beim Schreiben der Datei (${key})`);
|
||
return;
|
||
}
|
||
}
|
||
|
||
alert("✅ Daten erfolgreich gespeichert!");
|
||
}
|
||
|
||
if (isProd) {
|
||
try {
|
||
for (const [key, value] of Object.entries(changesForFile)) {
|
||
const singleParam = `${key}${slot}=${encodeURIComponent(value)}`;
|
||
const url = `/CPL?/kabelueberwachung.html&${singleParam}`;
|
||
|
||
console.log("📡 Sende an CPL (CGI) →", url);
|
||
|
||
const response = await fetch(url);
|
||
if (!response.ok) {
|
||
alert(`❌ Fehler beim Senden an die CPL-Hardware: ${key}`);
|
||
return;
|
||
}
|
||
}
|
||
|
||
alert("✅ Alle Daten erfolgreich an die CPL-Hardware gesendet!");
|
||
} catch (error) {
|
||
console.error("❌ Netzwerkfehler beim CPL-Aufruf:", error);
|
||
alert("❌ Netzwerkfehler beim Senden an die CPL-Hardware");
|
||
return;
|
||
}
|
||
}
|
||
|
||
onModulNameChange(ids[slot]);
|
||
|
||
dispatch(
|
||
setKueData({
|
||
kueID: [...ids],
|
||
isolationsgrenzwerte: [...isolationsgrenzwerte],
|
||
verzoegerung: [...verzoegerung],
|
||
untereSchleifenGrenzwerte: [...untereSchleifenGrenzwerte],
|
||
obereSchleifenGrenzwerte: [...obereSchleifenGrenzwerte],
|
||
schleifenintervall: [...schleifenintervall],
|
||
memoryInterval: [...speicherintervall],
|
||
})
|
||
);
|
||
} else {
|
||
alert("ℹ️ Keine Änderungen vorgenommen.");
|
||
}
|
||
|
||
onClose();
|
||
};
|
||
|
||
export default handleSave;
|