iobroker.eos-admin 7.9.45 → 7.9.48
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.
- package/admin/jsonConfig.json5 +70 -0
- package/adminWww/css/eos-branding.css +77 -0
- package/adminWww/index.html +6 -5
- package/adminWww/js/eos-branding.js +12 -11
- package/adminWww/js/eos-role-ui.js +304 -0
- package/adminWww/js/eos-security-ui.js +5 -5
- package/build/lib/web.js +124 -9
- package/build/main.js +16 -5
- package/docs/NEXOWATT_EOS_BRANDING_DE.md +29 -29
- package/docs/NEXOWATT_EOS_UI_LOGO_LOGIN_V6_DE.md +9 -9
- package/docs/NEXOWATT_EOS_UI_PERFORMANCE_V5_DE.md +25 -25
- package/docs/NEXOWATT_EOS_UI_V12_HEADER_LOGO_NAV_CLEANUP_DE.md +16 -16
- package/docs/NEXOWATT_EOS_UI_V12_HEADER_NAV_LOGO_FIX_DE.md +16 -16
- package/docs/NEXOWATT_EOS_UI_V15_DE.md +8 -8
- package/docs/NEXOWATT_EOS_UI_V16_DE.md +9 -9
- package/docs/NEXOWATT_EOS_UI_V17_DE.md +24 -24
- package/docs/NEXOWATT_EOS_UI_V6_FIXES_DE.md +13 -13
- package/docs/NEXOWATT_EOS_UI_V6_LOGIN_LOGO_404_FIX_DE.md +9 -9
- package/docs/NEXOWATT_EOS_UI_V6_LOGO_LOGIN_FIX_DE.md +10 -10
- package/docs/NEXOWATT_EOS_UI_V7_RESTORE_LOGO_SCOPE_FIX_DE.md +18 -18
- package/io-package.json +32 -5
- package/package.json +1 -1
package/build/lib/web.js
CHANGED
|
@@ -412,27 +412,119 @@ class Web {
|
|
|
412
412
|
return [...groups].sort();
|
|
413
413
|
}
|
|
414
414
|
getEosProtectedAdapterNames() {
|
|
415
|
-
//
|
|
415
|
+
// v47: frontend delete protection is core-only. Ignore old eosProtectedAdapters
|
|
416
416
|
// settings so normal installed adapters/instances remain deletable.
|
|
417
417
|
return [...new Set(CORE_PROTECTED_ADAPTER_NAMES)].sort();
|
|
418
418
|
}
|
|
419
|
-
|
|
419
|
+
getEosConfiguredRoleGroups(...keys) {
|
|
420
420
|
const groups = new Set();
|
|
421
|
+
const add = value => {
|
|
422
|
+
if (!value) return;
|
|
423
|
+
if (Array.isArray(value)) {
|
|
424
|
+
value.forEach(add);
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
if (typeof value === 'object') {
|
|
428
|
+
if (value.enabled === false) return;
|
|
429
|
+
add(value.group || value.id || value.name);
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
const group = this.normalizeEosGroupId(String(value));
|
|
433
|
+
if (group) groups.add(group);
|
|
434
|
+
};
|
|
435
|
+
const settings = this.settings || {};
|
|
436
|
+
keys.forEach(key => add(settings[key]));
|
|
437
|
+
return [...groups].sort();
|
|
438
|
+
}
|
|
439
|
+
getEosInstallerGroups() {
|
|
440
|
+
const groups = new Set(this.getEosConfiguredRoleGroups(
|
|
441
|
+
'eosInstallerGroups',
|
|
442
|
+
'eosInstallateurGroups',
|
|
443
|
+
'eosServiceGroups',
|
|
444
|
+
));
|
|
445
|
+
groups.add('system.group.installateur');
|
|
446
|
+
groups.add('system.group.installateure');
|
|
447
|
+
groups.add('system.group.installer');
|
|
448
|
+
groups.add('system.group.service');
|
|
449
|
+
groups.add('system.group.techniker');
|
|
450
|
+
return [...groups].sort();
|
|
451
|
+
}
|
|
452
|
+
getEosEndUserGroups() {
|
|
453
|
+
const groups = new Set(this.getEosConfiguredRoleGroups(
|
|
454
|
+
'eosEndUserGroups',
|
|
455
|
+
'eosEndkundeGroups',
|
|
456
|
+
'eosCustomerGroups',
|
|
457
|
+
));
|
|
458
|
+
groups.add('system.group.endkunde');
|
|
459
|
+
groups.add('system.group.endkunden');
|
|
460
|
+
groups.add('system.group.kunde');
|
|
461
|
+
groups.add('system.group.kunden');
|
|
462
|
+
groups.add('system.group.user');
|
|
463
|
+
groups.add('system.group.users');
|
|
464
|
+
return [...groups].sort();
|
|
465
|
+
}
|
|
466
|
+
getTranslatedName(value) {
|
|
467
|
+
if (!value) return '';
|
|
468
|
+
if (typeof value === 'string') return value;
|
|
469
|
+
return String(value.de || value.en || Object.values(value)[0] || '');
|
|
470
|
+
}
|
|
471
|
+
async getEosGroupDetailsForUser(userId) {
|
|
472
|
+
const groups = [];
|
|
421
473
|
try {
|
|
422
474
|
const result = await this.adapter.getObjectViewAsync('system', 'group', {
|
|
423
475
|
startkey: 'system.group.',
|
|
424
476
|
endkey: 'system.group.香',
|
|
477
|
+
include_docs: true,
|
|
425
478
|
});
|
|
426
479
|
for (const row of result.rows) {
|
|
427
|
-
const group = row.
|
|
480
|
+
const group = row.doc || row.value;
|
|
428
481
|
const members = Array.isArray(group?.common?.members) ? group.common.members : [];
|
|
429
|
-
if (members.includes(userId))
|
|
482
|
+
if (members.includes(userId)) {
|
|
483
|
+
groups.push({
|
|
484
|
+
id: row.id,
|
|
485
|
+
name: this.getTranslatedName(group?.common?.name),
|
|
486
|
+
desc: this.getTranslatedName(group?.common?.desc),
|
|
487
|
+
});
|
|
488
|
+
}
|
|
430
489
|
}
|
|
431
490
|
}
|
|
432
491
|
catch (e) {
|
|
433
492
|
this.adapter.log.debug(`Cannot resolve EOS security groups for ${userId}: ${e instanceof Error ? e.message : e}`);
|
|
434
493
|
}
|
|
435
|
-
return
|
|
494
|
+
return groups.sort((a, b) => a.id.localeCompare(b.id));
|
|
495
|
+
}
|
|
496
|
+
async getEosGroupsForUser(userId) {
|
|
497
|
+
return (await this.getEosGroupDetailsForUser(userId)).map(group => group.id);
|
|
498
|
+
}
|
|
499
|
+
normalizeEosRoleText(value) {
|
|
500
|
+
return String(value || '')
|
|
501
|
+
.toLowerCase()
|
|
502
|
+
.normalize('NFD')
|
|
503
|
+
.replace(/[\u0300-\u036f]/g, '')
|
|
504
|
+
.replace(/^system\.group\./, '')
|
|
505
|
+
.replace(/[^a-z0-9]+/g, ' ')
|
|
506
|
+
.trim();
|
|
507
|
+
}
|
|
508
|
+
resolveEosRole(userId, groups, groupNames, adminGroups) {
|
|
509
|
+
if (userId === 'system.user.admin' || groups.includes('system.group.administrator') || groups.some(group => adminGroups.includes(group))) {
|
|
510
|
+
return 'admin';
|
|
511
|
+
}
|
|
512
|
+
const installerGroups = this.getEosInstallerGroups();
|
|
513
|
+
if (groups.some(group => installerGroups.includes(group))) {
|
|
514
|
+
return 'installer';
|
|
515
|
+
}
|
|
516
|
+
const endUserGroups = this.getEosEndUserGroups();
|
|
517
|
+
if (groups.some(group => endUserGroups.includes(group))) {
|
|
518
|
+
return 'enduser';
|
|
519
|
+
}
|
|
520
|
+
const roleText = [...groups, ...groupNames].map(value => this.normalizeEosRoleText(value)).join(' ');
|
|
521
|
+
if (/(^| )(installateur|installateure|installer|installation|service|servicetechniker|techniker|technician|integrator|partner|wartung|maintenance)( |$)/i.test(roleText)) {
|
|
522
|
+
return 'installer';
|
|
523
|
+
}
|
|
524
|
+
if (/(^| )(endkunde|endkunden|kunde|kunden|customer|customers|bediener|operator|viewer|nutzer|benutzer)( |$)/i.test(roleText)) {
|
|
525
|
+
return 'enduser';
|
|
526
|
+
}
|
|
527
|
+
return 'enduser';
|
|
436
528
|
}
|
|
437
529
|
readAccessTokenFromRequest(req) {
|
|
438
530
|
const cookieHeader = req.headers.cookie || '';
|
|
@@ -481,20 +573,31 @@ class Web {
|
|
|
481
573
|
res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate');
|
|
482
574
|
res.setHeader('Content-Type', 'application/json; charset=utf-8');
|
|
483
575
|
const userId = await this.readEosCurrentUser(req);
|
|
484
|
-
const
|
|
576
|
+
const groupDetails = userId ? await this.getEosGroupDetailsForUser(userId) : [];
|
|
577
|
+
const groups = groupDetails.map(group => group.id);
|
|
578
|
+
const groupNames = groupDetails.flatMap(group => [group.name, group.desc]).filter(Boolean);
|
|
485
579
|
const adminGroups = this.getEosSecurityAdminGroups();
|
|
486
|
-
const
|
|
487
|
-
const
|
|
580
|
+
const role = this.resolveEosRole(userId, groups, groupNames, adminGroups);
|
|
581
|
+
const isAdministrator = role === 'admin' && (userId === 'system.user.admin' || groups.includes('system.group.administrator'));
|
|
582
|
+
const isEosAdminGroup = role === 'admin';
|
|
583
|
+
const isInstaller = role === 'installer';
|
|
584
|
+
const isEndUser = role === 'enduser';
|
|
488
585
|
res.status(200).json({
|
|
489
586
|
user: userId,
|
|
490
587
|
groups,
|
|
588
|
+
groupNames,
|
|
491
589
|
adminGroups,
|
|
590
|
+
installerGroups: this.getEosInstallerGroups(),
|
|
591
|
+
endUserGroups: this.getEosEndUserGroups(),
|
|
592
|
+
role,
|
|
492
593
|
isAdministrator,
|
|
493
594
|
isEosAdminGroup,
|
|
595
|
+
isInstaller,
|
|
596
|
+
isEndUser,
|
|
494
597
|
isAdmin: isEosAdminGroup,
|
|
495
598
|
hideLegacyAdminForNonAdmins: this.settings.eosHideLegacyAdminForNonAdmins !== false && this.settings.eosHideLegacyAdminFromNonAdmins !== false,
|
|
496
599
|
hideLegacyAdminFromNonAdmins: this.settings.eosHideLegacyAdminForNonAdmins !== false && this.settings.eosHideLegacyAdminFromNonAdmins !== false,
|
|
497
|
-
restrictProtectedAdapterControls: this.settings.eosRestrictProtectedAdapterControls !== false
|
|
600
|
+
restrictProtectedAdapterControls: this.settings.eosRestrictProtectedAdapterControls !== false,
|
|
498
601
|
legacyAdminAdapter: 'admin',
|
|
499
602
|
legacyAdminInstance: 'admin.0',
|
|
500
603
|
protectedAdapters: this.getEosProtectedAdapterNames(),
|
|
@@ -700,9 +803,15 @@ class Web {
|
|
|
700
803
|
res.status(200).json({
|
|
701
804
|
user: null,
|
|
702
805
|
groups: [],
|
|
806
|
+
groupNames: [],
|
|
703
807
|
adminGroups: ['system.group.administrator'],
|
|
808
|
+
installerGroups: this.getEosInstallerGroups(),
|
|
809
|
+
endUserGroups: this.getEosEndUserGroups(),
|
|
810
|
+
role: 'enduser',
|
|
704
811
|
isAdministrator: false,
|
|
705
812
|
isEosAdminGroup: false,
|
|
813
|
+
isInstaller: false,
|
|
814
|
+
isEndUser: true,
|
|
706
815
|
isAdmin: false,
|
|
707
816
|
hideLegacyAdminForNonAdmins: true,
|
|
708
817
|
hideLegacyAdminFromNonAdmins: true,
|
|
@@ -789,9 +898,15 @@ class Web {
|
|
|
789
898
|
res.status(200).json({
|
|
790
899
|
user: null,
|
|
791
900
|
groups: [],
|
|
901
|
+
groupNames: [],
|
|
792
902
|
adminGroups: ['system.group.administrator'],
|
|
903
|
+
installerGroups: this.getEosInstallerGroups(),
|
|
904
|
+
endUserGroups: this.getEosEndUserGroups(),
|
|
905
|
+
role: 'enduser',
|
|
793
906
|
isAdministrator: false,
|
|
794
907
|
isEosAdminGroup: false,
|
|
908
|
+
isInstaller: false,
|
|
909
|
+
isEndUser: true,
|
|
795
910
|
isAdmin: false,
|
|
796
911
|
hideLegacyAdminForNonAdmins: true,
|
|
797
912
|
hideLegacyAdminFromNonAdmins: true,
|
package/build/main.js
CHANGED
|
@@ -164,6 +164,8 @@ class Admin extends adapter_core_1.Adapter {
|
|
|
164
164
|
eosSecurityDebounce = null;
|
|
165
165
|
/** Avoid concurrent policy writes while the guard corrects objects. */
|
|
166
166
|
eosSecurityRunning = false;
|
|
167
|
+
/** v47: stale delete-lock cleanup is a one-shot migration, not a repeating guard. */
|
|
168
|
+
eosDeleteLockRepairFinished = false;
|
|
167
169
|
constructor(options = {}) {
|
|
168
170
|
options = {
|
|
169
171
|
...options,
|
|
@@ -816,7 +818,7 @@ class Admin extends adapter_core_1.Adapter {
|
|
|
816
818
|
return configured || DEFAULT_LEGACY_ADMIN_LOCK_BIND;
|
|
817
819
|
}
|
|
818
820
|
getProtectedAdapterNames() {
|
|
819
|
-
//
|
|
821
|
+
// v47: delete protection is intentionally limited to the fixed EOS core list.
|
|
820
822
|
// Older installations may have stored additional entries in eosProtectedAdapters;
|
|
821
823
|
// those must not make ordinary runtime adapters undeletable in Dienste/Module.
|
|
822
824
|
const result = new Set([LEGACY_ADMIN_ADAPTER_NAME, ...CORE_PROTECTED_ADAPTER_NAMES]);
|
|
@@ -881,9 +883,15 @@ class Admin extends adapter_core_1.Adapter {
|
|
|
881
883
|
.replace(/^system\.adapter\./, '')
|
|
882
884
|
.replace(/\.\d+$/, '');
|
|
883
885
|
const isProtected = protectedAdapters.has(adapter);
|
|
886
|
+
// v47: never "repair" the fixed protected core adapters here. On some systems
|
|
887
|
+
// ioBroker or another guard restores their delete flags immediately, which created
|
|
888
|
+
// a repair/reapply loop and filled the log every debounce cycle.
|
|
889
|
+
if (isProtected) {
|
|
890
|
+
return false;
|
|
891
|
+
}
|
|
884
892
|
let changed = false;
|
|
885
893
|
obj.common = obj.common || {};
|
|
886
|
-
// v45: old builds could leave common.dontDelete/common.nondeletable on normal
|
|
894
|
+
// v45/v47: old builds could leave common.dontDelete/common.nondeletable on normal
|
|
887
895
|
// adapter or instance objects. Those flags block ioBroker del even if the UI allows it.
|
|
888
896
|
if (obj.common.dontDelete === true) {
|
|
889
897
|
delete obj.common.dontDelete;
|
|
@@ -936,7 +944,7 @@ class Admin extends adapter_core_1.Adapter {
|
|
|
936
944
|
}
|
|
937
945
|
}
|
|
938
946
|
if (changed) {
|
|
939
|
-
this.log.
|
|
947
|
+
this.log.debug(`EOS delete guard repaired stale delete locks on ${changed} adapter/instance object(s)`);
|
|
940
948
|
}
|
|
941
949
|
}
|
|
942
950
|
|
|
@@ -971,7 +979,7 @@ class Admin extends adapter_core_1.Adapter {
|
|
|
971
979
|
this.log.warn(`Cannot protect instances of adapter "${adapter}": ${e instanceof Error ? e.message : e}`);
|
|
972
980
|
}
|
|
973
981
|
if (changed) {
|
|
974
|
-
this.log.
|
|
982
|
+
this.log.debug(`EOS ACL/UI delete guard applied to adapter "${adapter}"`);
|
|
975
983
|
}
|
|
976
984
|
}
|
|
977
985
|
async ensureLegacyAdminLocked() {
|
|
@@ -1015,7 +1023,10 @@ class Admin extends adapter_core_1.Adapter {
|
|
|
1015
1023
|
try {
|
|
1016
1024
|
await this.ensureLegacyAdminLocked();
|
|
1017
1025
|
await this.ensureLegacyAdminVisibleOnlyToAdmins();
|
|
1018
|
-
|
|
1026
|
+
if (!this.eosDeleteLockRepairFinished) {
|
|
1027
|
+
this.eosDeleteLockRepairFinished = true;
|
|
1028
|
+
await this.repairStaleAdapterDeleteLocks();
|
|
1029
|
+
}
|
|
1019
1030
|
if (this.config.eosProtectAdapterDeletion !== false) {
|
|
1020
1031
|
for (const adapter of this.getProtectedAdapterNames()) {
|
|
1021
1032
|
await this.ensureProtectedAdapter(adapter);
|
|
@@ -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.
|
|
@@ -1,10 +1,10 @@
|
|
|
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
|
+
# 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.
|