"use client"; // components/modules/Kue705FO.tsx import React, { useState, useEffect, useRef } from "react"; import ReactModal from "react-modal"; import Chart from "chart.js/auto"; import { useSelector } from "react-redux"; import KueModal from "../modales/kueModal/KueModal"; import "bootstrap-icons/font/bootstrap-icons.css"; // Import Bootstrap Icons import { RootState } from "../../redux/store"; import { DataTDR } from "../../redux/types/chartDataTypesTDR"; import { useDispatch } from "react-redux"; import { setSelectedChartData, setSelectedFileName, } from "../../redux/slices/variablesSlice"; import TDRPopup from "../modales/kueModal/TDRPopup"; import { createLoopChart, createTDRChart } from "../../utils/chartUtils"; import { getAlarmDisplayText } from "../../utils/alarmUtils"; import { goLoop } from "../../utils/goLoop"; import { goTDR } from "../../utils/goTDR"; import { loadTDRChartData } from "../../utils/loadTDRChartData"; import { loadLoopChartData } from "../../utils/loadLoopChartData"; const Kue705FO: React.FC = ({ isolationswert, schleifenwiderstand, modulName, kueOnline, slotIndex, tdrLocation, alarmStatus, }) => { /* console.log( `Rendering Kue705FO - SlotIndex: ${slotIndex}, ModulName: ${modulName}` ); */ const selectedChartData = useSelector( (state: RootState) => state.variables.selectedChartData ); const dispatch = useDispatch(); const chartRef = useRef(null); const [zoomPlugin, setZoomPlugin] = useState(null); // Plugin-Status für Chart.js const [kueVersion, setKueVersion] = useState("V4.19"); const [currentAlarmStatus, setCurrentAlarmStatus] = useState(false); const [currentModulName, setCurrentModulName] = useState(modulName); const [activeButton, setActiveButton] = useState("Schleife"); const [loopTitleText, setloopTitleText] = useState( "Schleifenwiderstand [kOhm]" ); const [loopDisplayValue, setLoopDisplayValue] = useState(schleifenwiderstand); // Initialisiere den loopDisplayValue mit schleifenwiderstand const [isoDisplayText, setIsoDisplayText] = useState("Aderbruch"); const [groundFaultDisplayText, setGroundFaultDisplayText] = useState("Erdschluss"); const [loopFaultDisplayText, setLoopFaultDisplayText] = useState("Schleifenfehler"); const [isoFaultDisplayText, setIsoFaultDisplayText] = useState("Isolationsfehler"); const [isoGreaterThan200, setIsoGreaterThan200] = useState(">200 MOhm"); const [loading, setLoading] = useState(false); const [isoDisplayValue, setIsoDisplayValue] = useState< string | JSX.Element >(); //Test erstmal leer ohne isolationswert const [showModal, setShowModal] = useState(false); const [showChartModal, setShowChartModal] = useState(false); const [chartData, setChartData] = useState(null); useEffect(() => { if (chartData) { dispatch(setSelectedChartData(chartData)); } }, [chartData, dispatch]); // Führe dispatch nur aus, wenn chartData sich ändert // Redux-Variablen abrufen const { kuePSTmMinus96V, kueCableBreak, kueGroundFault, kueAlarm1, kueAlarm2, kueOverflow, kueVersion: reduxKueVersion, tdrActive, } = useSelector((state: RootState) => state.variables); const handleOpenModal = () => setShowModal(true); const handleCloseModal = () => setShowModal(false); const handleOpenChartModal = () => { setShowChartModal(true); if (activeButton === "TDR") { loadTDRChartData(selectedFileName, setChartData); } else { loadLoopChartData(slotIndex, setChartData); } }; const handleButtonClick = (button: "Schleife" | "TDR") => { if (button === "Schleife") { setActiveButton("Schleife"); setloopTitleText("Schleifenwiderstand [kOhm]"); setLoopDisplayValue(schleifenwiderstand); // Setze den Wert auf schleifenwiderstand } else if (button === "TDR") { setActiveButton("TDR"); setloopTitleText("Entfernung [Km]"); setLoopDisplayValue( tdrLocation && tdrLocation[slotIndex] !== undefined ? tdrLocation[slotIndex] : "0" ); // Setze den Wert auf tdrLocation oder "0" als Fallback } }; // Funktion aufrufen in handleRefreshClick const handleRefreshClick = () => { if (activeButton === "Schleife") { goLoop(slotIndex, setLoading); } else if (activeButton === "TDR") { goTDR(slotIndex, setLoading); } }; const handleCloseChartModal = () => { if (chartInstance.current) { console.log("Chart wird beim Schließen des Modals zerstört."); chartInstance.current.destroy(); chartInstance.current = null; } setShowChartModal(false); }; // Funktion zum Erstellen des TDR-Charts const chartInstance = useRef(null); const selectedFileName = useSelector( (state: RootState) => state.variables.selectedFileName ); // Füge das Plugin zu Chart.js hinzu useEffect(() => { // Lade das Plugin nur, wenn `window` verfügbar ist if (typeof window !== "undefined") { import("chartjs-plugin-zoom").then((mod) => { setZoomPlugin(mod.default); // Setze das Plugin Chart.register(mod.default); // Plugin zur Chart.js-Instanz registrieren }); } }, []); interface DataLoop { t: number; // Zeit oder Index m: number; // Isolationswiderstand n: number; // Schleifenwiderstand } useEffect(() => { const updateAlarmStatus = () => { const alarmStatus = (kueAlarm1 && kueAlarm1[slotIndex]) || (kueAlarm2 && kueAlarm2[slotIndex]) || (kueCableBreak && kueCableBreak[slotIndex]) || (kueGroundFault && kueGroundFault[slotIndex]); setCurrentAlarmStatus(!!alarmStatus); // Wandelt string oder undefined in boolean um }; updateAlarmStatus(); const interval = setInterval(updateAlarmStatus, 10000); return () => clearInterval(interval); }, [slotIndex, kueAlarm1, kueAlarm2, kueCableBreak, kueGroundFault]); useEffect(() => { if (reduxKueVersion?.[slotIndex]) { setKueVersion("V" + Number(reduxKueVersion[slotIndex]) / 100); } }, [slotIndex, reduxKueVersion]); //--------------------------------------------------- // Funktion zum Aktualisieren der Anzeige basierend auf dem Alarmstatus mit Icon und Blinken // Funktion zum Aktualisieren der Anzeige basierend auf dem Alarmstatus mit Icon und Blinken useEffect(() => { setIsoDisplayValue( getAlarmDisplayText( slotIndex, kuePSTmMinus96V, kueCableBreak, kueGroundFault, kueAlarm1, kueAlarm2, kueOverflow, isolationswert, isoDisplayText, groundFaultDisplayText, isoFaultDisplayText, loopFaultDisplayText, isoGreaterThan200 ) ); }, [ slotIndex, isolationswert, isoDisplayText, groundFaultDisplayText, isoFaultDisplayText, loopFaultDisplayText, isoGreaterThan200, kuePSTmMinus96V, kueCableBreak, kueGroundFault, kueAlarm1, kueAlarm2, kueOverflow, ]); //--------------------------------------------------- // Effekt, um Modulnamen zu aktualisieren, wenn sich der Prop ändert useEffect(() => { setCurrentModulName(modulName); //console.log(`Modulname aktualisiert für Slot ${slotIndex}:`, modulName); }, [modulName, slotIndex]); //--------------------------------------------------- // Aktualisiert den Schleifenwiderstand, wenn sich der `schleifenwiderstand`-Prop ändert useEffect(() => { if (activeButton === "Schleife") { setLoopDisplayValue(schleifenwiderstand); } }, [schleifenwiderstand, activeButton]); //--------------------------------------------------- const noLetter = (e: React.KeyboardEvent) => { const input = e.currentTarget; input.value = input.value.replace(/[^0-9]/g, ""); }; //--------------------------------------------------- //Auswahlmenü für Jahr, Monat und Sortierung const [jahr, setJahr] = useState(new Date().getFullYear()); const [monat, setMonat] = useState(new Date().getMonth() + 1); const [sortAscending, setSortAscending] = useState(true); const handleSortToggle = () => { setSortAscending(!sortAscending); console.log( "Sortierung umkehren:", sortAscending ? "Absteigend" : "Aufsteigend" ); }; const handleAktualisieren = () => { console.log("Aktualisieren mit Jahr:", jahr, "Monat:", monat); // Logik für die Aktualisierung hinzufügen }; //--------------------------------------------------- //---------------------------------- useEffect(() => { if (selectedChartData) { createTDRChart(selectedChartData); // Neues Chart erstellen } return () => { // Cleanup beim Komponentenwechsel if (chartInstance.current) { console.log("Chart wird beim Komponentenwechsel zerstört."); chartInstance.current.destroy(); chartInstance.current = null; } }; }, [selectedChartData]); //---------------------------------- return (
{kueOnline === 1 ? ( <>
{slotIndex + 1}

KÜ705-FO

{}
Betrieb Alarm
{/* Anzeige des Isolation */}
{isoDisplayValue} {Number(kuePSTmMinus96V?.[slotIndex]) !== 1 && Number(kueCableBreak?.[slotIndex]) !== 1 && Number(kueGroundFault?.[slotIndex]) !== 1 && Number(kueAlarm1?.[slotIndex]) !== 1 && Number(kueAlarm2?.[slotIndex]) !== 1 && Number(kueOverflow?.[slotIndex]) !== 1 && (
ISO MOhm
)}
{currentModulName || `Modul ${slotIndex + 1}`}
{kueVersion}
{/* loopDisplay: Zeigt Schleifenwiderstand oder TDR-Distanz an, je nach Modus */}
{loopTitleText}

{loopDisplayValue + (activeButton === "Schleife" ? " KOhm" : " Km")}

{/* Modal für Messkurve */} {showChartModal && ( {/* Verwenden Sie die separate TDRPopup-Komponente */}
{/* Canvas für die Chart.js-Grafik */}
)} ) : (

Kein Modul im Slot {slotIndex + 1}

)}
); }; export default Kue705FO; interface Kue705FOProps { isolationswert: number | string | JSX.Element; schleifenwiderstand: number | string; modulName: string; kueOnline: number; slotIndex: number; tdrLocation: number[]; alarmStatus?: boolean; }