Show a warning when a customization reset clears min/max until restart

This commit is contained in:
proddy
2026-10-13 19:52:55 +02:00
parent bbacd7021a
commit 6a0e8ebc48
15 changed files with 90 additions and 28 deletions
+21 -6
View File
@@ -23,6 +23,7 @@ import {
TextField,
ToggleButton,
ToggleButtonGroup,
Tooltip,
Typography
} from '@mui/material';
@@ -292,6 +293,17 @@ const Customizations = () => {
return value as string;
}
function formatLimit(value: number | null | undefined) {
if (value === null) {
return (
<Tooltip title={LL.CUSTOMIZATIONS_LIMITS()}>
<WarningIcon color="warning" sx={{ fontSize: 16 }} />
</Tooltip>
);
}
return formatValue(value);
}
const isCommand = (de: DeviceEntity) => {
return de.n && de.n[0] === '!';
};
@@ -385,10 +397,13 @@ const Customizations = () => {
if (!selectedIds.has(de.id)) {
return de;
}
const next: DeviceEntity = { ...de, m: 0, c: false };
delete next.cn;
delete next.mi;
delete next.ma;
const next: DeviceEntity = { ...de, m: 0, cn: '', c: false };
if (de.mi !== undefined) {
next.mi = null;
}
if (de.ma !== undefined) {
next.ma = null;
}
return next;
})
);
@@ -829,10 +844,10 @@ const Customizations = () => {
</span>
</Cell>
<Cell>
{!(de.m & DeviceEntityMask.DV_READONLY) && formatValue(de.mi)}
{!(de.m & DeviceEntityMask.DV_READONLY) && formatLimit(de.mi)}
</Cell>
<Cell>
{!(de.m & DeviceEntityMask.DV_READONLY) && formatValue(de.ma)}
{!(de.m & DeviceEntityMask.DV_READONLY) && formatLimit(de.ma)}
</Cell>
<Cell>{formatValue(de.v)}</Cell>
</Row>
+37 -14
View File
@@ -4,6 +4,7 @@ import CancelIcon from '@mui/icons-material/Cancel';
import CloseIcon from '@mui/icons-material/Close';
import DoneIcon from '@mui/icons-material/Done';
import SettingsBackupRestoreIcon from '@mui/icons-material/SettingsBackupRestore';
import WarningIcon from '@mui/icons-material/Warning';
import {
Box,
Button,
@@ -12,7 +13,9 @@ import {
DialogContent,
DialogTitle,
Grid,
InputAdornment,
TextField,
Tooltip,
Typography
} from '@mui/material';
@@ -103,13 +106,25 @@ const CustomizationsDialog = ({
};
const remove = () => {
const next: DeviceEntity = { ...editItem, m: 0, c: false };
delete next.cn;
delete next.mi;
delete next.ma;
const next: DeviceEntity = { ...editItem, m: 0, cn: '', c: false };
if (editItem.mi !== undefined) {
next.mi = null;
}
if (editItem.ma !== undefined) {
next.ma = null;
}
onSave(next);
};
const limitAdornment = (cleared: boolean) =>
cleared ? (
<InputAdornment position="end">
<Tooltip title={LL.CUSTOMIZATIONS_LIMITS()}>
<WarningIcon color="warning" sx={{ fontSize: 16 }} />
</Tooltip>
</InputAdornment>
) : undefined;
return (
<Dialog sx={dialogStyle} open={open} onClose={handleClose}>
<DialogTitle>{`${LL.EDIT()} ${LL.ENTITY()}`}</DialogTitle>
@@ -150,20 +165,26 @@ const CustomizationsDialog = ({
<TextField
name="mi"
label={LL.MIN()}
value={numberValue(editItem.mi)}
value={typeof editItem.mi === 'number' ? numberValue(editItem.mi) : ''}
sx={{ width: '11ch' }}
type="number"
onChange={updateFormValue}
slotProps={{
input: { endAdornment: limitAdornment(editItem.mi === null) }
}}
/>
</Grid>
<Grid>
<TextField
name="ma"
label={LL.MAX()}
value={numberValue(editItem.ma)}
value={typeof editItem.ma === 'number' ? numberValue(editItem.ma) : ''}
sx={{ width: '11ch' }}
type="number"
onChange={updateFormValue}
slotProps={{
input: { endAdornment: limitAdornment(editItem.ma === null) }
}}
/>
</Grid>
</>
@@ -178,14 +199,16 @@ const CustomizationsDialog = ({
</DialogContent>
<DialogActions>
<Button
startIcon={<SettingsBackupRestoreIcon />}
variant="outlined"
onClick={remove}
color="error"
>
{LL.REMOVE()}
</Button>
{editItem.c && (
<Button
startIcon={<SettingsBackupRestoreIcon />}
variant="outlined"
onClick={remove}
color="error"
>
{LL.RESET()}
</Button>
)}
<Box sx={{ flexGrow: 1 }} />
<Button
startIcon={<CancelIcon />}
+2 -2
View File
@@ -172,8 +172,8 @@ export interface DeviceEntity {
t?: string; // tag for name
m: DeviceEntityMask; // mask
w: boolean; // writeable
mi?: number; // min value
ma?: number; // max value
mi?: number | null; // min value; null means cleared and the original returns after restart
ma?: number | null; // max value; null means cleared and the original returns after restart
c?: boolean; // true when a customization is saved (mask, name, or min/max)
o_m?: number; // original mask before edits
o_cn?: string; // original cn before edits
+2
View File
@@ -42,6 +42,7 @@ const cs: Translation = {
APPLY_CHANGES: 'Použít změny ({0})',
UPDATE: 'Aktualizovat',
REMOVE: 'Odebrat',
RESET: 'Obnovit',
PROBLEM_UPDATING: 'Problém s aktualizací',
PROBLEM_LOADING: 'Problém s načítáním',
ANALOG_SENSOR: 'Analogový senzor',
@@ -133,6 +134,7 @@ const cs: Translation = {
CUSTOMIZATIONS_RESTART: 'Všechna přizpůsobení byla odstraněna. Restartování...',
CUSTOMIZATIONS_FULL: 'Vybrané entity překročily limit. Ukládejte je postupně',
CUSTOMIZATIONS_SAVED: 'Přizpůsobení uloženo',
CUSTOMIZATIONS_LIMITS: 'Původní limity se vrátí po restartu',
CUSTOMIZATIONS_HELP_1: 'Vyberte zařízení a přizpůsobte možnosti entit nebo klikněte pro přejmenování',
CUSTOMIZATIONS_HELP_2: 'označit jako oblíbené',
CUSTOMIZATIONS_HELP_3: 'zakázat akci zápisu',
+2
View File
@@ -42,6 +42,7 @@ const de: Translation = {
APPLY_CHANGES: 'Änderungen anwenden ({0})',
UPDATE: 'Aktualisieren',
REMOVE: 'Entfernen',
RESET: 'Zurücksetzen',
PROBLEM_UPDATING: 'Problem beim Aktualisieren',
PROBLEM_LOADING: 'Problem beim Laden',
ANALOG_SENSOR: 'Analogsensor',
@@ -133,6 +134,7 @@ const de: Translation = {
CUSTOMIZATIONS_RESTART: 'Alle Anpassungen wurden entfernt. Neustart...',
CUSTOMIZATIONS_FULL: 'Ausgewählte Entitäten haben das Limit überschritten. Bitte stapelweise speichern!',
CUSTOMIZATIONS_SAVED: 'Anpassungen gespeichert',
CUSTOMIZATIONS_LIMITS: 'Originalgrenzen gelten nach einem Neustart',
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',
CUSTOMIZATIONS_HELP_3: 'Schreibaktion deaktivieren',
+2
View File
@@ -42,6 +42,7 @@ const en: Translation = {
APPLY_CHANGES: 'Apply Changes ({0})',
UPDATE: 'Update',
REMOVE: 'Remove',
RESET: 'Reset',
PROBLEM_UPDATING: 'Problem updating',
PROBLEM_LOADING: 'Problem loading',
ANALOG_SENSOR: 'Analog Sensor',
@@ -133,6 +134,7 @@ const en: Translation = {
CUSTOMIZATIONS_RESTART: 'All customizations have been removed. Restarting...',
CUSTOMIZATIONS_FULL: 'Selected entities exceeded limit. Please save in batches',
CUSTOMIZATIONS_SAVED: 'Customizations saved',
CUSTOMIZATIONS_LIMITS: 'Original limits return after restart',
CUSTOMIZATIONS_HELP_1: 'Select a device and customize the entities options',
CUSTOMIZATIONS_HELP_2: 'mark as favorite',
CUSTOMIZATIONS_HELP_3: 'disable write action',
+2
View File
@@ -42,6 +42,7 @@ const fr: Translation = {
APPLY_CHANGES: 'Appliquer les changements ({0})',
UPDATE: 'Update',
REMOVE: 'Enlever',
RESET: 'Réinitialiser',
PROBLEM_UPDATING: 'Problème lors de la mise à jour',
PROBLEM_LOADING: 'Problème lors du chargement',
ANALOG_SENSOR: 'Capteur analogique',
@@ -133,6 +134,7 @@ const fr: Translation = {
CUSTOMIZATIONS_RESTART: 'Toutes les personnalisations ont été supprimées. Redémarrage...',
CUSTOMIZATIONS_FULL: 'Les entités sélectionnées ont dépassé la limite. Veuillez sauvegarder par lots',
CUSTOMIZATIONS_SAVED: 'Personnalisations enregistrées',
CUSTOMIZATIONS_LIMITS: "Les limites d'origine reviennent après redémarrage",
CUSTOMIZATIONS_HELP_1: 'Sélectionnez un appareil et personnalisez les options des entités ou cliquez pour renommer',
CUSTOMIZATIONS_HELP_2: 'marquer comme favori',
CUSTOMIZATIONS_HELP_3: "désactiver l'action d'écriture",
+2
View File
@@ -42,6 +42,7 @@ const it: Translation = {
APPLY_CHANGES: 'Applica Cambiamenti ({0})',
UPDATE: 'Update',
REMOVE: 'Elimina',
RESET: 'Reimposta',
PROBLEM_UPDATING: 'Problema aggiornamento',
PROBLEM_LOADING: 'Problema caricamento',
ANALOG_SENSOR: 'Sensore Analogico',
@@ -133,6 +134,7 @@ const it: Translation = {
CUSTOMIZATIONS_RESTART: 'Tutte le personalizzazioni sono state rimosse. Riavvio ...',
CUSTOMIZATIONS_FULL: 'Le entità selezionate hanno superato il limite. Si prega di salvare in batch',
CUSTOMIZATIONS_SAVED: 'Personalizzazioni salvate',
CUSTOMIZATIONS_LIMITS: 'I limiti originali tornano dopo il riavvio',
CUSTOMIZATIONS_HELP_1: 'Seleziona un dispositivo e personalizza le opzioni delle entità o fai clic per rinominarlo',
CUSTOMIZATIONS_HELP_2: 'seleziona come preferito',
CUSTOMIZATIONS_HELP_3: 'disabilita azione scrittura',
+2
View File
@@ -42,6 +42,7 @@ const nl: Translation = {
APPLY_CHANGES: 'Aanpassen ({0})',
UPDATE: 'Update',
REMOVE: 'Verwijderen',
RESET: 'Resetten',
PROBLEM_UPDATING: 'Probleem met updaten',
PROBLEM_LOADING: 'Probleem met laden',
ANALOG_SENSOR: 'Analoge sensor',
@@ -133,6 +134,7 @@ const nl: Translation = {
CUSTOMIZATIONS_RESTART: 'Alle custom profielen worden verwijderd. Herstarten...',
CUSTOMIZATIONS_FULL: 'Te veel entiteiten geselecteerd. Sla op in delen aub',
CUSTOMIZATIONS_SAVED: 'Custom aanpassingen opgeslagen',
CUSTOMIZATIONS_LIMITS: 'Originele limieten gelden na herstart',
CUSTOMIZATIONS_HELP_1: 'Selecteer een apparaat en pas de entiteiten aan door middel van de opties',
CUSTOMIZATIONS_HELP_2: 'Markeer als favoriet',
CUSTOMIZATIONS_HELP_3: 'Zet schrijfacties uit',
+2
View File
@@ -42,6 +42,7 @@ const no: Translation = {
APPLY_CHANGES: 'Utfør endringer({0})',
UPDATE: 'Oppdater',
REMOVE: 'Fjern',
RESET: 'Tilbakestill',
PROBLEM_UPDATING: 'Problem med oppdatering',
PROBLEM_LOADING: 'Problem med opplasting',
ANALOG_SENSOR: 'Analog Sensor',
@@ -133,6 +134,7 @@ const no: Translation = {
CUSTOMIZATIONS_RESTART: 'Alle tilpasninger har blitt slettet. Restarter...',
CUSTOMIZATIONS_FULL: 'Antall valgte objekter for høyt. Largre i mindre antall om gangen',
CUSTOMIZATIONS_SAVED: 'Tilpasninger lagret',
CUSTOMIZATIONS_LIMITS: 'Opprinnelige grenser gjelder etter omstart',
CUSTOMIZATIONS_HELP_1: 'Velg en enhet og tilpass underenheter med hjelp av alternativer eller velg å gi nytt navn',
CUSTOMIZATIONS_HELP_2: 'merk som favoritt',
CUSTOMIZATIONS_HELP_3: 'inaktiviser skriving',
+2
View File
@@ -42,6 +42,7 @@ const pl: BaseTranslation = {
APPLY_CHANGES: 'Zapisz zmiany ({0})',
UPDATE: 'Zmień',
REMOVE: 'Usuń',
RESET: 'Resetuj',
PROBLEM_UPDATING: 'Problem z uaktualnieniem!',
PROBLEM_LOADING: 'Problem z załadowaniem!',
ANALOG_SENSOR: '{{u|u||ustawienia u|ustawień u}}rządzeni{{a podłączonego do EMS-ESP|e||a podłączonego do EMS-ESP|a podłączonego do EMS-ESP}}',
@@ -133,6 +134,7 @@ const pl: BaseTranslation = {
CUSTOMIZATIONS_RESTART: 'Wszystkie personalizacje zostały usunięte. Restartuję...',
CUSTOMIZATIONS_FULL: 'Wybrano za dużo obiektów. Wprowadzaj zmiany w mniejszych partiach.',
CUSTOMIZATIONS_SAVED: 'Personalizacje zostały zapisane.',
CUSTOMIZATIONS_LIMITS: 'Oryginalne limity wrócą po restarcie',
CUSTOMIZATIONS_HELP_1: 'Wybierz urządzenie EMS, a następnie dostosuj opcje lub kliknij na nazwie encji by tę nazwę zmienić',
CUSTOMIZATIONS_HELP_2: 'oznacz jako ulubioną',
CUSTOMIZATIONS_HELP_3: 'zablokuj akcje zapisu',
+2
View File
@@ -42,6 +42,7 @@ const sk: Translation = {
APPLY_CHANGES: 'Aplikovať zmeny ({0})',
UPDATE: 'Aktualizovať',
REMOVE: 'Odstrániť',
RESET: 'Obnoviť',
PROBLEM_UPDATING: 'Problém s aktualizáciou',
PROBLEM_LOADING: 'Problém s načítaním',
ANALOG_SENSOR: 'Analógový snímač',
@@ -133,6 +134,7 @@ const sk: Translation = {
CUSTOMIZATIONS_RESTART: 'Ste si istí, že chcete reštartovať EMS-ESP?',
CUSTOMIZATIONS_FULL: 'Vybrané subjekty prekročili limit. Prosím, ukladajte v dávkach',
CUSTOMIZATIONS_SAVED: 'Uložené prispôsobenia',
CUSTOMIZATIONS_LIMITS: 'Pôvodné limity sa vrátia po reštarte',
CUSTOMIZATIONS_HELP_1: 'Vyberte zariadenie a prispôsobte možnosti entít alebo kliknutím premenujte',
CUSTOMIZATIONS_HELP_2: 'označiť ako obľúbené',
CUSTOMIZATIONS_HELP_3: 'zakázať akciu zápisu',
+2
View File
@@ -42,6 +42,7 @@ const sv: Translation = {
APPLY_CHANGES: 'Utför ändringar ({0})',
UPDATE: 'Uppdatera',
REMOVE: 'Ta bort',
RESET: 'Återställ',
PROBLEM_UPDATING: 'Problem vid uppdatering',
PROBLEM_LOADING: 'Problem vid hämtning',
ANALOG_SENSOR: 'analog sensor',
@@ -133,6 +134,7 @@ const sv: Translation = {
CUSTOMIZATIONS_RESTART: 'Alla anpassningar har raderats. Startar om...',
CUSTOMIZATIONS_FULL: 'För många valda enheter. Vänligen spara ett mindre antal åt gången.',
CUSTOMIZATIONS_SAVED: 'Anpassningarna är sparade',
CUSTOMIZATIONS_LIMITS: 'Originalgränserna gäller efter omstart',
CUSTOMIZATIONS_HELP_1: 'Välj en enhet och anpassa entiteter med hjälp av alternativen',
CUSTOMIZATIONS_HELP_2: 'Favorit',
CUSTOMIZATIONS_HELP_3: 'Skrivskyddad',
+2
View File
@@ -42,6 +42,7 @@ const tr: Translation = {
APPLY_CHANGES: 'Değişiklikleri Uygula ({0})',
UPDATE: 'Update',
REMOVE: 'Kaldır',
RESET: 'Sıfırla',
PROBLEM_UPDATING: 'Güncelleme Sorunu',
PROBLEM_LOADING: 'Yükleme Sorunu',
ANALOG_SENSOR: 'Analog Sensör',
@@ -133,6 +134,7 @@ const tr: Translation = {
CUSTOMIZATIONS_RESTART: 'Bütün özelleştirmeler kaldırıldı. Yeniden başlatılıyor...',
CUSTOMIZATIONS_FULL: 'Seçilen varlıklar sınırı aşmaktadır. Lütfen parçalar halinde kaydedin',
CUSTOMIZATIONS_SAVED: 'Özelleştirmeler kaydedildi',
CUSTOMIZATIONS_LIMITS: 'Orijinal sınırlar yeniden başlatınca döner',
CUSTOMIZATIONS_HELP_1: 'Bir cihaz seçip varlıkların seçeneklerini özelleştirin veya yeniden adlandırmak için tıklayın',
CUSTOMIZATIONS_HELP_2: 'favori olarak işaretle',
CUSTOMIZATIONS_HELP_3: 'yazma işlemini devre dışı bırak',
+8 -6
View File
@@ -4444,6 +4444,8 @@ const emsesp_deviceentities_4 = [
n: 'hc2 selected room temperature',
id: 'hc2/seltemp',
m: 8,
mi: 5,
ma: 30,
w: true
},
{
@@ -4466,8 +4468,8 @@ const emsesp_deviceentities_7 = [
{ u: 0, n: '!reset', id: 'reset', m: 8, w: false },
{ v: false, n: 'heating active', id: 'heatingactive', m: 8, w: false },
{ v: false, n: 'tapwater active', id: 'tapwateractive', m: 4, w: false },
{ v: 5, n: 'selected flow temperature', id: 'selflowtemp', m: 4, w: true },
{ v: 0, n: 'burner selected max power', id: 'selburnpow', m: 14, w: true },
{ v: 5, n: 'selected flow temperature', id: 'selflowtemp', m: 8, mi: 0, ma: 90, c: true, w: true },
{ v: 0, n: 'burner selected max power', id: 'selburnpow', m: 14, mi: 0, ma: 100, w: true },
{ v: 0, n: 'heating pump modulation', id: 'heatingpumpmod', m: 0, w: false },
{ n: 'heating pump 2 modulation', id: 'heatingpump2mod', m: 0, w: false },
{ n: 'outside temperature', id: 'outdoortemp', m: 0, w: false },
@@ -4485,16 +4487,16 @@ const emsesp_deviceentities_7 = [
{ v: false, n: 'ignition', id: 'ignwork', m: 0, w: false },
{ v: false, n: 'oil preheating', id: 'oilpreheat', m: 0, w: false },
{ v: true, n: 'heating activated', id: 'heatingactivated', m: 0, w: false },
{ v: 80, n: 'heating temperature', id: 'heatingtemp', m: 0, w: false },
{ v: 70, n: 'burner pump max power', id: 'pumpmodmax', m: 0, w: false },
{ v: 80, n: 'heating temperature', id: 'heatingtemp', m: 0, mi: 30, ma: 82, w: true },
{ v: 70, n: 'burner pump max power', id: 'pumpmodmax', m: 0, mi: 10, ma: 100, w: true },
{ v: 30, n: 'burner pump min power', id: 'pumpmodmin', m: 0, w: false },
{ v: 1, n: 'pump delay', id: 'pumpdelay', m: 0, w: false },
{ v: 10, n: 'burner min period', id: 'burnminperiod', m: 0, w: false },
{ v: 0, n: 'burner min power', id: 'burnminpower', m: 0, w: false },
{ v: 50, n: 'burner max power', id: 'burnmaxpower', m: 0, w: false },
{ v: 50, n: 'burner max power', id: 'burnmaxpower', m: 0, mi: 0, ma: 100, w: true },
{ v: -6, n: 'hysteresis on temperature', id: 'boilhyston', m: 0, w: false },
{ v: 6, n: 'hysteresis off temperature', id: 'boilhystoff', m: 0, w: false },
{ v: 0, n: 'set flow temperature', id: 'setflowtemp', m: 0, w: true },
{ v: 0, n: 'set flow temperature', id: 'setflowtemp', m: 0, mi: 0, ma: 90, w: true },
{ v: 0, n: 'burner set power', id: 'setburnpow', m: 0, w: false },
{ v: 0, n: 'burner current power', id: 'curburnpow', m: 0, w: false },
{ v: 326323, n: 'burner starts', id: 'burnstarts', m: 0, w: false },