mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-07 08:19:52 +03:00
Change name of entity within WebUI #612
This commit is contained in:
28
interface/package-lock.json
generated
28
interface/package-lock.json
generated
@@ -15,7 +15,7 @@
|
||||
"@mui/material": "^5.10.4",
|
||||
"@table-library/react-table-library": "4.0.18",
|
||||
"@types/lodash": "^4.14.184",
|
||||
"@types/node": "^18.7.15",
|
||||
"@types/node": "^18.7.16",
|
||||
"@types/react": "^18.0.18",
|
||||
"@types/react-dom": "^18.0.6",
|
||||
"@types/react-router-dom": "^5.3.3",
|
||||
@@ -35,7 +35,7 @@
|
||||
"react-scripts": "5.0.1",
|
||||
"sockette": "^2.0.6",
|
||||
"typesafe-i18n": "^5.12.0",
|
||||
"typescript": "^4.8.2"
|
||||
"typescript": "^4.8.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"nodemon": "^2.0.19",
|
||||
@@ -4013,9 +4013,9 @@
|
||||
"integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA=="
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "18.7.15",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.15.tgz",
|
||||
"integrity": "sha512-XnjpaI8Bgc3eBag2Aw4t2Uj/49lLBSStHWfqKvIuXD7FIrZyMLWp8KuAFHAqxMZYTF9l08N1ctUn9YNybZJVmQ=="
|
||||
"version": "18.7.16",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.16.tgz",
|
||||
"integrity": "sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg=="
|
||||
},
|
||||
"node_modules/@types/parse-json": {
|
||||
"version": "4.0.0",
|
||||
@@ -16418,9 +16418,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/typescript": {
|
||||
"version": "4.8.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz",
|
||||
"integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==",
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz",
|
||||
"integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==",
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
"tsserver": "bin/tsserver"
|
||||
@@ -20201,9 +20201,9 @@
|
||||
"integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA=="
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "18.7.15",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.15.tgz",
|
||||
"integrity": "sha512-XnjpaI8Bgc3eBag2Aw4t2Uj/49lLBSStHWfqKvIuXD7FIrZyMLWp8KuAFHAqxMZYTF9l08N1ctUn9YNybZJVmQ=="
|
||||
"version": "18.7.16",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.16.tgz",
|
||||
"integrity": "sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg=="
|
||||
},
|
||||
"@types/parse-json": {
|
||||
"version": "4.0.0",
|
||||
@@ -29076,9 +29076,9 @@
|
||||
"requires": {}
|
||||
},
|
||||
"typescript": {
|
||||
"version": "4.8.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz",
|
||||
"integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw=="
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz",
|
||||
"integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig=="
|
||||
},
|
||||
"unbox-primitive": {
|
||||
"version": "1.0.2",
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"@mui/material": "^5.10.4",
|
||||
"@table-library/react-table-library": "4.0.18",
|
||||
"@types/lodash": "^4.14.184",
|
||||
"@types/node": "^18.7.15",
|
||||
"@types/node": "^18.7.16",
|
||||
"@types/react": "^18.0.18",
|
||||
"@types/react-dom": "^18.0.6",
|
||||
"@types/react-router-dom": "^5.3.3",
|
||||
@@ -31,7 +31,7 @@
|
||||
"react-scripts": "5.0.1",
|
||||
"sockette": "^2.0.6",
|
||||
"typesafe-i18n": "^5.12.0",
|
||||
"typescript": "^4.8.2"
|
||||
"typescript": "^4.8.3"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "react-app-rewired start",
|
||||
|
||||
@@ -45,15 +45,19 @@ const de: Translation = {
|
||||
PROBLEM_UPDATING: 'Problem beim Aktualisieren',
|
||||
PROBLEM_LOADING: 'Problem beim Laden',
|
||||
ACCESS_DENIED: 'Zugriff abgelehnt',
|
||||
ANALOG_SENSOR: 'Analogsensor{post}',
|
||||
ANALOG_SENSOR: 'Analogsensor',
|
||||
ANALOG_SENSORS: 'Analogsensoren',
|
||||
UPDATED: 'DE_Updated',
|
||||
UPDATE: 'DE_Update',
|
||||
REMOVED: 'DE_Removed',
|
||||
DELETION: 'DE_Deletion',
|
||||
OFFSET: 'Addition',
|
||||
FACTOR: 'Faktor',
|
||||
FREQ: 'Frequenz',
|
||||
STARTVALUE: 'Startwert',
|
||||
WARN_GPIO: 'Warnung: Vorsicht bei der korrekten Wahl des GPIO!',
|
||||
EDIT: 'Editiere',
|
||||
TEMP_SENSOR: 'Temperatursensor{post}',
|
||||
TEMP_SENSOR: 'Temperatursensor',
|
||||
TEMP_SENSORS: 'Temperatursensoren',
|
||||
WRITE_COMMAND: 'Befehl schreiben {cmd}',
|
||||
EMS_BUS_WARNING:
|
||||
@@ -128,7 +132,7 @@ const de: Translation = {
|
||||
RESTART_TEXT: 'EMS-ESP muss neu gestartet werden, um geänderte Systemeinstellungen zu übernehmen',
|
||||
COMMAND: 'Befehl',
|
||||
CUSTOMIZATIONS_RESTART: 'Alle Anpassungen wurden entfernt. Neustart...',
|
||||
CUSTOMIZATIONS_FULL: 'Ausgewählte Entitäten haben das Limit von 60 überschritten. Bitte stapelweise speichern',
|
||||
CUSTOMIZATIONS_FULL: 'Ausgewählte Entitäten haben das Limit überschritten. Bitte stapelweise speichern',
|
||||
CUSTOMIZATIONS_SAVED: 'Anpassungen gespeichert',
|
||||
CUSTOMIZATIONS_HELP_1: 'Wählen Sie ein Gerät aus und passen Sie die Entitäten mithilfe der Optionen an',
|
||||
CUSTOMIZATIONS_HELP_2: 'als Favorit markieren',
|
||||
@@ -253,7 +257,9 @@ const de: Translation = {
|
||||
NETWORK_ENABLE_IPV6: 'Aktiviere IPv6 Unterstützung',
|
||||
NETWORK_FIXED_IP: 'Feste IP Addresse',
|
||||
ADMIN: 'Administrator',
|
||||
GUEST: 'Gast'
|
||||
GUEST: 'Gast',
|
||||
NEW: 'Neu',
|
||||
RENAME: 'DE_Rename'
|
||||
};
|
||||
|
||||
export default de;
|
||||
|
||||
@@ -45,15 +45,19 @@ const en: BaseTranslation = {
|
||||
PROBLEM_UPDATING: 'Problem updating',
|
||||
PROBLEM_LOADING: 'Problem loading',
|
||||
ACCESS_DENIED: 'Access Denied',
|
||||
ANALOG_SENSOR: 'Analog Sensor{post}',
|
||||
ANALOG_SENSOR: 'Analog Sensor',
|
||||
ANALOG_SENSORS: 'Analog Sensors',
|
||||
UPDATED: 'Updated',
|
||||
UPDATE: 'Update',
|
||||
REMOVED: 'Removed',
|
||||
DELETION: 'Deletion',
|
||||
OFFSET: 'Offset',
|
||||
FACTOR: 'Factor',
|
||||
FREQ: 'Frequency',
|
||||
STARTVALUE: 'Start value',
|
||||
WARN_GPIO: 'Warning: be careful when assigning a GPIO!',
|
||||
EDIT: 'Edit',
|
||||
TEMP_SENSOR: 'Temperature Sensor{post}',
|
||||
TEMP_SENSOR: 'Temperature Sensor',
|
||||
TEMP_SENSORS: 'Temperature Sensors',
|
||||
WRITE_COMMAND: 'Write command {cmd}',
|
||||
EMS_BUS_WARNING:
|
||||
@@ -128,7 +132,7 @@ const en: BaseTranslation = {
|
||||
RESTART_TEXT: 'EMS-ESP needs to be restarted to apply changed system settings',
|
||||
COMMAND: 'Command',
|
||||
CUSTOMIZATIONS_RESTART: 'All customizations have been removed. Restarting...',
|
||||
CUSTOMIZATIONS_FULL: 'Selected entities exceeded limit of 60. Please Save in batches',
|
||||
CUSTOMIZATIONS_FULL: 'Selected entities exceeded limit. Please save in batches',
|
||||
CUSTOMIZATIONS_SAVED: 'Customizations saved',
|
||||
CUSTOMIZATIONS_HELP_1: 'Select a device and customize the entities using the options',
|
||||
CUSTOMIZATIONS_HELP_2: 'mark as favorite',
|
||||
@@ -254,7 +258,8 @@ const en: BaseTranslation = {
|
||||
NETWORK_FIXED_IP: 'Use Fixed IP address',
|
||||
ADMIN: 'Admin',
|
||||
GUEST: 'Guest',
|
||||
NEW: 'New'
|
||||
NEW: 'New',
|
||||
RENAME: 'Rename'
|
||||
};
|
||||
|
||||
export default en;
|
||||
|
||||
@@ -193,14 +193,29 @@ type RootTranslation = {
|
||||
*/
|
||||
ACCESS_DENIED: string
|
||||
/**
|
||||
* Analog Sensor{post}
|
||||
* @param {unknown} post
|
||||
* Analog Sensor
|
||||
*/
|
||||
ANALOG_SENSOR: RequiredParams<'post'>
|
||||
ANALOG_SENSOR: string
|
||||
/**
|
||||
* Analog Sensors
|
||||
*/
|
||||
ANALOG_SENSORS: string
|
||||
/**
|
||||
* Updated
|
||||
*/
|
||||
UPDATED: string
|
||||
/**
|
||||
* Update
|
||||
*/
|
||||
UPDATE: string
|
||||
/**
|
||||
* Removed
|
||||
*/
|
||||
REMOVED: string
|
||||
/**
|
||||
* Deletion
|
||||
*/
|
||||
DELETION: string
|
||||
/**
|
||||
* Offset
|
||||
*/
|
||||
@@ -226,10 +241,9 @@ type RootTranslation = {
|
||||
*/
|
||||
EDIT: string
|
||||
/**
|
||||
* Temperature Sensor{post}
|
||||
* @param {unknown} post
|
||||
* Temperature Sensor
|
||||
*/
|
||||
TEMP_SENSOR: RequiredParams<'post'>
|
||||
TEMP_SENSOR: string
|
||||
/**
|
||||
* Temperature Sensors
|
||||
*/
|
||||
@@ -521,7 +535,7 @@ type RootTranslation = {
|
||||
*/
|
||||
CUSTOMIZATIONS_RESTART: string
|
||||
/**
|
||||
* Selected entities exceeded limit of 60. Please Save in batches
|
||||
* Selected entities exceeded limit. Please save in batches
|
||||
*/
|
||||
CUSTOMIZATIONS_FULL: string
|
||||
/**
|
||||
@@ -1008,6 +1022,10 @@ type RootTranslation = {
|
||||
* New
|
||||
*/
|
||||
NEW: string
|
||||
/**
|
||||
* Rename
|
||||
*/
|
||||
RENAME: string
|
||||
}
|
||||
|
||||
export type TranslationFunctions = {
|
||||
@@ -1188,13 +1206,29 @@ export type TranslationFunctions = {
|
||||
*/
|
||||
ACCESS_DENIED: () => LocalizedString
|
||||
/**
|
||||
* Analog Sensor{post}
|
||||
* Analog Sensor
|
||||
*/
|
||||
ANALOG_SENSOR: (arg: { post: unknown }) => LocalizedString
|
||||
ANALOG_SENSOR: () => LocalizedString
|
||||
/**
|
||||
* Analog Sensors
|
||||
*/
|
||||
ANALOG_SENSORS: () => LocalizedString
|
||||
/**
|
||||
* Updated
|
||||
*/
|
||||
UPDATED: () => LocalizedString
|
||||
/**
|
||||
* Update
|
||||
*/
|
||||
UPDATE: () => LocalizedString
|
||||
/**
|
||||
* Removed
|
||||
*/
|
||||
REMOVED: () => LocalizedString
|
||||
/**
|
||||
* Deletion
|
||||
*/
|
||||
DELETION: () => LocalizedString
|
||||
/**
|
||||
* Offset
|
||||
*/
|
||||
@@ -1220,9 +1254,9 @@ export type TranslationFunctions = {
|
||||
*/
|
||||
EDIT: () => LocalizedString
|
||||
/**
|
||||
* Temperature Sensor{post}
|
||||
* Temperature Sensor
|
||||
*/
|
||||
TEMP_SENSOR: (arg: { post: unknown }) => LocalizedString
|
||||
TEMP_SENSOR: () => LocalizedString
|
||||
/**
|
||||
* Temperature Sensors
|
||||
*/
|
||||
@@ -1506,7 +1540,7 @@ export type TranslationFunctions = {
|
||||
*/
|
||||
CUSTOMIZATIONS_RESTART: () => LocalizedString
|
||||
/**
|
||||
* Selected entities exceeded limit of 60. Please Save in batches
|
||||
* Selected entities exceeded limit. Please save in batches
|
||||
*/
|
||||
CUSTOMIZATIONS_FULL: () => LocalizedString
|
||||
/**
|
||||
@@ -1993,6 +2027,10 @@ export type TranslationFunctions = {
|
||||
* New
|
||||
*/
|
||||
NEW: () => LocalizedString
|
||||
/**
|
||||
* Rename
|
||||
*/
|
||||
RENAME: () => LocalizedString
|
||||
}
|
||||
|
||||
export type Formatters = {}
|
||||
|
||||
@@ -44,15 +44,19 @@ const nl: BaseTranslation = {
|
||||
PROBLEM_UPDATING: 'Probleem met updaten',
|
||||
PROBLEM_LOADING: 'Probleem met laden',
|
||||
ACCESS_DENIED: 'Toegang geweigerd',
|
||||
ANALOG_SENSOR: 'Analoge sensor{post}',
|
||||
ANALOG_SENSOR: 'Analoge sensor',
|
||||
ANALOG_SENSORS: 'Analoge Sensoren',
|
||||
UPDATED: 'Bijgewerkt',
|
||||
UPDATE: 'Bijwerken',
|
||||
REMOVED: 'Verwijderd',
|
||||
DELETION: 'Verwijder',
|
||||
OFFSET: 'Offset',
|
||||
FACTOR: 'Factor',
|
||||
FREQ: 'Frequentie',
|
||||
STARTVALUE: 'Startwaarde',
|
||||
WARN_GPIO: 'Waarschuwing: let op met het koppelen van de juiste GPIO pin!',
|
||||
EDIT: 'Wijzigen',
|
||||
TEMP_SENSOR: 'Temperatuur sensor{post}',
|
||||
TEMP_SENSOR: 'Temperatuur sensor',
|
||||
TEMP_SENSORS: 'Temperatuur Sensoren',
|
||||
WRITE_COMMAND: 'Schrijf commando {cmd}',
|
||||
EMS_BUS_WARNING:
|
||||
@@ -127,7 +131,7 @@ const nl: BaseTranslation = {
|
||||
RESTART_TEXT: 'EMS-ESP dient opnieuw gestart te worden om de wijzingen toe te passen',
|
||||
COMMAND: 'Commando',
|
||||
CUSTOMIZATIONS_RESTART: 'Alle custom profielen worden verwijderd. Herstarten...',
|
||||
CUSTOMIZATIONS_FULL: 'Meer dan 60 entiteiten geselecteerd. Sla op in delen aub',
|
||||
CUSTOMIZATIONS_FULL: 'Te veel entiteiten geselecteerd. Sla op in delen aub',
|
||||
CUSTOMIZATIONS_SAVED: 'Custom aanpassingen opgeslagen',
|
||||
CUSTOMIZATIONS_HELP_1: 'Selecteer een apparaat en pas de entiteiten aan door middel van de opties',
|
||||
CUSTOMIZATIONS_HELP_2: 'Markeer as favoriet',
|
||||
@@ -254,7 +258,8 @@ const nl: BaseTranslation = {
|
||||
NETWORK_FIXED_IP: 'Gebruik vast IP addres',
|
||||
ADMIN: 'Admin',
|
||||
GUEST: 'Gast',
|
||||
NEW: 'Nieuwe'
|
||||
NEW: 'Nieuwe',
|
||||
RENAME: 'Hernoem'
|
||||
};
|
||||
|
||||
export default nl;
|
||||
|
||||
@@ -89,6 +89,7 @@ const DashboardData: FC = () => {
|
||||
active_sensors: 0,
|
||||
analog_enabled: false
|
||||
});
|
||||
|
||||
const [deviceData, setDeviceData] = useState<DeviceData>({ label: '', data: [] });
|
||||
const [sensorData, setSensorData] = useState<SensorData>({ sensors: [], analogs: [] });
|
||||
const [deviceValue, setDeviceValue] = useState<DeviceValue>();
|
||||
@@ -558,11 +559,11 @@ const DashboardData: FC = () => {
|
||||
offset: sensor.o
|
||||
});
|
||||
if (response.status === 204) {
|
||||
enqueueSnackbar(LL.TEMP_SENSOR({ post: ' change failed' }), { variant: 'error' });
|
||||
enqueueSnackbar(LL.TEMP_SENSOR() + ' ' + LL.UPLOAD_TEXT() + ' ' + LL.FAILED(), { variant: 'error' });
|
||||
} else if (response.status === 403) {
|
||||
enqueueSnackbar(LL.ACCESS_DENIED(), { variant: 'error' });
|
||||
} else {
|
||||
enqueueSnackbar(LL.TEMP_SENSOR({ post: ' removed' }), { variant: 'success' });
|
||||
enqueueSnackbar(LL.TEMP_SENSOR() + ' ' + LL.UPDATED(), { variant: 'success' });
|
||||
}
|
||||
setSensor(undefined);
|
||||
} catch (error: unknown) {
|
||||
@@ -578,7 +579,9 @@ const DashboardData: FC = () => {
|
||||
if (sensor) {
|
||||
return (
|
||||
<Dialog open={sensor !== undefined} onClose={() => setSensor(undefined)}>
|
||||
<DialogTitle>{LL.EDIT()} {LL.TEMP_SENSORS()}</DialogTitle>
|
||||
<DialogTitle>
|
||||
{LL.EDIT()} {LL.TEMP_SENSORS()}
|
||||
</DialogTitle>
|
||||
<DialogContent dividers>
|
||||
<Box color="warning.main" p={0} pl={0} pr={0} mt={0} mb={2}>
|
||||
<Typography variant="body2">Sensor ID {sensor.id}</Typography>
|
||||
@@ -983,11 +986,11 @@ const DashboardData: FC = () => {
|
||||
});
|
||||
|
||||
if (response.status === 204) {
|
||||
enqueueSnackbar(LL.ANALOG_SENSOR({ post: ' deletion failed' }), { variant: 'error' });
|
||||
enqueueSnackbar(LL.ANALOG_SENSOR() + ' ' + LL.DELETION() + ' ' + LL.FAILED(), { variant: 'error' });
|
||||
} else if (response.status === 403) {
|
||||
enqueueSnackbar(LL.ACCESS_DENIED(), { variant: 'error' });
|
||||
} else {
|
||||
enqueueSnackbar(LL.ANALOG_SENSOR({ post: ' removed' }), { variant: 'success' });
|
||||
enqueueSnackbar(LL.ANALOG_SENSOR() + ' ' + LL.REMOVED(), { variant: 'success' });
|
||||
}
|
||||
} catch (error: unknown) {
|
||||
enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_UPDATING()), { variant: 'error' });
|
||||
@@ -1011,11 +1014,11 @@ const DashboardData: FC = () => {
|
||||
});
|
||||
|
||||
if (response.status === 204) {
|
||||
enqueueSnackbar(LL.ANALOG_SENSOR({ post: ' update failed' }), { variant: 'error' });
|
||||
enqueueSnackbar(LL.ANALOG_SENSOR() + ' ' + LL.UPDATE() + ' ' + LL.FAILED(), { variant: 'error' });
|
||||
} else if (response.status === 403) {
|
||||
enqueueSnackbar(LL.ACCESS_DENIED(), { variant: 'error' });
|
||||
} else {
|
||||
enqueueSnackbar(LL.ANALOG_SENSOR({ post: ' updated' }), { variant: 'success' });
|
||||
enqueueSnackbar(LL.ANALOG_SENSOR() + ' ' + LL.UPDATED(), { variant: 'success' });
|
||||
}
|
||||
} catch (error: unknown) {
|
||||
enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_UPDATING()), { variant: 'error' });
|
||||
@@ -1030,7 +1033,9 @@ const DashboardData: FC = () => {
|
||||
if (analog) {
|
||||
return (
|
||||
<Dialog open={analog !== undefined} onClose={() => setAnalog(undefined)}>
|
||||
<DialogTitle>{LL.EDIT()} {LL.ANALOG_SENSORS()}</DialogTitle>
|
||||
<DialogTitle>
|
||||
{LL.EDIT()} {LL.ANALOG_SENSORS()}
|
||||
</DialogTitle>
|
||||
<DialogContent dividers>
|
||||
<Grid container spacing={2}>
|
||||
<Grid item>
|
||||
@@ -1055,7 +1060,13 @@ const DashboardData: FC = () => {
|
||||
/>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<ValidatedTextField name="t" label={LL.TYPE()} value={analog.t} select onChange={updateValue(setAnalog)}>
|
||||
<ValidatedTextField
|
||||
name="t"
|
||||
label={LL.TYPE()}
|
||||
value={analog.t}
|
||||
select
|
||||
onChange={updateValue(setAnalog)}
|
||||
>
|
||||
{AnalogTypeNames.map((val, i) => (
|
||||
<MenuItem key={i} value={i}>
|
||||
{val}
|
||||
|
||||
@@ -19,7 +19,6 @@ import {
|
||||
|
||||
import { Table } from '@table-library/react-table-library/table';
|
||||
import { useTheme } from '@table-library/react-table-library/theme';
|
||||
import { useSort, SortToggleType } from '@table-library/react-table-library/sort';
|
||||
import { Header, HeaderRow, HeaderCell, Body, Row, Cell } from '@table-library/react-table-library/table';
|
||||
|
||||
import { useSnackbar } from 'notistack';
|
||||
@@ -28,9 +27,6 @@ import SaveIcon from '@mui/icons-material/Save';
|
||||
import CancelIcon from '@mui/icons-material/Cancel';
|
||||
|
||||
import SettingsBackupRestoreIcon from '@mui/icons-material/SettingsBackupRestore';
|
||||
import KeyboardArrowUpOutlinedIcon from '@mui/icons-material/KeyboardArrowUpOutlined';
|
||||
import KeyboardArrowDownOutlinedIcon from '@mui/icons-material/KeyboardArrowDownOutlined';
|
||||
import UnfoldMoreOutlinedIcon from '@mui/icons-material/UnfoldMoreOutlined';
|
||||
import SearchIcon from '@mui/icons-material/Search';
|
||||
import FilterListIcon from '@mui/icons-material/FilterList';
|
||||
|
||||
@@ -53,17 +49,18 @@ const SettingsCustomization: FC = () => {
|
||||
|
||||
const { enqueueSnackbar } = useSnackbar();
|
||||
|
||||
const [deviceEntities, setDeviceEntities] = useState<DeviceEntity[]>([{ id: '', v: 0, n: '', m: 0, w: false }]);
|
||||
const emptyDeviceEntity = { id: '', v: 0, n: '', cn: '', m: 0, w: false };
|
||||
|
||||
const [deviceEntities, setDeviceEntities] = useState<DeviceEntity[]>([emptyDeviceEntity]);
|
||||
const [devices, setDevices] = useState<Devices>();
|
||||
const [errorMessage, setErrorMessage] = useState<string>();
|
||||
const [selectedDevice, setSelectedDevice] = useState<number>(-1);
|
||||
|
||||
const [selectedEntity, setSelectedEntity] = useState<DeviceEntity>();
|
||||
|
||||
const [confirmReset, setConfirmReset] = useState<boolean>(false);
|
||||
const [selectedFilters, setSelectedFilters] = useState<number>(0);
|
||||
const [search, setSearch] = useState('');
|
||||
|
||||
const [deviceEntity, setDeviceEntity] = useState<DeviceEntity>();
|
||||
|
||||
// eslint-disable-next-line
|
||||
const [masks, setMasks] = useState(() => ['']);
|
||||
|
||||
@@ -131,32 +128,6 @@ const SettingsCustomization: FC = () => {
|
||||
`
|
||||
});
|
||||
|
||||
const getSortIcon = (state: any, sortKey: any) => {
|
||||
if (state.sortKey === sortKey && state.reverse) {
|
||||
return <KeyboardArrowDownOutlinedIcon />;
|
||||
}
|
||||
if (state.sortKey === sortKey && !state.reverse) {
|
||||
return <KeyboardArrowUpOutlinedIcon />;
|
||||
}
|
||||
return <UnfoldMoreOutlinedIcon />;
|
||||
};
|
||||
|
||||
const entity_sort = useSort(
|
||||
{ nodes: deviceEntities },
|
||||
{},
|
||||
{
|
||||
sortIcon: {
|
||||
iconDefault: <UnfoldMoreOutlinedIcon />,
|
||||
iconUp: <KeyboardArrowUpOutlinedIcon />,
|
||||
iconDown: <KeyboardArrowDownOutlinedIcon />
|
||||
},
|
||||
sortToggleType: SortToggleType.AlternateWithReset,
|
||||
sortFns: {
|
||||
NAME: (array) => array.sort((a, b) => a.id.localeCompare(b.id))
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
const fetchDevices = useCallback(async () => {
|
||||
try {
|
||||
setDevices((await EMSESP.readDevices()).data);
|
||||
@@ -166,13 +137,13 @@ const SettingsCustomization: FC = () => {
|
||||
}, [LL]);
|
||||
|
||||
const setInitialMask = (data: DeviceEntity[]) => {
|
||||
setDeviceEntities(data.map((de) => ({ ...de, om: de.m })));
|
||||
setDeviceEntities(data.map((de) => ({ ...de, o_m: de.m, o_cn: de.cn })));
|
||||
};
|
||||
|
||||
const fetchDeviceEntities = async (unique_id: number) => {
|
||||
try {
|
||||
const data = (await EMSESP.readDeviceEntities({ id: unique_id })).data;
|
||||
setInitialMask(data);
|
||||
const new_deviceEntities = (await EMSESP.readDeviceEntities({ id: unique_id })).data;
|
||||
setInitialMask(new_deviceEntities);
|
||||
} catch (error: unknown) {
|
||||
setErrorMessage(extractErrorMessage(error, LL.PROBLEM_LOADING()));
|
||||
}
|
||||
@@ -196,12 +167,16 @@ const SettingsCustomization: FC = () => {
|
||||
function formatName(de: DeviceEntity) {
|
||||
if (de.n === undefined || de.n === de.id) {
|
||||
return de.id;
|
||||
} else if (de.n === '') {
|
||||
}
|
||||
|
||||
if (de.n === '') {
|
||||
return LL.COMMAND() + ': ' + de.id;
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
{de.n} (
|
||||
{de.cn !== undefined && de.cn !== '' ? de.cn : de.n}
|
||||
(
|
||||
<Link target="_blank" href={APIURL + devices?.devices[selectedDevice].t + '/' + de.id}>
|
||||
{de.id}
|
||||
</Link>
|
||||
@@ -274,10 +249,12 @@ const SettingsCustomization: FC = () => {
|
||||
const saveCustomization = async () => {
|
||||
if (devices && deviceEntities && selectedDevice !== -1) {
|
||||
const masked_entities = deviceEntities
|
||||
.filter((de) => de.m !== de.om)
|
||||
.map((new_de) => new_de.m.toString(16).padStart(2, '0') + new_de.id);
|
||||
.filter((de) => de.m !== de.o_m || de.cn !== de.o_cn)
|
||||
.map((new_de) => new_de.m.toString(16).padStart(2, '0') + new_de.id + (new_de.cn ? '|' + new_de.cn : ''));
|
||||
|
||||
if (masked_entities.length > 60) {
|
||||
// check size in bytes to match buffer in CPP, which is 4096
|
||||
const bytes = new TextEncoder().encode(JSON.stringify(masked_entities)).length;
|
||||
if (bytes > 4000) {
|
||||
enqueueSnackbar(LL.CUSTOMIZATIONS_FULL(), { variant: 'warning' });
|
||||
return;
|
||||
}
|
||||
@@ -339,16 +316,26 @@ const SettingsCustomization: FC = () => {
|
||||
};
|
||||
|
||||
const editEntity = (de: DeviceEntity) => {
|
||||
if (de.n) {
|
||||
setSelectedEntity(de);
|
||||
console.log(de.n); // TODO
|
||||
if (de.cn === undefined) {
|
||||
de.cn = '';
|
||||
}
|
||||
setDeviceEntity(de);
|
||||
};
|
||||
|
||||
const updateEntity = () => {
|
||||
if (selectedEntity) {
|
||||
setSelectedEntity(undefined); // TODO
|
||||
if (deviceEntity) {
|
||||
setDeviceEntities((prevState) => {
|
||||
const newState = prevState.map((obj) => {
|
||||
if (obj.id === deviceEntity.id) {
|
||||
return { ...obj, cn: deviceEntity.cn };
|
||||
}
|
||||
return obj;
|
||||
});
|
||||
return newState;
|
||||
});
|
||||
}
|
||||
|
||||
setDeviceEntity(undefined);
|
||||
};
|
||||
|
||||
const renderDeviceData = () => {
|
||||
@@ -445,19 +432,14 @@ const SettingsCustomization: FC = () => {
|
||||
</Tooltip>
|
||||
</Grid>
|
||||
</Grid>
|
||||
<Table data={{ nodes: shown_data }} theme={entities_theme} sort={entity_sort} layout={{ custom: true }}>
|
||||
<Table data={{ nodes: shown_data }} theme={entities_theme} layout={{ custom: true }}>
|
||||
{(tableList: any) => (
|
||||
<>
|
||||
<Header>
|
||||
<HeaderRow>
|
||||
<HeaderCell stiff>{LL.OPTIONS()}</HeaderCell>
|
||||
<HeaderCell resize>
|
||||
<Button
|
||||
fullWidth
|
||||
style={{ fontSize: '14px', justifyContent: 'flex-start' }}
|
||||
endIcon={getSortIcon(entity_sort.state, 'NAME')}
|
||||
onClick={() => entity_sort.fns.onToggleSort({ sortKey: 'NAME' })}
|
||||
>
|
||||
<Button fullWidth style={{ fontSize: '14px', justifyContent: 'flex-start' }}>
|
||||
{LL.NAME()}
|
||||
</Button>
|
||||
</HeaderCell>
|
||||
@@ -576,24 +558,24 @@ const SettingsCustomization: FC = () => {
|
||||
);
|
||||
};
|
||||
|
||||
const renderEditEntity = () => {
|
||||
if (selectedEntity) {
|
||||
return (
|
||||
<Dialog open={selectedEntity !== undefined} onClose={() => setSelectedEntity(undefined)}>
|
||||
<DialogTitle>Rename Entity</DialogTitle>
|
||||
const renderEditEntity = () => (
|
||||
<Dialog open={!!deviceEntity} onClose={() => setDeviceEntity(undefined)}>
|
||||
{deviceEntity && (
|
||||
<>
|
||||
<DialogTitle>{LL.RENAME() + ' ' + LL.ENTITY_NAME()}</DialogTitle>
|
||||
<DialogContent dividers>
|
||||
<Box color="warning.main" p={0} pl={0} pr={0} mt={0} mb={2}>
|
||||
<Typography variant="body2">{selectedEntity.n}</Typography>
|
||||
<Typography variant="body2">{deviceEntity.n}</Typography>
|
||||
</Box>
|
||||
<Grid container spacing={1}>
|
||||
<Grid item>
|
||||
<ValidatedTextField
|
||||
<TextField
|
||||
name="cn"
|
||||
label={LL.NEW() + ' ' + LL.ENTITY_NAME()}
|
||||
value={selectedEntity.cn}
|
||||
value={deviceEntity.cn}
|
||||
autoFocus
|
||||
sx={{ width: '30ch' }}
|
||||
onChange={updateValue(setSelectedEntity)}
|
||||
onChange={updateValue(setDeviceEntity)}
|
||||
/>
|
||||
</Grid>
|
||||
</Grid>
|
||||
@@ -602,7 +584,7 @@ const SettingsCustomization: FC = () => {
|
||||
<Button
|
||||
startIcon={<CancelIcon />}
|
||||
variant="outlined"
|
||||
onClick={() => setSelectedEntity(undefined)}
|
||||
onClick={() => setDeviceEntity(undefined)}
|
||||
color="secondary"
|
||||
>
|
||||
{LL.CANCEL()}
|
||||
@@ -617,10 +599,10 @@ const SettingsCustomization: FC = () => {
|
||||
{LL.SAVE()}
|
||||
</Button>
|
||||
</DialogActions>
|
||||
</Dialog>
|
||||
);
|
||||
}
|
||||
};
|
||||
</>
|
||||
)}
|
||||
</Dialog>
|
||||
);
|
||||
|
||||
return (
|
||||
<SectionContent title={LL.USER_CUSTOMIZATION()} titleGutter>
|
||||
|
||||
@@ -139,7 +139,8 @@ export interface DeviceEntity {
|
||||
n?: string; // fullname, optional
|
||||
cn?: string; // custom fullname, optional
|
||||
m: number; // mask
|
||||
om?: number; // original mask before edits
|
||||
o_m?: number; // original mask before edits
|
||||
o_cn?: string; // original cn before edits
|
||||
w: boolean; // writeable
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user