diff --git a/apiMockData/SERVICE/kabelueberwachungMockData.js b/apiMockData/SERVICE/kabelueberwachungMockData.js index 221a301..8787cab 100644 --- a/apiMockData/SERVICE/kabelueberwachungMockData.js +++ b/apiMockData/SERVICE/kabelueberwachungMockData.js @@ -47,7 +47,9 @@ var win_kueIso = [ ]; //Grenzwert (MOhm) für Isolationswiderstand var win_kueLimit1 = [ - 3, 9.9, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0 + 3, 9.9, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, + 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, + 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, ]; /* @@ -60,7 +62,9 @@ die Filterzeit startet beim nächsten Unterschreiten des Grenzwerts neu. Die Fil kurzfristige Schwankungen oder Störungen fälschlicherweise als Fehler gemeldet werden. */ var win_kueDelay1 = [ - 3, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420 + 3, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, + 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, + 420, ]; //--------------------------------------------------- //Schleifenwiderstand in Display (resDisplay) Einheit: KOhm @@ -71,15 +75,19 @@ var win_kueResidence = [ ]; //Schleifenmessung Unterer Grenzwert (KOhm) var win_kueLimit2Low = [ - 3, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1 + 3, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, ]; var win_kueLimit2High = [ - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, ]; //Schleifenintervall (h) für Schleifenmessung var win_kueLoopInterval = [ - 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 + 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, ]; //--------------------------------------------------- //KÜ Modul Version soll /100 und davor V angezeigt werden z.B. 4.19V @@ -91,36 +99,69 @@ var win_kueVersion = [ //Modulname in Komponente und auf der Anzeige var win_kueID = [ - "Test3", "B23", "Kabel 3", "Kabel 4", "Kabel 5", "Kabel 6", "FTZ4562", "Kabel 8", "12344", "Kabel 10", "Kabel 11", "Kabel 12", "Kabel 13", "Kabel 14", "Kabel 15", "H56-77", "Kabel 17", "Kabel 18", "Kabel 19", "Kabel 20", "Kabel 21", "Kabel 22", "Kabel 23", "Kabel 24", "Kabel 25", "Kabel 26", "Kabel 27", "Kabel 28", "Kabel 29", "Kabel 30", "Kabel 31", "Kabel 32" + "Test3", + "B23", + "Kabel 3", + "Kabel 4", + "Kabel 5", + "Kabel 6", + "FTZ4562", + "Kabel 8", + "12344", + "Kabel 10", + "Kabel 11", + "Kabel 12", + "Kabel 13", + "Kabel 14", + "Kabel 15", + "H56-77", + "Kabel 17", + "Kabel 18", + "Kabel 19", + "Kabel 20", + "Kabel 21", + "Kabel 22", + "Kabel 23", + "Kabel 24", + "Kabel 25", + "Kabel 26", + "Kabel 27", + "Kabel 28", + "Kabel 29", + "Kabel 30", + "Kabel 31", + "Kabel 32", ]; -//--------------------------------------------------- - -//TDR--------------------------------------------------- +//-------------TDR--------------------------------------------------- +var win_tdrActive = [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, +]; +//---------------------------------------------------- var win_tdrAtten = [ - 1, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0 -];; + 9, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0 +]; +var win_tdrSpeed = [ + 109, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 +]; +var win_tdrTrigger = [ + 89, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80 +]; +//---------------------------------------------------- var win_tdrPulse = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; -var win_tdrSpeed = [ - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 -];;;; var win_tdrAmp = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; -var win_tdrTrigger = [ - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80 -];; var win_tdrLocation = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; -var win_tdrActive = [ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 -];;; + var win_tdrLast = [ "2024-10-17 07:51:54:000", "2024-09-30 08:38:50:000", @@ -159,12 +200,7 @@ var win_tdrLast = [ //--------------------------------------------------- var win_memoryInterval = [ - 5, 0, 15, 0, 0, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0 + 5, 0, 15, 0, 0, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, ]; //Speicherintervall (Kein, 1 MInute, 5 Minuten, 10 Minuten, 15 Minuten, 30 Minuten, 60 Minuten, 360 Minuten (6h), 720 Minuten (12h) - - - - - - diff --git a/components/main/kabelueberwachung/kue705FO/modals/TdrEinstellung.tsx b/components/main/kabelueberwachung/kue705FO/modals/TdrEinstellung.tsx index 2e5ccde..b74e98c 100644 --- a/components/main/kabelueberwachung/kue705FO/modals/TdrEinstellung.tsx +++ b/components/main/kabelueberwachung/kue705FO/modals/TdrEinstellung.tsx @@ -11,18 +11,36 @@ interface Props { export default function TdrEinstellung({ slot }: Props) { const tdrSlice = useSelector((state: RootState) => state.kueDataSlice); - const [tdrData, setTdrData] = useState({ - daempfung: tdrSlice.tdrAtten?.[slot]?.toString() ?? "", - geschwindigkeit: tdrSlice.tdrSpeed?.[slot]?.toString() ?? "", - trigger: tdrSlice.tdrTrigger?.[slot]?.toString() ?? "", - }); + const cacheKey = `slot_${slot}`; + if (typeof window !== "undefined") { + window.__tdrCache = window.__tdrCache || {}; + } + const cachedTdr = + typeof window !== "undefined" ? window.__tdrCache[cacheKey] : null; - const [tdrActive, setTdrActive] = useState(false); + const [tdrData, setTdrData] = useState( + () => + cachedTdr?.data || { + daempfung: tdrSlice.tdrAtten?.[slot]?.toString() ?? "", + geschwindigkeit: tdrSlice.tdrSpeed?.[slot]?.toString() ?? "", + trigger: tdrSlice.tdrTrigger?.[slot]?.toString() ?? "", + } + ); - // Zustand beim Öffnen aus Redux übernehmen - useEffect(() => { - setTdrActive(tdrSlice.tdrActive?.[slot] === 1); - }, [slot, tdrSlice.tdrActive]); + const [tdrActive, setTdrActive] = useState( + () => cachedTdr?.tdrActive ?? tdrSlice.tdrActive?.[slot] === 1 + ); + + // Updates in Redux nicht mehr automatisch übernehmen, solange Fenster offen + + const updateCache = (data: typeof tdrData, active = tdrActive) => { + if (typeof window !== "undefined") { + window.__tdrCache[cacheKey] = { + data, + tdrActive: active, + }; + } + }; const handleSave = () => { const { daempfung, geschwindigkeit, trigger } = tdrData; @@ -35,28 +53,24 @@ export default function TdrEinstellung({ slot }: Props) { const isDev = window.location.hostname === "localhost"; if (isDev) { - const requests = [ - { key: "win_tdrAtten", value: daempfung.trim() }, - { key: "win_tdrSpeed", value: geschwindigkeit.trim() }, - { key: "win_tdrTrigger", value: trigger.trim() }, + const updates = [ + { key: "win_tdrAtten", slot, value: daempfung.trim() }, + { key: "win_tdrSpeed", slot, value: geschwindigkeit.trim() }, + { key: "win_tdrTrigger", slot, value: trigger.trim() }, ]; - Promise.all( - requests.map(({ key, value }) => - fetch( - `/api/cpl/updateTdrSettingsDataAPIHandler?key=${key}&slot=${slot}&value=${value}` - ).then((res) => { - if (!res.ok) throw new Error(`Fehler bei ${key}`); - return res.json(); - }) - ) - ) + fetch("/api/cpl/updateTdrSettingsDataAPIHandler", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ updates }), + }) + .then((res) => res.json()) .then(() => { - alert("TDR-Mockdaten erfolgreich gespeichert."); + alert("TDR-Werte erfolgreich gespeichert."); }) .catch((err) => { - console.error("Fehler beim Speichern der Mockdaten:", err); - alert("Fehler beim Speichern der TDR-Einstellungen."); + console.error("Fehler beim Speichern:", err); + alert("Speichern fehlgeschlagen."); }); } else { const base = `${window.location.origin}/CPL?/kabelueberwachung.html`; @@ -83,11 +97,14 @@ export default function TdrEinstellung({ slot }: Props) { alert("Fehler beim Senden der TDR-Einstellungen."); }); } + + updateCache(tdrData, tdrActive); }; const handleTdrToggle = () => { const newState = !tdrActive; setTdrActive(newState); + updateCache(tdrData, newState); const isDev = window.location.hostname === "localhost"; const slotParam = `KTX${slot}=${newState ? 1 : 0}`; @@ -154,9 +171,11 @@ export default function TdrEinstellung({ slot }: Props) { - setTdrData({ ...tdrData, daempfung: e.target.value }) - } + onChange={(e) => { + const updated = { ...tdrData, daempfung: e.target.value }; + setTdrData(updated); + updateCache(updated); + }} className="border px-2 py-1 rounded w-full pr-10" /> @@ -173,9 +192,11 @@ export default function TdrEinstellung({ slot }: Props) { - setTdrData({ ...tdrData, geschwindigkeit: e.target.value }) - } + onChange={(e) => { + const updated = { ...tdrData, geschwindigkeit: e.target.value }; + setTdrData(updated); + updateCache(updated); + }} className="border px-2 py-1 rounded w-full pr-14" /> @@ -189,9 +210,11 @@ export default function TdrEinstellung({ slot }: Props) { - setTdrData({ ...tdrData, trigger: e.target.value }) - } + onChange={(e) => { + const updated = { ...tdrData, trigger: e.target.value }; + setTdrData(updated); + updateCache(updated); + }} className="border px-2 py-1 rounded w-full" /> diff --git a/config/webVersion.ts b/config/webVersion.ts index 3b1e436..bb1b4c0 100644 --- a/config/webVersion.ts +++ b/config/webVersion.ts @@ -6,5 +6,5 @@ 2: Patch oder Hotfix (Bugfixes oder kleine Änderungen). */ -const webVersion = "1.6.322"; +const webVersion = "1.6.323"; export default webVersion; diff --git a/pages/api/cpl/updateTdrSettingsDataAPIHandler.ts b/pages/api/cpl/updateTdrSettingsDataAPIHandler.ts index 68aa57e..a67305d 100644 --- a/pages/api/cpl/updateTdrSettingsDataAPIHandler.ts +++ b/pages/api/cpl/updateTdrSettingsDataAPIHandler.ts @@ -1,16 +1,13 @@ -// /pages/api/cpl/updateTdrSettingsDataAPIHandler.ts +// pages/api/cpl/updateTdrSettingsDataAPIHandler.ts import path from "path"; import fs from "fs/promises"; export default async function handler(req, res) { - const { slot, value, key } = req.query; - if (slot === undefined || value === undefined) { - return res.status(400).json({ error: "Missing slot or value" }); - } + const updates = req.body?.updates; - if (!slot || !value || !key) { - return res.status(400).json({ error: "Missing slot, value, or key" }); + if (!Array.isArray(updates) || updates.length === 0) { + return res.status(400).json({ error: "Missing or invalid updates array" }); } const filePath = path.join( @@ -19,28 +16,39 @@ export default async function handler(req, res) { ); try { - const fileContent = await fs.readFile(filePath, "utf-8"); - const regex = new RegExp(`(var\\s+${key}\\s*=\\s*\\[)([^\\]]*)(\\])`); - const match = fileContent.match(regex); + let fileContent = await fs.readFile(filePath, "utf-8"); - if (!match) { - return res - .status(404) - .json({ error: `Key "${key}" not found in mock data.` }); + for (const { key, slot, value } of updates) { + const regex = new RegExp(`var\\s+${key}\\s*=\\s*\\[[^\\]]*\\]\\s*;`, "m"); + const match = fileContent.match(regex); + + if (!match) { + console.warn(`Key "${key}" not found in file.`); + continue; + } + + const arrayRaw = match[0].match(/\[(.*)\]/s)?.[1] || ""; + let values = arrayRaw + .split(",") + .map((v) => v.trim()) + .map((v) => (v === "" ? "0" : v)) + .slice(0, 32); + + values[Number(slot)] = Number(value); + + const newLine = `var ${key} = [\n ${values.join(", ")}\n];`; + fileContent = fileContent.replace(regex, newLine); } - const values = match[2].split(",").map((v) => v.trim()); - values[Number(slot)] = value; + // Bereinige kaputte Endzeilen wie ")" + fileContent = fileContent.replace( + /^\s*[\)\(a-zA-Z0-9\/\:\. ]{2,40}\s*$/gm, + "" + ); - // Optional: Entferne leere Einträge - while (values.length > 0 && !values[values.length - 1]) values.pop(); + await fs.writeFile(filePath, fileContent, "utf-8"); - const newArray = `var ${key} = [\n ${values.join(", ")}\n];`; - const updated = fileContent.replace(regex, newArray); - - await fs.writeFile(filePath, updated, "utf-8"); - - return res.status(200).json({ success: true, slot, value }); + return res.status(200).json({ success: true, updated: updates.length }); } catch (err) { console.error("API error:", err); return res.status(500).json({ error: "Internal server error." });