import React, { useState } from 'react'; import { FormControl, InputLabel, Select, MenuItem, TableContainer, Table, TableHead, TableRow, TableCell, TableBody, } from '@material-ui/core'; import { useSelector } from 'react-redux'; import { formatTime } from '../common/util/formatter'; import ReportFilter, { useFilterStyles } from './components/ReportFilter'; import { prefixString } from '../common/util/stringUtils'; import { useTranslation } from '../common/components/LocalizationProvider'; import PageLayout from '../common/components/PageLayout'; import ReportsMenu from './components/ReportsMenu'; import usePersistedState from '../common/util/usePersistedState'; import ColumnSelect from './components/ColumnSelect'; const typesArray = [ ['allEvents', 'eventAll'], ['deviceOnline', 'eventDeviceOnline'], ['deviceUnknown', 'eventDeviceUnknown'], ['deviceOffline', 'eventDeviceOffline'], ['deviceInactive', 'eventDeviceInactive'], ['deviceMoving', 'eventDeviceMoving'], ['deviceStopped', 'eventDeviceStopped'], ['deviceOverspeed', 'eventDeviceOverspeed'], ['deviceFuelDrop', 'eventDeviceFuelDrop'], ['commandResult', 'eventCommandResult'], ['geofenceEnter', 'eventGeofenceEnter'], ['geofenceExit', 'eventGeofenceExit'], ['alarm', 'eventAlarm'], ['ignitionOn', 'eventIgnitionOn'], ['ignitionOff', 'eventIgnitionOff'], ['maintenance', 'eventMaintenance'], ['textMessage', 'eventTextMessage'], ['driverChanged', 'eventDriverChanged'], ]; const typesMap = new Map(typesArray); const columnsArray = [ ['eventTime', 'positionFixTime'], ['type', 'sharedType'], ['geofenceId', 'sharedGeofence'], ['maintenanceId', 'sharedMaintenance'], ['alarm', 'positionAlarm'], ]; const columnsMap = new Map(columnsArray); const EventReportPage = () => { const classes = useFilterStyles(); const t = useTranslation(); const geofences = useSelector((state) => state.geofences.items); const [columns, setColumns] = usePersistedState('eventColumns', ['eventTime', 'type', 'alarm']); const [eventTypes, setEventTypes] = useState(['allEvents']); const [items, setItems] = useState([]); const handleSubmit = async (deviceId, from, to, mail, headers) => { const query = new URLSearchParams({ deviceId, from, to, mail, }); eventTypes.forEach((it) => query.append('type', it)); const response = await fetch(`/api/reports/events?${query.toString()}`, { headers }); if (response.ok) { const contentType = response.headers.get('content-type'); if (contentType) { if (contentType === 'application/json') { setItems(await response.json()); } else { window.location.assign(window.URL.createObjectURL(await response.blob())); } } } }; const formatValue = (item, key) => { switch (key) { case 'eventTime': return formatTime(item[key]); case 'type': return t(prefixString('event', item[key])); case 'geofenceId': if (item[key] > 0) { const geofence = geofences[item[key]]; return geofence && geofence.name; } return null; case 'maintenanceId': return item[key] > 0 ? item[key] > 0 : null; case 'alarm': return item.attributes[key] ? t(prefixString('alarm', item.attributes[key])) : null; default: return item[key]; } }; return ( } breadcrumbs={['reportTitle', 'reportEvents']}> {t('reportEventTypes')} { let values = event.target.value; const clicked = child.props.value; if (values.includes('allEvents') && values.length > 1) { values = [clicked]; } setEventTypes(values); }} renderValue={(it) => (it.length > 1 ? it.length : it.length > 0 ? t(typesMap.get(it[0])) : it)} multiple > {typesArray.map(([key, string]) => ( {t(string)} ))} {columns.map((key) => ({t(columnsMap.get(key))}))} {items.map((item) => ( {columns.map((key) => ( {formatValue(item, key)} ))} ))} ); }; export default EventReportPage;