Files
CPLv4.0/components/main/kabelueberwachung/kue705FO/modals/KueEinstellung.tsx
ISA aabdb10ddd fix: KUE-Einstellungen nach dem Speichern sofort lokal aktualisiert
- formData nach erfolgreichem handleSave manuell gesetzt
- Alle Werte (Grenzwerte, Intervall etc.) werden direkt im UI angezeigt
- Kein Navigieren oder Neuladen mehr nötig zur Sichtbarkeit
- Cache aktualisiert, damit auch beim Wiederöffnen korrekte Werte angezeigt werden
2025-04-30 10:52:22 +02:00

255 lines
8.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// KueEinstellung.tsx final überarbeitet: formData wird direkt nach dem Speichern aktualisiert
"use client";
import { useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import type { RootState } from "../../../../../redux/store";
import handleSave from "../handlers/handleSave";
import handleDisplayEinschalten from "../handlers/handleDisplayEinschalten";
import firmwareUpdate from "../handlers/firmwareUpdate";
import { useAdminAuth } from "../../../settingsPageComponents/hooks/useAdminAuth";
interface Props {
slot: number;
showModal: boolean;
onClose?: () => void;
onModulNameChange?: (id: string) => void;
}
const memoryIntervalOptions = [
{ value: 0, label: "Kein" },
{ value: 1, label: "1 Minute" },
{ value: 5, label: "5 Minuten" },
{ value: 10, label: "10 Minuten" },
{ value: 15, label: "15 Minuten" },
{ value: 30, label: "30 Minuten" },
{ value: 60, label: "60 Minuten" },
{ value: 360, label: "6 Stunden" },
{ value: 720, label: "12 Stunden" },
];
export default function KueEinstellung({
slot,
showModal,
onClose = () => {},
onModulNameChange,
}: Props) {
const dispatch = useDispatch();
const {
kueID,
kueLimit1,
kueDelay1,
kueLimit2Low,
kueLoopInterval,
memoryInterval,
} = useSelector((state: RootState) => state.kueDataSlice);
const { isAdminLoggedIn } = useAdminAuth(true);
const formCacheKey = `slot_${slot}`;
if (typeof window !== "undefined") {
window.__kueCache = window.__kueCache || {};
}
const cached =
typeof window !== "undefined" ? window.__kueCache?.[formCacheKey] : null;
const [formData, setFormData] = useState(() => {
if (cached) return cached;
return {
name: kueID[slot] || "",
limit1: kueLimit1[slot]?.toString() ?? "",
delay1: kueDelay1[slot]?.toString() ?? "",
limit2Low: kueLimit2Low[slot]?.toString() ?? "",
loopInterval: kueLoopInterval[slot]?.toString() ?? "",
memoryInterval: memoryInterval[slot]?.toString() ?? "",
};
});
const handleChange = (key: keyof typeof formData, value: string) => {
const updated = { ...formData, [key]: value };
setFormData(updated);
if (typeof window !== "undefined") {
window.__kueCache![formCacheKey] = updated;
}
};
const handleSaveWrapper = () => {
const updatedKueID = [...kueID];
updatedKueID[slot] = formData.name;
const updatedLimit1 = [...kueLimit1];
updatedLimit1[slot] = Number(formData.limit1);
const updatedDelay1 = [...kueDelay1];
updatedDelay1[slot] = Number(formData.delay1);
const updatedLimit2Low = [...kueLimit2Low];
updatedLimit2Low[slot] = Number(formData.limit2Low);
const updatedLoopInterval = [...kueLoopInterval];
updatedLoopInterval[slot] = Number(formData.loopInterval);
const updatedMemoryInterval = [...memoryInterval];
updatedMemoryInterval[slot] = Number(formData.memoryInterval);
handleSave({
ids: updatedKueID,
isolationsgrenzwerte: updatedLimit1,
verzoegerung: updatedDelay1,
untereSchleifenGrenzwerte: updatedLimit2Low,
obereSchleifenGrenzwerte: updatedLimit2Low,
schleifenintervall: updatedLoopInterval,
speicherintervall: updatedMemoryInterval,
originalValues: {
kueID,
isolationsgrenzwerte: kueLimit1,
verzoegerung: kueDelay1,
untereSchleifenGrenzwerte: kueLimit2Low,
obereSchleifenGrenzwerte: kueLimit2Low,
schleifenintervall: kueLoopInterval,
speicherintervall: memoryInterval,
},
slot,
dispatch,
onModulNameChange: onModulNameChange ?? (() => {}),
onClose,
});
const newData = {
name: updatedKueID[slot],
limit1: updatedLimit1[slot].toString(),
delay1: updatedDelay1[slot].toString(),
limit2Low: updatedLimit2Low[slot].toString(),
loopInterval: updatedLoopInterval[slot].toString(),
memoryInterval: updatedMemoryInterval[slot].toString(),
};
setFormData(newData);
if (typeof window !== "undefined") {
window.__kueCache![formCacheKey] = newData;
}
};
return (
<div className="text-black space-y-6">
<div>
<label className="font-bold">Kabelbezeichnung:</label>
<input
type="text"
className="w-full border rounded p-1 text-sm"
value={formData.name}
onChange={(e) => handleChange("name", e.target.value)}
/>
</div>
<div>
<h3 className="font-bold text-center mb-2">Isolationsmessung</h3>
<table className="w-full border-collapse text-sm">
<thead className="bg-gray-100">
<tr>
<th className="border p-2 text-center">Grenzwert (MOhm)</th>
<th className="border p-2 text-center">Verzögerung (sek)</th>
</tr>
</thead>
<tbody>
<tr>
<td className="border p-2 text-center">
<input
type="number"
step="0.1"
className="w-[6rem] border rounded p-1"
value={formData.limit1}
onChange={(e) => handleChange("limit1", e.target.value)}
/>
</td>
<td className="border p-2 text-center">
<input
type="number"
step="0.1"
className="w-[6rem] border rounded p-1"
value={formData.delay1}
onChange={(e) => handleChange("delay1", e.target.value)}
/>
</td>
</tr>
</tbody>
</table>
</div>
<div>
<h3 className="font-bold text-center mb-2">Schleifenmessung</h3>
<table className="w-full border-collapse text-sm mb-2">
<thead className="bg-gray-100">
<tr>
<th className="border p-2 text-center">Grenzwert (kOhm)</th>
<th className="border p-2 text-center">Schleifenintervall (h)</th>
</tr>
</thead>
<tbody>
<tr>
<td className="border p-2 text-center">
<input
type="number"
step="0.1"
className="w-[6rem] border rounded p-1"
value={formData.limit2Low}
onChange={(e) => handleChange("limit2Low", e.target.value)}
/>
</td>
<td className="border p-2 text-center">
<input
type="number"
step="0.1"
className="w-[6rem] border rounded p-1"
value={formData.loopInterval}
onChange={(e) => handleChange("loopInterval", e.target.value)}
/>
</td>
</tr>
</tbody>
</table>
<div>
<label className="font-bold block mb-1">Speicherintervall</label>
<select
className="w-full border rounded p-1 text-sm"
value={formData.memoryInterval}
onChange={(e) => handleChange("memoryInterval", e.target.value)}
>
{memoryIntervalOptions.map((opt) => (
<option key={opt.value} value={opt.value}>
{opt.label}
</option>
))}
</select>
</div>
</div>
<div className="flex justify-end gap-2 bg-gray-100 p-3 rounded">
{isAdminLoggedIn && (
<button
onClick={() => firmwareUpdate(slot)}
className="bg-littwin-blue text-white px-4 py-2 rounded flex items-center"
>
<span className="mr-2">🔧</span> Firmware Update
</button>
)}
<button
onClick={() => handleDisplayEinschalten(slot)}
className="bg-littwin-blue text-white px-4 py-2 rounded flex items-center"
>
<span className="mr-2">📺</span> Display einschalten
</button>
<button
onClick={handleSaveWrapper}
className="bg-littwin-blue text-white px-4 py-2 rounded flex items-center"
>
<span className="mr-2">💾</span> Speichern
</button>
</div>
</div>
);
}