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 && (
+ }
+ variant="outlined"
+ color="primary"
+ onClick={() => navigate('/settings/upload')}
+ >
+ {LL.UPDATE()}
+
+ )}
+
{
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;