iobroker.eos-admin 7.9.40 → 7.9.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,6 +14,7 @@
14
14
  const LOGO = asset('img/eos/nexowatt-192.png');
15
15
  const PNG_LOGO = asset('img/eos/nexowatt-192.png');
16
16
  const LOGIN_MOTTO = EOS_MEANING;
17
+ const CORE_PROTECTED_ADAPTERS = ['admin', 'eos-admin', 'backitup', 'nexowatt-devices', 'nexowatt-device', 'nexowatt-dev', 'nexowatt-ui'];
17
18
 
18
19
  const TEXT_REPLACEMENTS = [
19
20
  [/NexoWatt\s+Energy\s+Management\s+System/gi, BRAND],
@@ -132,7 +133,7 @@
132
133
  isAdmin: false,
133
134
  hideLegacyAdminForNonAdmins: true,
134
135
  restrictProtectedAdapterControls: true,
135
- protectedAdapters: ['eos-admin', 'backitup'],
136
+ protectedAdapters: CORE_PROTECTED_ADAPTERS,
136
137
  },
137
138
  securityFetchStarted: false,
138
139
  assistOpen: false,
@@ -307,7 +308,7 @@
307
308
  ];
308
309
 
309
310
  const normalizeSecurityPolicy = policy => {
310
- const protectedAdapters = new Set(['eos-admin', 'backitup']);
311
+ const protectedAdapters = new Set(CORE_PROTECTED_ADAPTERS);
311
312
  (Array.isArray(policy?.protectedAdapters) ? policy.protectedAdapters : []).forEach(item => {
312
313
  const adapter = typeof item === 'string' ? normalizeIdentifier(item) : normalizeIdentifier(item?.adapter || item?.name);
313
314
  if (adapter) protectedAdapters.add(adapter);
@@ -348,7 +349,7 @@
348
349
  // Security endpoint may be unavailable during login or old cache. Fallback below.
349
350
  }
350
351
  }
351
- state.securityPolicy = normalizeSecurityPolicy({ isAdmin: false, protectedAdapters: ['eos-admin', 'backitup'] });
352
+ state.securityPolicy = normalizeSecurityPolicy({ isAdmin: false, protectedAdapters: CORE_PROTECTED_ADAPTERS });
352
353
  applySecurityClasses();
353
354
  scheduleFullPatch(0);
354
355
  };
@@ -403,7 +404,7 @@
403
404
  if (!isDeleteControl(control)) return;
404
405
  control.classList.add('eos-protected-delete-control');
405
406
  control.setAttribute('aria-disabled', 'true');
406
- control.setAttribute('title', 'Nur Administratoren dürfen geschützte EOS-Systemmodule löschen');
407
+ control.setAttribute('title', 'Geschütztes EOS-Systemmodul darf nicht gelöscht werden');
407
408
  if ('disabled' in control) control.disabled = true;
408
409
  control.addEventListener('click', event => {
409
410
  event.preventDefault();
@@ -459,7 +460,7 @@
459
460
  });
460
461
 
461
462
  const protectDeleteDialogs = () => {
462
- if (isAdminUser() || state.securityPolicy.restrictProtectedAdapterControls === false) return;
463
+ if (state.securityPolicy.restrictProtectedAdapterControls === false) return;
463
464
  const protectedAdapters = state.securityPolicy.protectedAdapters || [];
464
465
  Array.from(document.querySelectorAll('.MuiDialog-paper, [role="dialog"]')).forEach(dialog => {
465
466
  const text = textOfElement(dialog);
@@ -526,17 +527,15 @@
526
527
  // Adapter UIs must remain 100% functional; backend/role checks still protect EOS actions.
527
528
  if (isAdapterConfigSurface()) return;
528
529
  if (!policy.loaded) return;
529
- if (isAdminUser()) {
530
- document.querySelectorAll('.eos-hidden-legacy-admin, .eos-protected-adapter-row').forEach(el => {
531
- el.classList.remove('eos-hidden-legacy-admin', 'eos-protected-adapter-row');
532
- el.removeAttribute('aria-hidden');
533
- });
534
- return;
535
- }
530
+
531
+ document.querySelectorAll('.eos-hidden-legacy-admin, .eos-protected-adapter-row').forEach(el => {
532
+ el.classList.remove('eos-hidden-legacy-admin', 'eos-protected-adapter-row');
533
+ el.removeAttribute('aria-hidden');
534
+ });
536
535
 
537
536
  const containers = getSecurityContainers();
538
537
  containers.forEach(container => {
539
- if (policy.hideLegacyAdminForNonAdmins !== false && isLegacyAdminContainer(container)) {
538
+ if (!isAdminUser() && policy.hideLegacyAdminForNonAdmins !== false && isLegacyAdminContainer(container)) {
540
539
  container.classList.add('eos-hidden-legacy-admin');
541
540
  container.setAttribute('aria-hidden', 'true');
542
541
  return;
@@ -1,7 +1,7 @@
1
1
  (() => {
2
2
  'use strict';
3
3
 
4
- window.NEXOWATT_EOS_OBJECTS_STATE_TOOLS_VERSION = 'v39-object-state-tools';
4
+ window.NEXOWATT_EOS_OBJECTS_STATE_TOOLS_VERSION = 'v42-force-version-delete-dp-fix';
5
5
 
6
6
  const ACTIVE_CLASS = 'eos-objects-surface';
7
7
  const safe = fn => { try { return fn(); } catch (e) { return undefined; } };
@@ -86,16 +86,19 @@
86
86
  if (!setSurfaceState()) return;
87
87
  const base = root && root.nodeType ? root : document;
88
88
  const cells = [];
89
- if (base.nodeType === Node.ELEMENT_NODE && base.matches?.('.eos-object-value-cell')) cells.push(base);
90
- cells.push(...Array.from(base.querySelectorAll?.('.eos-object-value-cell') || []));
89
+ const valueCellSelector = '.eos-object-value-cell,[data-eos-object-value-cell],[title*="Wert schreiben"],[title*="Button sofort testen"]';
90
+ if (base.nodeType === Node.ELEMENT_NODE && base.matches?.(valueCellSelector)) cells.push(base);
91
+ cells.push(...Array.from(base.querySelectorAll?.(valueCellSelector) || []));
91
92
  cells.forEach(cell => {
92
- const id = cell.getAttribute('data-eos-object-value-cell') || '';
93
- const writable = cell.getAttribute('data-eos-object-writable') === '1';
93
+ const id = cell.getAttribute('data-eos-object-value-cell') || cell.closest?.('[id]')?.getAttribute('id') || '';
94
+ const title = cell.getAttribute('title') || '';
95
+ const writable = cell.getAttribute('data-eos-object-writable') === '1' || /Wert schreiben|Button sofort testen/i.test(title);
94
96
  const visibleValue = (cell.textContent || '').trim().replace(/\s+/g, ' ') || '(leer)';
95
97
  cell.style.pointerEvents = 'auto';
96
98
  cell.style.cursor = writable ? 'pointer' : 'default';
97
99
  cell.classList.toggle('eos-object-value-writable', writable);
98
100
  cell.classList.toggle('eos-object-value-readonly', !writable);
101
+ cell.classList.add('eos-object-value-cell');
99
102
  cell.setAttribute('data-eos-current-visible-value', visibleValue);
100
103
  const hint = writable
101
104
  ? 'Klicken: Wert schreiben / Button sofort testen'
@@ -140,6 +143,8 @@
140
143
  if (nativeInteractive) {
141
144
  // Intentionally do not stop propagation. This keeps the native ObjectBrowser write dialog and button states working.
142
145
  releaseNativeControls(nativeInteractive);
146
+ window.setTimeout(() => releaseNativeControls(document), 50);
147
+ window.setTimeout(() => annotateValueCells(document), 120);
143
148
  }
144
149
  }, false);
145
150
 
@@ -1,9 +1,10 @@
1
1
  (() => {
2
2
  'use strict';
3
3
 
4
- const VERSION = 'v39-object-state-tools';
4
+ const VERSION = 'v42-force-version-delete-dp-fix';
5
5
  const LEGACY_ADMIN = 'admin';
6
6
  const LEGACY_ADMIN_INSTANCE = 'admin.0';
7
+ const CORE_PROTECTED_ADAPTERS = ['admin', 'eos-admin', 'backitup', 'nexowatt-devices', 'nexowatt-device', 'nexowatt-dev', 'nexowatt-ui'];
7
8
  const ASSET_BASE = (() => {
8
9
  const script = document.currentScript?.src || document.querySelector('script[src*="eos-security-ui.js"]')?.src || window.location.href;
9
10
  return new URL('../', script).href;
@@ -22,7 +23,7 @@
22
23
  isAdministrator: false,
23
24
  hideLegacyAdminFromNonAdmins: true,
24
25
  restrictProtectedAdapterControls: true,
25
- protectedAdapters: ['eos-admin'],
26
+ protectedAdapters: CORE_PROTECTED_ADAPTERS,
26
27
  },
27
28
  scheduled: false,
28
29
  observer: null,
@@ -63,11 +64,15 @@
63
64
  };
64
65
 
65
66
  const isAdminUser = () => !!(state.policy?.isAdmin || state.policy?.isEosAdminGroup || state.policy?.isAdministrator);
66
- const protectedAdapters = () => new Set((state.policy?.protectedAdapters || []).map(normalizeAdapter).filter(Boolean));
67
+ const protectedAdapters = () => {
68
+ const names = new Set([LEGACY_ADMIN, ...CORE_PROTECTED_ADAPTERS].map(normalizeAdapter).filter(Boolean));
69
+ (state.policy?.protectedAdapters || []).map(normalizeAdapter).filter(Boolean).forEach(adapter => names.add(adapter));
70
+ return names;
71
+ };
67
72
 
68
73
  const isProtectedAdapter = value => {
69
74
  const adapter = normalizeAdapter(value);
70
- return !!adapter && protectedAdapters().has(adapter);
75
+ return !!adapter && (adapter === LEGACY_ADMIN || protectedAdapters().has(adapter));
71
76
  };
72
77
 
73
78
  window.NEXOWATT_EOS_SECURITY = {
@@ -76,15 +81,11 @@
76
81
  isAdminUser,
77
82
  isProtectedAdapter,
78
83
  shouldBlockAdapterDelete(adapterName) {
79
- if (isAdminUser()) return false;
80
- const adapter = normalizeAdapter(adapterName);
81
- return adapter === LEGACY_ADMIN || isProtectedAdapter(adapter);
84
+ return isProtectedAdapter(adapterName);
82
85
  },
83
86
  shouldBlockInstanceDelete(instanceIdOrAdapter) {
84
- if (isAdminUser()) return false;
85
87
  const raw = String(instanceIdOrAdapter || '').replace(/^system\.adapter\./, '');
86
- const adapter = normalizeAdapter(raw);
87
- return adapter === LEGACY_ADMIN || isProtectedAdapter(adapter);
88
+ return isProtectedAdapter(raw);
88
89
  },
89
90
  };
90
91
 
@@ -128,7 +129,7 @@
128
129
  };
129
130
 
130
131
  const hideProtectedDeleteControls = () => {
131
- if (!state.policy?.restrictProtectedAdapterControls || isAdminUser()) return;
132
+ if (!state.policy?.restrictProtectedAdapterControls) return;
132
133
  const protectedSet = protectedAdapters();
133
134
  if (!protectedSet.size) return;
134
135
  document.querySelectorAll('.MuiCard-root, .MuiPaper-root, [role="row"], tr, .MuiListItem-root').forEach(panel => {
@@ -158,13 +159,6 @@
158
159
  }
159
160
  });
160
161
  });
161
- document.querySelectorAll('[role="menuitem"], .MuiMenuItem-root').forEach(item => {
162
- const text = normalizeFlat(item.textContent || '');
163
- if (/loschen|delete|remove|deinstall|uninstall/.test(text)) {
164
- item.classList.add('eos-security-hidden-delete');
165
- item.style.display = 'none';
166
- }
167
- });
168
162
  };
169
163
 
170
164
  const replaceTextNodes = () => {
@@ -301,14 +295,30 @@
301
295
 
302
296
  document.addEventListener('click', event => {
303
297
  const target = event.target?.closest?.('button,[role="button"],a,[role="menuitem"],.MuiMenuItem-root');
304
- if (!target || isAdminUser() || isAdapterConfigSurface()) return;
298
+ if (!target || isAdapterConfigSurface()) return;
305
299
  // Native Admin dialogs, install/autocomplete poppers and adapter-owned menus must stay untouched.
306
300
  if (target.closest?.('.MuiDialog-root,.MuiModal-root,.MuiPopover-root,.MuiPopper-root,.MuiMenu-root,.MuiAutocomplete-popper,[role="dialog"],[role="listbox"],[role="menu"]')) return;
307
301
  const label = normalizeFlat(`${target.textContent || ''} ${target.getAttribute?.('title') || ''} ${target.getAttribute?.('aria-label') || ''}`);
308
- if (/loschen|delete|remove|deinstall|uninstall/.test(label)) {
309
- target.classList.add('eos-security-hidden-delete');
310
- target.style.display = 'none';
311
- }
302
+ if (!/loschen|delete|remove|deinstall|uninstall/.test(label)) return;
303
+
304
+ const panel = closestPanel(target);
305
+ if (!panel) return;
306
+ const protectedSet = protectedAdapters();
307
+ const icon = panel.querySelector('img[src*="/adapter/"], img[src*="adapter/"]');
308
+ const src = icon ? String(icon.getAttribute('src') || '') : '';
309
+ const match = src.match(/adapter\/([^\/]+)\//i);
310
+ const adapterFromIcon = match ? normalizeAdapter(match[1]) : '';
311
+ const text = normalizeFlat(panel.textContent || '');
312
+ const protectedHit = adapterFromIcon
313
+ ? isProtectedAdapter(adapterFromIcon)
314
+ : [...protectedSet].some(adapter => new RegExp(`\\b${adapter.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(?:\\.\\d+)?\\b`, 'i').test(text));
315
+ if (!protectedHit) return;
316
+
317
+ target.classList.add('eos-security-hidden-delete');
318
+ target.setAttribute?.('aria-disabled', 'true');
319
+ target.style.display = 'none';
320
+ event.preventDefault();
321
+ event.stopImmediatePropagation();
312
322
  }, true);
313
323
 
314
324
  const start = () => {
package/build/lib/web.js CHANGED
@@ -33,6 +33,14 @@ let socketIoFile;
33
33
  let uuid;
34
34
  const page404 = (0, node_fs_1.readFileSync)(`${__dirname}/../../public/404.html`).toString('utf8');
35
35
  const logTemplate = (0, node_fs_1.readFileSync)(`${__dirname}/../../public/logTemplate.html`).toString('utf8');
36
+ const CORE_PROTECTED_ADAPTER_NAMES = [
37
+ 'eos-admin',
38
+ 'backitup',
39
+ 'nexowatt-devices',
40
+ 'nexowatt-device',
41
+ 'nexowatt-dev',
42
+ 'nexowatt-ui',
43
+ ];
36
44
  // const FORBIDDEN_CHARS = /[\]\[*,;'"`<>\\\s?]/g; // with space
37
45
  // copied from here: https://github.com/component/escape-html/blob/master/index.js
38
46
  const matchHtmlRegExp = /["'&<>]/;
@@ -403,7 +411,7 @@ class Web {
403
411
  return [...groups].sort();
404
412
  }
405
413
  getEosProtectedAdapterNames() {
406
- const names = new Set(['eos-admin']);
414
+ const names = new Set(CORE_PROTECTED_ADAPTER_NAMES);
407
415
  const add = value => {
408
416
  if (!value) return;
409
417
  if (Array.isArray(value)) {
package/build/main.js CHANGED
@@ -44,6 +44,14 @@ function normalizeLoginTimeout(value, fallback = 3_600) {
44
44
  }
45
45
  const EOS_ADMIN_ADAPTER_NAME = 'eos-admin';
46
46
  const LEGACY_ADMIN_ADAPTER_NAME = 'admin';
47
+ const CORE_PROTECTED_ADAPTER_NAMES = [
48
+ EOS_ADMIN_ADAPTER_NAME,
49
+ 'backitup',
50
+ 'nexowatt-devices',
51
+ 'nexowatt-device',
52
+ 'nexowatt-dev',
53
+ 'nexowatt-ui',
54
+ ];
47
55
  const LEGACY_ADMIN_INSTANCE_ID = 'system.adapter.admin.0';
48
56
  const DEFAULT_LEGACY_ADMIN_LOCK_PORT = 18_081;
49
57
  const DEFAULT_LEGACY_ADMIN_LOCK_BIND = '127.0.0.1';
@@ -809,8 +817,11 @@ class Admin extends adapter_core_1.Adapter {
809
817
  }
810
818
  getProtectedAdapterNames() {
811
819
  const configured = normalizeProtectedAdapters(this.config.eosProtectedAdapters);
812
- const result = new Set(configured);
813
- result.add(EOS_ADMIN_ADAPTER_NAME);
820
+ const result = new Set(CORE_PROTECTED_ADAPTER_NAMES);
821
+ configured.forEach(adapter => result.add(adapter));
822
+ // EOS Admin and the core NexoWatt runtime adapters must always stay protected through ACL/UI policy,
823
+ // but never via common.dontDelete/common.nondeletable. Those flags can interfere with ioBroker updates
824
+ // because updates may replace adapter objects.
814
825
  return [...result].sort();
815
826
  }
816
827
  scheduleEosSecurityGuard(reason) {
@@ -1,29 +1,29 @@
1
- # NexoWatt EOS Admin Branding
2
-
3
- Diese Variante hält die Adapter-Basis bewusst nahe am upstream `admin`-Adapter, damit Updates sauber übernommen werden können.
4
-
5
- ## Update-Strategie
6
-
7
- 1. Fork/Branch auf den aktuellen upstream-Stand bringen.
8
- 2. Branding-Patch erneut anwenden.
9
- 3. Frontend/Backend bauen und testen.
10
- 4. Als internen PR oder Fork-PR mergen.
11
-
12
- Empfohlener Ablauf:
13
-
14
- ```bash
15
- git remote add upstream https://github.com/ioBroker/ioBroker.admin.git
16
- git fetch upstream
17
- git checkout -b nexowatt/eos-admin-branding upstream/master
18
- python scripts/apply-eos-branding.py
19
- npm install
20
- cd src-admin && npm install && cd ..
21
- npm run build
22
- npm test
23
- git add .
24
- git commit -m "feat: add NexoWatt EOS branded admin skin"
25
- ```
26
-
27
- ## Bewusste Entscheidung
28
-
29
- Der technische Paketname `iobroker.admin` bleibt erhalten. Das minimiert Update- und Rebase-Konflikte. Sichtbare UI-Bezeichnungen werden zur Laufzeit und in den relevanten Metadaten auf `NexoWatt EOS` gebrandet.
1
+ # NexoWatt EOS Admin Branding
2
+
3
+ Diese Variante hält die Adapter-Basis bewusst nahe am upstream `admin`-Adapter, damit Updates sauber übernommen werden können.
4
+
5
+ ## Update-Strategie
6
+
7
+ 1. Fork/Branch auf den aktuellen upstream-Stand bringen.
8
+ 2. Branding-Patch erneut anwenden.
9
+ 3. Frontend/Backend bauen und testen.
10
+ 4. Als internen PR oder Fork-PR mergen.
11
+
12
+ Empfohlener Ablauf:
13
+
14
+ ```bash
15
+ git remote add upstream https://github.com/ioBroker/ioBroker.admin.git
16
+ git fetch upstream
17
+ git checkout -b nexowatt/eos-admin-branding upstream/master
18
+ python scripts/apply-eos-branding.py
19
+ npm install
20
+ cd src-admin && npm install && cd ..
21
+ npm run build
22
+ npm test
23
+ git add .
24
+ git commit -m "feat: add NexoWatt EOS branded admin skin"
25
+ ```
26
+
27
+ ## Bewusste Entscheidung
28
+
29
+ Der technische Paketname `iobroker.admin` bleibt erhalten. Das minimiert Update- und Rebase-Konflikte. Sichtbare UI-Bezeichnungen werden zur Laufzeit und in den relevanten Metadaten auf `NexoWatt EOS` gebrandet.
@@ -1,9 +1,9 @@
1
- # NexoWatt EOS UI v6
2
-
3
- Änderungen:
4
-
5
- - Abmelden-Button wird auf der Login-Maske nicht mehr erzeugt und zusätzlich per CSS ausgeblendet.
6
- - Das temporäre EOS-/Kompass-Icon wurde durch das originale NexoWatt-Logo ersetzt.
7
- - Admin-SVGs, Favicons, Manifest-Icons und Runtime-Branding zeigen dasselbe NexoWatt-Symbol.
8
- - Logout-Redirect wurde vereinfacht, damit keine kodierten `/%2F.../index.html?login` 404-Pfade entstehen.
9
- - Frontend-Bundles bleiben unverändert; nur Branding-Overlay und Assets wurden angepasst.
1
+ # NexoWatt EOS UI v6
2
+
3
+ Änderungen:
4
+
5
+ - Abmelden-Button wird auf der Login-Maske nicht mehr erzeugt und zusätzlich per CSS ausgeblendet.
6
+ - Das temporäre EOS-/Kompass-Icon wurde durch das originale NexoWatt-Logo ersetzt.
7
+ - Admin-SVGs, Favicons, Manifest-Icons und Runtime-Branding zeigen dasselbe NexoWatt-Symbol.
8
+ - Logout-Redirect wurde vereinfacht, damit keine kodierten `/%2F.../index.html?login` 404-Pfade entstehen.
9
+ - Frontend-Bundles bleiben unverändert; nur Branding-Overlay und Assets wurden angepasst.
@@ -1,25 +1,25 @@
1
- # NexoWatt EOS UI v5
2
-
3
- Diese Version bleibt auf der bestehenden Admin-Adapter-Struktur und verändert nur das Frontend-/Login-Branding über ein kleines Overlay.
4
-
5
- ## Schwerpunkte v5
6
-
7
- - Login-Titel bereinigt: `NexoWatt EOS`, Unterzeile `Energy Operation System`.
8
- - Doppelte/unsaubere Login-Pseudo-Texte entfernt.
9
- - Linke Navigation als scrollbarer EOS-Bereich vorbereitet, damit zusätzliche Einträge später sauber per Slider/Scrollbar erreichbar bleiben.
10
- - NexoWatt/EOS-Kopfbereich im Drawer zusammengeführt; die alte doppelte Logozeile wird ausgeblendet.
11
- - Logout-Button wird fest sichtbar oben rechts platziert und liegt nicht mehr außerhalb des sichtbaren Bereichs.
12
- - Topbar und Navigation wurden responsiver ausgelegt.
13
- - Adapter-/Modul-Kacheln wurden weiter abgerundet und die alten blauen Kopfbereiche werden durch dunklere EOS-Flächen ersetzt.
14
- - Performance-Härtung: kein permanenter 1,5-Sekunden-Full-Scan mehr, kein Beobachten der häufig wechselnden `class`-Attribute, weniger globale Blur-/Shadow-Effekte.
15
-
16
- ## Technischer Ansatz
17
-
18
- Die React/Vite-Bundles bleiben unangetastet. Das Branding läuft über:
19
-
20
- - `adminWww/css/eos-branding.css`
21
- - `adminWww/js/eos-branding.js`
22
- - `src-admin/public/css/eos-branding.css`
23
- - `src-admin/public/js/eos-branding.js`
24
-
25
- Damit bleibt der Adapter updatefreundlicher, weil Upstream-Dateien nicht unnötig hart gepatcht werden.
1
+ # NexoWatt EOS UI v5
2
+
3
+ Diese Version bleibt auf der bestehenden Admin-Adapter-Struktur und verändert nur das Frontend-/Login-Branding über ein kleines Overlay.
4
+
5
+ ## Schwerpunkte v5
6
+
7
+ - Login-Titel bereinigt: `NexoWatt EOS`, Unterzeile `Energy Operation System`.
8
+ - Doppelte/unsaubere Login-Pseudo-Texte entfernt.
9
+ - Linke Navigation als scrollbarer EOS-Bereich vorbereitet, damit zusätzliche Einträge später sauber per Slider/Scrollbar erreichbar bleiben.
10
+ - NexoWatt/EOS-Kopfbereich im Drawer zusammengeführt; die alte doppelte Logozeile wird ausgeblendet.
11
+ - Logout-Button wird fest sichtbar oben rechts platziert und liegt nicht mehr außerhalb des sichtbaren Bereichs.
12
+ - Topbar und Navigation wurden responsiver ausgelegt.
13
+ - Adapter-/Modul-Kacheln wurden weiter abgerundet und die alten blauen Kopfbereiche werden durch dunklere EOS-Flächen ersetzt.
14
+ - Performance-Härtung: kein permanenter 1,5-Sekunden-Full-Scan mehr, kein Beobachten der häufig wechselnden `class`-Attribute, weniger globale Blur-/Shadow-Effekte.
15
+
16
+ ## Technischer Ansatz
17
+
18
+ Die React/Vite-Bundles bleiben unangetastet. Das Branding läuft über:
19
+
20
+ - `adminWww/css/eos-branding.css`
21
+ - `adminWww/js/eos-branding.js`
22
+ - `src-admin/public/css/eos-branding.css`
23
+ - `src-admin/public/js/eos-branding.js`
24
+
25
+ Damit bleibt der Adapter updatefreundlicher, weil Upstream-Dateien nicht unnötig hart gepatcht werden.
@@ -1,16 +1,16 @@
1
- # NexoWatt EOS UI v12 – Header-Logo und Navigationsleiste
2
-
3
- Diese Version basiert auf dem guten v11 Layout mit vollem Header, waagerechter Navigation und großem Inhaltsbereich.
4
-
5
- ## Änderungen
6
-
7
- - Der doppelte NexoWatt/EOS Bereich in der unteren Navigationsleiste wurde entfernt.
8
- - In der unteren Navigationsleiste bleibt links nur noch der Einklapp-Pfeil erhalten.
9
- - Das echte NexoWatt Logo im oberen Header ist größer, kontrastreicher und besser sichtbar.
10
- - Die Login-Zentrierung, die EOS Modul-Kacheln, das lesbare Drei-Punkte-Info-Overlay und die 404-sichere Asset-Struktur aus v11 bleiben erhalten.
11
-
12
- ## Technischer Ansatz
13
-
14
- Die upstream React/Vite Bundles bleiben weiterhin unverändert. Das Design wird über `adminWww/css/eos-branding.css` und `adminWww/js/eos-branding.js` angewendet.
15
-
16
- Cache-Busting: `v=12`.
1
+ # NexoWatt EOS UI v12 – Header-Logo und Navigationsleiste
2
+
3
+ Diese Version basiert auf dem guten v11 Layout mit vollem Header, waagerechter Navigation und großem Inhaltsbereich.
4
+
5
+ ## Änderungen
6
+
7
+ - Der doppelte NexoWatt/EOS Bereich in der unteren Navigationsleiste wurde entfernt.
8
+ - In der unteren Navigationsleiste bleibt links nur noch der Einklapp-Pfeil erhalten.
9
+ - Das echte NexoWatt Logo im oberen Header ist größer, kontrastreicher und besser sichtbar.
10
+ - Die Login-Zentrierung, die EOS Modul-Kacheln, das lesbare Drei-Punkte-Info-Overlay und die 404-sichere Asset-Struktur aus v11 bleiben erhalten.
11
+
12
+ ## Technischer Ansatz
13
+
14
+ Die upstream React/Vite Bundles bleiben weiterhin unverändert. Das Design wird über `adminWww/css/eos-branding.css` und `adminWww/js/eos-branding.js` angewendet.
15
+
16
+ Cache-Busting: `v=12`.
@@ -1,16 +1,16 @@
1
- # NexoWatt EOS UI v12
2
-
3
- Diese Version basiert auf dem horizontalen v11-Layout.
4
-
5
- ## Änderungen
6
-
7
- - Der globale Header bleibt über die komplette Seitenbreite erhalten.
8
- - Die Navigation bleibt waagerecht unter dem Header.
9
- - Der doppelte Branding-Block am Anfang der horizontalen Navigation wurde entfernt.
10
- - An dieser Stelle bleibt nur der native Einklapp-Pfeil sichtbar.
11
- - Das NexoWatt-EOS-Logo im Header wurde größer, kontrastreicher und besser sichtbar gestaltet.
12
- - Die Login-Zentrierung und die 404-Asset-Pfade aus v11 bleiben erhalten.
13
-
14
- ## Technischer Hinweis
15
-
16
- Die Änderung ist weiterhin als CSS/JS-Overlay umgesetzt. Die upstream React/Vite-Bundles bleiben unverändert.
1
+ # NexoWatt EOS UI v12
2
+
3
+ Diese Version basiert auf dem horizontalen v11-Layout.
4
+
5
+ ## Änderungen
6
+
7
+ - Der globale Header bleibt über die komplette Seitenbreite erhalten.
8
+ - Die Navigation bleibt waagerecht unter dem Header.
9
+ - Der doppelte Branding-Block am Anfang der horizontalen Navigation wurde entfernt.
10
+ - An dieser Stelle bleibt nur der native Einklapp-Pfeil sichtbar.
11
+ - Das NexoWatt-EOS-Logo im Header wurde größer, kontrastreicher und besser sichtbar gestaltet.
12
+ - Die Login-Zentrierung und die 404-Asset-Pfade aus v11 bleiben erhalten.
13
+
14
+ ## Technischer Hinweis
15
+
16
+ Die Änderung ist weiterhin als CSS/JS-Overlay umgesetzt. Die upstream React/Vite-Bundles bleiben unverändert.
@@ -1,8 +1,8 @@
1
- # NexoWatt EOS Admin UI v15
2
-
3
- Diese Version basiert auf v14 und korrigiert nur zwei optische Punkte:
4
-
5
- - Das NexoWatt-Logo im Header ist dunkler abgestimmt, damit es nicht überbelichtet wirkt. Der grüne Schein im Hintergrund bleibt erhalten.
6
- - Der Einklapp-Pfeil der horizontalen Navigation sitzt weiter links und native Abmelden-Einträge werden zuverlässig aus der Navigation entfernt, damit keine Überlappung entsteht.
7
-
8
- Die React/Vite-Bundles bleiben unverändert.
1
+ # NexoWatt EOS Admin UI v15
2
+
3
+ Diese Version basiert auf v14 und korrigiert nur zwei optische Punkte:
4
+
5
+ - Das NexoWatt-Logo im Header ist dunkler abgestimmt, damit es nicht überbelichtet wirkt. Der grüne Schein im Hintergrund bleibt erhalten.
6
+ - Der Einklapp-Pfeil der horizontalen Navigation sitzt weiter links und native Abmelden-Einträge werden zuverlässig aus der Navigation entfernt, damit keine Überlappung entsteht.
7
+
8
+ Die React/Vite-Bundles bleiben unverändert.
@@ -1,9 +1,9 @@
1
- # NexoWatt EOS UI v16
2
-
3
- Basis: v15.
4
-
5
- Korrekturen:
6
- - Header-Logo sauber zentriert, nicht überstrahlt und nicht zu dunkel.
7
- - Nativer Logout/Abmelden-Menüpunkt wird zuverlässig aus der horizontalen Navigation entfernt.
8
- - Einklapp-Pfeil bekommt einen eigenen Bereich ohne Überlappung.
9
- - Benutzername im Header ist hell und lesbar.
1
+ # NexoWatt EOS UI v16
2
+
3
+ Basis: v15.
4
+
5
+ Korrekturen:
6
+ - Header-Logo sauber zentriert, nicht überstrahlt und nicht zu dunkel.
7
+ - Nativer Logout/Abmelden-Menüpunkt wird zuverlässig aus der horizontalen Navigation entfernt.
8
+ - Einklapp-Pfeil bekommt einen eigenen Bereich ohne Überlappung.
9
+ - Benutzername im Header ist hell und lesbar.
@@ -1,24 +1,24 @@
1
- # NexoWatt EOS UI v17
2
-
3
- Basis: v16 Layoutstand.
4
-
5
- ## Änderungen
6
-
7
- - Header-Logo links optisch neu abgestimmt:
8
- - eigenes optimiertes Header-Logo `nexowatt-header-192.png`
9
- - Logo sitzt mittig im ovalen Header-Badge
10
- - dunkler Logo-Hintergrund bleibt als Schein erhalten
11
- - kein Mehrfach-/Geisterschein mehr
12
- - Horizontaler Navigationsbereich:
13
- - der Einklapp-Pfeil hat einen festen eigenen Slot
14
- - alte Drawer-Header-Inhalte werden dort ausgeblendet
15
- - native `Abmelden`-Navigationseinträge werden aus der EOS-Navigation entfernt, damit keine Überlappung mehr entsteht
16
- - Benutzername im Header bleibt hell lesbar.
17
- - Authentifizierung / automatische Abmeldung:
18
- - keine eigene Token-Löschung mehr im EOS-Overlay
19
- - kein eigener Logout-Button mehr
20
- - Session-Ablauf und automatische Abmeldung laufen über die originale Admin-Logik.
21
-
22
- ## Technischer Hinweis
23
-
24
- Das EOS-Overlay greift nur in Branding/Layout ein. Die native Session-Überwachung bleibt in `src-admin/src/App.tsx` und die Token-Erneuerung bleibt in `src-admin/src/login/Login.tsx`.
1
+ # NexoWatt EOS UI v17
2
+
3
+ Basis: v16 Layoutstand.
4
+
5
+ ## Änderungen
6
+
7
+ - Header-Logo links optisch neu abgestimmt:
8
+ - eigenes optimiertes Header-Logo `nexowatt-header-192.png`
9
+ - Logo sitzt mittig im ovalen Header-Badge
10
+ - dunkler Logo-Hintergrund bleibt als Schein erhalten
11
+ - kein Mehrfach-/Geisterschein mehr
12
+ - Horizontaler Navigationsbereich:
13
+ - der Einklapp-Pfeil hat einen festen eigenen Slot
14
+ - alte Drawer-Header-Inhalte werden dort ausgeblendet
15
+ - native `Abmelden`-Navigationseinträge werden aus der EOS-Navigation entfernt, damit keine Überlappung mehr entsteht
16
+ - Benutzername im Header bleibt hell lesbar.
17
+ - Authentifizierung / automatische Abmeldung:
18
+ - keine eigene Token-Löschung mehr im EOS-Overlay
19
+ - kein eigener Logout-Button mehr
20
+ - Session-Ablauf und automatische Abmeldung laufen über die originale Admin-Logik.
21
+
22
+ ## Technischer Hinweis
23
+
24
+ Das EOS-Overlay greift nur in Branding/Layout ein. Die native Session-Überwachung bleibt in `src-admin/src/App.tsx` und die Token-Erneuerung bleibt in `src-admin/src/login/Login.tsx`.
@@ -1,13 +1,13 @@
1
- # NexoWatt EOS UI v6 Fixes
2
-
3
- Diese Version korrigiert die gemeldeten Punkte aus dem Testlauf:
4
-
5
- - Die Login-Seite zeigt keinen Abmelden-Button mehr.
6
- - Login, Drawer, Topbar, Manifest, Favicon und Adapter-Icon verwenden wieder das originale NexoWatt/EOS Logo.
7
- - Das Login-Branding lautet sichtbar `NexoWatt EOS` und `Energy Operation System`.
8
- - Der zusätzliche Logout-Button wird nur im angemeldeten Admin-Shell angezeigt.
9
- - Der Logout-Fallback nutzt die Backend-Route `/logout` ohne kodierten Hash-/Origin-Parameter, damit nach erneutem Login keine 404-Weiterleitung entsteht.
10
- - Login-Weiterleitungen auf `/logout` oder `/login` werden zur Laufzeit bereinigt, um 404-/Redirect-Loops nach der Anmeldung zu vermeiden.
11
- - Die Asset-Prüfung für `adminWww/index.html`, `manifest.json`, Branding-CSS/JS und dynamische Assets wurde durchgeführt.
12
-
13
- Die technische Admin-Basis bleibt upstream-nah. Das Branding liegt weiterhin überwiegend in `adminWww/css/eos-branding.css` und `adminWww/js/eos-branding.js`.
1
+ # NexoWatt EOS UI v6 Fixes
2
+
3
+ Diese Version korrigiert die gemeldeten Punkte aus dem Testlauf:
4
+
5
+ - Die Login-Seite zeigt keinen Abmelden-Button mehr.
6
+ - Login, Drawer, Topbar, Manifest, Favicon und Adapter-Icon verwenden wieder das originale NexoWatt/EOS Logo.
7
+ - Das Login-Branding lautet sichtbar `NexoWatt EOS` und `Energy Operation System`.
8
+ - Der zusätzliche Logout-Button wird nur im angemeldeten Admin-Shell angezeigt.
9
+ - Der Logout-Fallback nutzt die Backend-Route `/logout` ohne kodierten Hash-/Origin-Parameter, damit nach erneutem Login keine 404-Weiterleitung entsteht.
10
+ - Login-Weiterleitungen auf `/logout` oder `/login` werden zur Laufzeit bereinigt, um 404-/Redirect-Loops nach der Anmeldung zu vermeiden.
11
+ - Die Asset-Prüfung für `adminWww/index.html`, `manifest.json`, Branding-CSS/JS und dynamische Assets wurde durchgeführt.
12
+
13
+ Die technische Admin-Basis bleibt upstream-nah. Das Branding liegt weiterhin überwiegend in `adminWww/css/eos-branding.css` und `adminWww/js/eos-branding.js`.
@@ -1,9 +1,9 @@
1
- # NexoWatt EOS UI v6
2
-
3
- Änderungen:
4
-
5
- - Login-Maske zeigt keinen zusätzlichen Abmelden-Button mehr.
6
- - Das alte grüne NexoWatt Logo wird überall verwendet: Login, Drawer, Topbar, Favicon-/Manifest-nahe Admin-Assets und Fallback-Icons.
7
- - `Energy Management System` bleibt entfernt; Login nutzt `NexoWatt EOS` und `Energy Operation System`.
8
- - Login-Weiterleitung wurde abgesichert, damit nach erfolgreicher Anmeldung nicht auf eine Route weitergeleitet wird, die einen 404 erzeugen kann.
9
- - Das Branding bleibt weiterhin als Overlay umgesetzt, damit die Upstream-Admin-Struktur möglichst updatefähig bleibt.
1
+ # NexoWatt EOS UI v6
2
+
3
+ Änderungen:
4
+
5
+ - Login-Maske zeigt keinen zusätzlichen Abmelden-Button mehr.
6
+ - Das alte grüne NexoWatt Logo wird überall verwendet: Login, Drawer, Topbar, Favicon-/Manifest-nahe Admin-Assets und Fallback-Icons.
7
+ - `Energy Management System` bleibt entfernt; Login nutzt `NexoWatt EOS` und `Energy Operation System`.
8
+ - Login-Weiterleitung wurde abgesichert, damit nach erfolgreicher Anmeldung nicht auf eine Route weitergeleitet wird, die einen 404 erzeugen kann.
9
+ - Das Branding bleibt weiterhin als Overlay umgesetzt, damit die Upstream-Admin-Struktur möglichst updatefähig bleibt.