iobroker.eos-admin 7.9.37 → 7.9.38
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/adminWww/css/eos-branding.css +62 -79
- package/adminWww/index.html +4 -4
- package/adminWww/js/eos-branding.js +47 -49
- package/adminWww/js/eos-runtime-fixes.js +7 -7
- package/adminWww/js/eos-security-ui.js +11 -8
- package/io-package.json +8 -4
- package/package.json +1 -1
- package/tools/nexowatt-validate-package.cjs +1 -1
|
@@ -3321,7 +3321,7 @@ html.eos-app #eos-assist-root {
|
|
|
3321
3321
|
}
|
|
3322
3322
|
|
|
3323
3323
|
|
|
3324
|
-
/* === NexoWatt EOS
|
|
3324
|
+
/* === NexoWatt EOS v38: native adapter configuration safe mode =============
|
|
3325
3325
|
Custom adapter configuration pages (React/HTML/jsonConfig) must be fully
|
|
3326
3326
|
controlled by the adapter itself. EOS shell decoration is disabled inside the
|
|
3327
3327
|
content area so buttons such as "Gerät hinzufügen" and "Gerät bearbeiten" stay
|
|
@@ -3372,100 +3372,83 @@ html.eos-app.eos-adapter-config-surface #app-paper .eos-protected-adapter-row {
|
|
|
3372
3372
|
pointer-events: auto !important;
|
|
3373
3373
|
}
|
|
3374
3374
|
|
|
3375
|
-
|
|
3376
|
-
|
|
3377
|
-
|
|
3378
|
-
|
|
3379
|
-
html.eos-app .
|
|
3380
|
-
html.eos-app .
|
|
3381
|
-
html.eos-app .
|
|
3382
|
-
html.eos-app .
|
|
3383
|
-
html.eos-app .
|
|
3384
|
-
html.eos-app
|
|
3385
|
-
html.eos-app
|
|
3375
|
+
|
|
3376
|
+
/* === NexoWatt EOS v38: native popup/dialog compatibility ==================
|
|
3377
|
+
EOS decoration must never block native Admin dialogs, adapter install search,
|
|
3378
|
+
autocomplete poppers, menus or adapter-owned configuration dialogs. */
|
|
3379
|
+
html.eos-app .MuiDialog-root,
|
|
3380
|
+
html.eos-app .MuiModal-root,
|
|
3381
|
+
html.eos-app .MuiPopover-root,
|
|
3382
|
+
html.eos-app .MuiPopper-root,
|
|
3383
|
+
html.eos-app .MuiMenu-root,
|
|
3384
|
+
html.eos-app .MuiAutocomplete-popper,
|
|
3385
|
+
html.eos-app [role="dialog"],
|
|
3386
|
+
html.eos-app [role="listbox"],
|
|
3387
|
+
html.eos-app [role="menu"] {
|
|
3386
3388
|
pointer-events: auto !important;
|
|
3387
|
-
z-index: 5200 !important;
|
|
3388
3389
|
}
|
|
3389
|
-
html.eos-app .
|
|
3390
|
-
html.eos-app .
|
|
3391
|
-
html.eos-app .
|
|
3392
|
-
html.eos-app .
|
|
3393
|
-
html.eos-app .
|
|
3394
|
-
html.eos-app
|
|
3395
|
-
html.eos-app
|
|
3396
|
-
html.eos-app button[aria-label="Close"],
|
|
3397
|
-
html.eos-app button[title="Schließen"],
|
|
3398
|
-
html.eos-app button[title="Close"] {
|
|
3390
|
+
html.eos-app .MuiDialog-paper,
|
|
3391
|
+
html.eos-app .MuiPaper-root[role="dialog"],
|
|
3392
|
+
html.eos-app .MuiPopover-paper,
|
|
3393
|
+
html.eos-app .MuiMenu-paper,
|
|
3394
|
+
html.eos-app .MuiAutocomplete-paper,
|
|
3395
|
+
html.eos-app .MuiAutocomplete-listbox,
|
|
3396
|
+
html.eos-app .MuiList-root[role="listbox"] {
|
|
3399
3397
|
pointer-events: auto !important;
|
|
3400
|
-
|
|
3401
|
-
visibility: visible !important;
|
|
3402
|
-
z-index: 5201 !important;
|
|
3398
|
+
user-select: auto !important;
|
|
3403
3399
|
}
|
|
3404
|
-
html.eos-app .
|
|
3405
|
-
html.eos-app .
|
|
3406
|
-
html.eos-app .
|
|
3407
|
-
html.eos-app
|
|
3408
|
-
|
|
3400
|
+
html.eos-app .MuiAutocomplete-popper,
|
|
3401
|
+
html.eos-app .MuiPopper-root,
|
|
3402
|
+
html.eos-app .MuiPopover-root,
|
|
3403
|
+
html.eos-app .MuiMenu-root {
|
|
3404
|
+
z-index: 6500 !important;
|
|
3405
|
+
}
|
|
3406
|
+
html.eos-app .MuiDialog-root button,
|
|
3407
|
+
html.eos-app .MuiDialog-root [role="button"],
|
|
3408
|
+
html.eos-app .MuiDialog-root a,
|
|
3409
|
+
html.eos-app .MuiModal-root button,
|
|
3410
|
+
html.eos-app .MuiModal-root [role="button"],
|
|
3411
|
+
html.eos-app .MuiModal-root a,
|
|
3412
|
+
html.eos-app .MuiPopover-root button,
|
|
3413
|
+
html.eos-app .MuiPopover-root [role="button"],
|
|
3414
|
+
html.eos-app .MuiPopover-root a,
|
|
3415
|
+
html.eos-app .MuiPopper-root button,
|
|
3416
|
+
html.eos-app .MuiPopper-root [role="button"],
|
|
3417
|
+
html.eos-app .MuiPopper-root a,
|
|
3418
|
+
html.eos-app .MuiMenu-root button,
|
|
3419
|
+
html.eos-app .MuiMenu-root [role="button"],
|
|
3420
|
+
html.eos-app .MuiMenu-root a,
|
|
3421
|
+
html.eos-app [role="listbox"] [role="option"],
|
|
3422
|
+
html.eos-app .MuiAutocomplete-option {
|
|
3423
|
+
pointer-events: auto !important;
|
|
3424
|
+
visibility: visible !important;
|
|
3409
3425
|
}
|
|
3410
3426
|
|
|
3411
|
-
/*
|
|
3412
|
-
but does not force adapter-object ACLs for runtime adapters by default. */
|
|
3413
|
-
html.eos-app .eos-backitup-safe-note { color: rgba(226,245,255,.78); }
|
|
3414
|
-
|
|
3415
|
-
/* v37: native Admin notifications must always be closable. */
|
|
3427
|
+
/* v38: snackbars/toasts are clickable, but generic dialogs are not modified. */
|
|
3416
3428
|
html.eos-app .MuiSnackbar-root,
|
|
3417
|
-
html.eos-app .
|
|
3418
|
-
html.eos-app .
|
|
3419
|
-
html.eos-app [role="alert"],
|
|
3420
|
-
html.eos-app .Toastify__toast,
|
|
3429
|
+
html.eos-app .SnackbarItem-root,
|
|
3430
|
+
html.eos-app .SnackbarItem-wrappedRoot,
|
|
3421
3431
|
html.eos-app .notistack-Snackbar,
|
|
3422
|
-
html.eos-app .
|
|
3432
|
+
html.eos-app .Toastify__toast-container,
|
|
3433
|
+
html.eos-app .Toastify__toast {
|
|
3423
3434
|
pointer-events: auto !important;
|
|
3424
3435
|
z-index: 5200 !important;
|
|
3425
3436
|
}
|
|
3426
3437
|
html.eos-app .MuiSnackbar-root button,
|
|
3427
|
-
html.eos-app .
|
|
3428
|
-
html.eos-app .MuiSnackbarContent-root button,
|
|
3429
|
-
html.eos-app [role="alert"] button,
|
|
3430
|
-
html.eos-app .Toastify__toast button,
|
|
3438
|
+
html.eos-app .SnackbarItem-root button,
|
|
3431
3439
|
html.eos-app .notistack-Snackbar button,
|
|
3432
|
-
html.eos-app .
|
|
3433
|
-
html.eos-app .eos-notification-safe [role="button"],
|
|
3434
|
-
html.eos-app .eos-notification-safe a,
|
|
3435
|
-
html.eos-app .eos-notification-safe .MuiIconButton-root {
|
|
3440
|
+
html.eos-app .Toastify__toast button {
|
|
3436
3441
|
pointer-events: auto !important;
|
|
3437
3442
|
visibility: visible !important;
|
|
3438
3443
|
opacity: 1 !important;
|
|
3439
3444
|
}
|
|
3440
|
-
html.eos-app .eos-notification-safe .eos-protected-delete-control,
|
|
3441
|
-
html.eos-app .eos-notification-safe .eos-security-hidden-delete {
|
|
3442
|
-
display: inline-flex !important;
|
|
3443
|
-
pointer-events: auto !important;
|
|
3444
|
-
}
|
|
3445
3445
|
|
|
3446
|
-
|
|
3447
|
-
|
|
3448
|
-
html.eos-app .eos-
|
|
3449
|
-
html.eos-app .
|
|
3450
|
-
html.eos-app .
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
html.eos-app .eos-notification-dialog,
|
|
3455
|
-
html.eos-app .MuiDialog-paper:has(#notifications-dialog-close) {
|
|
3456
|
-
pointer-events: auto !important;
|
|
3457
|
-
z-index: 4301 !important;
|
|
3458
|
-
}
|
|
3459
|
-
html.eos-app .eos-notification-dialog button,
|
|
3460
|
-
html.eos-app .eos-notification-dialog [role="button"],
|
|
3461
|
-
html.eos-app .MuiDialog-paper:has(#notifications-dialog-close) button,
|
|
3462
|
-
html.eos-app .MuiDialog-paper:has(#notifications-dialog-close) [role="button"] {
|
|
3463
|
-
pointer-events: auto !important;
|
|
3464
|
-
visibility: visible !important;
|
|
3465
|
-
}
|
|
3466
|
-
|
|
3467
|
-
/* v37: security text must never show mojibake-like fragments after runtime repair. */
|
|
3468
|
-
html.eos-app .eos-security-admin-only-field,
|
|
3469
|
-
html.eos-app .eos-settings-dialog {
|
|
3470
|
-
unicode-bidi: plaintext;
|
|
3446
|
+
/* v38: never allow decorative EOS layers to sit above native modals/popups. */
|
|
3447
|
+
html.eos-app .eos-top-toolbar::before,
|
|
3448
|
+
html.eos-app .eos-top-toolbar::after,
|
|
3449
|
+
html.eos-app .eos-brand-badge::before,
|
|
3450
|
+
html.eos-app .eos-brand-badge::after,
|
|
3451
|
+
html.eos-app .eos-panel::before,
|
|
3452
|
+
html.eos-app .eos-panel::after {
|
|
3453
|
+
pointer-events: none !important;
|
|
3471
3454
|
}
|
package/adminWww/index.html
CHANGED
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
rel="stylesheet"
|
|
32
32
|
href="css/leaflet.css"
|
|
33
33
|
/>
|
|
34
|
-
<link rel="stylesheet" href="./css/eos-branding.css?v=
|
|
34
|
+
<link rel="stylesheet" href="./css/eos-branding.css?v=38" />
|
|
35
35
|
<link
|
|
36
36
|
rel="manifest"
|
|
37
37
|
href="manifest.json"
|
|
@@ -154,9 +154,9 @@
|
|
|
154
154
|
<script type="module" crossorigin src="./assets/index-CQZugZ1z.js"></script>
|
|
155
155
|
<link rel="modulepreload" crossorigin href="./assets/preload-helper-BDBacUwf.js">
|
|
156
156
|
<link rel="modulepreload" crossorigin href="./assets/iobroker_admin__mf_v__runtimeInit__mf_v__-g2X2zhAf.js">
|
|
157
|
-
<script defer src="./js/eos-branding.js?v=
|
|
158
|
-
<script defer src="./js/eos-security-ui.js?v=
|
|
159
|
-
<script defer src="./js/eos-assistant.js?v=
|
|
157
|
+
<script defer src="./js/eos-branding.js?v=38"></script>
|
|
158
|
+
<script defer src="./js/eos-security-ui.js?v=38"></script>
|
|
159
|
+
<script defer src="./js/eos-assistant.js?v=38"></script>
|
|
160
160
|
</head>
|
|
161
161
|
<body>
|
|
162
162
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
(() => {
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
window.NEXOWATT_EOS_UI_VERSION = '
|
|
4
|
+
window.NEXOWATT_EOS_UI_VERSION = 'v38-popup-config-stability-fix';
|
|
5
5
|
|
|
6
6
|
const BRAND = 'NexoWatt EOS';
|
|
7
7
|
const EOS_MEANING = 'Energy Operation System';
|
|
@@ -405,24 +405,50 @@
|
|
|
405
405
|
|
|
406
406
|
|
|
407
407
|
const releaseNotificationControls = () => safe(() => {
|
|
408
|
-
//
|
|
409
|
-
//
|
|
410
|
-
|
|
408
|
+
// v38: Keep native snackbar/toast close buttons clickable without touching dialogs,
|
|
409
|
+
// poppers, menus or adapter-owned configuration surfaces. Earlier broad selectors
|
|
410
|
+
// changed generic dialogs and broke React click handlers.
|
|
411
|
+
const roots = [
|
|
412
|
+
'.MuiSnackbar-root',
|
|
413
|
+
'.SnackbarItem-root',
|
|
414
|
+
'.SnackbarItem-wrappedRoot',
|
|
415
|
+
'.notistack-Snackbar',
|
|
416
|
+
'.Toastify__toast-container',
|
|
417
|
+
'.Toastify__toast'
|
|
418
|
+
].join(',');
|
|
419
|
+
document.querySelectorAll(roots).forEach(box => {
|
|
420
|
+
if (box.closest('.MuiDialog-root,.MuiModal-root,.MuiPopover-root,.MuiPopper-root,.MuiMenu-root,[role="dialog"]')) return;
|
|
411
421
|
box.classList.add('eos-notification-safe');
|
|
412
422
|
box.style.pointerEvents = 'auto';
|
|
413
|
-
box.querySelectorAll('button, [role="button"], a, .MuiIconButton-root
|
|
423
|
+
box.querySelectorAll('button, [role="button"], a, .MuiIconButton-root').forEach(control => {
|
|
414
424
|
control.classList.remove('eos-protected-delete-control', 'eos-security-hidden-delete');
|
|
415
|
-
|
|
416
|
-
control.removeAttribute('aria-disabled');
|
|
417
|
-
if ('disabled' in control) control.disabled = false;
|
|
425
|
+
// Do not remove disabled states globally. Only restore pointer handling.
|
|
418
426
|
control.style.pointerEvents = 'auto';
|
|
419
|
-
control.style.display = '';
|
|
420
427
|
control.style.visibility = '';
|
|
421
428
|
control.style.opacity = '';
|
|
422
429
|
});
|
|
423
430
|
});
|
|
424
431
|
});
|
|
425
432
|
|
|
433
|
+
const ensurePopupCompatibility = () => safe(() => {
|
|
434
|
+
// v38: All native Admin dialogs, adapter install/autocomplete poppers, menus and
|
|
435
|
+
// adapter-owned modals must stay above EOS decorative layers and keep their React
|
|
436
|
+
// event handlers untouched.
|
|
437
|
+
const selectors = [
|
|
438
|
+
'.MuiDialog-root', '.MuiModal-root', '.MuiPopover-root', '.MuiPopper-root',
|
|
439
|
+
'.MuiMenu-root', '.MuiAutocomplete-popper', '.MuiAutocomplete-listbox',
|
|
440
|
+
'[role="dialog"]', '[role="listbox"]', '[role="menu"]'
|
|
441
|
+
].join(',');
|
|
442
|
+
document.querySelectorAll(selectors).forEach(el => {
|
|
443
|
+
el.classList.add('eos-native-popup-safe');
|
|
444
|
+
if (el.style) {
|
|
445
|
+
el.style.pointerEvents = 'auto';
|
|
446
|
+
const isFloating = el.matches('.MuiPopover-root,.MuiPopper-root,.MuiMenu-root,.MuiAutocomplete-popper,[role="listbox"],[role="menu"]');
|
|
447
|
+
if (isFloating && !el.closest('.MuiDialog-paper')) el.style.zIndex = '6500';
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
});
|
|
451
|
+
|
|
426
452
|
const protectDeleteDialogs = () => {
|
|
427
453
|
if (isAdminUser() || state.securityPolicy.restrictProtectedAdapterControls === false) return;
|
|
428
454
|
const protectedAdapters = state.securityPolicy.protectedAdapters || [];
|
|
@@ -836,7 +862,8 @@
|
|
|
836
862
|
}
|
|
837
863
|
patchDrawerHeader(document.querySelector('.MuiDrawer-paper'));
|
|
838
864
|
hideNativeLogoutNav();
|
|
839
|
-
|
|
865
|
+
releaseNotificationControls();
|
|
866
|
+
ensurePopupCompatibility();
|
|
840
867
|
removeLogoutButton();
|
|
841
868
|
});
|
|
842
869
|
|
|
@@ -1033,23 +1060,10 @@
|
|
|
1033
1060
|
|
|
1034
1061
|
|
|
1035
1062
|
const patchNotifications = () => safe(() => {
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
document.querySelectorAll(selectors.join(',')).forEach(node => {
|
|
1041
|
-
node.classList.add('eos-notification-surface');
|
|
1042
|
-
if (node.style) {
|
|
1043
|
-
node.style.pointerEvents = 'auto';
|
|
1044
|
-
if (!node.closest('.MuiDialog-root')) node.style.zIndex = '5200';
|
|
1045
|
-
}
|
|
1046
|
-
node.querySelectorAll('button,[role="button"],a').forEach(control => {
|
|
1047
|
-
control.classList.add('eos-notification-action');
|
|
1048
|
-
control.style.pointerEvents = 'auto';
|
|
1049
|
-
control.style.visibility = 'visible';
|
|
1050
|
-
control.style.opacity = '1';
|
|
1051
|
-
});
|
|
1052
|
-
});
|
|
1063
|
+
// Kept for compatibility with older calls. v38 intentionally scopes this to
|
|
1064
|
+
// snackbar/toast surfaces only; no dialogs, popovers or adapter config controls.
|
|
1065
|
+
releaseNotificationControls();
|
|
1066
|
+
ensurePopupCompatibility();
|
|
1053
1067
|
});
|
|
1054
1068
|
|
|
1055
1069
|
const applyNavCompactPreference = () => safe(() => {
|
|
@@ -1355,10 +1369,11 @@
|
|
|
1355
1369
|
ensureRightsHelper();
|
|
1356
1370
|
ensurePermissionPresets();
|
|
1357
1371
|
ensureSettingsDialogClasses();
|
|
1358
|
-
|
|
1372
|
+
ensurePopupCompatibility();
|
|
1359
1373
|
hideNativeLogoutNav();
|
|
1360
1374
|
hideOfficialNexoWattRepoWarning();
|
|
1361
|
-
|
|
1375
|
+
releaseNotificationControls();
|
|
1376
|
+
ensurePopupCompatibility();
|
|
1362
1377
|
applySecurityUiGuard();
|
|
1363
1378
|
if (isAdapterConfigSurface()) {
|
|
1364
1379
|
// Adapter-owned configuration pages must not be rebranded or structurally patched.
|
|
@@ -1394,10 +1409,11 @@
|
|
|
1394
1409
|
ensureRightsHelper();
|
|
1395
1410
|
ensurePermissionPresets();
|
|
1396
1411
|
ensureSettingsDialogClasses();
|
|
1397
|
-
|
|
1412
|
+
ensurePopupCompatibility();
|
|
1398
1413
|
hideNativeLogoutNav();
|
|
1399
1414
|
hideOfficialNexoWattRepoWarning();
|
|
1400
|
-
|
|
1415
|
+
releaseNotificationControls();
|
|
1416
|
+
ensurePopupCompatibility();
|
|
1401
1417
|
applySecurityUiGuard();
|
|
1402
1418
|
for (const scope of scopes.slice(0, 80)) {
|
|
1403
1419
|
if (!scope || !scope.isConnected) continue;
|
|
@@ -1474,21 +1490,3 @@
|
|
|
1474
1490
|
window.addEventListener('load', () => scheduleFullPatch(0), { once: true });
|
|
1475
1491
|
window.addEventListener('hashchange', () => scheduleFullPatch(0));
|
|
1476
1492
|
})();
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
// v37 eos notification close compatibility: never let EOS overlays block native notification dialogs.
|
|
1480
|
-
(() => {
|
|
1481
|
-
const normalize = value => String(value || '').replace(/\s+/g, ' ').trim();
|
|
1482
|
-
document.addEventListener('click', event => {
|
|
1483
|
-
const target = event.target?.closest?.('button, [role="button"], a, .MuiButtonBase-root, .MuiIconButton-root');
|
|
1484
|
-
if (!target) return;
|
|
1485
|
-
const dialog = target.closest?.('.eos-notification-dialog, .MuiDialog-paper, [role="dialog"]');
|
|
1486
|
-
if (!dialog || !/benachrichtigungen|notifications|acknowledge|bestätigen|schließen|close/i.test(dialog.textContent || '')) return;
|
|
1487
|
-
const label = normalize(`${target.textContent || ''} ${target.getAttribute?.('aria-label') || ''} ${target.getAttribute?.('title') || ''}`);
|
|
1488
|
-
if (/schließen|close|bestätigen|acknowledge/i.test(label)) {
|
|
1489
|
-
target.style.pointerEvents = 'auto';
|
|
1490
|
-
// Do not prevent React handlers; only stop EOS-specific bubbling side effects.
|
|
1491
|
-
event.stopPropagation();
|
|
1492
|
-
}
|
|
1493
|
-
}, true);
|
|
1494
|
-
})();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
(() => {
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
window.NEXOWATT_EOS_RUNTIME_FIXES_VERSION = '
|
|
4
|
+
window.NEXOWATT_EOS_RUNTIME_FIXES_VERSION = 'v38-popup-config-stability-fix';
|
|
5
5
|
|
|
6
6
|
const MOJIBAKE_MAP = new Map(Object.entries({
|
|
7
7
|
'dürfen': 'dürfen', 'Dürfen': 'Dürfen',
|
|
@@ -78,9 +78,9 @@
|
|
|
78
78
|
|
|
79
79
|
const isNotificationSurface = el => !!el?.closest?.([
|
|
80
80
|
'.MuiSnackbar-root',
|
|
81
|
-
'.
|
|
82
|
-
'
|
|
83
|
-
'
|
|
81
|
+
'.SnackbarItem-root',
|
|
82
|
+
'.SnackbarItem-wrappedRoot',
|
|
83
|
+
'.notistack-Snackbar',
|
|
84
84
|
'.Toastify__toast',
|
|
85
85
|
'.eos-notification-safe'
|
|
86
86
|
].join(','));
|
|
@@ -107,9 +107,9 @@
|
|
|
107
107
|
const base = root && root.nodeType ? root : document;
|
|
108
108
|
const surfaces = Array.from(base.querySelectorAll?.([
|
|
109
109
|
'.MuiSnackbar-root',
|
|
110
|
-
'.
|
|
111
|
-
'
|
|
112
|
-
'
|
|
110
|
+
'.SnackbarItem-root',
|
|
111
|
+
'.SnackbarItem-wrappedRoot',
|
|
112
|
+
'.notistack-Snackbar',
|
|
113
113
|
'.Toastify__toast'
|
|
114
114
|
].join(',')) || []);
|
|
115
115
|
if (base.nodeType === Node.ELEMENT_NODE && isNotificationSurface(base)) surfaces.push(base);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
(() => {
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
const VERSION = '
|
|
4
|
+
const VERSION = 'v38-popup-safe-security-polish';
|
|
5
5
|
const LEGACY_ADMIN = 'admin';
|
|
6
6
|
const LEGACY_ADMIN_INSTANCE = 'admin.0';
|
|
7
7
|
const ASSET_BASE = (() => {
|
|
@@ -246,18 +246,19 @@
|
|
|
246
246
|
const isAdapterConfigSurface = () => document.documentElement.classList.contains('eos-adapter-config-surface') || /Instanzeinstellungen:|Instance settings:|Geräteliste|Gerät hinzufügen|Gerät bearbeiten/i.test(document.body?.textContent || '');
|
|
247
247
|
|
|
248
248
|
const releaseNotificationControls = () => {
|
|
249
|
-
//
|
|
250
|
-
//
|
|
251
|
-
|
|
249
|
+
// v38: security UI must not modify generic dialogs or adapter popups.
|
|
250
|
+
// Only snackbar/toast surfaces are normalized for clickability.
|
|
251
|
+
const roots = [
|
|
252
|
+
'.MuiSnackbar-root', '.SnackbarItem-root', '.SnackbarItem-wrappedRoot',
|
|
253
|
+
'.notistack-Snackbar', '.Toastify__toast-container', '.Toastify__toast'
|
|
254
|
+
].join(',');
|
|
255
|
+
document.querySelectorAll(roots).forEach(box => {
|
|
256
|
+
if (box.closest('.MuiDialog-root,.MuiModal-root,.MuiPopover-root,.MuiPopper-root,.MuiMenu-root,[role="dialog"]')) return;
|
|
252
257
|
box.classList.add('eos-notification-safe');
|
|
253
258
|
box.style.pointerEvents = 'auto';
|
|
254
259
|
box.querySelectorAll('button, [role="button"], a, .MuiIconButton-root').forEach(control => {
|
|
255
260
|
control.classList.remove('eos-protected-delete-control', 'eos-security-hidden-delete');
|
|
256
|
-
control.removeAttribute('disabled');
|
|
257
|
-
control.removeAttribute('aria-disabled');
|
|
258
|
-
if ('disabled' in control) control.disabled = false;
|
|
259
261
|
control.style.pointerEvents = 'auto';
|
|
260
|
-
control.style.display = '';
|
|
261
262
|
control.style.visibility = '';
|
|
262
263
|
});
|
|
263
264
|
});
|
|
@@ -301,6 +302,8 @@
|
|
|
301
302
|
document.addEventListener('click', event => {
|
|
302
303
|
const target = event.target?.closest?.('button,[role="button"],a,[role="menuitem"],.MuiMenuItem-root');
|
|
303
304
|
if (!target || isAdminUser() || isAdapterConfigSurface()) return;
|
|
305
|
+
// Native Admin dialogs, install/autocomplete poppers and adapter-owned menus must stay untouched.
|
|
306
|
+
if (target.closest?.('.MuiDialog-root,.MuiModal-root,.MuiPopover-root,.MuiPopper-root,.MuiMenu-root,.MuiAutocomplete-popper,[role="dialog"],[role="listbox"],[role="menu"]')) return;
|
|
304
307
|
const label = normalizeFlat(`${target.textContent || ''} ${target.getAttribute?.('title') || ''} ${target.getAttribute?.('aria-label') || ''}`);
|
|
305
308
|
if (/loschen|delete|remove|deinstall|uninstall/.test(label)) {
|
|
306
309
|
target.classList.add('eos-security-hidden-delete');
|
package/io-package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "eos-admin",
|
|
4
|
-
"version": "7.9.
|
|
4
|
+
"version": "7.9.38",
|
|
5
5
|
"titleLang": {
|
|
6
6
|
"en": "NexoWatt EOS Admin",
|
|
7
7
|
"de": "NexoWatt EOS Admin",
|
|
@@ -18,6 +18,10 @@
|
|
|
18
18
|
"connectionType": "local",
|
|
19
19
|
"dataSource": "push",
|
|
20
20
|
"news": {
|
|
21
|
+
"7.9.38": {
|
|
22
|
+
"en": "Fixed native dialog/popup compatibility and adapter install search after EOS overlay changes.",
|
|
23
|
+
"de": "Native Dialoge, Popups und Adapter-Installationssuche nach EOS-Overlay-Anpassungen korrigiert."
|
|
24
|
+
},
|
|
21
25
|
"7.9.37": {
|
|
22
26
|
"en": "Fixes notification dialog closing/acknowledgement handling, keeps BackItUp untouched by EOS object protection, and repairs German EOS Security text encoding on settings pages.",
|
|
23
27
|
"de": "Korrigiert das Schließen/Bestätigen von Benachrichtigungen, lässt BackItUp von EOS-Objektschutz unverändert und repariert deutsche EOS-Sicherheitsbeschriftungen in den Einstellungen."
|
|
@@ -206,7 +210,7 @@
|
|
|
206
210
|
"icon": "admin.svg",
|
|
207
211
|
"messagebox": true,
|
|
208
212
|
"enabled": true,
|
|
209
|
-
"extIcon": "https://unpkg.com/iobroker.eos-admin@7.9.
|
|
213
|
+
"extIcon": "https://unpkg.com/iobroker.eos-admin@7.9.38/admin/admin.svg",
|
|
210
214
|
"keywords": [
|
|
211
215
|
"NexoWatt",
|
|
212
216
|
"EOS",
|
|
@@ -217,7 +221,7 @@
|
|
|
217
221
|
"licensed"
|
|
218
222
|
],
|
|
219
223
|
"compact": true,
|
|
220
|
-
"readme": "https://unpkg.com/iobroker.eos-admin@7.9.
|
|
224
|
+
"readme": "https://unpkg.com/iobroker.eos-admin@7.9.38/README.md",
|
|
221
225
|
"authors": [
|
|
222
226
|
"bluefox <bluefox@ccu.io>",
|
|
223
227
|
"hobbyquaker <hq@ccu.io>"
|
|
@@ -286,7 +290,7 @@
|
|
|
286
290
|
"nondeletable": false,
|
|
287
291
|
"allowAdapterUpdate": true,
|
|
288
292
|
"allowAdapterDelete": false,
|
|
289
|
-
"meta": "https://unpkg.com/iobroker.eos-admin@7.9.
|
|
293
|
+
"meta": "https://unpkg.com/iobroker.eos-admin@7.9.38/io-package.json",
|
|
290
294
|
"npmPackage": "iobroker.eos-admin"
|
|
291
295
|
},
|
|
292
296
|
"native": {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.eos-admin",
|
|
3
3
|
"description": "NexoWatt EOS Admin standalone interface with notification, BackItUp isolation and EOS Security text fixes",
|
|
4
|
-
"version": "7.9.
|
|
4
|
+
"version": "7.9.38",
|
|
5
5
|
"contributors": [
|
|
6
6
|
"bluefox <dogafox@gmail.com>",
|
|
7
7
|
"apollon77",
|
|
@@ -62,7 +62,7 @@ if (!webBuild.includes('Follow upstream admin semantics again')) fail('build/lib
|
|
|
62
62
|
if (index.includes('eos-hard-logout.js')) fail('adminWww/index.html must not load the removed custom hard-logout timer');
|
|
63
63
|
if (!branding.includes('isAdapterConfigSurface')) fail('eos-branding.js lacks native adapter config safe-mode detection');
|
|
64
64
|
if (!branding.includes('Adapter UIs must remain 100% functional')) fail('eos-branding.js lacks native adapter config interaction guard');
|
|
65
|
-
if (!branding.includes('
|
|
65
|
+
if (!branding.includes('v38: All native Admin dialogs') || !branding.includes('ensurePopupCompatibility')) fail('eos-branding.js lacks v38 popup compatibility guard');
|
|
66
66
|
const mainBuild = fs.readFileSync(path.join(root, 'build/main.js'), 'utf8');
|
|
67
67
|
if (!mainBuild.includes('v37 BackItUp/runtime-adapter compatibility')) fail('build/main.js lacks v37 BackItUp compatibility guard');
|
|
68
68
|
|