diff --git a/typescript/frontend-marios2/src/content/dashboards/Configuration/Configuration.tsx b/typescript/frontend-marios2/src/content/dashboards/Configuration/Configuration.tsx index be697523e..40298e60b 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Configuration/Configuration.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Configuration/Configuration.tsx @@ -9,16 +9,22 @@ import { Grid, IconButton, InputLabel, + Modal, Select, TextField, + Typography, useTheme } from '@mui/material'; import React, { useState } from 'react'; import { FormattedMessage } from 'react-intl'; import Button from '@mui/material/Button'; +import { DateField } from '@mui/x-date-pickers/DateField'; import axiosConfig from '../../../Resources/axiosConfig'; import { Close as CloseIcon } from '@mui/icons-material'; import MenuItem from '@mui/material/MenuItem'; +import { DateTimePicker, LocalizationProvider } from '@mui/x-date-pickers'; +import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; +import dayjs from 'dayjs'; interface ConfigurationProps { values: TopologyValues; @@ -30,32 +36,11 @@ function Configuration(props: ConfigurationProps) { return null; } - const forcedCalibrationChargeOptions = ['No', 'UntilEoc', 'Yes']; - - const [formValues, setFormValues] = useState({ - minimumSoC: props.values.minimumSoC[0].value, - gridSetPoint: (props.values.gridSetPoint[0].value as number) / 1000, - forceCalibrationCharge: forcedCalibrationChargeOptions.indexOf( - props.values.calibrationChargeForced[0].value.toString() - ) - }); - - const handleSubmit = async (e) => { - setLoading(true); - const res = await axiosConfig - .post(`/EditInstallationConfig?installationId=${props.id}`, formValues) - .catch((err) => { - if (err.response) { - setError(true); - setLoading(false); - } - }); - - if (res) { - setUpdated(true); - setLoading(false); - } - }; + const forcedCalibrationChargeOptions = [ + 'RepetitivelyEvery', + 'AdditionallyOnce', + 'ChargePermanently' + ]; const [errors, setErrors] = useState({ minimumSoC: false, @@ -80,9 +65,62 @@ function Configuration(props: ConfigurationProps) { ] = useState( props.values.calibrationChargeForced[0].value.toString() ); - //const forcedCalibrationChargeOptions = ['No', 'UntilEoc', 'Yes']; + const [isDateModalOpen, setIsDateModalOpen] = useState(false); + const [calibrationChargeDate, setCalibrationChargeDate] = useState(); + const [isErrorDateModalOpen, setErrorDateModalOpen] = useState(false); + const [dateSelectionError, setDateSelectionError] = useState(''); + const [dateFieldOpen, setDateFieldOpen] = useState(false); + + const [formValues, setFormValues] = useState({ + minimumSoC: props.values.minimumSoC[0].value, + gridSetPoint: (props.values.gridSetPoint[0].value as number) / 1000, + forceCalibrationCharge: forcedCalibrationChargeOptions.indexOf( + props.values.calibrationChargeForced[0].value.toString() + ), + calibrationChargeDate: Date(props.values.calibrationChargeDate[0].value) + }); + + const handleSubmit = async (e) => { + setLoading(true); + const res = await axiosConfig + .post(`/EditInstallationConfig?installationId=${props.id}`, formValues) + .catch((err) => { + if (err.response) { + setError(true); + setLoading(false); + } + }); + + if (res) { + setUpdated(true); + setLoading(false); + } + }; + + const handleCancel = () => { + setIsDateModalOpen(false); + }; + const handleOkOnErrorDateModal = () => { + setErrorDateModalOpen(false); + setIsDateModalOpen(true); + }; + + const handleConfirm = () => { + setIsDateModalOpen(false); + + if (calibrationChargeDate.isBefore(dayjs())) { + setDateSelectionError('You must use a future date'); + setErrorDateModalOpen(true); + return; + } + + setDateFieldOpen(true); + }; const handleSelectedCalibrationChargeChange = (event) => { + if (event.target.value != 'ChargePermanently') { + setIsDateModalOpen(true); + } setSelectedForcedCalibrationChargeOption(event.target.value); setFormValues({ @@ -199,7 +237,6 @@ function Configuration(props: ConfigurationProps) { open={openForcedCalibrationCharge} onClose={handleCloseForcedCalibrationCharge} onOpen={handleOpenForcedCalibrationCharge} - //renderValue={selectedForcedCalibrationChargeOption} > {forcedCalibrationChargeOptions.map((option) => ( @@ -209,6 +246,127 @@ function Configuration(props: ConfigurationProps) { + {(dateFieldOpen || formValues.forceCalibrationCharge != 2) && ( +
+ + + +
+ )} + + {isErrorDateModalOpen && ( + {}}> + + + {dateSelectionError} + + + + + + )} + + {isDateModalOpen && ( + + {}}> + + + setCalibrationChargeDate(newDate) + } + sx={{ + marginTop: 2 + }} + /> + +
+ + + +
+
+
+
+ )}