import { useEffect, useState } from 'react'; import AddIcon from '@mui/icons-material/Add'; import CancelIcon from '@mui/icons-material/Cancel'; import CommentsDisabledOutlinedIcon from '@mui/icons-material/CommentsDisabledOutlined'; import DoneIcon from '@mui/icons-material/Done'; import EditOffOutlinedIcon from '@mui/icons-material/EditOffOutlined'; import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; import InsertCommentOutlinedIcon from '@mui/icons-material/InsertCommentOutlined'; import RemoveIcon from '@mui/icons-material/RemoveCircleOutline'; import { Box, Button, Checkbox, Dialog, DialogActions, DialogContent, DialogTitle, Grid, InputAdornment, MenuItem, TextField } from '@mui/material'; import { dialogStyle } from 'CustomTheme'; import type Schema from 'async-validator'; import type { ValidateFieldsError } from 'async-validator'; import { BlockFormControlLabel, ValidatedTextField } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import { numberValue, updateValue } from 'utils'; import { validate } from 'validators'; import { DeviceValueType, DeviceValueTypeNames, DeviceValueUOM_s } from './types'; import type { EntityItem } from './types'; interface CustomEntitiesDialogProps { open: boolean; creating: boolean; onClose: () => void; onSave: (ei: EntityItem) => void; onDup: (ei: EntityItem) => void; selectedItem: EntityItem; validator: Schema; } const CustomEntitiesDialog = ({ open, creating, onClose, onSave, onDup, selectedItem, validator }: CustomEntitiesDialogProps) => { const { LL } = useI18nContext(); const [editItem, setEditItem] = useState(selectedItem); const [fieldErrors, setFieldErrors] = useState(); const updateFormValue = updateValue(setEditItem); useEffect(() => { if (open) { setFieldErrors(undefined); setEditItem(selectedItem); // convert to hex strings straight away setEditItem({ ...selectedItem, device_id: selectedItem.device_id.toString(16).toUpperCase(), type_id: selectedItem.type_id.toString(16).toUpperCase(), factor: selectedItem.value_type === DeviceValueType.BOOL ? selectedItem.factor.toString(16).toUpperCase() : selectedItem.factor }); } }, [open, selectedItem]); const handleClose = ( _event: React.SyntheticEvent, reason: 'backdropClick' | 'escapeKeyDown' ) => { if (reason !== 'backdropClick') { onClose(); } }; const save = async () => { try { setFieldErrors(undefined); await validate(validator, editItem); if (typeof editItem.device_id === 'string') { editItem.device_id = parseInt(editItem.device_id, 16); } if (typeof editItem.type_id === 'string') { editItem.type_id = parseInt(editItem.type_id, 16); } if ( editItem.value_type === DeviceValueType.BOOL && typeof editItem.factor === 'string' ) { editItem.factor = parseInt(editItem.factor, 16); } onSave(editItem); } catch (error) { setFieldErrors(error as ValidateFieldsError); } }; const remove = () => { editItem.deleted = true; onSave(editItem); }; const dup = () => { onDup(editItem); }; return ( {creating ? LL.ADD(1) + ' ' + LL.NEW(1) : LL.EDIT()} {LL.ENTITY()} } checkedIcon={} checked={editItem.hide} onChange={updateFormValue} name="hide" /> } label="API/MQTT" /> EMS-{LL.VALUE(1)} RAM-{LL.VALUE(1)} {editItem.ram === 1 && ( <> {DeviceValueUOM_s.map((val, i) => ( {val} ))} )} {editItem.ram === 0 && ( <> } checkedIcon={} checked={editItem.writeable} onChange={updateFormValue} name="writeable" /> } label={LL.WRITEABLE()} /> 0x ) }, htmlInput: { style: { textTransform: 'uppercase' } } }} /> 0x ) }, htmlInput: { style: { textTransform: 'uppercase' } } }} /> {DeviceValueTypeNames[DeviceValueType.BOOL]} {DeviceValueTypeNames[DeviceValueType.INT8]} {DeviceValueTypeNames[DeviceValueType.UINT8]} {DeviceValueTypeNames[DeviceValueType.INT16]} {DeviceValueTypeNames[DeviceValueType.UINT16]} {DeviceValueTypeNames[DeviceValueType.UINT24]} {DeviceValueTypeNames[DeviceValueType.TIME]} {DeviceValueTypeNames[DeviceValueType.UINT32]} {DeviceValueTypeNames[DeviceValueType.STRING]} {editItem.value_type !== DeviceValueType.BOOL && editItem.value_type !== DeviceValueType.STRING && ( <> {DeviceValueUOM_s.map((val, i) => ( {val} ))} )} {editItem.value_type === DeviceValueType.STRING && editItem.device_id !== '0' && ( )} {editItem.value_type === DeviceValueType.BOOL && ( 0x ) }, htmlInput: { style: { textTransform: 'uppercase' } } }} /> )} )} {!creating && ( )} ); }; export default CustomEntitiesDialog;