aboutsummaryrefslogtreecommitdiff
path: root/modern/src/reports/ChartReportPage.jsx
diff options
context:
space:
mode:
Diffstat (limited to 'modern/src/reports/ChartReportPage.jsx')
-rw-r--r--modern/src/reports/ChartReportPage.jsx152
1 files changed, 0 insertions, 152 deletions
diff --git a/modern/src/reports/ChartReportPage.jsx b/modern/src/reports/ChartReportPage.jsx
deleted file mode 100644
index 6175e1d8..00000000
--- a/modern/src/reports/ChartReportPage.jsx
+++ /dev/null
@@ -1,152 +0,0 @@
-import dayjs from 'dayjs';
-import React, { useState } from 'react';
-import {
- FormControl, InputLabel, Select, MenuItem,
-} from '@mui/material';
-import {
- CartesianGrid, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis,
-} from 'recharts';
-import ReportFilter from './components/ReportFilter';
-import { formatTime } from '../common/util/formatter';
-import { useTranslation } from '../common/components/LocalizationProvider';
-import PageLayout from '../common/components/PageLayout';
-import ReportsMenu from './components/ReportsMenu';
-import usePositionAttributes from '../common/attributes/usePositionAttributes';
-import { useCatch } from '../reactHelper';
-import { useAttributePreference, usePreference } from '../common/util/preferences';
-import {
- altitudeFromMeters, distanceFromMeters, speedFromKnots, volumeFromLiters,
-} from '../common/util/converter';
-import useReportStyles from './common/useReportStyles';
-
-const ChartReportPage = () => {
- const classes = useReportStyles();
- const t = useTranslation();
-
- const positionAttributes = usePositionAttributes(t);
-
- const distanceUnit = useAttributePreference('distanceUnit');
- const altitudeUnit = useAttributePreference('altitudeUnit');
- const speedUnit = useAttributePreference('speedUnit');
- const volumeUnit = useAttributePreference('volumeUnit');
- const hours12 = usePreference('twelveHourFormat');
-
- const [items, setItems] = useState([]);
- const [types, setTypes] = useState(['speed']);
- const [type, setType] = useState('speed');
-
- const values = items.map((it) => it[type]);
- const minValue = Math.min(...values);
- const maxValue = Math.max(...values);
- const valueRange = maxValue - minValue;
-
- const handleSubmit = useCatch(async ({ deviceId, from, to }) => {
- const query = new URLSearchParams({ deviceId, from, to });
- const response = await fetch(`/api/reports/route?${query.toString()}`, {
- headers: { Accept: 'application/json' },
- });
- if (response.ok) {
- const positions = await response.json();
- const keySet = new Set();
- const keyList = [];
- const formattedPositions = positions.map((position) => {
- const data = { ...position, ...position.attributes };
- const formatted = {};
- formatted.fixTime = dayjs(position.fixTime).valueOf();
- Object.keys(data).filter((key) => !['id', 'deviceId'].includes(key)).forEach((key) => {
- const value = data[key];
- if (typeof value === 'number') {
- keySet.add(key);
- const definition = positionAttributes[key] || {};
- switch (definition.dataType) {
- case 'speed':
- formatted[key] = speedFromKnots(value, speedUnit).toFixed(2);
- break;
- case 'altitude':
- formatted[key] = altitudeFromMeters(value, altitudeUnit).toFixed(2);
- break;
- case 'distance':
- formatted[key] = distanceFromMeters(value, distanceUnit).toFixed(2);
- break;
- case 'volume':
- formatted[key] = volumeFromLiters(value, volumeUnit).toFixed(2);
- break;
- case 'hours':
- formatted[key] = (value / 1000).toFixed(2);
- break;
- default:
- formatted[key] = value;
- break;
- }
- }
- });
- return formatted;
- });
- Object.keys(positionAttributes).forEach((key) => {
- if (keySet.has(key)) {
- keyList.push(key);
- keySet.delete(key);
- }
- });
- setTypes([...keyList, ...keySet]);
- setItems(formattedPositions);
- } else {
- throw Error(await response.text());
- }
- });
-
- return (
- <PageLayout menu={<ReportsMenu />} breadcrumbs={['reportTitle', 'reportChart']}>
- <ReportFilter handleSubmit={handleSubmit} showOnly>
- <div className={classes.filterItem}>
- <FormControl fullWidth>
- <InputLabel>{t('reportChartType')}</InputLabel>
- <Select
- label={t('reportChartType')}
- value={type}
- onChange={(e) => setType(e.target.value)}
- disabled={!items.length}
- >
- {types.map((key) => (
- <MenuItem key={key} value={key}>{positionAttributes[key]?.name || key}</MenuItem>
- ))}
- </Select>
- </FormControl>
- </div>
- </ReportFilter>
- {items.length > 0 && (
- <div className={classes.chart}>
- <ResponsiveContainer>
- <LineChart
- data={items}
- margin={{
- top: 10, right: 40, left: 0, bottom: 10,
- }}
- >
- <XAxis
- dataKey="fixTime"
- type="number"
- tickFormatter={(value) => formatTime(value, 'time', hours12)}
- domain={['dataMin', 'dataMax']}
- scale="time"
- />
- <YAxis
- type="number"
- tickFormatter={(value) => value.toFixed(2)}
- domain={[minValue - valueRange / 5, maxValue + valueRange / 5]}
- />
- <CartesianGrid strokeDasharray="3 3" />
- <Tooltip
- formatter={(value, key) => [value, positionAttributes[key]?.name || key]}
- labelFormatter={(value) => formatTime(value, 'seconds', hours12)}
- />
- <Line type="monotone" dataKey={type} />
- </LineChart>
- </ResponsiveContainer>
- </div>
- )}
- </PageLayout>
- );
-};
-
-export default ChartReportPage;