From 53e9a062e8cd62248026fc762f5ac0be2b2f8488 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 22 Jul 2024 14:46:22 +0200 Subject: [PATCH] refactor web file structure and seperate settings from status --- .gitignore | 1 + interface/src/AuthenticatedRouting.tsx | 74 +++++++++++-------- .../{project => app/main}/CustomEntities.tsx | 0 .../main}/CustomEntitiesDialog.tsx | 0 .../{project => app/main}/Customization.tsx | 2 +- .../main}/CustomizationDialog.tsx | 0 .../src/{project => app/main}/DeviceIcon.tsx | 0 .../src/{project => app/main}/Devices.tsx | 0 .../{project => app/main}/DevicesDialog.tsx | 0 .../main}/EntityMaskToggle.tsx | 0 interface/src/{project => app/main}/Help.tsx | 2 +- .../src/{project => app/main}/Modules.tsx | 0 .../{project => app/main}/ModulesDialog.tsx | 0 .../src/{project => app/main}/OptionIcon.tsx | 0 .../src/{project => app/main}/Scheduler.tsx | 0 .../{project => app/main}/SchedulerDialog.tsx | 0 .../src/{project => app/main}/Sensors.tsx | 0 .../main}/SensorsAnalogDialog.tsx | 0 .../main}/SensorsTemperatureDialog.tsx | 0 interface/src/{project => app/main}/api.ts | 0 .../src/{project => app/main}/deviceValue.ts | 0 interface/src/{project => app/main}/types.ts | 0 .../src/{project => app/main}/validators.ts | 0 .../ap => app/settings}/APSettings.tsx | 5 +- .../settings}/ApplicationSettings.tsx | 12 +-- .../mqtt => app/settings}/MqttSettings.tsx | 4 +- .../ntp => app/settings}/NTPSettings.tsx | 4 +- .../{framework => app/settings}/Settings.tsx | 14 ++-- .../{framework/ntp => app/settings}/TZ.tsx | 0 .../settings}/UploadDownload.tsx | 6 +- .../settings}/network/Network.tsx | 5 +- .../settings}/network/NetworkSettings.tsx | 2 +- .../network/WiFiConnectionContext.tsx | 0 .../settings}/network/WiFiNetworkScanner.tsx | 0 .../settings}/network/WiFiNetworkSelector.tsx | 0 .../settings}/security/GenerateToken.tsx | 0 .../settings}/security/ManageUsers.tsx | 0 .../settings}/security/Security.tsx | 2 +- .../settings}/security/SecuritySettings.tsx | 0 .../settings}/security/User.tsx | 0 .../{framework/ap => app/status}/APStatus.tsx | 3 +- .../status/Activity.tsx} | 6 +- .../status/HardwareStatus.tsx} | 2 +- .../mqtt => app/status}/MqttStatus.tsx | 3 +- .../ntp => app/status}/NTPStatus.tsx | 3 +- .../network => app/status}/NetworkStatus.tsx | 3 +- .../system => app/status}/RestartMonitor.tsx | 0 .../status/Status.tsx} | 67 ++++++++++++----- .../system => app/status}/SystemLog.tsx | 2 +- .../src/{project => app/status}/bbqkees.svg | 0 .../src/components/layout/LayoutAppBar.tsx | 6 +- .../src/components/layout/LayoutMenu.tsx | 6 +- .../src/components/layout/ListMenuItem.tsx | 10 +-- interface/src/framework/ap/AccessPoint.tsx | 34 --------- interface/src/framework/mqtt/Mqtt.tsx | 34 --------- interface/src/framework/ntp/NetworkTime.tsx | 33 --------- interface/src/framework/system/System.tsx | 50 ------------- interface/src/types/system.ts | 2 +- interface/src/validators/ap.ts | 2 +- mock-api/rest_server.ts | 1 + 60 files changed, 149 insertions(+), 251 deletions(-) rename interface/src/{project => app/main}/CustomEntities.tsx (100%) rename interface/src/{project => app/main}/CustomEntitiesDialog.tsx (100%) rename interface/src/{project => app/main}/Customization.tsx (99%) rename interface/src/{project => app/main}/CustomizationDialog.tsx (100%) rename interface/src/{project => app/main}/DeviceIcon.tsx (100%) rename interface/src/{project => app/main}/Devices.tsx (100%) rename interface/src/{project => app/main}/DevicesDialog.tsx (100%) rename interface/src/{project => app/main}/EntityMaskToggle.tsx (100%) rename interface/src/{project => app/main}/Help.tsx (99%) rename interface/src/{project => app/main}/Modules.tsx (100%) rename interface/src/{project => app/main}/ModulesDialog.tsx (100%) rename interface/src/{project => app/main}/OptionIcon.tsx (100%) rename interface/src/{project => app/main}/Scheduler.tsx (100%) rename interface/src/{project => app/main}/SchedulerDialog.tsx (100%) rename interface/src/{project => app/main}/Sensors.tsx (100%) rename interface/src/{project => app/main}/SensorsAnalogDialog.tsx (100%) rename interface/src/{project => app/main}/SensorsTemperatureDialog.tsx (100%) rename interface/src/{project => app/main}/api.ts (100%) rename interface/src/{project => app/main}/deviceValue.ts (100%) rename interface/src/{project => app/main}/types.ts (100%) rename interface/src/{project => app/main}/validators.ts (100%) rename interface/src/{framework/ap => app/settings}/APSettings.tsx (98%) rename interface/src/{project => app/settings}/ApplicationSettings.tsx (98%) rename interface/src/{framework/mqtt => app/settings}/MqttSettings.tsx (99%) rename interface/src/{framework/ntp => app/settings}/NTPSettings.tsx (98%) rename interface/src/{framework => app/settings}/Settings.tsx (93%) rename interface/src/{framework/ntp => app/settings}/TZ.tsx (100%) rename interface/src/{framework/system => app/settings}/UploadDownload.tsx (98%) rename interface/src/{framework => app/settings}/network/Network.tsx (88%) rename interface/src/{framework => app/settings}/network/NetworkSettings.tsx (99%) rename interface/src/{framework => app/settings}/network/WiFiConnectionContext.tsx (100%) rename interface/src/{framework => app/settings}/network/WiFiNetworkScanner.tsx (100%) rename interface/src/{framework => app/settings}/network/WiFiNetworkSelector.tsx (100%) rename interface/src/{framework => app/settings}/security/GenerateToken.tsx (100%) rename interface/src/{framework => app/settings}/security/ManageUsers.tsx (100%) rename interface/src/{framework => app/settings}/security/Security.tsx (94%) rename interface/src/{framework => app/settings}/security/SecuritySettings.tsx (100%) rename interface/src/{framework => app/settings}/security/User.tsx (100%) rename interface/src/{framework/ap => app/status}/APStatus.tsx (96%) rename interface/src/{project/SystemActivity.tsx => app/status/Activity.tsx} (96%) rename interface/src/{framework/system/ESPSystemStatus.tsx => app/status/HardwareStatus.tsx} (99%) rename interface/src/{framework/mqtt => app/status}/MqttStatus.tsx (97%) rename interface/src/{framework/ntp => app/status}/NTPStatus.tsx (98%) rename interface/src/{framework/network => app/status}/NetworkStatus.tsx (98%) rename interface/src/{framework/system => app/status}/RestartMonitor.tsx (100%) rename interface/src/{framework/system/SystemStatus.tsx => app/status/Status.tsx} (90%) rename interface/src/{framework/system => app/status}/SystemLog.tsx (99%) rename interface/src/{project => app/status}/bbqkees.svg (100%) delete mode 100644 interface/src/framework/ap/AccessPoint.tsx delete mode 100644 interface/src/framework/mqtt/Mqtt.tsx delete mode 100644 interface/src/framework/ntp/NetworkTime.tsx delete mode 100644 interface/src/framework/system/System.tsx diff --git a/.gitignore b/.gitignore index 81f72621f..2eb46fa12 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ yarn.lock analyse.html interface/vite.config.ts.timestamp* *.local + # i18n generated files interface/src/i18n/i18n-react.tsx interface/src/i18n/i18n-types.ts diff --git a/interface/src/AuthenticatedRouting.tsx b/interface/src/AuthenticatedRouting.tsx index 4be4fcd42..3e9a619e2 100644 --- a/interface/src/AuthenticatedRouting.tsx +++ b/interface/src/AuthenticatedRouting.tsx @@ -1,26 +1,32 @@ import { type FC, useContext } from 'react'; import { Navigate, Route, Routes } from 'react-router-dom'; +import CustomEntities from 'app/main/CustomEntities'; +import Customization from 'app/main/Customization'; +import Devices from 'app/main/Devices'; +import Modules from 'app/main/Modules'; +import Scheduler from 'app/main/Scheduler'; +import Sensors from 'app/main/Sensors'; +import APSettings from 'app/settings/APSettings'; +import ApplicationSettings from 'app/settings/ApplicationSettings'; +import MqttSettings from 'app/settings/MqttSettings'; +import NTPSettings from 'app/settings/NTPSettings'; +import Settings from 'app/settings/Settings'; +import UploadDownload from 'app/settings/UploadDownload'; +import Network from 'app/settings/network/Network'; +import Security from 'app/settings/security/Security'; +import APStatus from 'app/status/APStatus'; +import Activity from 'app/status/Activity'; +import HardwareStatus from 'app/status/HardwareStatus'; +import MqttStatus from 'app/status/MqttStatus'; +import NTPStatus from 'app/status/NTPStatus'; +import NetworkStatus from 'app/status/NetworkStatus'; +import Status from 'app/status/Status'; +import SystemLog from 'app/status/SystemLog'; import { Layout } from 'components'; import { AuthenticatedContext } from 'contexts/authentication'; -import Settings from 'framework/Settings'; -import AccessPoint from 'framework/ap/AccessPoint'; -import Mqtt from 'framework/mqtt/Mqtt'; -import Network from 'framework/network/Network'; -import NetworkTime from 'framework/ntp/NetworkTime'; -import Security from 'framework/security/Security'; -import ESPSystemStatus from 'framework/system/ESPSystemStatus'; -import System from 'framework/system/System'; -import UploadDownload from 'framework/system/UploadDownload'; -import ApplicationSettings from 'project/ApplicationSettings'; -import CustomEntities from 'project/CustomEntities'; -import Customization from 'project/Customization'; -import Devices from 'project/Devices'; -import Modules from 'project/Modules'; -import Scheduler from 'project/Scheduler'; -import Sensors from 'project/Sensors'; -import Help from './project/Help'; +import Help from './app/main/Help'; const AuthenticatedRouting: FC = () => { const { me } = useContext(AuthenticatedContext); @@ -29,24 +35,34 @@ const AuthenticatedRouting: FC = () => { } /> } /> - } /> + } /> } /> } /> + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + {me.admin && ( <> - } /> - } /> - } /> - } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> - } /> - } /> - } /> - } /> } /> - } /> - } /> - } /> + + } /> + } /> + } /> )} diff --git a/interface/src/project/CustomEntities.tsx b/interface/src/app/main/CustomEntities.tsx similarity index 100% rename from interface/src/project/CustomEntities.tsx rename to interface/src/app/main/CustomEntities.tsx diff --git a/interface/src/project/CustomEntitiesDialog.tsx b/interface/src/app/main/CustomEntitiesDialog.tsx similarity index 100% rename from interface/src/project/CustomEntitiesDialog.tsx rename to interface/src/app/main/CustomEntitiesDialog.tsx diff --git a/interface/src/project/Customization.tsx b/interface/src/app/main/Customization.tsx similarity index 99% rename from interface/src/project/Customization.tsx rename to interface/src/app/main/Customization.tsx index be34f04bf..00e3905ea 100644 --- a/interface/src/project/Customization.tsx +++ b/interface/src/app/main/Customization.tsx @@ -41,6 +41,7 @@ import { import { useTheme } from '@table-library/react-table-library/theme'; import { dialogStyle } from 'CustomTheme'; import { useRequest } from 'alova'; +import RestartMonitor from 'app/status/RestartMonitor'; import { BlockNavigation, ButtonRow, @@ -48,7 +49,6 @@ import { SectionContent, useLayoutTitle } from 'components'; -import RestartMonitor from 'framework/system/RestartMonitor'; import { useI18nContext } from 'i18n/i18n-react'; import * as EMSESP from './api'; diff --git a/interface/src/project/CustomizationDialog.tsx b/interface/src/app/main/CustomizationDialog.tsx similarity index 100% rename from interface/src/project/CustomizationDialog.tsx rename to interface/src/app/main/CustomizationDialog.tsx diff --git a/interface/src/project/DeviceIcon.tsx b/interface/src/app/main/DeviceIcon.tsx similarity index 100% rename from interface/src/project/DeviceIcon.tsx rename to interface/src/app/main/DeviceIcon.tsx diff --git a/interface/src/project/Devices.tsx b/interface/src/app/main/Devices.tsx similarity index 100% rename from interface/src/project/Devices.tsx rename to interface/src/app/main/Devices.tsx diff --git a/interface/src/project/DevicesDialog.tsx b/interface/src/app/main/DevicesDialog.tsx similarity index 100% rename from interface/src/project/DevicesDialog.tsx rename to interface/src/app/main/DevicesDialog.tsx diff --git a/interface/src/project/EntityMaskToggle.tsx b/interface/src/app/main/EntityMaskToggle.tsx similarity index 100% rename from interface/src/project/EntityMaskToggle.tsx rename to interface/src/app/main/EntityMaskToggle.tsx diff --git a/interface/src/project/Help.tsx b/interface/src/app/main/Help.tsx similarity index 99% rename from interface/src/project/Help.tsx rename to interface/src/app/main/Help.tsx index 85be550ce..129db407d 100644 --- a/interface/src/project/Help.tsx +++ b/interface/src/app/main/Help.tsx @@ -18,7 +18,7 @@ import { Typography } from '@mui/material'; -import * as EMSESP from 'project/api'; +import * as EMSESP from 'app/main/api'; import { useRequest } from 'alova'; import { SectionContent, useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; diff --git a/interface/src/project/Modules.tsx b/interface/src/app/main/Modules.tsx similarity index 100% rename from interface/src/project/Modules.tsx rename to interface/src/app/main/Modules.tsx diff --git a/interface/src/project/ModulesDialog.tsx b/interface/src/app/main/ModulesDialog.tsx similarity index 100% rename from interface/src/project/ModulesDialog.tsx rename to interface/src/app/main/ModulesDialog.tsx diff --git a/interface/src/project/OptionIcon.tsx b/interface/src/app/main/OptionIcon.tsx similarity index 100% rename from interface/src/project/OptionIcon.tsx rename to interface/src/app/main/OptionIcon.tsx diff --git a/interface/src/project/Scheduler.tsx b/interface/src/app/main/Scheduler.tsx similarity index 100% rename from interface/src/project/Scheduler.tsx rename to interface/src/app/main/Scheduler.tsx diff --git a/interface/src/project/SchedulerDialog.tsx b/interface/src/app/main/SchedulerDialog.tsx similarity index 100% rename from interface/src/project/SchedulerDialog.tsx rename to interface/src/app/main/SchedulerDialog.tsx diff --git a/interface/src/project/Sensors.tsx b/interface/src/app/main/Sensors.tsx similarity index 100% rename from interface/src/project/Sensors.tsx rename to interface/src/app/main/Sensors.tsx diff --git a/interface/src/project/SensorsAnalogDialog.tsx b/interface/src/app/main/SensorsAnalogDialog.tsx similarity index 100% rename from interface/src/project/SensorsAnalogDialog.tsx rename to interface/src/app/main/SensorsAnalogDialog.tsx diff --git a/interface/src/project/SensorsTemperatureDialog.tsx b/interface/src/app/main/SensorsTemperatureDialog.tsx similarity index 100% rename from interface/src/project/SensorsTemperatureDialog.tsx rename to interface/src/app/main/SensorsTemperatureDialog.tsx diff --git a/interface/src/project/api.ts b/interface/src/app/main/api.ts similarity index 100% rename from interface/src/project/api.ts rename to interface/src/app/main/api.ts diff --git a/interface/src/project/deviceValue.ts b/interface/src/app/main/deviceValue.ts similarity index 100% rename from interface/src/project/deviceValue.ts rename to interface/src/app/main/deviceValue.ts diff --git a/interface/src/project/types.ts b/interface/src/app/main/types.ts similarity index 100% rename from interface/src/project/types.ts rename to interface/src/app/main/types.ts diff --git a/interface/src/project/validators.ts b/interface/src/app/main/validators.ts similarity index 100% rename from interface/src/project/validators.ts rename to interface/src/app/main/validators.ts diff --git a/interface/src/framework/ap/APSettings.tsx b/interface/src/app/settings/APSettings.tsx similarity index 98% rename from interface/src/framework/ap/APSettings.tsx rename to interface/src/app/settings/APSettings.tsx index 21a8d49ae..d2a9accb4 100644 --- a/interface/src/framework/ap/APSettings.tsx +++ b/interface/src/app/settings/APSettings.tsx @@ -15,7 +15,8 @@ import { FormLoader, SectionContent, ValidatedPasswordField, - ValidatedTextField + ValidatedTextField, + useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import { range } from 'lodash-es'; @@ -47,6 +48,8 @@ const APSettings: FC = () => { const { LL } = useI18nContext(); + useLayoutTitle(LL.SETTINGS_OF(LL.ACCESS_POINT(0))); + const [fieldErrors, setFieldErrors] = useState(); const updateFormValue = updateValueDirty( diff --git a/interface/src/project/ApplicationSettings.tsx b/interface/src/app/settings/ApplicationSettings.tsx similarity index 98% rename from interface/src/project/ApplicationSettings.tsx rename to interface/src/app/settings/ApplicationSettings.tsx index 069863994..b419aa9b7 100644 --- a/interface/src/project/ApplicationSettings.tsx +++ b/interface/src/app/settings/ApplicationSettings.tsx @@ -20,6 +20,7 @@ import { import * as SystemApi from 'api/system'; import { useRequest } from 'alova'; +import RestartMonitor from 'app/status/RestartMonitor'; import type { ValidateFieldsError } from 'async-validator'; import { BlockFormControlLabel, @@ -31,15 +32,14 @@ import { ValidatedTextField, useLayoutTitle } from 'components'; -import RestartMonitor from 'framework/system/RestartMonitor'; import { useI18nContext } from 'i18n/i18n-react'; import { numberValue, updateValueDirty, useRest } from 'utils'; import { validate } from 'validators'; -import * as EMSESP from './api'; -import { BOARD_PROFILES } from './types'; -import type { Settings } from './types'; -import { createSettingsValidator } from './validators'; +import * as EMSESP from '../main/api'; +import { BOARD_PROFILES } from '../main/types'; +import type { Settings } from '../main/types'; +import { createSettingsValidator } from '../main/validators'; export function boardProfileSelectItems() { return Object.keys(BOARD_PROFILES).map((code) => ( @@ -115,7 +115,7 @@ const ApplicationSettings: FC = () => { }); }; - useLayoutTitle(LL.APPLICATION()); + useLayoutTitle(LL.SETTINGS_OF(LL.APPLICATION())); const content = () => { if (!data) { diff --git a/interface/src/framework/mqtt/MqttSettings.tsx b/interface/src/app/settings/MqttSettings.tsx similarity index 99% rename from interface/src/framework/mqtt/MqttSettings.tsx rename to interface/src/app/settings/MqttSettings.tsx index ce59362c5..6ccf77680 100644 --- a/interface/src/framework/mqtt/MqttSettings.tsx +++ b/interface/src/app/settings/MqttSettings.tsx @@ -23,7 +23,8 @@ import { FormLoader, SectionContent, ValidatedPasswordField, - ValidatedTextField + ValidatedTextField, + useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import type { MqttSettingsType } from 'types'; @@ -48,6 +49,7 @@ const MqttSettings: FC = () => { }); const { LL } = useI18nContext(); + useLayoutTitle(LL.SETTINGS_OF('MQTT')); const [fieldErrors, setFieldErrors] = useState(); diff --git a/interface/src/framework/ntp/NTPSettings.tsx b/interface/src/app/settings/NTPSettings.tsx similarity index 98% rename from interface/src/framework/ntp/NTPSettings.tsx rename to interface/src/app/settings/NTPSettings.tsx index b24f22633..ae8ef094a 100644 --- a/interface/src/framework/ntp/NTPSettings.tsx +++ b/interface/src/app/settings/NTPSettings.tsx @@ -15,7 +15,8 @@ import { ButtonRow, FormLoader, SectionContent, - ValidatedTextField + ValidatedTextField, + useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import type { NTPSettingsType } from 'types'; @@ -43,6 +44,7 @@ const NTPSettings: FC = () => { }); const { LL } = useI18nContext(); + useLayoutTitle(LL.SETTINGS_OF('NTP')); const updateFormValue = updateValueDirty( origData, diff --git a/interface/src/framework/Settings.tsx b/interface/src/app/settings/Settings.tsx similarity index 93% rename from interface/src/framework/Settings.tsx rename to interface/src/app/settings/Settings.tsx index 1d17db0fb..a9e49f8ca 100644 --- a/interface/src/framework/Settings.tsx +++ b/interface/src/app/settings/Settings.tsx @@ -79,15 +79,15 @@ const Settings: FC = () => { @@ -95,7 +95,7 @@ const Settings: FC = () => { @@ -103,7 +103,7 @@ const Settings: FC = () => { @@ -111,14 +111,14 @@ const Settings: FC = () => { diff --git a/interface/src/framework/ntp/TZ.tsx b/interface/src/app/settings/TZ.tsx similarity index 100% rename from interface/src/framework/ntp/TZ.tsx rename to interface/src/app/settings/TZ.tsx diff --git a/interface/src/framework/system/UploadDownload.tsx b/interface/src/app/settings/UploadDownload.tsx similarity index 98% rename from interface/src/framework/system/UploadDownload.tsx rename to interface/src/app/settings/UploadDownload.tsx index 8c159ef4e..6c49d6842 100644 --- a/interface/src/framework/system/UploadDownload.tsx +++ b/interface/src/app/settings/UploadDownload.tsx @@ -6,8 +6,9 @@ import { Box, Button, Divider, Link, Typography } from '@mui/material'; import * as SystemApi from 'api/system'; -import * as EMSESP from 'project/api'; +import * as EMSESP from 'app/main/api'; import { useRequest } from 'alova'; +import type { APIcall } from 'app/main/types'; import { FormLoader, SectionContent, @@ -15,9 +16,8 @@ import { useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; -import type { APIcall } from 'project/types'; -import RestartMonitor from './RestartMonitor'; +import RestartMonitor from '../status/RestartMonitor'; const UploadDownload: FC = () => { const { LL } = useI18nContext(); diff --git a/interface/src/framework/network/Network.tsx b/interface/src/app/settings/network/Network.tsx similarity index 88% rename from interface/src/framework/network/Network.tsx rename to interface/src/app/settings/network/Network.tsx index 2d524c63a..0088a93b8 100644 --- a/interface/src/framework/network/Network.tsx +++ b/interface/src/app/settings/network/Network.tsx @@ -9,13 +9,12 @@ import { useI18nContext } from 'i18n/i18n-react'; import type { WiFiNetwork } from 'types'; import NetworkSettings from './NetworkSettings'; -import NetworkStatus from './NetworkStatus'; import { WiFiConnectionContext } from './WiFiConnectionContext'; import WiFiNetworkScanner from './WiFiNetworkScanner'; const Network: FC = () => { const { LL } = useI18nContext(); - useLayoutTitle(LL.NETWORK(0)); + useLayoutTitle(LL.SETTINGS_OF(LL.NETWORK(0))); const { routerTab } = useRouterTab(); @@ -45,11 +44,9 @@ const Network: FC = () => { > - - } /> } /> } /> } /> diff --git a/interface/src/framework/network/NetworkSettings.tsx b/interface/src/app/settings/network/NetworkSettings.tsx similarity index 99% rename from interface/src/framework/network/NetworkSettings.tsx rename to interface/src/app/settings/network/NetworkSettings.tsx index 16d173f2b..cc1d8386a 100644 --- a/interface/src/framework/network/NetworkSettings.tsx +++ b/interface/src/app/settings/network/NetworkSettings.tsx @@ -44,7 +44,7 @@ import { updateValueDirty, useRest } from 'utils'; import { validate } from 'validators'; import { createNetworkSettingsValidator } from 'validators/network'; -import RestartMonitor from '../system/RestartMonitor'; +import RestartMonitor from '../../status/RestartMonitor'; import { WiFiConnectionContext } from './WiFiConnectionContext'; import { isNetworkOpen, networkSecurityMode } from './WiFiNetworkSelector'; diff --git a/interface/src/framework/network/WiFiConnectionContext.tsx b/interface/src/app/settings/network/WiFiConnectionContext.tsx similarity index 100% rename from interface/src/framework/network/WiFiConnectionContext.tsx rename to interface/src/app/settings/network/WiFiConnectionContext.tsx diff --git a/interface/src/framework/network/WiFiNetworkScanner.tsx b/interface/src/app/settings/network/WiFiNetworkScanner.tsx similarity index 100% rename from interface/src/framework/network/WiFiNetworkScanner.tsx rename to interface/src/app/settings/network/WiFiNetworkScanner.tsx diff --git a/interface/src/framework/network/WiFiNetworkSelector.tsx b/interface/src/app/settings/network/WiFiNetworkSelector.tsx similarity index 100% rename from interface/src/framework/network/WiFiNetworkSelector.tsx rename to interface/src/app/settings/network/WiFiNetworkSelector.tsx diff --git a/interface/src/framework/security/GenerateToken.tsx b/interface/src/app/settings/security/GenerateToken.tsx similarity index 100% rename from interface/src/framework/security/GenerateToken.tsx rename to interface/src/app/settings/security/GenerateToken.tsx diff --git a/interface/src/framework/security/ManageUsers.tsx b/interface/src/app/settings/security/ManageUsers.tsx similarity index 100% rename from interface/src/framework/security/ManageUsers.tsx rename to interface/src/app/settings/security/ManageUsers.tsx diff --git a/interface/src/framework/security/Security.tsx b/interface/src/app/settings/security/Security.tsx similarity index 94% rename from interface/src/framework/security/Security.tsx rename to interface/src/app/settings/security/Security.tsx index 94e306b22..32d452af2 100644 --- a/interface/src/framework/security/Security.tsx +++ b/interface/src/app/settings/security/Security.tsx @@ -11,7 +11,7 @@ import SecuritySettings from './SecuritySettings'; const Security: FC = () => { const { LL } = useI18nContext(); - useLayoutTitle(LL.SECURITY(0)); + useLayoutTitle(LL.SETTINGS_OF(LL.SECURITY(0))); const { routerTab } = useRouterTab(); diff --git a/interface/src/framework/security/SecuritySettings.tsx b/interface/src/app/settings/security/SecuritySettings.tsx similarity index 100% rename from interface/src/framework/security/SecuritySettings.tsx rename to interface/src/app/settings/security/SecuritySettings.tsx diff --git a/interface/src/framework/security/User.tsx b/interface/src/app/settings/security/User.tsx similarity index 100% rename from interface/src/framework/security/User.tsx rename to interface/src/app/settings/security/User.tsx diff --git a/interface/src/framework/ap/APStatus.tsx b/interface/src/app/status/APStatus.tsx similarity index 96% rename from interface/src/framework/ap/APStatus.tsx rename to interface/src/app/status/APStatus.tsx index 9c3e0cbe7..de43be859 100644 --- a/interface/src/framework/ap/APStatus.tsx +++ b/interface/src/app/status/APStatus.tsx @@ -19,7 +19,7 @@ import type { Theme } from '@mui/material'; import * as APApi from 'api/ap'; import { useRequest } from 'alova'; -import { ButtonRow, FormLoader, SectionContent } from 'components'; +import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import type { APStatusType } from 'types'; import { APNetworkStatus } from 'types'; @@ -41,6 +41,7 @@ const APStatus: FC = () => { const { data: data, send: loadData, error } = useRequest(APApi.readAPStatus); const { LL } = useI18nContext(); + useLayoutTitle(LL.STATUS_OF(LL.ACCESS_POINT(0))); const theme = useTheme(); diff --git a/interface/src/project/SystemActivity.tsx b/interface/src/app/status/Activity.tsx similarity index 96% rename from interface/src/project/SystemActivity.tsx rename to interface/src/app/status/Activity.tsx index ade2e653c..84c5199be 100644 --- a/interface/src/project/SystemActivity.tsx +++ b/interface/src/app/status/Activity.tsx @@ -19,15 +19,15 @@ import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'component import { useI18nContext } from 'i18n/i18n-react'; import type { Translation } from 'i18n/i18n-types'; -import * as EMSESP from './api'; -import type { Stat } from './types'; +import * as EMSESP from '../main/api'; +import type { Stat } from '../main/types'; const SystemActivity: FC = () => { const { data: data, send: loadData, error } = useRequest(EMSESP.readActivity); const { LL } = useI18nContext(); - useLayoutTitle(LL.SYSTEM(0)); + useLayoutTitle(LL.EMS_BUS_STATUS()); const stats_theme = tableTheme({ Table: ` diff --git a/interface/src/framework/system/ESPSystemStatus.tsx b/interface/src/app/status/HardwareStatus.tsx similarity index 99% rename from interface/src/framework/system/ESPSystemStatus.tsx rename to interface/src/app/status/HardwareStatus.tsx index 5cdc61bbf..e97d77a55 100644 --- a/interface/src/framework/system/ESPSystemStatus.tsx +++ b/interface/src/app/status/HardwareStatus.tsx @@ -26,7 +26,7 @@ import { useRequest } from 'alova'; import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; -import BBQKeesIcon from '../../project/bbqkees.svg'; +import BBQKeesIcon from './bbqkees.svg'; function formatNumber(num: number) { return new Intl.NumberFormat().format(num); diff --git a/interface/src/framework/mqtt/MqttStatus.tsx b/interface/src/app/status/MqttStatus.tsx similarity index 97% rename from interface/src/framework/mqtt/MqttStatus.tsx rename to interface/src/app/status/MqttStatus.tsx index f171b5cee..81475b481 100644 --- a/interface/src/framework/mqtt/MqttStatus.tsx +++ b/interface/src/app/status/MqttStatus.tsx @@ -20,7 +20,7 @@ import type { Theme } from '@mui/material'; import * as MqttApi from 'api/mqtt'; import { useRequest } from 'alova'; -import { ButtonRow, FormLoader, SectionContent } from 'components'; +import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import type { MqttStatusType } from 'types'; import { MqttDisconnectReason } from 'types'; @@ -61,6 +61,7 @@ const MqttStatus: FC = () => { const { data: data, send: loadData, error } = useRequest(MqttApi.readMqttStatus); const { LL } = useI18nContext(); + useLayoutTitle(LL.STATUS_OF('MQTT')); const theme = useTheme(); diff --git a/interface/src/framework/ntp/NTPStatus.tsx b/interface/src/app/status/NTPStatus.tsx similarity index 98% rename from interface/src/framework/ntp/NTPStatus.tsx rename to interface/src/app/status/NTPStatus.tsx index d1a9af611..a07753f8e 100644 --- a/interface/src/framework/ntp/NTPStatus.tsx +++ b/interface/src/app/status/NTPStatus.tsx @@ -31,7 +31,7 @@ import * as NTPApi from 'api/ntp'; import { dialogStyle } from 'CustomTheme'; import { useRequest } from 'alova'; -import { ButtonRow, FormLoader, SectionContent } from 'components'; +import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import type { NTPStatusType, Time } from 'types'; import { NTPSyncStatus } from 'types'; @@ -45,6 +45,7 @@ const NTPStatus: FC = () => { const [processing, setProcessing] = useState(false); const { LL } = useI18nContext(); + useLayoutTitle(LL.STATUS_OF('NTP')); const { send: updateTime } = useRequest( (local_time: Time) => NTPApi.updateTime(local_time), diff --git a/interface/src/framework/network/NetworkStatus.tsx b/interface/src/app/status/NetworkStatus.tsx similarity index 98% rename from interface/src/framework/network/NetworkStatus.tsx rename to interface/src/app/status/NetworkStatus.tsx index b189bbc91..683ed0727 100644 --- a/interface/src/framework/network/NetworkStatus.tsx +++ b/interface/src/app/status/NetworkStatus.tsx @@ -23,7 +23,7 @@ import type { Theme } from '@mui/material'; import * as NetworkApi from 'api/network'; import { useRequest } from 'alova'; -import { ButtonRow, FormLoader, SectionContent } from 'components'; +import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import type { NetworkStatusType } from 'types'; import { NetworkConnectionStatus } from 'types'; @@ -91,6 +91,7 @@ const NetworkStatus: FC = () => { } = useRequest(NetworkApi.readNetworkStatus); const { LL } = useI18nContext(); + useLayoutTitle(LL.STATUS_OF(LL.NETWORK(1))); const theme = useTheme(); diff --git a/interface/src/framework/system/RestartMonitor.tsx b/interface/src/app/status/RestartMonitor.tsx similarity index 100% rename from interface/src/framework/system/RestartMonitor.tsx rename to interface/src/app/status/RestartMonitor.tsx diff --git a/interface/src/framework/system/SystemStatus.tsx b/interface/src/app/status/Status.tsx similarity index 90% rename from interface/src/framework/system/SystemStatus.tsx rename to interface/src/app/status/Status.tsx index 7c115c495..d5a637225 100644 --- a/interface/src/framework/system/SystemStatus.tsx +++ b/interface/src/app/status/Status.tsx @@ -1,4 +1,5 @@ import { type FC, useContext, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; import { toast } from 'react-toastify'; import AccessTimeIcon from '@mui/icons-material/AccessTime'; @@ -6,6 +7,7 @@ import BuildIcon from '@mui/icons-material/Build'; import CancelIcon from '@mui/icons-material/Cancel'; import DeviceHubIcon from '@mui/icons-material/DeviceHub'; import DirectionsBusIcon from '@mui/icons-material/DirectionsBus'; +import LogoDevIcon from '@mui/icons-material/LogoDev'; import MemoryIcon from '@mui/icons-material/Memory'; import PermScanWifiIcon from '@mui/icons-material/PermScanWifi'; import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew'; @@ -13,6 +15,7 @@ import RefreshIcon from '@mui/icons-material/Refresh'; import RouterIcon from '@mui/icons-material/Router'; import SettingsInputAntennaIcon from '@mui/icons-material/SettingsInputAntenna'; import TimerIcon from '@mui/icons-material/Timer'; +import UpgradeIcon from '@mui/icons-material/Upgrade'; import WifiIcon from '@mui/icons-material/Wifi'; import { Avatar, @@ -32,14 +35,14 @@ import { import * as SystemApi from 'api/system'; -import * as EMSESP from 'project/api'; +import * as EMSESP from 'app/main/api'; import { dialogStyle } from 'CustomTheme'; import { useRequest } from 'alova'; +import { busConnectionStatus } from 'app/main/types'; import { FormLoader, SectionContent, useLayoutTitle } from 'components'; import ListMenuItem from 'components/layout/ListMenuItem'; import { AuthenticatedContext } from 'contexts/authentication'; import { useI18nContext } from 'i18n/i18n-react'; -import { busConnectionStatus } from 'project/types'; import { NTPSyncStatus, NetworkConnectionStatus } from 'types'; import RestartMonitor from './RestartMonitor'; @@ -47,7 +50,9 @@ import RestartMonitor from './RestartMonitor'; const SystemStatus: FC = () => { const { LL } = useI18nContext(); - useLayoutTitle(LL.SYSTEM(0)); + const navigate = useNavigate(); + + useLayoutTitle(LL.STATUS_OF('')); const { me } = useContext(AuthenticatedContext); @@ -313,7 +318,7 @@ const SystemStatus: FC = () => { return ( <> - + @@ -336,6 +341,16 @@ const SystemStatus: FC = () => { )} + + + @@ -366,14 +381,27 @@ const SystemStatus: FC = () => { - + + + + + + + + {me.admin && ( + + )} + { bgcolor={busStatusHighlight()} label={LL.EMS_BUS_STATUS()} text={busStatus()} - to="/system/activity" + to="/status/activity" /> @@ -392,7 +420,7 @@ const SystemStatus: FC = () => { bgcolor="#68374d" label={LL.STATUS_OF(LL.HARDWARE())} text={formatNumber(data.free_heap) + ' KB' + ' ' + LL.FREE_MEMORY()} - to="/system/espsystemstatus" + to="/status/hardwarestatus" /> @@ -406,7 +434,7 @@ const SystemStatus: FC = () => { bgcolor={networkStatusHighlight()} label={LL.STATUS_OF(LL.NETWORK(1))} text={networkStatus()} - to="/settings/network/status" + to="/status/network" /> @@ -416,7 +444,7 @@ const SystemStatus: FC = () => { bgcolor={activeHighlight(data.mqtt_status)} label={LL.STATUS_OF('MQTT')} text={data.mqtt_status ? LL.ACTIVE() : LL.INACTIVE(0)} - to="/settings/mqtt/status" + to="/status/mqtt" /> @@ -426,7 +454,7 @@ const SystemStatus: FC = () => { bgcolor={ntpStatusHighlight()} label={LL.STATUS_OF('NTP')} text={ntpStatus()} - to="/settings/ntp/status" + to="/status/ntp" /> @@ -434,11 +462,10 @@ const SystemStatus: FC = () => { disabled={!me.admin} icon={SettingsInputAntennaIcon} bgcolor={activeHighlight(data.ap_status)} - label={LL.ACCESS_POINT(0)} + label={LL.STATUS_OF(LL.ACCESS_POINT(0))} text={data.ap_status ? LL.ACTIVE() : LL.INACTIVE(0)} - to="/settings/ap/status" + to="/status/ap" /> - {renderScanDialog()} diff --git a/interface/src/framework/system/SystemLog.tsx b/interface/src/app/status/SystemLog.tsx similarity index 99% rename from interface/src/framework/system/SystemLog.tsx rename to interface/src/app/status/SystemLog.tsx index 8ee65396a..bf2ba5f48 100644 --- a/interface/src/framework/system/SystemLog.tsx +++ b/interface/src/app/status/SystemLog.tsx @@ -75,7 +75,7 @@ const levelLabel = (level: LogLevel) => { const SystemLog: FC = () => { const { LL } = useI18nContext(); - useLayoutTitle(LL.SYSTEM(0)); + useLayoutTitle(LL.LOG_OF(LL.SYSTEM(0))); const { loadData, diff --git a/interface/src/project/bbqkees.svg b/interface/src/app/status/bbqkees.svg similarity index 100% rename from interface/src/project/bbqkees.svg rename to interface/src/app/status/bbqkees.svg diff --git a/interface/src/components/layout/LayoutAppBar.tsx b/interface/src/components/layout/LayoutAppBar.tsx index 3d1a5c433..06e43e798 100644 --- a/interface/src/components/layout/LayoutAppBar.tsx +++ b/interface/src/components/layout/LayoutAppBar.tsx @@ -16,11 +16,9 @@ const LayoutAppBar: FC = ({ title, onToggleDrawer }) => { const pathnames = useLocation() .pathname.split('/') .filter((x) => x); + const show_back = pathnames.length > 1; + const navigate = useNavigate(); - let show_back = false; - if (pathnames.length > 1) { - show_back = pathnames[0] !== 'system' || pathnames[1] === 'espsystemstatus'; - } return ( { - + = ({ } > - + ) : ( - + )} diff --git a/interface/src/framework/ap/AccessPoint.tsx b/interface/src/framework/ap/AccessPoint.tsx deleted file mode 100644 index 08e55ca1f..000000000 --- a/interface/src/framework/ap/AccessPoint.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import type { FC } from 'react'; -import { Navigate, Route, Routes } from 'react-router-dom'; - -import { Tab } from '@mui/material'; - -import { RouterTabs, useLayoutTitle, useRouterTab } from 'components'; -import { useI18nContext } from 'i18n/i18n-react'; - -import APSettings from './APSettings'; -import APStatus from './APStatus'; - -const AccessPoint: FC = () => { - const { LL } = useI18nContext(); - - useLayoutTitle(LL.ACCESS_POINT(0)); - - const { routerTab } = useRouterTab(); - - return ( - <> - - - - - - } /> - } /> - } /> - - - ); -}; - -export default AccessPoint; diff --git a/interface/src/framework/mqtt/Mqtt.tsx b/interface/src/framework/mqtt/Mqtt.tsx deleted file mode 100644 index c4e2c9d56..000000000 --- a/interface/src/framework/mqtt/Mqtt.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import type { FC } from 'react'; -import { Navigate, Route, Routes } from 'react-router-dom'; - -import { Tab } from '@mui/material'; - -import { RouterTabs, useLayoutTitle, useRouterTab } from 'components'; -import { useI18nContext } from 'i18n/i18n-react'; - -import MqttSettings from './MqttSettings'; -import MqttStatus from './MqttStatus'; - -const Mqtt: FC = () => { - const { LL } = useI18nContext(); - - useLayoutTitle('MQTT'); - - const { routerTab } = useRouterTab(); - - return ( - <> - - - - - - } /> - } /> - } /> - - - ); -}; - -export default Mqtt; diff --git a/interface/src/framework/ntp/NetworkTime.tsx b/interface/src/framework/ntp/NetworkTime.tsx deleted file mode 100644 index b34f09699..000000000 --- a/interface/src/framework/ntp/NetworkTime.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import type { FC } from 'react'; -import { Navigate, Route, Routes } from 'react-router-dom'; - -import { Tab } from '@mui/material'; - -import { RouterTabs, useLayoutTitle, useRouterTab } from 'components'; -import { useI18nContext } from 'i18n/i18n-react'; - -import NTPSettings from './NTPSettings'; -import NTPStatus from './NTPStatus'; - -const NetworkTime: FC = () => { - const { LL } = useI18nContext(); - useLayoutTitle('NTP'); - - const { routerTab } = useRouterTab(); - - return ( - <> - - - - - - } /> - } /> - } /> - - - ); -}; - -export default NetworkTime; diff --git a/interface/src/framework/system/System.tsx b/interface/src/framework/system/System.tsx deleted file mode 100644 index 0cc0c28d6..000000000 --- a/interface/src/framework/system/System.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { type FC, useContext } from 'react'; -import { Navigate, Route, Routes } from 'react-router-dom'; - -import { Tab } from '@mui/material'; - -import { RequireAdmin, RouterTabs, useLayoutTitle, useRouterTab } from 'components'; -import { AuthenticatedContext } from 'contexts/authentication'; -import { useI18nContext } from 'i18n/i18n-react'; -import SystemActivity from 'project/SystemActivity'; - -import SystemLog from './SystemLog'; -import SystemStatus from './SystemStatus'; - -const System: FC = () => { - const { LL } = useI18nContext(); - - useLayoutTitle(LL.SYSTEM(0)); - - const { routerTab } = useRouterTab(); - const { me } = useContext(AuthenticatedContext); - - return ( - <> - - - - - - - } /> - } /> - - - - } - /> - } /> - - - ); -}; - -export default System; diff --git a/interface/src/types/system.ts b/interface/src/types/system.ts index 8bdfdddff..5dfca23c3 100644 --- a/interface/src/types/system.ts +++ b/interface/src/types/system.ts @@ -1,4 +1,4 @@ -import type { busConnectionStatus } from 'project/types'; +import type { busConnectionStatus } from 'app/main/types'; import type { NetworkConnectionStatus } from './network'; diff --git a/interface/src/validators/ap.ts b/interface/src/validators/ap.ts index f67c830e4..5a1514909 100644 --- a/interface/src/validators/ap.ts +++ b/interface/src/validators/ap.ts @@ -1,5 +1,5 @@ +import { isAPEnabled } from 'app/settings/APSettings'; import Schema from 'async-validator'; -import { isAPEnabled } from 'framework/ap/APSettings'; import type { APSettingsType } from 'types'; import { IP_ADDRESS_VALIDATOR } from './shared'; diff --git a/mock-api/rest_server.ts b/mock-api/rest_server.ts index 4da77f457..9b860c338 100644 --- a/mock-api/rest_server.ts +++ b/mock-api/rest_server.ts @@ -411,6 +411,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;