- Endpunkt /api/cpl/updateKueSettingsDataAPIHandler erstellt - Änderungen werden direkt in apiMockData/SERVICE/kabelueberwachungMockData.js geschrieben - Strings werden korrekt in Anführungszeichen gespeichert - Komma- und Formatierungsfehler im JS-Array beseitigt - Entwicklungsumgebung kann KUE-Einstellungen ohne Embedded-System testen
189 lines
5.0 KiB
TypeScript
189 lines
5.0 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[];
|
||
}
|
||
|
||
export interface HandleSaveParams {
|
||
ids: string[];
|
||
isolationsgrenzwerte: number[];
|
||
verzoegerung: number[];
|
||
untereSchleifenGrenzwerte: number[];
|
||
obereSchleifenGrenzwerte: number[];
|
||
schleifenintervall: number[];
|
||
speicherintervall: number[];
|
||
originalValues: {
|
||
kueID: string[];
|
||
isolationsgrenzwerte: number[];
|
||
verzoegerung: number[];
|
||
untereSchleifenGrenzwerte: number[];
|
||
obereSchleifenGrenzwerte: number[];
|
||
schleifenintervall: number[];
|
||
speicherintervall: number[];
|
||
};
|
||
slot: number;
|
||
dispatch: any;
|
||
onModulNameChange: (id: string) => void;
|
||
onClose: () => void;
|
||
onFormUpdate?: (updated: any) => void; // Added this property
|
||
}
|
||
|
||
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) {
|
||
const keyMap: Record<string, string> = {
|
||
KID: "win_kueID",
|
||
KL_: "win_kueLimit1",
|
||
KD_: "win_kueDelay1",
|
||
KR_: "win_kueLimit2Low",
|
||
KRO_: "win_kueLimit2High",
|
||
KRI: "win_kueLoopInterval",
|
||
KLO: "win_memoryInterval",
|
||
};
|
||
|
||
for (const [key, value] of Object.entries(changesForFile)) {
|
||
const mappedKey = keyMap[key] ?? key;
|
||
|
||
const params = new URLSearchParams({
|
||
key: mappedKey,
|
||
value: String(value),
|
||
slot: String(slot),
|
||
});
|
||
|
||
const response = await fetch(
|
||
`/api/cpl/updateKueSettingsDataAPIHandler?${params.toString()}`
|
||
);
|
||
|
||
if (!response.ok) {
|
||
console.error("DEV fetch error:", await response.text());
|
||
}
|
||
}
|
||
}
|
||
|
||
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],
|
||
})
|
||
);
|
||
// 🚀 Modal erst schließen, wenn UI aktualisiert ist
|
||
setTimeout(() => {
|
||
onClose();
|
||
}, 0);
|
||
} else {
|
||
alert("ℹ️ Keine Änderungen vorgenommen.");
|
||
}
|
||
|
||
onClose();
|
||
};
|
||
|
||
export default handleSave;
|