iobroker.eos-admin 7.9.89 → 7.9.92

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.
Files changed (59) hide show
  1. package/INSTALL_TEST_V7.9.92.md +18 -0
  2. package/NEXOWATT_EOS_BUILD_INFO.json +19 -25
  3. package/PUBLISH_STABLE_V7.9.92.md +19 -0
  4. package/README_STABILITY_V7.9.92.md +14 -0
  5. package/RELEASE_ACCEPTANCE_V7.9.92.md +12 -0
  6. package/RELEASE_NOTES_V7.9.92.md +17 -0
  7. package/adminWww/assets/Instances-YdaGnS5a-v84.js +1 -1
  8. package/adminWww/css/nexowatt-native-shell.css +151 -12
  9. package/adminWww/index.html +11 -11
  10. package/adminWww/js/eos-account-management.js +1 -1
  11. package/adminWww/js/eos-assistant.js +1 -1
  12. package/adminWww/js/eos-basic-settings.js +1 -1
  13. package/adminWww/js/eos-branding-sanitizer.js +1 -1
  14. package/adminWww/js/eos-native-security.js +1 -1
  15. package/adminWww/js/eos-policy-client.js +1 -1
  16. package/adminWww/js/eos-role-bootstrap.js +180 -46
  17. package/adminWww/js/eos-role-ui.js +156 -23
  18. package/adminWww/js/nexowatt-native-shell.js +1 -1
  19. package/build/lib/web.js +39 -0
  20. package/io-package.json +15 -5
  21. package/package.json +21 -13
  22. package/tools/nexowatt-account-management-selftest.cjs +1 -1
  23. package/tools/nexowatt-ensure-release-defaults.cjs +72 -0
  24. package/tools/nexowatt-internal-reserve-selftest.cjs +1 -0
  25. package/tools/nexowatt-login-layout-selftest.cjs +81 -0
  26. package/tools/nexowatt-modern-ui-selftest.cjs +7 -5
  27. package/tools/nexowatt-release-defaults-selftest.cjs +29 -0
  28. package/tools/nexowatt-validate-package.cjs +18 -8
  29. package/INSTALL_TEST_V7.9.89.md +0 -73
  30. package/PUBLISH_STABLE_V7.9.89.md +0 -33
  31. package/README_STABILITY_V7.9.89.md +0 -26
  32. package/RELEASE_ACCEPTANCE_V7.9.89.md +0 -40
  33. package/admin/img/eos/nexowatt-192-maskable.png +0 -0
  34. package/admin/img/eos/nexowatt-24.png +0 -0
  35. package/admin/img/eos/nexowatt-512-maskable.png +0 -0
  36. package/admin/img/eos/nexowatt-eos-logo.png +0 -0
  37. package/adminWww/admin.png +0 -0
  38. package/adminWww/img/eos/nexowatt-24.png +0 -0
  39. package/adminWww/img/eos/nexowatt-eos-logo.png +0 -0
  40. package/adminWww/img/eos/nexowatt-header-128.png +0 -0
  41. package/adminWww/img/eos/nexowatt-header-192.png +0 -0
  42. package/adminWww/img/eos/nexowatt-header-256.png +0 -0
  43. package/adminWww/img/eos/nexowatt-header-512.png +0 -0
  44. package/adminWww/img/eos/nexowatt-header-64.png +0 -0
  45. package/adminWww/img/logo192.png +0 -0
  46. package/adminWww/js/eos-adapter-surface-cleanup.js +0 -141
  47. package/adminWww/js/eos-toolbar-ghost-cleanup.js +0 -102
  48. package/docs/NEXOWATT_EOS_BRANDING_DE.md +0 -29
  49. package/docs/NEXOWATT_EOS_UI_LOGO_LOGIN_V6_DE.md +0 -9
  50. package/docs/NEXOWATT_EOS_UI_PERFORMANCE_V5_DE.md +0 -25
  51. package/docs/NEXOWATT_EOS_UI_V12_HEADER_LOGO_NAV_CLEANUP_DE.md +0 -16
  52. package/docs/NEXOWATT_EOS_UI_V12_HEADER_NAV_LOGO_FIX_DE.md +0 -16
  53. package/docs/NEXOWATT_EOS_UI_V15_DE.md +0 -8
  54. package/docs/NEXOWATT_EOS_UI_V16_DE.md +0 -9
  55. package/docs/NEXOWATT_EOS_UI_V17_DE.md +0 -24
  56. package/docs/NEXOWATT_EOS_UI_V6_FIXES_DE.md +0 -13
  57. package/docs/NEXOWATT_EOS_UI_V6_LOGIN_LOGO_404_FIX_DE.md +0 -9
  58. package/docs/NEXOWATT_EOS_UI_V6_LOGO_LOGIN_FIX_DE.md +0 -10
  59. package/docs/NEXOWATT_EOS_UI_V7_RESTORE_LOGO_SCOPE_FIX_DE.md +0 -18
@@ -1,26 +0,0 @@
1
- # NexoWatt EOS Admin 7.9.89 – Stable
2
-
3
- Version 7.9.89 ist die freigegebene Produktlinie für NexoWatt-EOS-Verkaufssysteme auf Basis der bewährten Admin-7-Laufzeit.
4
-
5
- ## Produktfunktionen
6
-
7
- - Rollenmodell **Admin / Service**, **Installateur** und **Gast / Endkunde**.
8
- - Expertenmodus ausschließlich für Admin / Service.
9
- - Installateurzugriff für Inbetriebnahme, Konfiguration und Fehlersuche.
10
- - Endkundenzugriff für freigegebenes Smart Home, Räume, Funktionen und NexoWatt-Bedienbereiche.
11
- - Erstanmeldung von `installer` und `guest` direkt in der normalen Anmeldekarte: Benutzerstufe wählen, Passwort einmalig leer lassen und anschließend zwingend ein persönliches Passwort vergeben.
12
- - Passwort-Reset: Admin / Service darf Installateur und Endkunde zurücksetzen; Installateur ausschließlich Endkunde.
13
- - EOS Assist im Kopfbereich ohne Überlagerung der Inhaltsfläche.
14
- - Zugangsverwaltung ausschließlich unter **Zugänge & Rechte**.
15
- - Moderne aktuelle **Übersicht**; die Easy-Übersicht wird nicht als Produktstartseite verwendet.
16
- - Interner System-Admin und interne BackItUp-Notfallreserve nur für Admin / Service sichtbar.
17
- - NexoWatt Sicherung für die dafür freigegebenen Rollen nutzbar.
18
- - Standardport 8081; interne Admin-Reserve auf 127.0.0.1:18081.
19
-
20
- ## Sicherheitsprinzip
21
-
22
- Ausgeblendete Bedienelemente sind nicht die einzige Schutzschicht. Kritische Aktionen werden zusätzlich über Rollenprüfung, Socket-Guard und Objekt-ACLs abgesichert. Fehlende oder unbekannte Rollen fallen auf die geringsten Endkundenrechte zurück.
23
-
24
- ## Rückfallstand
25
-
26
- Die vorherige Stable 7.9.86 bleibt als dokumentierter Rückfallstand erhalten. Vor einem Produktupdate ist ein vollständiges Backup vorgeschrieben.
@@ -1,40 +0,0 @@
1
- # Release-Abnahme – NexoWatt EOS Admin 7.9.89
2
-
3
- ## Automatische Prüfgates
4
-
5
- - [ ] Versionsgleichheit in package.json, Lockdateien, io-package.json, Frontend und Build-Info
6
- - [ ] npm-Kanal `latest`
7
- - [ ] Paketvalidierung
8
- - [ ] Syntax- und Importintegrität
9
- - [ ] Frontend-Abhängigkeitsgraph
10
- - [ ] Rollen- und Rechteprüfung
11
- - [ ] integrierte Erstanmeldung
12
- - [ ] Passwort-Reset-Hierarchie
13
- - [ ] Expertenmodus-Sperre
14
- - [ ] interne Admin-/BackItUp-Reserve
15
- - [ ] NexoWatt-Sicherung für freigegebene Rollen
16
- - [ ] moderne Übersicht und Header-EOS-Assist
17
- - [ ] Zugangsverwaltung nur unter Zugänge & Rechte
18
- - [ ] Popup-, Datenpunkt- und Updateprüfung
19
- - [ ] Standardport 8081
20
- - [ ] npm pack und npm publish --dry-run
21
-
22
- ## Reale Systemabnahme
23
-
24
- - [ ] Neuinstallation auf dem Produktcontroller
25
- - [ ] Update von 7.9.86
26
- - [ ] Admin-/Service-Anmeldung
27
- - [ ] Installateur-Erstanmeldung ohne Startpasswort
28
- - [ ] Guest-Erstanmeldung ohne Startpasswort
29
- - [ ] Admin setzt Installateur zurück
30
- - [ ] Admin setzt Guest zurück
31
- - [ ] Installateur setzt Guest zurück
32
- - [ ] Installateur kann weder sich selbst noch Admin zurücksetzen
33
- - [ ] Guest kann keine Zugänge zurücksetzen
34
- - [ ] Neustart des Controllers
35
- - [ ] Anmeldung nach Neustart
36
- - [ ] NexoWatt Sicherung erstellen und Rücklesetest
37
- - [ ] interne Notfallreserve nur als Admin sichtbar
38
- - [ ] Rollback auf 7.9.86
39
-
40
- Eine Checkbox darf erst nach nachvollziehbarem Testnachweis gesetzt werden.
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,141 +0,0 @@
1
- (() => {
2
- 'use strict';
3
-
4
- const VERSION = 'v65-native-drawer-header-hard-remove';
5
- window.NEXOWATT_EOS_ADAPTER_SURFACE_CLEANUP_VERSION = VERSION;
6
-
7
- const previous = window.__NEXOWATT_EOS_ADAPTER_SURFACE_CLEANUP_RUNTIME__;
8
- if (previous?.version === VERSION) return;
9
- previous?.stop?.();
10
-
11
- const controller = new AbortController();
12
- const signal = controller.signal;
13
- let observer = null;
14
- let timer = 0;
15
-
16
- const routeIsAdapters = () => /tab-adapters\b/.test(String(window.location.hash || '').toLowerCase());
17
- const safe = fn => { try { return fn(); } catch { return undefined; } };
18
- const text = el => String(el?.textContent || '').replace(/\s+/g, ' ').trim();
19
-
20
- const SORT_NEEDLE = /\b(Titel|Title|Name|Beliebte zuerst|Popular first|Kürzlich aktualisiert|Kuerzlich aktualisiert|Recently updated|Description A-Z|Name A-Z)\b/i;
21
- const CATEGORY_NEEDLE = /\b(Alle|All|Kommunikation|Communication|Energie|Energy|Fahrzeug|Vehicle|Garten|Garden|Geoposition|Hardware|Haushalt|Household|Infrastruktur|Infrastructure|Logik|Logic|Messung|Metering|Multimedia|Netzwerk|Network|Protokolle|Protocols|Sonstige|General|Visualisierung|Visualization|Visualisierungssymbole|visualization-icons|Messaging|Klima|Climate)\b/i;
22
-
23
- const paperOf = root => root?.querySelector?.('.MuiMenu-paper,.MuiPopover-paper,.MuiPaper-root,[role="menu"],[role="listbox"]') || root;
24
- const itemsOf = root => Array.from(root?.querySelectorAll?.('.MuiMenuItem-root,[role="menuitem"],li') || []);
25
-
26
- const isAdapterFilterMenu = root => {
27
- if (!root || !routeIsAdapters()) return false;
28
- if (root.closest?.('.MuiDialog-root,.MuiDialog-paper,[role="dialog"]')) return false;
29
- const items = itemsOf(root);
30
- if (!items.length) return false;
31
- const hasTagCard = items.some(item => Array.from(item.classList || []).some(cls => cls.startsWith('tag-card-')));
32
- const content = text(root);
33
- return hasTagCard || SORT_NEEDLE.test(content) || (items.length > 8 && CATEGORY_NEEDLE.test(content));
34
- };
35
-
36
- const isOrphanedOrMisplaced = root => {
37
- const paper = paperOf(root);
38
- const rect = paper?.getBoundingClientRect?.();
39
- if (!rect) return false;
40
- const content = text(root);
41
- const hasSort = SORT_NEEDLE.test(content);
42
- const hasCategory = CATEGORY_NEEDLE.test(content)
43
- || itemsOf(root).some(item => Array.from(item.classList || []).some(cls => cls.startsWith('tag-card-')));
44
- const nearLeftNavigation = rect.left < 230;
45
- const nearTopHeader = rect.top < 165;
46
- const tooTallLeftRail = hasCategory && nearLeftNavigation && rect.height > 160;
47
- const wrongTopSortBox = hasSort && nearLeftNavigation && nearTopHeader;
48
- const disconnectedAnchorSymptom = nearLeftNavigation && (hasSort || hasCategory) && rect.width <= 260;
49
- return tooTallLeftRail || wrongTopSortBox || disconnectedAnchorSymptom;
50
- };
51
-
52
- const suppressRoot = root => safe(() => {
53
- root.classList.add('eos-adapter-filter-menu-stale');
54
- root.setAttribute('aria-hidden', 'true');
55
- root.style.pointerEvents = 'none';
56
- root.style.visibility = 'hidden';
57
- root.style.opacity = '0';
58
- root.style.display = 'none';
59
- const paper = paperOf(root);
60
- if (paper && paper !== root) {
61
- paper.classList.add('eos-adapter-filter-menu-stale-paper');
62
- paper.style.pointerEvents = 'none';
63
- paper.style.visibility = 'hidden';
64
- paper.style.opacity = '0';
65
- paper.style.display = 'none';
66
- }
67
- });
68
-
69
- const releaseRoot = root => safe(() => {
70
- if (!root.classList.contains('eos-adapter-filter-menu-stale')) return;
71
- root.classList.remove('eos-adapter-filter-menu-stale');
72
- root.removeAttribute('aria-hidden');
73
- ['pointerEvents', 'visibility', 'opacity', 'display'].forEach(prop => { root.style[prop] = ''; });
74
- const paper = paperOf(root);
75
- if (paper && paper !== root) {
76
- paper.classList.remove('eos-adapter-filter-menu-stale-paper');
77
- ['pointerEvents', 'visibility', 'opacity', 'display'].forEach(prop => { paper.style[prop] = ''; });
78
- }
79
- });
80
-
81
- const cleanupAdapterMenus = () => safe(() => {
82
- if (!routeIsAdapters()) return;
83
- const roots = Array.from(document.querySelectorAll('.MuiMenu-root,.MuiPopover-root,body > [role="presentation"]'));
84
- roots.forEach(root => {
85
- if (!isAdapterFilterMenu(root)) {
86
- releaseRoot(root);
87
- return;
88
- }
89
- root.classList.add('eos-adapter-filter-menu');
90
- if (isOrphanedOrMisplaced(root)) suppressRoot(root);
91
- else releaseRoot(root);
92
- });
93
- });
94
-
95
- const schedule = (delay = 0) => {
96
- if (timer) window.clearTimeout(timer);
97
- timer = window.setTimeout(() => {
98
- timer = 0;
99
- cleanupAdapterMenus();
100
- }, delay);
101
- };
102
-
103
- const onHashChange = () => schedule(0);
104
- const onResize = () => schedule(100);
105
- const onScroll = () => { if (routeIsAdapters()) schedule(120); };
106
- const onClick = () => { if (routeIsAdapters()) schedule(0); };
107
- const onKeyUp = event => { if (event.key === 'Escape' && routeIsAdapters()) schedule(0); };
108
-
109
- const install = () => {
110
- schedule(0);
111
- schedule(250);
112
- schedule(1000);
113
- window.addEventListener('hashchange', onHashChange, { signal });
114
- window.addEventListener('resize', onResize, { passive: true, signal });
115
- window.addEventListener('scroll', onScroll, { capture: true, passive: true, signal });
116
- document.addEventListener('click', onClick, { capture: true, signal });
117
- document.addEventListener('keyup', onKeyUp, { capture: true, signal });
118
- observer = new MutationObserver(mutations => {
119
- if (!routeIsAdapters()) return;
120
- for (const mutation of mutations) {
121
- if (mutation.type === 'childList' && mutation.addedNodes?.length) {
122
- schedule(40);
123
- break;
124
- }
125
- }
126
- });
127
- observer.observe(document.documentElement, { subtree: true, childList: true });
128
- };
129
-
130
- const stop = () => {
131
- if (timer) window.clearTimeout(timer);
132
- timer = 0;
133
- observer?.disconnect();
134
- observer = null;
135
- controller.abort();
136
- };
137
- window.__NEXOWATT_EOS_ADAPTER_SURFACE_CLEANUP_RUNTIME__ = { version: VERSION, stop };
138
-
139
- if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', install, { once: true, signal });
140
- else install();
141
- })();
@@ -1,102 +0,0 @@
1
- (() => {
2
- 'use strict';
3
-
4
- window.NEXOWATT_EOS_TOOLBAR_CLEANUP_VERSION = 'v69-v57-header-restore';
5
-
6
- const PRIMARY_SELECTOR = '.eos-brand-badge, .eos-system-brand, [data-eos-primary-brand="true"]';
7
- const HIDDEN_CLASS = 'eos-native-compact-identity-hidden';
8
-
9
- const hide = element => {
10
- if (!element || element.matches?.(PRIMARY_SELECTOR) || element.closest?.(PRIMARY_SELECTOR) || element.querySelector?.(PRIMARY_SELECTOR)) return;
11
- const text = `${element.textContent || ''} ${element.getAttribute?.('aria-label') || ''} ${element.getAttribute?.('title') || ''}`.toLowerCase();
12
- if (text.includes('nexowatt eos') || text.includes('energy operation system')) return;
13
- element.classList.add(HIDDEN_CLASS);
14
- element.setAttribute('aria-hidden', 'true');
15
- element.setAttribute('inert', '');
16
- element.querySelectorAll?.('a,button,[role="button"],input,select,textarea').forEach(control => {
17
- control.setAttribute('tabindex', '-1');
18
- control.setAttribute('aria-hidden', 'true');
19
- });
20
- };
21
-
22
- const directChild = (container, node) => {
23
- let current = node;
24
- while (current?.parentElement && current.parentElement !== container) current = current.parentElement;
25
- return current?.parentElement === container ? current : null;
26
- };
27
-
28
- const cleanToolbar = toolbar => {
29
- if (!toolbar) return;
30
- const children = Array.from(toolbar.children || []);
31
- children.forEach((child, index) => {
32
- if (!child?.querySelector || child.matches(PRIMARY_SELECTOR) || child.querySelector(PRIMARY_SELECTOR)) return;
33
- const easy = child.querySelector('a[href*="#easy"], a[href*="/easy"]');
34
- if (!easy) return;
35
- hide(child);
36
-
37
- const previous = children[index - 1];
38
- if (previous && !previous.matches(PRIMARY_SELECTOR) && !previous.querySelector?.(PRIMARY_SELECTOR)) {
39
- const rect = previous.getBoundingClientRect?.();
40
- const isSmallControl = previous.matches?.('button,.MuiIconButton-root') || !!previous.querySelector?.('button,.MuiIconButton-root');
41
- const hasMenuOrChevron = !!previous.querySelector?.('svg[data-testid="MenuIcon"],svg[data-testid="ChevronLeftIcon"],svg[data-testid="ChevronRightIcon"]');
42
- if (isSmallControl && (hasMenuOrChevron || !rect || (rect.width <= 72 && rect.height <= 72))) hide(previous);
43
- }
44
- });
45
- };
46
-
47
- const cleanDrawer = drawer => {
48
- if (!drawer) return;
49
- drawer.querySelectorAll('a[href*="#easy"], a[href*="/easy"]').forEach(link => {
50
- const child = directChild(drawer, link);
51
- if (!child || child.classList?.contains('MuiList-root') || child.querySelector?.('.MuiListItemButton-root')) return;
52
- hide(child);
53
- });
54
- };
55
-
56
- const cleanByGeometry = () => {
57
- if (!window.matchMedia('(min-width: 901px)').matches) return;
58
- document.querySelectorAll('a[href*="#easy"], a[href*="/easy"]').forEach(link => {
59
- if (link.closest(PRIMARY_SELECTOR)) return;
60
- const rect = link.getBoundingClientRect?.();
61
- const alt = Array.from(link.querySelectorAll?.('img') || []).map(img => img.alt || '').join(' ').toLowerCase();
62
- const text = `${link.textContent || ''} ${alt}`.trim().toLowerCase();
63
- if (!rect || rect.top > 105 || rect.left > 240 || rect.width > 220 || rect.height > 90) return;
64
- if (text.includes('nexowatt eos') || text.includes('energy operation system')) return;
65
- let candidate = link;
66
- for (let i = 0; i < 5 && candidate.parentElement; i += 1) {
67
- const parent = candidate.parentElement;
68
- if (parent.matches(PRIMARY_SELECTOR) || parent.querySelector(PRIMARY_SELECTOR)) break;
69
- const r = parent.getBoundingClientRect?.();
70
- if (!r || r.top > 105 || r.left > 240 || r.width > 240 || r.height > 95) break;
71
- candidate = parent;
72
- if (parent.matches('.MuiToolbar-root,.MuiDrawer-paper,.MuiAppBar-root')) break;
73
- }
74
- if (!candidate.matches('.MuiToolbar-root,.MuiDrawer-paper,.MuiAppBar-root')) hide(candidate);
75
- });
76
- };
77
-
78
- let scheduled = false;
79
- const run = () => {
80
- scheduled = false;
81
- if (!document.getElementById('app-paper')) return;
82
- document.querySelectorAll('.MuiAppBar-root .MuiToolbar-root, header .MuiToolbar-root').forEach(cleanToolbar);
83
- document.querySelectorAll('.MuiDrawer-paper, .MuiSwipeableDrawer-paper').forEach(cleanDrawer);
84
- cleanByGeometry();
85
- };
86
- const schedule = () => {
87
- if (scheduled) return;
88
- scheduled = true;
89
- requestAnimationFrame(run);
90
- };
91
-
92
- if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', schedule, { once: true });
93
- else schedule();
94
-
95
- const observer = new MutationObserver(schedule);
96
- observer.observe(document.documentElement, { childList: true, subtree: true });
97
- window.addEventListener('resize', schedule, { passive: true });
98
- window.addEventListener('hashchange', schedule, { passive: true });
99
- setTimeout(schedule, 250);
100
- setTimeout(schedule, 1000);
101
- setTimeout(schedule, 3000);
102
- })();
@@ -1,29 +0,0 @@
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 +0,0 @@
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 +0,0 @@
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 +0,0 @@
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 +0,0 @@
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 +0,0 @@
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 +0,0 @@
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 +0,0 @@
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 +0,0 @@
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 +0,0 @@
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,10 +0,0 @@
1
- # NexoWatt EOS Admin UI v6
2
-
3
- Änderungen:
4
-
5
- - Login zeigt keinen Abmelden-Button mehr.
6
- - Temporäres Kompass-Icon wurde entfernt. Es wird überall das ursprüngliche NexoWatt-Logo verwendet.
7
- - Admin-/Adapter-Icons, PWA-Icons und Favicons wurden auf das NexoWatt-Logo vereinheitlicht.
8
- - Runtime-Branding beobachtet keine Attribute mehr und reduziert damit DOM-Arbeit auf großen Modul-/Adapterseiten.
9
- - Logout-URL bleibt relativ zur Admin-Basis, um 404-Probleme hinter Pfaden/Proxy-Setups zu vermeiden.
10
- - Die technischen Admin-Bundles bleiben unangetastet.
@@ -1,18 +0,0 @@
1
- # NexoWatt EOS UI v7 – Restore v5 Design, Logo Scope Fix
2
-
3
- Diese Version basiert bewusst wieder auf dem v5-Designstand. Die v6-Änderungen an Drawer/AdapterTile wurden nicht übernommen, damit das vorherige Kachel-/Cockpit-Design erhalten bleibt.
4
-
5
- ## Korrekturen
6
-
7
- - Das markierte EOS-Symbol wurde durch das alte NexoWatt-Logo ersetzt.
8
- - `admin.svg`-Kopien wurden ebenfalls auf das alte NexoWatt-Logo gesetzt.
9
- - Das NexoWatt-Logo wird nur in echten Branding-Bereichen gesetzt: Login, Drawer/Header, EOS-Branding.
10
- - Adapter-/Dienst-/Instanzzeilen werden nicht mehr mit dem NexoWatt-Logo überschrieben.
11
- - `no-image.svg` ist wieder ein neutrales Modul-Platzhalter-Icon, damit fehlende Adapterbilder nicht als NexoWatt-Branding erscheinen.
12
- - Der Abmelden-Button wird auf der Anmeldemaske entfernt und zusätzlich per CSS ausgeblendet.
13
- - Login-Redirects auf `login` oder `logout` werden bereinigt, um 404-Schleifen nach der Anmeldung zu vermeiden.
14
- - Die technische OAuth-Client-ID im Source-Code ist wieder upstream-nah gesetzt.
15
-
16
- ## Wichtig
17
-
18
- Die React/Vite-Runtime-Bundles bleiben unverändert. Das Branding wird über `adminWww/css/eos-branding.css` und `adminWww/js/eos-branding.js` aufgesetzt.