import React, { useState } from 'react'; import { FormControl, InputLabel, Select, MenuItem, Button, TextField, Typography, } from '@mui/material'; import { useDispatch, useSelector } from 'react-redux'; import dayjs from 'dayjs'; import { useTranslation } from '../../common/components/LocalizationProvider'; import useReportStyles from '../common/useReportStyles'; import { devicesActions, reportsActions } from '../../store'; import SplitButton from '../../common/components/SplitButton'; import SelectField from '../../common/components/SelectField'; import { useRestriction } from '../../common/util/permissions'; const ReportFilter = ({ children, handleSubmit, handleSchedule, showOnly, ignoreDevice, multiDevice, includeGroups }) => { const classes = useReportStyles(); const dispatch = useDispatch(); const t = useTranslation(); const readonly = useRestriction('readonly'); const devices = useSelector((state) => state.devices.items); const groups = useSelector((state) => state.groups.items); const deviceId = useSelector((state) => state.devices.selectedId); const deviceIds = useSelector((state) => state.devices.selectedIds); const groupIds = useSelector((state) => state.reports.groupIds); const period = useSelector((state) => state.reports.period); const from = useSelector((state) => state.reports.from); const to = useSelector((state) => state.reports.to); const [button, setButton] = useState('json'); const [description, setDescription] = useState(); const [calendarId, setCalendarId] = useState(); const scheduleDisabled = button === 'schedule' && (!description || !calendarId); const disabled = (!ignoreDevice && !deviceId && !deviceIds.length && !groupIds.length) || scheduleDisabled; const handleClick = (type) => { if (type === 'schedule') { handleSchedule(deviceIds, groupIds, { description, calendarId, attributes: {}, }); } else { let selectedFrom; let selectedTo; switch (period) { case 'today': selectedFrom = dayjs().startOf('day'); selectedTo = dayjs().endOf('day'); break; case 'yesterday': selectedFrom = dayjs().subtract(1, 'day').startOf('day'); selectedTo = dayjs().subtract(1, 'day').endOf('day'); break; case 'thisWeek': selectedFrom = dayjs().startOf('week'); selectedTo = dayjs().endOf('week'); break; case 'previousWeek': selectedFrom = dayjs().subtract(1, 'week').startOf('week'); selectedTo = dayjs().subtract(1, 'week').endOf('week'); break; case 'thisMonth': selectedFrom = dayjs().startOf('month'); selectedTo = dayjs().endOf('month'); break; case 'previousMonth': selectedFrom = dayjs().subtract(1, 'month').startOf('month'); selectedTo = dayjs().subtract(1, 'month').endOf('month'); break; default: selectedFrom = dayjs(from, 'YYYY-MM-DDTHH:mm'); selectedTo = dayjs(to, 'YYYY-MM-DDTHH:mm'); break; } handleSubmit({ deviceId, deviceIds, groupIds, from: selectedFrom.toISOString(), to: selectedTo.toISOString(), calendarId, type, }); } }; return (
{!ignoreDevice && (
{t(multiDevice ? 'deviceTitle' : 'reportDevice')}
)} {includeGroups && (
{t('settingsGroups')}
)} {button !== 'schedule' ? ( <>
{t('reportPeriod')}
{period === 'custom' && (
dispatch(reportsActions.updateFrom(e.target.value))} fullWidth />
)} {period === 'custom' && (
dispatch(reportsActions.updateTo(e.target.value))} fullWidth />
)} ) : ( <>
setDescription(event.target.value)} label={t('sharedDescription')} fullWidth />
setCalendarId(Number(event.target.value))} endpoint="/api/calendars" label={t('sharedCalendar')} fullWidth />
)} {children}
{showOnly ? ( ) : ( setButton(value)} options={readonly ? { json: t('reportShow'), export: t('reportExport'), mail: t('reportEmail'), } : { json: t('reportShow'), export: t('reportExport'), mail: t('reportEmail'), schedule: t('reportSchedule'), }} /> )}
); }; export default ReportFilter;