diff --git a/interface/src/project/DashboardDevices.tsx b/interface/src/project/DashboardDevices.tsx index acf4f1fbc..3d00c1d9c 100644 --- a/interface/src/project/DashboardDevices.tsx +++ b/interface/src/project/DashboardDevices.tsx @@ -1,6 +1,7 @@ import CommentsDisabledOutlinedIcon from '@mui/icons-material/CommentsDisabledOutlined'; import EditIcon from '@mui/icons-material/Edit'; import EditOffOutlinedIcon from '@mui/icons-material/EditOffOutlined'; +import FormatListNumberedIcon from '@mui/icons-material/FormatListNumbered'; import DownloadIcon from '@mui/icons-material/GetApp'; import HighlightOffIcon from '@mui/icons-material/HighlightOff'; import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; @@ -35,6 +36,7 @@ import { useRequest } from 'alova'; import { useState, useContext, useEffect, useCallback, useLayoutEffect } from 'react'; import { IconContext } from 'react-icons'; +import { useNavigate } from 'react-router-dom'; import { toast } from 'react-toastify'; import DashboardDevicesDialog from './DashboardDevicesDialog'; import DeviceIcon from './DeviceIcon'; @@ -62,6 +64,8 @@ const DashboardDevices: FC = () => { const [showDeviceInfo, setShowDeviceInfo] = useState(false); const [selectedDevice, setSelectedDevice] = useState(); + const navigate = useNavigate(); + const { data: coreData, send: readCoreData } = useRequest(() => EMSESP.readCoreData(), { initialData: { connected: true, @@ -264,13 +268,16 @@ const DashboardDevices: FC = () => { }, [escFunction]); const refreshData = () => { - if (deviceValueDialogOpen) { - return; + if (!deviceValueDialogOpen) { + selectedDevice ? void readDeviceData(selectedDevice) : void readCoreData(); } - if (selectedDevice) { - void readDeviceData(selectedDevice); + }; + + const customize = () => { + if (selectedDevice == 99) { + navigate('/settings/customentities'); } else { - void readCoreData(); + navigate('/settings/customization', { state: selectedDevice }); } }; @@ -496,10 +503,19 @@ const DashboardDevices: FC = () => { - {shown_data.length + ' ' + LL.ENTITIES(shown_data.length)} + {LL.SHOWING() + + ' ' + + shown_data.length + + '/' + + coreData.devices[deviceIndex].e + + ' ' + + LL.ENTITIES(shown_data.length)} setShowDeviceInfo(true)}> + + + diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 110535f34..183d32778 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -23,7 +23,7 @@ import { Table, Header, HeaderRow, HeaderCell, Body, Row, Cell } from '@table-li import { useTheme } from '@table-library/react-table-library/theme'; import { useRequest } from 'alova'; import { useState, useEffect, useCallback } from 'react'; -import { unstable_useBlocker as useBlocker } from 'react-router-dom'; +import { unstable_useBlocker as useBlocker, useLocation } from 'react-router-dom'; import { toast } from 'react-toastify'; import EntityMaskToggle from './EntityMaskToggle'; @@ -52,19 +52,23 @@ const SettingsCustomization: FC = () => { const [restarting, setRestarting] = useState(false); const [restartNeeded, setRestartNeeded] = useState(false); const [deviceEntities, setDeviceEntities] = useState([]); - const [selectedDevice, setSelectedDevice] = useState(-1); const [confirmReset, setConfirmReset] = useState(false); const [selectedFilters, setSelectedFilters] = useState(0); const [search, setSearch] = useState(''); const [selectedDeviceEntity, setSelectedDeviceEntity] = useState(); const [dialogOpen, setDialogOpen] = useState(false); + // fetch devices first + const { data: devices } = useRequest(EMSESP.readDevices); + + // const { state } = useLocation(); + const [selectedDevice, setSelectedDevice] = useState(useLocation().state || -1); + const [selectedDeviceName, setSelectedDeviceName] = useState(''); + const { send: resetCustomizations } = useRequest(EMSESP.resetCustomizations(), { immediate: false }); - const { data: devices } = useRequest(EMSESP.readDevices); - const { send: writeCustomizationEntities } = useRequest((data) => EMSESP.writeCustomizationEntities(data), { immediate: false }); @@ -176,6 +180,22 @@ const SettingsCustomization: FC = () => { } }, [deviceEntities]); + useEffect(() => { + if (devices && selectedDevice !== -1) { + void readDeviceEntities(selectedDevice); + const id = devices.devices.findIndex((d) => d.i === selectedDevice); + if (id === -1) { + setSelectedDevice(-1); + setSelectedDeviceName(''); + } else { + setSelectedDeviceName(devices.devices[id].tn || ''); + setNumChanges(0); + setRestartNeeded(false); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [devices, selectedDevice]); + const restart = async () => { await restartCommand().catch((error) => { toast.error(error.message); @@ -246,16 +266,6 @@ const SettingsCustomization: FC = () => { ); }; - const changeSelectedDevice = (event: React.ChangeEvent) => { - if (devices) { - const selected_device = parseInt(event.target.value, 10); - setSelectedDevice(selected_device); - setNumChanges(0); - void readDeviceEntities(devices?.devices[selected_device].i); - setRestartNeeded(false); - } - }; - const resetCustomization = async () => { try { await resetCustomizations(); @@ -314,30 +324,21 @@ const SettingsCustomization: FC = () => { return; } - await writeCustomizationEntities({ id: devices?.devices[selectedDevice].i, entity_ids: masked_entities }).catch( - (error) => { - if (error.message === 'Reboot required') { - setRestartNeeded(true); - } else { - toast.error(error.message); - } + await writeCustomizationEntities({ id: selectedDevice, entity_ids: masked_entities }).catch((error) => { + if (error.message === 'Reboot required') { + setRestartNeeded(true); + } else { + toast.error(error.message); } - ); + }); setOriginalSettings(deviceEntities); } }; const renderDeviceList = () => ( <> - + {LL.CUSTOMIZATIONS_HELP_1()}. - - ={LL.CUSTOMIZATIONS_HELP_2()}   - ={LL.CUSTOMIZATIONS_HELP_3()}   - ={LL.CUSTOMIZATIONS_HELP_4()}   - ={LL.CUSTOMIZATIONS_HELP_5()}   - ={LL.CUSTOMIZATIONS_HELP_6()} - { fullWidth value={selectedDevice} disabled={numChanges !== 0} - onChange={changeSelectedDevice} + onChange={(e) => setSelectedDevice(parseInt(e.target.value))} margin="normal" select > {LL.SELECT_DEVICE()}... - {devices.devices.map((device: DeviceShort, index) => ( - + {devices.devices.map((device: DeviceShort) => ( + {device.s} ))} @@ -363,14 +364,19 @@ const SettingsCustomization: FC = () => { ); const renderDeviceData = () => { - if (deviceEntities.length === 0) { - return; - } - const shown_data = deviceEntities.filter((de) => filter_entity(de)); return ( <> + + + ={LL.CUSTOMIZATIONS_HELP_2()}   + ={LL.CUSTOMIZATIONS_HELP_3()}   + ={LL.CUSTOMIZATIONS_HELP_4()}   + ={LL.CUSTOMIZATIONS_HELP_5()}   + ={LL.CUSTOMIZATIONS_HELP_6()} + + { - {LL.SHOWING()} {shown_data.length}/{deviceEntities.length} + {LL.SHOWING()} {shown_data.length}/{deviceEntities.length} {LL.ENTITIES(deviceEntities.length)} @@ -467,7 +473,7 @@ const SettingsCustomization: FC = () => { {formatName(de, false)} ( - + {de.id} ) @@ -506,7 +512,7 @@ const SettingsCustomization: FC = () => { {LL.DEVICE_ENTITIES()} {devices && renderDeviceList()} - {renderDeviceData()} + {deviceEntities && renderDeviceData()} {restartNeeded && (