feat: Chart-Bereich mit Kalender synchronisiert
- Chart-Ansicht wird jetzt basierend auf `vonDatum` und `bisDatum` eingeschränkt. - `startIndex` und `endIndex` werden aus den Datumswerten berechnet und im Redux-Store aktualisiert. - `Brush`-Grenzen werden automatisch angepasst, um den sichtbaren Bereich zu begrenzen. - Sicherstellung, dass `bisDatum` nicht kleiner als `vonDatum` wird.
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
"use client"; // components/main/kabelueberwachung/kue705FO/Charts/LoopMeasurementChart/LoopChartActionBar.tsx
|
"use client"; // components/main/kabelueberwachung/kue705FO/Charts/LoopMeasurementChart/LoopChartActionBar.tsx
|
||||||
import React, { useEffect } from "react";
|
import React, { useEffect, useMemo } from "react";
|
||||||
import DateRangePicker from "../DateRangePicker";
|
import DateRangePicker from "../DateRangePicker";
|
||||||
import { useDispatch, useSelector } from "react-redux";
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
import { RootState } from "../../../../../../redux/store";
|
import { RootState } from "../../../../../../redux/store";
|
||||||
@@ -23,6 +23,7 @@ const LoopChartActionBar: React.FC = () => {
|
|||||||
selectedSlotType,
|
selectedSlotType,
|
||||||
isChartOpen,
|
isChartOpen,
|
||||||
slotNumber,
|
slotNumber,
|
||||||
|
loopMeasurementCurveChartData, // ⬅️ HIER FEHLTE DIESE ZEILE
|
||||||
} = useSelector((state: RootState) => state.kabelueberwachungChart);
|
} = useSelector((state: RootState) => state.kabelueberwachungChart);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -92,6 +93,30 @@ const LoopChartActionBar: React.FC = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const minDate = useMemo(() => {
|
||||||
|
if (
|
||||||
|
!loopMeasurementCurveChartData ||
|
||||||
|
loopMeasurementCurveChartData.length === 0
|
||||||
|
)
|
||||||
|
return "";
|
||||||
|
return new Date(
|
||||||
|
loopMeasurementCurveChartData[loopMeasurementCurveChartData.length - 1].t
|
||||||
|
)
|
||||||
|
.toISOString()
|
||||||
|
.split("T")[0];
|
||||||
|
}, [loopMeasurementCurveChartData]);
|
||||||
|
|
||||||
|
const maxDate = useMemo(() => {
|
||||||
|
if (
|
||||||
|
!loopMeasurementCurveChartData ||
|
||||||
|
loopMeasurementCurveChartData.length === 0
|
||||||
|
)
|
||||||
|
return "";
|
||||||
|
return new Date(loopMeasurementCurveChartData[0].t)
|
||||||
|
.toISOString()
|
||||||
|
.split("T")[0];
|
||||||
|
}, [loopMeasurementCurveChartData]);
|
||||||
|
|
||||||
// **Automatische Datenaktualisierung bei Auswahländerung**
|
// **Automatische Datenaktualisierung bei Auswahländerung**
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
handleFetchData();
|
handleFetchData();
|
||||||
@@ -103,12 +128,26 @@ const LoopChartActionBar: React.FC = () => {
|
|||||||
<DateRangePicker
|
<DateRangePicker
|
||||||
setVonDatum={(date) => {
|
setVonDatum={(date) => {
|
||||||
const isoDate = date.toISOString().split("T")[0];
|
const isoDate = date.toISOString().split("T")[0];
|
||||||
if (isoDate !== vonDatum) dispatch(setVonDatum(isoDate));
|
|
||||||
|
if (isoDate < minDate || isoDate > maxDate) return;
|
||||||
|
|
||||||
|
dispatch(setVonDatum(isoDate));
|
||||||
|
|
||||||
|
if (isoDate > bisDatum) {
|
||||||
|
dispatch(setBisDatum(isoDate)); // Sicherstellen, dass bisDatum >= vonDatum bleibt
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
setBisDatum={(date) => {
|
setBisDatum={(date) => {
|
||||||
const isoDate = date.toISOString().split("T")[0];
|
const isoDate = date.toISOString().split("T")[0];
|
||||||
if (isoDate !== bisDatum) dispatch(setBisDatum(isoDate));
|
|
||||||
|
if (isoDate < minDate || isoDate > maxDate) return;
|
||||||
|
|
||||||
|
if (isoDate >= vonDatum) {
|
||||||
|
dispatch(setBisDatum(isoDate));
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
|
minDate={minDate}
|
||||||
|
maxDate={maxDate}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{/* Dropdown für DIA-Modus */}
|
{/* Dropdown für DIA-Modus */}
|
||||||
|
|||||||
@@ -123,6 +123,27 @@ const LoopMeasurementChart = () => {
|
|||||||
},
|
},
|
||||||
[dispatch, formatierteDaten]
|
[dispatch, formatierteDaten]
|
||||||
);
|
);
|
||||||
|
useEffect(() => {
|
||||||
|
if (formatierteDaten.length) {
|
||||||
|
const startIndex = formatierteDaten.findIndex(
|
||||||
|
(d) => new Date(d.zeit).toISOString().split("T")[0] === vonDatum
|
||||||
|
);
|
||||||
|
const endIndex = formatierteDaten.findIndex(
|
||||||
|
(d) => new Date(d.zeit).toISOString().split("T")[0] === bisDatum
|
||||||
|
);
|
||||||
|
|
||||||
|
if (startIndex !== -1 && endIndex !== -1) {
|
||||||
|
dispatch(
|
||||||
|
setBrushRange({
|
||||||
|
startIndex,
|
||||||
|
endIndex,
|
||||||
|
startDate: vonDatum,
|
||||||
|
endDate: bisDatum,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [vonDatum, bisDatum, formatierteDaten, dispatch]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div style={{ width: "100%", height: isFullScreen ? "90%" : "400px" }}>
|
<div style={{ width: "100%", height: isFullScreen ? "90%" : "400px" }}>
|
||||||
|
|||||||
Reference in New Issue
Block a user