Skip to content

Commit 966df64

Browse files
committed
finish logger charts
1 parent e1aab0a commit 966df64

4 files changed

Lines changed: 83 additions & 23 deletions

File tree

ethernet-view/src/components/ChartMenu/ChartMenu.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ export const ChartMenu = memo(({ sidebarSections }: Props) => {
2323

2424
const [charts, setCharts] = useState<ChartInfo[]>([]);
2525

26-
const addChart = ((chartId: ChartId, initialMeasurementId: MeasurementId) => {
27-
setCharts([...charts, { chartId, initialMeasurementId }]);
28-
});
26+
const addChart = ((chartId: ChartId, initialMeasurementId: MeasurementId) => {
27+
setCharts([...charts, { chartId, initialMeasurementId }]);
28+
});
2929

3030
const removeChart = useCallback((chartId: ChartId) => {
3131
setCharts(prevCharts => prevCharts.filter(chart => chart.chartId !== chartId));

ethernet-view/src/pages/LoggerPage/ChartsColumn/ChartMenu/ChartElement/ChartCanvas.tsx

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { NumericMeasurementInfo } from "common";
21
import { ColorType, createChart, IChartApi, UTCTimestamp } from "lightweight-charts";
32
import { ChartPoint } from "pages/LoggerPage/LogsColumn/LogLoader/LogsProcessor";
43
import { useEffect, useRef } from "react";
@@ -12,6 +11,7 @@ interface Props {
1211
}
1312

1413
export const ChartCanvas = ({ measurementsInChart, getDataFromLogSession }: Props) => {
14+
const timeRendered = useRef<number>(Date.now() / 1000);
1515
const chart = useRef<IChartApi | null>(null);
1616
const chartContainerRef = useRef<HTMLDivElement>(null);
1717

@@ -42,23 +42,27 @@ export const ChartCanvas = ({ measurementsInChart, getDataFromLogSession }: Prop
4242
},
4343
});
4444
}
45+
46+
let chartTime = timeRendered.current;
47+
measurementsInChart.forEach((measurement) => {
48+
const data = getDataFromLogSession(measurement.id);
49+
const series = chart.current?.addLineSeries({
50+
color: measurement.color,
51+
})
52+
for(const point of data) {
53+
series?.update({ time: chartTime++ as UTCTimestamp, value: point.value });
54+
}
55+
chartTime = timeRendered.current;
56+
})
4557

4658
return () => {
4759
resizeObserver.disconnect();
4860
chart.current?.remove();
4961
}
50-
}, []);
62+
}, [measurementsInChart.length]);
5163

5264
useEffect(() => {
53-
let date = Math.floor(Date.now() / 1000);
54-
measurementsInChart.forEach((measurement) => {
55-
const series = chart.current?.addLineSeries({color: measurement.color});
56-
const data = getDataFromLogSession(measurement.id);
57-
data.forEach((point) => {
58-
series?.update({ time: date++ as UTCTimestamp, value: point.value });
59-
})
60-
})
61-
}, [measurementsInChart]);
65+
}, [measurementsInChart.length]);
6266

6367
return (
6468
<div ref={chartContainerRef}></div>

ethernet-view/src/pages/LoggerPage/ChartsColumn/ChartMenu/ChartElement/ChartElement.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import { AiOutlineCloseCircle } from "react-icons/ai"
33
import styles from "components/ChartMenu/ChartElement/ChartElement.module.scss"
44
import { ChartCanvas } from "./ChartCanvas";
55
import { ChartPoint } from "pages/LoggerPage/LogsColumn/LogLoader/LogsProcessor";
6-
import { ChartLegend } from "components/ChartMenu/ChartElement/ChartLegend/ChartLegend";
7-
import { useCallback, useEffect, useState } from "react";
8-
import { MeasurementId, NumericMeasurementInfo, useMeasurementsStore } from "common";
6+
import { useEffect, useState } from "react";
7+
import { MeasurementId, } from "common";
8+
import { ChartLegend } from "./ChartLegend";
99

1010
interface Props {
1111
chartId: ChartId;
@@ -24,19 +24,15 @@ export const ChartElement = ({ chartId, initialMeasurementId, removeChart, getDa
2424
const [measurementsInChart, setMeasurementsInChart] = useState<MeasurementLogger[]>([{id: initialMeasurementId, color: 'red'}]);
2525

2626
useEffect(() => {
27-
console.log(measurementsInChart);
28-
}, [measurementsInChart]);
27+
console.log(measurementsInChart)
28+
}, [measurementsInChart])
2929

3030
const addMeasurementToChart = (measurement: MeasurementLogger) => {
3131
if(!measurementsInChart.some(measurementInChart => measurementInChart.id === measurement.id)) {
3232
setMeasurementsInChart([...measurementsInChart, measurement]);
3333
}
3434
}
3535

36-
// const removeMeasurementFromChart = useCallback((measurementId: MeasurementId) => {
37-
// setMeasurementsInChart(prevMeasurements => prevMeasurements.filter(measurement => measurement.id !== measurementId));
38-
// }, []);
39-
4036
const handleDrop = (ev: React.DragEvent<HTMLDivElement>) => {
4137
ev.stopPropagation();
4238
const id = ev.dataTransfer.getData("id");
@@ -60,6 +56,12 @@ export const ChartElement = ({ chartId, initialMeasurementId, removeChart, getDa
6056
measurementsInChart={measurementsInChart}
6157
getDataFromLogSession={getDataFromLogSession}
6258
/>
59+
<ChartLegend
60+
chartId={chartId}
61+
measurementsInChart={measurementsInChart}
62+
removeChart={removeChart}
63+
removeMeasurementFromChart={(measurementId: MeasurementId) => setMeasurementsInChart(measurementsInChart.filter(measurement => measurement.id !== measurementId))}
64+
/>
6365
</div>
6466
</div>
6567
)
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { MeasurementId } from "common";
2+
import { ChartId } from "components/ChartMenu/ChartMenu";
3+
import { useEffect, useRef } from "react";
4+
import styles from "components/ChartMenu/ChartElement/ChartLegend/ChartLegend.module.scss"
5+
import { MeasurementLogger } from "./ChartElement";
6+
7+
interface Props {
8+
chartId: ChartId;
9+
measurementsInChart: MeasurementLogger[];
10+
removeMeasurementFromChart: (measurementId: MeasurementId) => void;
11+
removeChart: (chartId: ChartId) => void;
12+
}
13+
14+
export const ChartLegend = ({ chartId, measurementsInChart, removeMeasurementFromChart, removeChart }: Props) => {
15+
16+
const legendRef = useRef<HTMLDivElement>(null);
17+
18+
const onRemoveMeasurement = (measurementId: MeasurementId) => {
19+
removeMeasurementFromChart(measurementId);
20+
};
21+
22+
useEffect(() => {
23+
if(measurementsInChart.length == 0) removeChart(chartId);
24+
}, [measurementsInChart.length])
25+
26+
useEffect(() => {
27+
if (legendRef.current) {
28+
while (legendRef.current.firstChild) {
29+
legendRef.current.removeChild(legendRef.current.firstChild);
30+
}
31+
measurementsInChart.forEach((measurement) => {
32+
const newChartLegendItem = createChartLegendItem(measurement);
33+
newChartLegendItem.onclick = (_) => onRemoveMeasurement(measurement.id);
34+
legendRef.current?.appendChild(newChartLegendItem);
35+
});
36+
}
37+
});
38+
39+
return <div className={styles.chartLegend} ref={legendRef}></div>;
40+
};
41+
42+
function createChartLegendItem(measurement: MeasurementLogger) {
43+
const legendItem = document.createElement("div");
44+
legendItem.setAttribute("data-id", measurement.id);
45+
legendItem.className = styles.chartLegendItem;
46+
const seriesColor = document.createElement("div");
47+
seriesColor.className = styles.chartLegendItemColor;
48+
seriesColor.style.backgroundColor = measurement.color;
49+
const seriesName = document.createElement("p");
50+
seriesName.innerText = measurement.id;
51+
legendItem.appendChild(seriesColor);
52+
legendItem.appendChild(seriesName);
53+
return legendItem;
54+
}

0 commit comments

Comments
 (0)