190 lines
5.8 KiB
TypeScript
190 lines
5.8 KiB
TypeScript
"use client";
|
|
import React from "react";
|
|
import { useSelector, useDispatch } from "react-redux";
|
|
import { RootState } from "../../../../../../redux/store";
|
|
import {
|
|
setVonDatum,
|
|
setBisDatum,
|
|
} from "../../../../../../redux/slices/kabelueberwachungChartSlice";
|
|
import {
|
|
ComposedChart,
|
|
XAxis,
|
|
YAxis,
|
|
CartesianGrid,
|
|
Tooltip,
|
|
Legend,
|
|
ResponsiveContainer,
|
|
Line,
|
|
} from "recharts";
|
|
|
|
// 📌 Benutzerdefinierter Tooltip für die richtige Anordnung der Werte
|
|
const CustomTooltip = ({ active, payload, label }: any) => {
|
|
if (active && payload && payload.length) {
|
|
const messwertMax = payload.find(
|
|
(p: any) => p.dataKey === "messwertMaximum"
|
|
);
|
|
const messwert = payload.find((p: any) => p.dataKey === "messwert");
|
|
const messwertMin = payload.find(
|
|
(p: any) => p.dataKey === "messwertMinimum"
|
|
);
|
|
const messwertDurchschnitt = payload.find(
|
|
(p: any) => p.dataKey === "messwertDurchschnitt"
|
|
);
|
|
|
|
return (
|
|
<div
|
|
style={{
|
|
background: "white",
|
|
padding: "8px",
|
|
border: "1px solid lightgrey",
|
|
borderRadius: "5px",
|
|
textAlign: "center",
|
|
}}
|
|
>
|
|
<strong>{new Date(label).toLocaleString()}</strong>
|
|
<div style={{ color: "grey" }}>
|
|
{messwertMax
|
|
? `Messwert Maximum: ${messwertMax.value.toFixed(2)} kOhm`
|
|
: ""}
|
|
</div>
|
|
<div style={{ color: "#00AEEF", fontWeight: "bold" }}>
|
|
{messwert ? `Messwert: ${messwert.value.toFixed(2)} kOhm` : ""}
|
|
{messwertDurchschnitt
|
|
? `Messwert Durchschnitt: ${messwertDurchschnitt.value.toFixed(
|
|
2
|
|
)} kOhm`
|
|
: ""}
|
|
</div>
|
|
<div style={{ color: "grey" }}>
|
|
{messwertMin
|
|
? `Messwert Minimum: ${messwertMin.value.toFixed(2)} kOhm`
|
|
: ""}
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
return null;
|
|
};
|
|
|
|
const LoopMeasurementChart = () => {
|
|
const littwinBlue = getComputedStyle(
|
|
document.documentElement
|
|
).getPropertyValue("--littwin-blue");
|
|
const dispatch = useDispatch();
|
|
const istVollbild = useSelector(
|
|
(state: RootState) => state.kabelueberwachungChart.isFullScreen
|
|
);
|
|
const { loopMeasurementCurveChartData, vonDatum, bisDatum } = useSelector(
|
|
(state: RootState) => state.kabelueberwachungChart
|
|
);
|
|
const ausgewaehlterModus = useSelector(
|
|
(state: RootState) => state.kabelueberwachungChart.selectedMode
|
|
);
|
|
|
|
// 📌 Konvertiere Daten für den Chart & kehre Reihenfolge um
|
|
const formatierteDaten = loopMeasurementCurveChartData
|
|
.map((eintrag) => ({
|
|
zeit: new Date(eintrag.t).getTime(), // Zeitstempel
|
|
messwertMinimum: eintrag.i, // Minimum (Tiefstwert)
|
|
messwertMaximum: eintrag.a, // Maximum (Höchstwert)
|
|
messwert: eintrag.m ?? null, // Aktueller Messwert
|
|
messwertDurchschnitt:
|
|
ausgewaehlterModus === "DIA1" || ausgewaehlterModus === "DIA2"
|
|
? eintrag.g ?? null
|
|
: null, // Durchschnittswert nur in DIA1 & DIA2
|
|
}))
|
|
.reverse(); // 🔄 Hier wird die Reihenfolge umgekehrt
|
|
|
|
// Berechnung des minimalen Werts für Y-Achse
|
|
const minMesswert = Math.min(
|
|
...loopMeasurementCurveChartData.map((entry) => entry.i)
|
|
);
|
|
|
|
return (
|
|
<div
|
|
style={{
|
|
position: "relative",
|
|
width: "100%",
|
|
height: istVollbild ? "90%" : "400px",
|
|
}}
|
|
>
|
|
<ResponsiveContainer width="100%" height="100%">
|
|
<ComposedChart data={formatierteDaten}>
|
|
<CartesianGrid strokeDasharray="3 3" />
|
|
<XAxis
|
|
dataKey="zeit"
|
|
domain={[
|
|
new Date(vonDatum).getTime(),
|
|
new Date(bisDatum).getTime(),
|
|
]}
|
|
tickFormatter={(zeit) => new Date(zeit).toLocaleDateString()}
|
|
/>
|
|
<YAxis
|
|
label={{ value: "kOhm", angle: -90, position: "insideLeft" }}
|
|
domain={[minMesswert, "auto"]}
|
|
tickFormatter={(wert) => `${wert.toFixed(2)} kOhm`}
|
|
/>
|
|
<Tooltip content={<CustomTooltip />} />
|
|
|
|
{/* 📌 Manuell definierte Legende mit der richtigen Reihenfolge */}
|
|
<Legend
|
|
payload={[
|
|
{ value: "Messwert Maximum", type: "line", color: "lightgrey" },
|
|
ausgewaehlterModus === "DIA1" || ausgewaehlterModus === "DIA2"
|
|
? {
|
|
value: "Messwert Durchschnitt",
|
|
type: "line",
|
|
color: littwinBlue,
|
|
}
|
|
: { value: "Messwert", type: "line", color: littwinBlue },
|
|
{ value: "Messwert Minimum", type: "line", color: "lightgrey" },
|
|
]}
|
|
/>
|
|
|
|
{/* Messwert Minimum als Linie */}
|
|
<Line
|
|
type="monotone"
|
|
dataKey="messwertMinimum"
|
|
stroke="lightgrey"
|
|
dot={false}
|
|
name="Messwert Minimum"
|
|
/>
|
|
|
|
{/* Messwert Maximum als Linie */}
|
|
<Line
|
|
type="monotone"
|
|
dataKey="messwertMaximum"
|
|
stroke="lightgrey"
|
|
dot={false}
|
|
name="Messwert Maximum"
|
|
/>
|
|
|
|
{/* Messwert Durchschnitt (nur in DIA1 & DIA2) */}
|
|
{(ausgewaehlterModus === "DIA1" || ausgewaehlterModus === "DIA2") && (
|
|
<Line
|
|
type="monotone"
|
|
dataKey="messwertDurchschnitt"
|
|
stroke={littwinBlue}
|
|
dot={true}
|
|
name="Messwert Durchschnitt"
|
|
/>
|
|
)}
|
|
|
|
{/* Messwert als Punktdiagramm */}
|
|
{ausgewaehlterModus === "DIA0" && (
|
|
<Line
|
|
type="monotone"
|
|
dataKey="messwert"
|
|
stroke={littwinBlue}
|
|
dot={true}
|
|
name="Messwert"
|
|
/>
|
|
)}
|
|
</ComposedChart>
|
|
</ResponsiveContainer>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default LoopMeasurementChart;
|