diff --git a/interface/src/components/layout/LayoutMenu.tsx b/interface/src/components/layout/LayoutMenu.tsx index 9a43749c1..ec1ca6e92 100644 --- a/interface/src/components/layout/LayoutMenu.tsx +++ b/interface/src/components/layout/LayoutMenu.tsx @@ -131,7 +131,11 @@ const LayoutMenu: FC = () => { - + diff --git a/interface/src/framework/Settings.tsx b/interface/src/framework/Settings.tsx index 5c8290b28..7ecb07166 100644 --- a/interface/src/framework/Settings.tsx +++ b/interface/src/framework/Settings.tsx @@ -34,7 +34,7 @@ const Settings: FC = () => { - + @@ -142,7 +142,7 @@ const Settings: FC = () => { - + diff --git a/interface/src/project/Devices.tsx b/interface/src/project/Devices.tsx index 5ace3f3f2..b8fe104e4 100644 --- a/interface/src/project/Devices.tsx +++ b/interface/src/project/Devices.tsx @@ -33,7 +33,7 @@ import { useSort, SortToggleType } from '@table-library/react-table-library/sort import { Table, Header, HeaderRow, HeaderCell, Body, Row, Cell } from '@table-library/react-table-library/table'; import { useTheme } from '@table-library/react-table-library/theme'; import { useRequest } from 'alova'; -import { useState, useEffect, useCallback, useLayoutEffect } from 'react'; +import { useState, useEffect, useCallback, useLayoutEffect, useContext } from 'react'; import { IconContext } from 'react-icons'; import { useNavigate } from 'react-router-dom'; @@ -51,10 +51,13 @@ import type { FC } from 'react'; import { dialogStyle } from 'CustomTheme'; import { ButtonRow, SectionContent, MessageBox, useLayoutTitle } from 'components'; +import { AuthenticatedContext } from 'contexts/authentication'; import { useI18nContext } from 'i18n/i18n-react'; const Devices: FC = () => { const { LL } = useI18nContext(); + const { me } = useContext(AuthenticatedContext); + const [size, setSize] = useState([0, 0]); const [selectedDeviceValue, setSelectedDeviceValue] = useState(); const [onlyFav, setOnlyFav] = useState(false); @@ -281,9 +284,9 @@ const Devices: FC = () => { const customize = () => { if (selectedDevice == 99) { - navigate('/settings/customentities'); + navigate('/customentities'); } else { - navigate('/settings/customization', { state: selectedDevice }); + navigate('/customizations', { state: selectedDevice }); } }; @@ -520,9 +523,11 @@ const Devices: FC = () => { setShowDeviceInfo(true)}> - - - + {me.admin && ( + + + + )} @@ -584,7 +589,7 @@ const Devices: FC = () => { {renderNameCell(dv)} {formatValue(LL, dv.v, dv.u)} - {dv.c && !hasMask(dv.id, DeviceEntityMask.DV_READONLY) && ( + {me.admin && dv.c && !hasMask(dv.id, DeviceEntityMask.DV_READONLY) && ( showDeviceValue(dv)}> {dv.v === '' && dv.c ? ( diff --git a/interface/src/project/Sensors.tsx b/interface/src/project/Sensors.tsx index 17364b6d8..d74b88131 100644 --- a/interface/src/project/Sensors.tsx +++ b/interface/src/project/Sensors.tsx @@ -27,12 +27,13 @@ import { useI18nContext } from 'i18n/i18n-react'; const Sensors: FC = () => { const { LL } = useI18nContext(); + const { me } = useContext(AuthenticatedContext); + const [selectedTemperatureSensor, setSelectedTemperatureSensor] = useState(); const [selectedAnalogSensor, setSelectedAnalogSensor] = useState(); const [temperatureDialogOpen, setTemperatureDialogOpen] = useState(false); const [analogDialogOpen, setAnalogDialogOpen] = useState(false); const [creating, setCreating] = useState(false); - const { me } = useContext(AuthenticatedContext); const { data: sensorData, send: fetchSensorData } = useRequest(() => EMSESP.readSensorData(), { initialData: { @@ -220,8 +221,10 @@ const Sensors: FC = () => { } const updateTemperatureSensor = (ts: TemperatureSensor) => { - setSelectedTemperatureSensor(ts); - setTemperatureDialogOpen(true); + if (me.admin) { + setSelectedTemperatureSensor(ts); + setTemperatureDialogOpen(true); + } }; const onTemperatureDialogClose = () => { @@ -244,9 +247,11 @@ const Sensors: FC = () => { }; const updateAnalogSensor = (as: AnalogSensor) => { - setCreating(false); - setSelectedAnalogSensor(as); - setAnalogDialogOpen(true); + if (me.admin) { + setCreating(false); + setSelectedAnalogSensor(as); + setAnalogDialogOpen(true); + } }; const onAnalogDialogClose = () => { diff --git a/mock-api/handler.ts b/mock-api/handler.ts index bbf6e1542..9dfd6558c 100644 --- a/mock-api/handler.ts +++ b/mock-api/handler.ts @@ -412,6 +412,7 @@ const guest_signin = { access_token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Imd1ZXN0IiwiYWRtaW4iOmZhbHNlfQ.E_lylR_vGIQFZUGNwcl5F6OkHoaELGsC5zqhi0pAiJE' }; +// modify here to simulate admin and guest logins const signin = admin_signin; // const signin = guest_signin; @@ -425,6 +426,7 @@ const EMSESP_CORE_DATA_ENDPOINT = REST_ENDPOINT_ROOT + 'coreData'; const EMSESP_SENSOR_DATA_ENDPOINT = REST_ENDPOINT_ROOT + 'sensorData'; const EMSESP_DEVICES_ENDPOINT = REST_ENDPOINT_ROOT + 'devices'; const EMSESP_SCANDEVICES_ENDPOINT = REST_ENDPOINT_ROOT + 'scanDevices'; +// for later // const EMSESP_DEVICEDATA_ENDPOINT = REST_ENDPOINT_ROOT + 'deviceData/:id'; // const EMSESP_DEVICEENTITIES_ENDPOINT = REST_ENDPOINT_ROOT + 'deviceEntities/:id'; const EMSESP_DEVICEDATA_ENDPOINT = REST_ENDPOINT_ROOT + 'deviceData';