Die Variable 'chartData' wurde in 'loopMeasurementCurveChartData' umbenannt, um den Inhalt und Zweck der Daten klarer zu definieren. Diese Änderung verbessert die Lesbarkeit und Wartbarkeit des Codes, indem sie die Bedeutung der Variablen präziser beschreibt.
180 lines
5.8 KiB
TypeScript
180 lines
5.8 KiB
TypeScript
"use client"; // components/main/kabelueberwachung/kue705FO/Charts/LoopMeasurementChart/LoopMeasurementChart.tsx
|
|
import React, { useEffect, useRef, useState } from "react";
|
|
import { useSelector } from "react-redux";
|
|
import { RootState } from "../../../../../../redux/store";
|
|
import Chart from "chart.js/auto";
|
|
import "chartjs-adapter-moment";
|
|
|
|
const LoopMeasurementChart = () => {
|
|
const chartRef = useRef<HTMLCanvasElement>(null);
|
|
const chartInstance = useRef<Chart | null>(null);
|
|
const [zoomPlugin, setZoomPlugin] = useState<any>(null);
|
|
|
|
useEffect(() => {
|
|
if (typeof window !== "undefined") {
|
|
import("chartjs-plugin-zoom").then((mod) => {
|
|
setZoomPlugin(mod.default);
|
|
Chart.register(mod.default);
|
|
});
|
|
}
|
|
}, []);
|
|
|
|
// Daten & Datum aus Redux abrufen
|
|
const { loopMeasurementCurveChartData, vonDatum, bisDatum } = useSelector(
|
|
(state: RootState) => state.kabelueberwachungChart
|
|
);
|
|
const selectedMode = useSelector(
|
|
(state: RootState) => state.kabelueberwachungChart.selectedMode
|
|
);
|
|
|
|
useEffect(() => {
|
|
if (chartRef.current) {
|
|
if (chartInstance.current) {
|
|
chartInstance.current.destroy();
|
|
}
|
|
|
|
console.log("Chart Data:", loopMeasurementCurveChartData);
|
|
console.log("Von Datum:", vonDatum, "Bis Datum:", bisDatum);
|
|
console.log("Selected Mode:", selectedMode);
|
|
|
|
// Daten filtern basierend auf vonDatum und bisDatum
|
|
const filteredData = loopMeasurementCurveChartData.filter((entry) => {
|
|
const timestampMs = new Date(entry.t).getTime();
|
|
return (
|
|
timestampMs >= new Date(vonDatum).getTime() &&
|
|
timestampMs <= new Date(bisDatum).getTime()
|
|
);
|
|
});
|
|
|
|
// Basis-Datasets für i (Minimum) und a (Maximum)
|
|
const datasets = [
|
|
{
|
|
label: "Messwert Minimum (kOhm)",
|
|
data: filteredData.map((entry) => ({
|
|
x: new Date(entry.t).getTime(),
|
|
y: entry.i,
|
|
})),
|
|
borderColor: "rgba(75, 192, 192, 1)", // Türkis
|
|
backgroundColor: "rgba(75, 192, 192, 0.2)",
|
|
fill: false,
|
|
},
|
|
{
|
|
label: "Messwert Maximum (kOhm)",
|
|
data: filteredData.map((entry) => ({
|
|
x: new Date(entry.t).getTime(),
|
|
y: entry.a,
|
|
})),
|
|
borderColor: "rgba(192, 75, 75, 1)", // Rot
|
|
backgroundColor: "rgba(192, 75, 75, 0.2)",
|
|
fill: false,
|
|
},
|
|
];
|
|
|
|
// Falls DIA0: `m` als aktueller Messwert verwenden
|
|
if (
|
|
selectedMode === "DIA0" &&
|
|
filteredData.some((entry) => entry.m !== undefined)
|
|
) {
|
|
datasets.push({
|
|
label: "Messwert Aktuell (m)",
|
|
data: filteredData.map((entry) => ({
|
|
x: new Date(entry.t).getTime(),
|
|
y: entry.m ?? NaN,
|
|
})),
|
|
borderColor: "rgba(255, 165, 0, 1)", // Orange
|
|
backgroundColor: "rgba(255, 165, 0, 0.2)",
|
|
fill: false,
|
|
});
|
|
}
|
|
|
|
// Falls DIA1 oder DIA2: `g` als Durchschnittswert verwenden
|
|
if (
|
|
(selectedMode === "DIA1" || selectedMode === "DIA2") &&
|
|
filteredData.some((entry) => entry.g !== undefined)
|
|
) {
|
|
datasets.push({
|
|
label: "Messwert Durchschnitt (g)",
|
|
data: filteredData.map((entry) => ({
|
|
x: new Date(entry.t).getTime(),
|
|
y: entry.g ?? NaN,
|
|
})),
|
|
borderColor: "rgba(75, 75, 192, 1)", // Blau
|
|
backgroundColor: "rgba(75, 75, 192, 0.2)",
|
|
fill: false,
|
|
});
|
|
}
|
|
|
|
const ctx = chartRef.current.getContext("2d");
|
|
if (ctx) {
|
|
chartInstance.current = new Chart(ctx, {
|
|
type: "line",
|
|
data: { datasets },
|
|
options: {
|
|
responsive: true,
|
|
maintainAspectRatio: false,
|
|
elements: {
|
|
line: { spanGaps: true },
|
|
},
|
|
scales: {
|
|
x: {
|
|
type: "time",
|
|
time: {
|
|
unit: "day",
|
|
tooltipFormat: "dd.MM.yyyy HH:mm", // Ändert das Format für Tooltips (inkl. Uhrzeit)
|
|
displayFormats: { day: "dd.MM.yyyy" }, // Achse bleibt nur Datum
|
|
},
|
|
title: { display: true, text: "Zeit (Datum)" },
|
|
min: new Date(vonDatum).getTime(),
|
|
max: new Date(bisDatum).getTime(),
|
|
},
|
|
y: {
|
|
ticks: {
|
|
callback: (value) =>
|
|
(typeof value === "number" ? value.toFixed(2) : value) +
|
|
" kOhm",
|
|
},
|
|
},
|
|
},
|
|
plugins: {
|
|
tooltip: {
|
|
callbacks: {
|
|
label: (tooltipItem) => {
|
|
const rawItem = tooltipItem.raw as { x: number; y: number };
|
|
const date = new Date(rawItem.x);
|
|
const timeString = `${date
|
|
.getHours()
|
|
.toString()
|
|
.padStart(2, "0")}:${date
|
|
.getMinutes()
|
|
.toString()
|
|
.padStart(2, "0")}`;
|
|
return `${tooltipItem.dataset.label}: ${(
|
|
tooltipItem.raw as { x: number; y: number }
|
|
).y.toFixed(2)} kOhm `;
|
|
},
|
|
},
|
|
},
|
|
zoom: {
|
|
pan: { enabled: true, mode: "x" },
|
|
zoom: {
|
|
wheel: { enabled: true },
|
|
pinch: { enabled: true },
|
|
mode: "x",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|
|
}
|
|
}
|
|
}, [loopMeasurementCurveChartData, vonDatum, bisDatum, selectedMode]);
|
|
|
|
return (
|
|
<div style={{ position: "relative", width: "100%", height: "400px" }}>
|
|
<canvas ref={chartRef} />
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default LoopMeasurementChart;
|