iobroker.admin 7.4.7 → 7.4.8
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/README.md +5 -4
- package/adminWww/asset-manifest.json +21 -21
- package/adminWww/index.html +1 -1
- package/adminWww/static/js/1892.3c30ecff.chunk.js.map +1 -1
- package/adminWww/static/js/{288.12201160.chunk.js → 288.23e8413f.chunk.js} +2 -2
- package/adminWww/static/js/288.23e8413f.chunk.js.map +1 -0
- package/adminWww/static/js/3363.a4c36649.chunk.js.map +1 -1
- package/adminWww/static/js/3834.d81ffc60.chunk.js +2 -0
- package/adminWww/static/js/3834.d81ffc60.chunk.js.map +1 -0
- package/adminWww/static/js/4289.cbde8e52.chunk.js +2 -0
- package/adminWww/static/js/4289.cbde8e52.chunk.js.map +1 -0
- package/adminWww/static/js/471.8a82d825.chunk.js.map +1 -1
- package/adminWww/static/js/4720.6112531a.chunk.js +2 -0
- package/adminWww/static/js/4720.6112531a.chunk.js.map +1 -0
- package/adminWww/static/js/5687.d7fa0a4e.chunk.js +2 -0
- package/adminWww/static/js/5687.d7fa0a4e.chunk.js.map +1 -0
- package/adminWww/static/js/{6361.48a28196.chunk.js → 6361.ec86271d.chunk.js} +2 -2
- package/adminWww/static/js/6361.ec86271d.chunk.js.map +1 -0
- package/adminWww/static/js/6603.ee9b0df5.chunk.js +3 -0
- package/adminWww/static/js/6603.ee9b0df5.chunk.js.map +1 -0
- package/adminWww/static/js/{6853.cfc24286.chunk.js → 6853.ff130602.chunk.js} +2 -2
- package/adminWww/static/js/{6853.cfc24286.chunk.js.map → 6853.ff130602.chunk.js.map} +1 -1
- package/adminWww/static/js/7137.7b5ca6b5.chunk.js.map +1 -1
- package/adminWww/static/js/{8144.ae502bba.chunk.js → 8144.5989b02c.chunk.js} +3 -3
- package/adminWww/static/js/8144.5989b02c.chunk.js.map +1 -0
- package/adminWww/static/js/8387.2cb15163.chunk.js.map +1 -1
- package/adminWww/static/js/{main.d26a969d.js → main.a833ed54.js} +2 -2
- package/adminWww/static/js/{main.d26a969d.js.map → main.a833ed54.js.map} +1 -1
- package/build-backend/main.js +1 -1
- package/build-backend/main.js.map +1 -1
- package/io-package.json +14 -14
- package/package.json +4 -4
- package/adminWww/static/js/288.12201160.chunk.js.map +0 -1
- package/adminWww/static/js/3834.2e04eb51.chunk.js +0 -2
- package/adminWww/static/js/3834.2e04eb51.chunk.js.map +0 -1
- package/adminWww/static/js/4289.e9a5790f.chunk.js +0 -2
- package/adminWww/static/js/4289.e9a5790f.chunk.js.map +0 -1
- package/adminWww/static/js/4720.72b71322.chunk.js +0 -2
- package/adminWww/static/js/4720.72b71322.chunk.js.map +0 -1
- package/adminWww/static/js/5687.c249e41f.chunk.js +0 -2
- package/adminWww/static/js/5687.c249e41f.chunk.js.map +0 -1
- package/adminWww/static/js/6361.48a28196.chunk.js.map +0 -1
- package/adminWww/static/js/6603.614b4df4.chunk.js +0 -3
- package/adminWww/static/js/6603.614b4df4.chunk.js.map +0 -1
- package/adminWww/static/js/8144.ae502bba.chunk.js.map +0 -1
- /package/adminWww/static/js/{6603.614b4df4.chunk.js.LICENSE.txt → 6603.ee9b0df5.chunk.js.LICENSE.txt} +0 -0
- /package/adminWww/static/js/{8144.ae502bba.chunk.js.LICENSE.txt → 8144.5989b02c.chunk.js.LICENSE.txt} +0 -0
package/README.md
CHANGED
|
@@ -87,6 +87,11 @@ The icons may not be reused in other projects without the proper flaticon licens
|
|
|
87
87
|
<!--
|
|
88
88
|
### **WORK IN PROGRESS**
|
|
89
89
|
-->
|
|
90
|
+
### 7.4.8 (2024-12-21)
|
|
91
|
+
|
|
92
|
+
- (@GermanBluefox) Show latest/stable labels by updating/downgrading of adapters
|
|
93
|
+
- (@GermanBluefox) Corrected selection of chinese language
|
|
94
|
+
|
|
90
95
|
### 7.4.7 (2024-12-12)
|
|
91
96
|
|
|
92
97
|
- (@GermanBluefox) Corrected the rendering of custom JSON config components
|
|
@@ -109,10 +114,6 @@ The icons may not be reused in other projects without the proper flaticon licens
|
|
|
109
114
|
- (@GermanBluefox) Made improvement for JSONConfig components
|
|
110
115
|
- (@GermanBluefox) Added clear button to text area JSON config component
|
|
111
116
|
|
|
112
|
-
### 7.4.1 (2024-11-19)
|
|
113
|
-
|
|
114
|
-
- (@GermanBluefox) Made improvement for JSONConfig components
|
|
115
|
-
|
|
116
117
|
## License
|
|
117
118
|
|
|
118
119
|
The MIT License (MIT)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"files": {
|
|
3
|
-
"main.js": "./static/js/main.
|
|
3
|
+
"main.js": "./static/js/main.a833ed54.js",
|
|
4
4
|
"static/css/288.c0edd320.chunk.css": "./static/css/288.c0edd320.chunk.css",
|
|
5
|
-
"static/js/288.
|
|
5
|
+
"static/js/288.23e8413f.chunk.js": "./static/js/288.23e8413f.chunk.js",
|
|
6
6
|
"static/js/4669.59fb05c3.chunk.js": "./static/js/4669.59fb05c3.chunk.js",
|
|
7
7
|
"static/js/9379.8bf77bba.chunk.js": "./static/js/9379.8bf77bba.chunk.js",
|
|
8
8
|
"static/js/2233.a42dca22.chunk.js": "./static/js/2233.a42dca22.chunk.js",
|
|
@@ -18,18 +18,18 @@
|
|
|
18
18
|
"static/js/5043.d2ef6c25.chunk.js": "./static/js/5043.d2ef6c25.chunk.js",
|
|
19
19
|
"static/js/500.9af53d0a.chunk.js": "./static/js/500.9af53d0a.chunk.js",
|
|
20
20
|
"static/js/7950.afbe1ff4.chunk.js": "./static/js/7950.afbe1ff4.chunk.js",
|
|
21
|
-
"static/js/4289.
|
|
21
|
+
"static/js/4289.cbde8e52.chunk.js": "./static/js/4289.cbde8e52.chunk.js",
|
|
22
22
|
"static/js/471.8a82d825.chunk.js": "./static/js/471.8a82d825.chunk.js",
|
|
23
23
|
"static/js/3363.a4c36649.chunk.js": "./static/js/3363.a4c36649.chunk.js",
|
|
24
24
|
"static/js/1892.3c30ecff.chunk.js": "./static/js/1892.3c30ecff.chunk.js",
|
|
25
|
-
"static/js/5687.
|
|
25
|
+
"static/js/5687.d7fa0a4e.chunk.js": "./static/js/5687.d7fa0a4e.chunk.js",
|
|
26
26
|
"static/js/7137.7b5ca6b5.chunk.js": "./static/js/7137.7b5ca6b5.chunk.js",
|
|
27
|
-
"static/js/6361.
|
|
27
|
+
"static/js/6361.ec86271d.chunk.js": "./static/js/6361.ec86271d.chunk.js",
|
|
28
28
|
"static/js/4203.cf3ffdb3.chunk.js": "./static/js/4203.cf3ffdb3.chunk.js",
|
|
29
29
|
"static/js/8387.2cb15163.chunk.js": "./static/js/8387.2cb15163.chunk.js",
|
|
30
30
|
"static/js/8222.399b9b24.chunk.js": "./static/js/8222.399b9b24.chunk.js",
|
|
31
31
|
"static/js/7424.223daaa3.chunk.js": "./static/js/7424.223daaa3.chunk.js",
|
|
32
|
-
"static/js/6853.
|
|
32
|
+
"static/js/6853.ff130602.chunk.js": "./static/js/6853.ff130602.chunk.js",
|
|
33
33
|
"static/js/1869.02f95681.chunk.js": "./static/js/1869.02f95681.chunk.js",
|
|
34
34
|
"static/js/3849.363dd3ca.chunk.js": "./static/js/3849.363dd3ca.chunk.js",
|
|
35
35
|
"static/js/706.2cac44d0.chunk.js": "./static/js/706.2cac44d0.chunk.js",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"static/js/7050.dcdd30eb.chunk.js": "./static/js/7050.dcdd30eb.chunk.js",
|
|
39
39
|
"static/js/921.f7fc8142.chunk.js": "./static/js/921.f7fc8142.chunk.js",
|
|
40
40
|
"static/js/7249.ff7ffd3f.chunk.js": "./static/js/7249.ff7ffd3f.chunk.js",
|
|
41
|
-
"static/js/4720.
|
|
41
|
+
"static/js/4720.6112531a.chunk.js": "./static/js/4720.6112531a.chunk.js",
|
|
42
42
|
"static/js/3997.8ee38232.chunk.js": "./static/js/3997.8ee38232.chunk.js",
|
|
43
43
|
"static/js/5446.7055c034.chunk.js": "./static/js/5446.7055c034.chunk.js",
|
|
44
44
|
"static/js/6331.a5f853ac.chunk.js": "./static/js/6331.a5f853ac.chunk.js",
|
|
@@ -203,7 +203,7 @@
|
|
|
203
203
|
"static/js/4386.2fbc4060.chunk.js": "./static/js/4386.2fbc4060.chunk.js",
|
|
204
204
|
"static/js/9228.cf388444.chunk.js": "./static/js/9228.cf388444.chunk.js",
|
|
205
205
|
"static/js/7949.922477b8.chunk.js": "./static/js/7949.922477b8.chunk.js",
|
|
206
|
-
"static/js/6603.
|
|
206
|
+
"static/js/6603.ee9b0df5.chunk.js": "./static/js/6603.ee9b0df5.chunk.js",
|
|
207
207
|
"static/js/9086.a4fdc813.chunk.js": "./static/js/9086.a4fdc813.chunk.js",
|
|
208
208
|
"static/js/632.72c332b3.chunk.js": "./static/js/632.72c332b3.chunk.js",
|
|
209
209
|
"static/js/2825.60a77210.chunk.js": "./static/js/2825.60a77210.chunk.js",
|
|
@@ -218,8 +218,8 @@
|
|
|
218
218
|
"static/js/722.3b277309.chunk.js": "./static/js/722.3b277309.chunk.js",
|
|
219
219
|
"static/js/6341.1f2713bb.chunk.js": "./static/js/6341.1f2713bb.chunk.js",
|
|
220
220
|
"static/js/8552.128c8064.chunk.js": "./static/js/8552.128c8064.chunk.js",
|
|
221
|
-
"static/js/8144.
|
|
222
|
-
"static/js/3834.
|
|
221
|
+
"static/js/8144.5989b02c.chunk.js": "./static/js/8144.5989b02c.chunk.js",
|
|
222
|
+
"static/js/3834.d81ffc60.chunk.js": "./static/js/3834.d81ffc60.chunk.js",
|
|
223
223
|
"static/media/wizard-welcome.jpg": "./static/media/wizard-welcome.06f62f65d3031a66f279.jpg",
|
|
224
224
|
"static/media/wizard-finish.jpg": "./static/media/wizard-finish.8e587d2858a835449991.jpg",
|
|
225
225
|
"static/media/material.woff": "./static/media/material.a4c124e2e5122e01c52b.woff",
|
|
@@ -381,9 +381,9 @@
|
|
|
381
381
|
"static/media/file.svg": "./static/media/file.d39f44d0930a01c6b1a0.svg",
|
|
382
382
|
"static/media/certificates.svg": "./static/media/certificates.0a7c4a4c750fa74d2f98.svg",
|
|
383
383
|
"static/media/rooms.svg": "./static/media/rooms.8d7a30c563e146914ecb.svg",
|
|
384
|
-
"main.
|
|
384
|
+
"main.a833ed54.js.map": "./static/js/main.a833ed54.js.map",
|
|
385
385
|
"288.c0edd320.chunk.css.map": "./static/css/288.c0edd320.chunk.css.map",
|
|
386
|
-
"288.
|
|
386
|
+
"288.23e8413f.chunk.js.map": "./static/js/288.23e8413f.chunk.js.map",
|
|
387
387
|
"4669.59fb05c3.chunk.js.map": "./static/js/4669.59fb05c3.chunk.js.map",
|
|
388
388
|
"9379.8bf77bba.chunk.js.map": "./static/js/9379.8bf77bba.chunk.js.map",
|
|
389
389
|
"2233.a42dca22.chunk.js.map": "./static/js/2233.a42dca22.chunk.js.map",
|
|
@@ -399,18 +399,18 @@
|
|
|
399
399
|
"5043.d2ef6c25.chunk.js.map": "./static/js/5043.d2ef6c25.chunk.js.map",
|
|
400
400
|
"500.9af53d0a.chunk.js.map": "./static/js/500.9af53d0a.chunk.js.map",
|
|
401
401
|
"7950.afbe1ff4.chunk.js.map": "./static/js/7950.afbe1ff4.chunk.js.map",
|
|
402
|
-
"4289.
|
|
402
|
+
"4289.cbde8e52.chunk.js.map": "./static/js/4289.cbde8e52.chunk.js.map",
|
|
403
403
|
"471.8a82d825.chunk.js.map": "./static/js/471.8a82d825.chunk.js.map",
|
|
404
404
|
"3363.a4c36649.chunk.js.map": "./static/js/3363.a4c36649.chunk.js.map",
|
|
405
405
|
"1892.3c30ecff.chunk.js.map": "./static/js/1892.3c30ecff.chunk.js.map",
|
|
406
|
-
"5687.
|
|
406
|
+
"5687.d7fa0a4e.chunk.js.map": "./static/js/5687.d7fa0a4e.chunk.js.map",
|
|
407
407
|
"7137.7b5ca6b5.chunk.js.map": "./static/js/7137.7b5ca6b5.chunk.js.map",
|
|
408
|
-
"6361.
|
|
408
|
+
"6361.ec86271d.chunk.js.map": "./static/js/6361.ec86271d.chunk.js.map",
|
|
409
409
|
"4203.cf3ffdb3.chunk.js.map": "./static/js/4203.cf3ffdb3.chunk.js.map",
|
|
410
410
|
"8387.2cb15163.chunk.js.map": "./static/js/8387.2cb15163.chunk.js.map",
|
|
411
411
|
"8222.399b9b24.chunk.js.map": "./static/js/8222.399b9b24.chunk.js.map",
|
|
412
412
|
"7424.223daaa3.chunk.js.map": "./static/js/7424.223daaa3.chunk.js.map",
|
|
413
|
-
"6853.
|
|
413
|
+
"6853.ff130602.chunk.js.map": "./static/js/6853.ff130602.chunk.js.map",
|
|
414
414
|
"1869.02f95681.chunk.js.map": "./static/js/1869.02f95681.chunk.js.map",
|
|
415
415
|
"3849.363dd3ca.chunk.js.map": "./static/js/3849.363dd3ca.chunk.js.map",
|
|
416
416
|
"706.2cac44d0.chunk.js.map": "./static/js/706.2cac44d0.chunk.js.map",
|
|
@@ -419,7 +419,7 @@
|
|
|
419
419
|
"7050.dcdd30eb.chunk.js.map": "./static/js/7050.dcdd30eb.chunk.js.map",
|
|
420
420
|
"921.f7fc8142.chunk.js.map": "./static/js/921.f7fc8142.chunk.js.map",
|
|
421
421
|
"7249.ff7ffd3f.chunk.js.map": "./static/js/7249.ff7ffd3f.chunk.js.map",
|
|
422
|
-
"4720.
|
|
422
|
+
"4720.6112531a.chunk.js.map": "./static/js/4720.6112531a.chunk.js.map",
|
|
423
423
|
"9701.2178b9bd.chunk.js.map": "./static/js/9701.2178b9bd.chunk.js.map",
|
|
424
424
|
"2930.8e88fcf2.chunk.js.map": "./static/js/2930.8e88fcf2.chunk.js.map",
|
|
425
425
|
"9072.4505ce12.chunk.js.map": "./static/js/9072.4505ce12.chunk.js.map",
|
|
@@ -427,7 +427,7 @@
|
|
|
427
427
|
"4386.2fbc4060.chunk.js.map": "./static/js/4386.2fbc4060.chunk.js.map",
|
|
428
428
|
"9228.cf388444.chunk.js.map": "./static/js/9228.cf388444.chunk.js.map",
|
|
429
429
|
"7949.922477b8.chunk.js.map": "./static/js/7949.922477b8.chunk.js.map",
|
|
430
|
-
"6603.
|
|
430
|
+
"6603.ee9b0df5.chunk.js.map": "./static/js/6603.ee9b0df5.chunk.js.map",
|
|
431
431
|
"9086.a4fdc813.chunk.js.map": "./static/js/9086.a4fdc813.chunk.js.map",
|
|
432
432
|
"632.72c332b3.chunk.js.map": "./static/js/632.72c332b3.chunk.js.map",
|
|
433
433
|
"2825.60a77210.chunk.js.map": "./static/js/2825.60a77210.chunk.js.map",
|
|
@@ -442,10 +442,10 @@
|
|
|
442
442
|
"722.3b277309.chunk.js.map": "./static/js/722.3b277309.chunk.js.map",
|
|
443
443
|
"6341.1f2713bb.chunk.js.map": "./static/js/6341.1f2713bb.chunk.js.map",
|
|
444
444
|
"8552.128c8064.chunk.js.map": "./static/js/8552.128c8064.chunk.js.map",
|
|
445
|
-
"8144.
|
|
446
|
-
"3834.
|
|
445
|
+
"8144.5989b02c.chunk.js.map": "./static/js/8144.5989b02c.chunk.js.map",
|
|
446
|
+
"3834.d81ffc60.chunk.js.map": "./static/js/3834.d81ffc60.chunk.js.map"
|
|
447
447
|
},
|
|
448
448
|
"entrypoints": [
|
|
449
|
-
"static/js/main.
|
|
449
|
+
"static/js/main.a833ed54.js"
|
|
450
450
|
]
|
|
451
451
|
}
|
package/adminWww/index.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!doctype html><html lang="en" translate="no"><head><meta charset="utf-8"/><link rel="icon" href="./favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no"/><meta name="theme-color" content="#000000"/><meta name="description" content="admin - ioBroker"/><link rel="apple-touch-icon" href="./logo192.png"/><link rel="stylesheet" href="./css/leaflet.css"/><link rel="manifest" href="./manifest.json" crossorigin="use-credentials"/><script type="text/javascript" onerror="setTimeout(function(){window.location.reload()}, 5000)" src="./lib/js/socket.io.js"></script><script type="text/javascript" src="./lib/js/sparkline.js"></script><title>Admin</title><script>window.loginHideLogo="@@loginHideLogo@@",window.loginMotto="@@loginMotto@@",window.login="@@auth@@",window.loginLogo="@@loginLogo@@",window.loginLink="@@loginLink@@",window.loginTitle="@@loginTitle@@",window.loginBackgroundColor="@@loginBackgroundColor@@",window.loginBackgroundImage="@@loginBackgroundImage@@",window.vendorPrefix="@@vendorPrefix@@",window.disableDataReporting="@@disableDataReporting@@",window.loadingBackgroundColor="@@loadingBackgroundColor@@",window.loadingBackgroundImage="@@loadingBackgroundImage@@",window.loadingHideLogo="@@loadingHideLogo@@"</script><style>.root{background-color:rgba(255,255,255,.87);border-radius:10px}.unsupported{width:200px;background-color:#aaa;margin:auto;margin-top:3rem;padding:10px;line-height:25px;border-radius:4px;text-align:center}.leaflet-container{height:400px;width:100%}</style><script>setTimeout((()=>{const o=document.body;window.location.search.includes("?login")?(window.loginBackgroundColor&&-1===window.loginBackgroundColor.indexOf("loginBackgroundColor")&&(o.style.backgroundColor=window.loginBackgroundColor),window.loginBackgroundImage&&-1===window.loginBackgroundImage.indexOf("loginBackgroundImage")&&(o.style.backgroundImage="url("+window.loginBackgroundImage+")",o.style.backgroundSize="cover")):(window.loadingBackgroundColor&&-1===window.loadingBackgroundColor.indexOf("loadingBackgroundColor")&&(o.style.backgroundColor=window.loadingBackgroundColor),window.loadingBackgroundImage&&-1===window.loadingBackgroundImage.indexOf("loadingBackgroundImage")&&(o.style.backgroundImage="url("+window.loadingBackgroundImage+")",o.style.backgroundSize="cover"))}),0),window.addEventListener("load",(function o(n){window.removeEventListener("load",o,!1);if(window.navigator.userAgent.indexOf("MSIE ")>0||navigator.userAgent.match(/Trident.*rv\:11\./)){const o=document.getElementById("root");o.classList.add("unsupported"),o.innerHTML="Browser is not supported. Please use Firefox or Chrome."}}),!1)</script><script defer="defer" src="static/js/main.
|
|
1
|
+
<!doctype html><html lang="en" translate="no"><head><meta charset="utf-8"/><link rel="icon" href="./favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no"/><meta name="theme-color" content="#000000"/><meta name="description" content="admin - ioBroker"/><link rel="apple-touch-icon" href="./logo192.png"/><link rel="stylesheet" href="./css/leaflet.css"/><link rel="manifest" href="./manifest.json" crossorigin="use-credentials"/><script type="text/javascript" onerror="setTimeout(function(){window.location.reload()}, 5000)" src="./lib/js/socket.io.js"></script><script type="text/javascript" src="./lib/js/sparkline.js"></script><title>Admin</title><script>window.loginHideLogo="@@loginHideLogo@@",window.loginMotto="@@loginMotto@@",window.login="@@auth@@",window.loginLogo="@@loginLogo@@",window.loginLink="@@loginLink@@",window.loginTitle="@@loginTitle@@",window.loginBackgroundColor="@@loginBackgroundColor@@",window.loginBackgroundImage="@@loginBackgroundImage@@",window.vendorPrefix="@@vendorPrefix@@",window.disableDataReporting="@@disableDataReporting@@",window.loadingBackgroundColor="@@loadingBackgroundColor@@",window.loadingBackgroundImage="@@loadingBackgroundImage@@",window.loadingHideLogo="@@loadingHideLogo@@"</script><style>.root{background-color:rgba(255,255,255,.87);border-radius:10px}.unsupported{width:200px;background-color:#aaa;margin:auto;margin-top:3rem;padding:10px;line-height:25px;border-radius:4px;text-align:center}.leaflet-container{height:400px;width:100%}</style><script>setTimeout((()=>{const o=document.body;window.location.search.includes("?login")?(window.loginBackgroundColor&&-1===window.loginBackgroundColor.indexOf("loginBackgroundColor")&&(o.style.backgroundColor=window.loginBackgroundColor),window.loginBackgroundImage&&-1===window.loginBackgroundImage.indexOf("loginBackgroundImage")&&(o.style.backgroundImage="url("+window.loginBackgroundImage+")",o.style.backgroundSize="cover")):(window.loadingBackgroundColor&&-1===window.loadingBackgroundColor.indexOf("loadingBackgroundColor")&&(o.style.backgroundColor=window.loadingBackgroundColor),window.loadingBackgroundImage&&-1===window.loadingBackgroundImage.indexOf("loadingBackgroundImage")&&(o.style.backgroundImage="url("+window.loadingBackgroundImage+")",o.style.backgroundSize="cover"))}),0),window.addEventListener("load",(function o(n){window.removeEventListener("load",o,!1);if(window.navigator.userAgent.indexOf("MSIE ")>0||navigator.userAgent.match(/Trident.*rv\:11\./)){const o=document.getElementById("root");o.classList.add("unsupported"),o.innerHTML="Browser is not supported. Please use Firefox or Chrome."}}),!1)</script><script defer="defer" src="static/js/main.a833ed54.js"></script></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static/js/1892.3c30ecff.chunk.js","mappings":"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","sources":["tabs/Logs.tsx"],"sourcesContent":["import React, { Component, type JSX } from 'react';\n\nimport {\n Button,\n IconButton,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n TextField,\n Typography,\n Menu,\n MenuItem,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Badge,\n LinearProgress,\n FormControl,\n Select,\n Tooltip,\n type SelectChangeEvent,\n Box,\n} from '@mui/material';\n\nimport {\n Close as CloseIcon,\n Delete as DeleteIcon,\n DeleteForever as DeleteForeverIcon,\n Pause as PauseIcon,\n Refresh as RefreshIcon,\n SaveAlt as SaveAltIcon,\n ErrorOutline as ErrorIcon,\n Warning as WarningIcon,\n Check as CheckIcon,\n ArrowUpward,\n ArrowDownward,\n Clear,\n} from '@mui/icons-material';\nimport { FaPalette as ColorsIcon } from 'react-icons/fa';\n\nimport { amber, grey, red } from '@mui/material/colors';\n\nimport {\n Icon,\n withWidth,\n Utils,\n TabHeader,\n type IobTheme,\n type ThemeType,\n type Translate,\n type AdminConnection,\n TabContainer,\n TabContent,\n} from '@iobroker/adapter-react-v5';\n\nimport type LogsWorker from '@/Workers/LogsWorker';\nimport type { LogLineSaved } from '@/Workers/LogsWorker';\nimport type { CompactAdapterInfo, CompactHost } from '@/types';\n\nimport AdminUtils from '../helpers/AdminUtils';\n\nconst MAX_LOGS = 3000;\n\nconst styles: Record<string, any> = {\n container: {\n height: '100%',\n },\n table: {\n tableLayout: 'fixed',\n minWidth: 960,\n '& td,th': {\n padding: '3px 4px',\n },\n '& td:nth-of-type(5)': {\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n },\n },\n row: {\n '@media screen and (max-width: 450px)': {\n '& > *': {\n fontSize: '8px !important',\n },\n },\n },\n rowOdd: (theme: IobTheme) => ({\n backgroundColor: theme.palette.background.default,\n }),\n cell: {\n verticalAlign: 'top',\n },\n cellName: {\n lineHeight: '14px',\n },\n updatedRow: {\n animation: 'updated 1s',\n },\n formControl: {\n width: '100%',\n '@media screen and (max-width: 450px)': {\n '& > *': {\n fontSize: '10px !important',\n },\n position: 'relative',\n },\n },\n light_error: {\n color: red[800],\n },\n light_warn: {\n color: amber[800],\n },\n light_debug: {\n color: grey[800],\n },\n light_silly: {\n color: grey[700],\n },\n dark_error: {\n color: red[200],\n },\n dark_warn: {\n color: amber[200],\n },\n dark_debug: {\n color: '#b1b1b1',\n },\n dark_silly: {\n color: '#7e7e7e',\n },\n source: {\n width: 200,\n '@media screen and (max-width: 450px)': {\n width: 120,\n },\n },\n pid: {\n width: 55,\n '@media screen and (max-width: 450px)': {\n width: 40,\n },\n },\n timestamp: {\n width: 175,\n '@media screen and (max-width: 450px)': {\n width: 100,\n },\n },\n severity: {\n width: 80,\n '@media screen and (max-width: 450px)': {\n width: 61,\n },\n },\n message: {\n minWidth: 300,\n '@media screen and (max-width: 450px)': {\n minWidth: 150,\n },\n },\n hidden: {\n display: 'none',\n },\n grow: {\n flexGrow: 1,\n },\n logSize: {\n marginRight: '1rem',\n marginLeft: '1rem',\n },\n logEstimated: {\n fontStyle: 'italic',\n },\n closeButton: (theme: IobTheme) => ({\n position: 'absolute',\n right: 8,\n top: 8,\n color: theme.palette.grey[500],\n }),\n header: (theme: IobTheme) => ({\n '& .MuiFormLabel-root.Mui-disabled': {\n color: theme.palette.text.primary,\n },\n '& .MuiInput-underline::before': {\n content: '\"\"',\n borderBottom: 'none',\n },\n '@media screen and (max-width: 450px)': {\n '& > *': {\n fontSize: '10px !important',\n },\n },\n }),\n pauseButton: {\n minWidth: 48,\n },\n pauseCount: {\n color: amber[500],\n },\n downloadLogSize: {\n color: grey[500],\n marginLeft: 16,\n },\n downloadEntry: {\n display: 'flex',\n justifyContent: 'space-between',\n },\n pidSize: {\n fontSize: 14,\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n },\n messageText: {\n '@media screen and (max-width: 450px)': {\n '& > *': {\n fontSize: '10px !important',\n },\n },\n },\n badge: {\n top: 10,\n right: 10,\n },\n badgeError: {\n // color: red[500],\n },\n badgeWarn: {\n backgroundColor: amber[500],\n },\n emptyButton: {\n width: 48,\n },\n icon: {\n width: 16,\n height: 16,\n },\n iconSelect: {\n width: 24,\n height: 25,\n marginRight: 4,\n },\n name: {\n verticalAlign: 'top',\n display: 'inline-block',\n marginTop: 1,\n marginLeft: 2,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n width: '100%',\n textOverflow: 'ellipsis',\n },\n iconAndName: {\n whiteSpace: 'nowrap',\n display: 'flex',\n },\n tooltip: {\n pointerEvents: 'none',\n },\n};\n\nconst COLORS_LIGHT = [\n '#ffadad30',\n '#ffd6a530',\n '#fdffb630',\n '#caffbf30',\n '#9bf6ff30',\n '#a0c4ff30',\n '#bdb2ff30',\n '#ffc6ff30',\n '#fffffc30',\n];\n\nconst COLORS_DARK = [\n 'rgba(255,109,109,0.1)',\n 'rgba(253,173,84,0.1)',\n 'rgba(241,255,88,0.1)',\n 'rgba(115,253,81,0.1)',\n 'rgba(71,235,255,0.1)',\n 'rgba(74,145,255,0.1)',\n 'rgba(108,85,255,0.1)',\n 'rgba(250,77,250,0.1)',\n 'rgba(255,255,105,0.1)',\n];\n\ninterface LogLineSavedExtended extends LogLineSaved {\n odd?: boolean;\n time?: string;\n icon?: string;\n}\n\ninterface LogsProps {\n socket: AdminConnection;\n currentHost: string;\n clearErrors: () => void;\n logsWorker: LogsWorker;\n themeType: ThemeType;\n t: Translate;\n width: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n theme: IobTheme;\n}\n\ninterface LogsState {\n source: string;\n severity: string;\n message: string;\n reverse: boolean;\n logDeleteDialog: boolean;\n logDownloadDialog: HTMLButtonElement | null;\n logFiles: { path: { fileName: string; size: number }; name: string }[];\n logs: LogLineSavedExtended[] | null;\n logSize: number | null;\n logErrors: number;\n logWarnings: number;\n estimatedSize: boolean;\n pause: number;\n pid: boolean;\n colors: boolean;\n adapters: Record<string, CompactAdapterInfo>;\n sources: Record<string, { active: boolean; icon: string; color?: string }>;\n currentHost: string;\n hosts: Record<string, CompactHost>;\n}\n\nclass Logs extends Component<LogsProps, LogsState> {\n private readonly severities: Record<string, number>;\n\n private readonly t: Translate;\n\n private ignoreNextLogs: boolean;\n\n private lastRowRender: number;\n\n private lastRowRenderTimeout: ReturnType<typeof setTimeout> | null = null;\n\n private readLogsInProcess: boolean;\n\n private hostsTimer: ReturnType<typeof setTimeout> | null = null;\n\n private scrollToEnd: boolean;\n\n constructor(props: LogsProps) {\n super(props);\n\n this.state = {\n source: (((window as any)._localStorage as Storage) || window.localStorage).getItem('Log.source') || '1',\n severity:\n (((window as any)._localStorage as Storage) || window.localStorage).getItem('Log.severity') || 'debug',\n message: (((window as any)._localStorage as Storage) || window.localStorage).getItem('Log.message') || '',\n reverse:\n (((window as any)._localStorage as Storage) || window.localStorage).getItem('Log.reverse') === 'true',\n logDeleteDialog: false,\n logDownloadDialog: null,\n logFiles: [],\n logs: null,\n logSize: null,\n logErrors: 0,\n logWarnings: 0,\n estimatedSize: true,\n pause: 0,\n // pauseCount: 0,\n pid: (((window as any)._localStorage as Storage) || window.localStorage).getItem('Logs.pid') === 'true',\n colors:\n (((window as any)._localStorage as Storage) || window.localStorage).getItem('Logs.colors') === 'true',\n adapters: {},\n sources: {},\n currentHost: this.props.currentHost,\n hosts: null,\n };\n\n this.scrollToEnd = this.state.reverse;\n\n this.severities = {\n silly: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n };\n\n this.t = props.t;\n }\n\n readLogs(\n force: boolean,\n logFiles?: { path: { fileName: string; size: number }; name: string }[],\n cb?: () => void,\n ): void {\n if (this.props.logsWorker && this.state.hosts) {\n void this.props.logsWorker.getLogs(force).then(results => {\n if (!results) {\n return;\n }\n const logs: LogLineSavedExtended[] = [...results.logs];\n const logSize = results.logSize;\n\n let logWarnings = 0;\n let logErrors = 0;\n let lastOdd = true;\n const sources: Record<string, { active: boolean; icon: string; color?: string }> = JSON.parse(\n JSON.stringify(this.state.sources),\n );\n Object.values(sources).forEach(source => (source.active = false));\n\n logs.forEach(item => {\n lastOdd = !lastOdd;\n item.odd = lastOdd;\n\n if (!item.time) {\n const date = new Date(item.ts);\n item.time =\n `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ` +\n `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}.${date.getMilliseconds().toString().padStart(3, '0')}`;\n }\n if (item.severity === 'error') {\n logErrors++;\n } else if (item.severity === 'warn') {\n logWarnings++;\n }\n\n if (item.from) {\n if (!sources[item.from]) {\n sources[item.from] = { active: true, icon: this.getSourceIcon(item.from) };\n } else {\n sources[item.from].active = true;\n }\n }\n });\n\n // define for every source the own color\n let color = 0;\n const COLORS = this.props.themeType === 'dark' ? COLORS_DARK : COLORS_LIGHT;\n Object.keys(sources)\n .sort()\n .forEach(id => {\n sources[id].color = COLORS[color % COLORS.length];\n color++;\n });\n\n // scroll down by reverse direction\n this.scrollToEnd = this.state.reverse;\n\n const newState: Partial<LogsState> = {\n logs,\n logSize,\n estimatedSize: false,\n logErrors,\n logWarnings,\n sources,\n };\n if (logFiles) {\n newState.logFiles = logFiles;\n }\n this.setState(newState as LogsState, () => cb && cb());\n });\n } else if (logFiles) {\n this.setState({ logFiles }, () => cb && cb());\n }\n }\n\n async readLogFiles(): Promise<{ path: { fileName: string; size: number }; name: string }[]> {\n const list: { fileName: string; size: number }[] = await this.props.socket.getLogsFiles(this.state.currentHost);\n if (list?.length) {\n const logFiles: { path: { fileName: string; size: number }; name: string }[] = [];\n\n list.reverse();\n // first 2018-01-01\n list.forEach(file => {\n const parts = file.fileName.split('/');\n const name = parts\n .pop()\n .replace(/iobroker\\.?/, '')\n .replace('.log', '');\n\n if (name[0] <= '9') {\n logFiles.push({\n path: file,\n name,\n });\n }\n });\n\n // then restart.log and so on\n list.sort();\n list.forEach(file => {\n const parts = file.fileName.split('/');\n const name = parts\n .pop()\n .replace(/iobroker\\.?/, '')\n .replace('.log', '');\n\n if (name[0] > '9') {\n logFiles.push({\n path: file,\n name,\n });\n }\n });\n\n return logFiles;\n }\n return [];\n }\n\n componentDidMount(): void {\n // this.props.logsWorker && this.props.logsWorker.enableCountErrors(false);\n this.props.logsWorker.registerHandler(this.logHandler);\n this.props.clearErrors();\n\n void this.props.socket.getCompactAdapters().then(async (adapters: Record<string, CompactAdapterInfo>) => {\n const _hosts: CompactHost[] = await this.props.socket.getCompactHosts();\n const hosts: Record<string, CompactHost> = {};\n _hosts.forEach(item => (hosts[item._id] = item));\n\n await new Promise<void>(resolve => {\n this.setState({ adapters, hosts }, () => resolve());\n });\n const logFiles = await this.readLogFiles();\n this.readLogs(true, logFiles);\n });\n }\n\n componentWillUnmount(): void {\n // this.props.logsWorker && this.props.logsWorker.enableCountErrors(true);\n this.props.logsWorker.unregisterHandler(this.logHandler);\n this.props.clearErrors();\n }\n\n getSourceIcon(from: string): string | null {\n const adapterName = from.replace(/\\.\\d+$/, '');\n let icon = this.state.adapters[adapterName]?.icon;\n if (icon) {\n if (!icon.startsWith('data:image')) {\n icon = `./files/${adapterName}.admin/${icon}`;\n }\n } else if (this.state.hosts) {\n icon = this.state.hosts[`system.${from}`]?.common?.icon || 'img/no-image.png';\n }\n return icon || null;\n }\n\n logHandler = (newLogs: LogLineSaved[], size: number): void => {\n if (this.ignoreNextLogs) {\n this.ignoreNextLogs = false;\n return;\n }\n\n const oldLogs = this.state.logs || [];\n const logs = oldLogs.concat(newLogs);\n\n if (logs.length > MAX_LOGS) {\n logs.splice(0, logs.length - MAX_LOGS);\n }\n\n let logWarnings = 0;\n let logErrors = 0;\n let lastOdd = false;\n let sources: Record<string, { active: boolean; icon: string; color?: string }>;\n let color = Object.keys(this.state.sources).length;\n const COLORS = this.props.themeType === 'dark' ? COLORS_DARK : COLORS_LIGHT;\n\n logs.forEach(item => {\n if (item.odd !== undefined) {\n lastOdd = item.odd;\n } else {\n lastOdd = !lastOdd;\n item.odd = lastOdd;\n }\n if (!item.time) {\n const date = new Date(item.ts);\n item.time =\n `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ` +\n `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}.${date.getMilliseconds().toString().padStart(3, '0')}`;\n }\n if (item.severity === 'error') {\n logErrors++;\n } else if (item.severity === 'warn') {\n logWarnings++;\n }\n\n if (item.from) {\n if (!this.state.sources[item.from] && !sources?.[item.from]) {\n sources = sources || JSON.parse(JSON.stringify(this.state.sources));\n sources[item.from] = {\n active: true,\n color: COLORS[color % COLORS.length],\n icon: this.getSourceIcon(item.from),\n };\n color++;\n } else if (!this.state.sources[item.from]?.active && !sources?.[item.from]?.active) {\n sources = sources || JSON.parse(JSON.stringify(this.state.sources));\n sources[item.from].active = true;\n }\n }\n });\n\n const newState: Partial<LogsState> = {\n logs,\n logSize: this.state.logSize + size,\n estimatedSize: true,\n logWarnings,\n logErrors,\n };\n if (sources) {\n newState.sources = sources;\n }\n\n if (this.state.reverse) {\n // remember if the last element is visible\n const el = document.getElementById('endOfLog');\n this.scrollToEnd = el ? el.getBoundingClientRect().top < window.innerHeight : true;\n }\n\n this.setState(newState as LogsState);\n };\n\n clearLog(): void {\n this.props.logsWorker?.clearLines();\n this.props.clearErrors();\n this.setState({\n logs: [],\n logSize: null,\n logErrors: 0,\n logWarnings: 0,\n });\n }\n\n handleMessageChange(event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>): void {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem('Log.message', event.target.value);\n this.setState({ message: event.target.value });\n }\n\n handleSourceChange(source: string): void {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem('Log.source', source);\n this.setState({ source });\n }\n\n handleSeverityChange(event: SelectChangeEvent<string>): void {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem('Log.severity', event.target.value);\n this.setState({ severity: event.target.value });\n }\n\n handleLogDelete(): void {\n this.props.socket\n .delLogs(this.state.currentHost)\n .then(() => this.clearLog())\n .then(() => this.readLogs(true, null, () => this.setState({ logDeleteDialog: false })))\n .catch((error: string) => {\n this.setState({ logDeleteDialog: false });\n window.alert(error);\n });\n }\n\n handleLogPause(): void {\n this.setState({ pause: this.state.pause ? 0 : this.state.logs.length });\n }\n\n static openTab(path: string): void {\n const tab = window.open(path, '_blank');\n tab.focus();\n }\n\n getLogFiles(): JSX.Element[] {\n return this.state.logFiles.map(entry => (\n <MenuItem\n style={styles.downloadEntry}\n key={entry.name}\n onClick={() => {\n Logs.openTab(entry.path.fileName);\n this.setState({ logDownloadDialog: null });\n }}\n >\n {entry.name}\n <Typography\n style={styles.downloadLogSize}\n variant=\"caption\"\n >\n {AdminUtils.formatBytes(entry.path.size) || '-'}\n </Typography>\n </MenuItem>\n ));\n }\n\n getSeverities(): JSX.Element[] {\n const severities = [];\n\n for (const i in this.severities) {\n severities.push(\n <MenuItem\n value={i}\n key={i}\n style={styles[`${this.props.themeType}_${i}`]}\n >\n {i}\n </MenuItem>,\n );\n }\n\n return severities;\n }\n\n getSources(): JSX.Element[] {\n const sources = Object.keys(this.state.sources).sort();\n sources.unshift('1');\n\n return sources.map(id => (\n <MenuItem\n value={id}\n key={id}\n style={{\n backgroundColor: !this.state.colors || id === '1' ? undefined : this.state.sources[id].color,\n display: 'flex',\n alignItems: 'center',\n }}\n >\n {id === '1' ? null : (\n <Icon\n src={this.state.sources[id].icon || ''}\n style={styles.iconSelect}\n />\n )}\n {id === '1' ? this.t('Source (show all)') : id}\n </MenuItem>\n ));\n }\n\n getOneRow(\n i: number,\n rows: JSX.Element[],\n options: {\n filterMessage: string;\n sourceFilter: string;\n previousKey: number;\n keyPrefix: 'r' | '';\n length: number;\n },\n ): void {\n const row = this.state.logs[i];\n if (!row) {\n return;\n }\n const severity = row.severity;\n\n let message = row.message || '';\n let id = '';\n\n if (typeof message !== 'object') {\n const regExp = new RegExp(\n `${row.from.replace('.', '\\\\.').replace(')', '\\\\)').replace('(', '\\\\(')} \\\\(\\\\d+\\\\) `,\n 'g',\n );\n const matches = message.match(regExp);\n\n if (matches) {\n message = message.replace(matches[0], '');\n id = matches[0].split(' ')[1].match(/\\d+/g)[0];\n } else {\n message = message.replace(`${row.from} `, '');\n }\n }\n\n const isFrom = options.sourceFilter !== '1' && options.sourceFilter !== row.from;\n\n let isHidden = isFrom || this.severities[severity] < this.severities[this.state.severity];\n if (!isHidden && options.filterMessage) {\n if (typeof message === 'object') {\n isHidden = !message.original.toLowerCase().includes(options.filterMessage);\n } else {\n isHidden = !message.toLowerCase().includes(options.filterMessage);\n }\n }\n\n const key = options.previousKey === row.key ? i : row.key;\n options.previousKey = row.key;\n\n rows.push(\n <TableRow\n id={options.length === i ? 'endOfLog' : undefined}\n sx={Utils.getStyle(\n this.props.theme,\n styles.row,\n row.odd && styles.rowOdd,\n isHidden && styles.hidden,\n this.lastRowRender && row.ts > this.lastRowRender && styles.updatedRow,\n )}\n style={this.state.colors ? { backgroundColor: this.state.sources[row.from]?.color || undefined } : {}}\n key={options.keyPrefix + key}\n hover\n >\n <TableCell style={{ ...styles.cell, ...styles.cellName }}>\n <div style={styles.iconAndName}>\n <Icon\n src={this.state.sources[row.from]?.icon || ''}\n style={styles.icon}\n />\n <div style={styles.name}>{row.from}</div>\n </div>\n </TableCell>\n {this.state.pid && (\n <TableCell style={{ ...styles.cell, ...styles[`${this.props.themeType}_${severity}`] }}>\n {id}\n </TableCell>\n )}\n <TableCell style={{ ...styles.cell, ...styles[`${this.props.themeType}_${severity}`] }}>\n {row.time}\n </TableCell>\n <TableCell\n style={{ ...styles.cell, ...styles[`${this.props.themeType}_${severity}`], fontWeight: 'bold' }}\n >\n {row.severity}\n </TableCell>\n <TableCell\n style={{ ...styles.cell, ...styles[`${this.props.themeType}_${severity}`] }}\n title={typeof message === 'object' ? message.original : message}\n >\n {typeof message === 'object'\n ? message.parts.map((item, idx) => (\n <span\n key={idx}\n style={item.style}\n >\n {item.text}\n </span>\n ))\n : message}\n </TableCell>\n </TableRow>,\n );\n }\n\n getRows(): JSX.Element[] {\n const rows: JSX.Element[] = [];\n const options: {\n filterMessage: string;\n sourceFilter: string;\n previousKey: number;\n keyPrefix: 'r' | '';\n length: number;\n } = {\n filterMessage: this.state.message.toLowerCase(),\n sourceFilter: this.state.source,\n previousKey: 0,\n keyPrefix: '',\n length: 0,\n };\n const sources = Object.keys(this.state.sources).sort();\n sources.unshift('1');\n if (!sources.includes(options.sourceFilter)) {\n options.sourceFilter = '1';\n }\n\n options.previousKey = 0;\n options.keyPrefix = this.state.reverse ? 'r' : '';\n options.length = this.state.pause > 0 ? this.state.pause - 1 : this.state.logs.length - 1;\n if (this.state.reverse) {\n for (let i = 0; i <= options.length; i++) {\n this.getOneRow(i, rows, options);\n }\n } else {\n for (let i = options.length; i >= 0; i--) {\n this.getOneRow(i, rows, options);\n }\n }\n\n // Scroll to last element\n if (options.length > 0 && this.scrollToEnd) {\n setTimeout(() => {\n const el = document.getElementById('endOfLog');\n el?.scrollIntoView();\n }, 200);\n this.scrollToEnd = false;\n }\n\n if (!this.lastRowRender || Date.now() - this.lastRowRender > 1000) {\n if (!this.lastRowRenderTimeout) {\n this.lastRowRenderTimeout = setTimeout(() => {\n this.lastRowRenderTimeout = null;\n this.lastRowRender = Date.now();\n }, 1000);\n }\n }\n\n return rows;\n }\n\n renderClearDialog(): JSX.Element {\n if (!this.state.logDeleteDialog) {\n return null;\n }\n\n return (\n <Dialog\n onClose={() => this.setState({ logDeleteDialog: false })}\n open={!0}\n >\n <DialogTitle>\n {this.t('Please confirm')}\n <IconButton\n size=\"large\"\n sx={styles.closeButton}\n onClick={() => this.setState({ logDeleteDialog: false })}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent dividers>\n <Typography gutterBottom>{this.t('Log file will be deleted. Are you sure?')}</Typography>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n autoFocus\n onClick={() => this.handleLogDelete()}\n color=\"primary\"\n startIcon={<CheckIcon />}\n >\n {this.t('Ok')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => this.setState({ logDeleteDialog: false })}\n color=\"grey\"\n startIcon={<CloseIcon />}\n >\n {this.t('Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n changePid(): void {\n const pid = !this.state.pid;\n (((window as any)._localStorage as Storage) || window.localStorage).setItem('Logs.pid', pid ? 'true' : 'false');\n this.setState({ pid });\n }\n\n renderToolbar(): JSX.Element {\n const pauseChild = !this.state.pause ? (\n <PauseIcon />\n ) : (\n <Typography style={styles.pauseCount}>{this.state.logs.length - this.state.pause}</Typography>\n );\n\n const isMobile = this.props.width === 'xs' || this.props.width === 'sm';\n\n const downloadLogButton = isMobile ? (\n <IconButton\n color=\"primary\"\n onClick={event => this.setState({ logDownloadDialog: event.currentTarget })}\n >\n <SaveAltIcon />\n </IconButton>\n ) : (\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<SaveAltIcon />}\n onClick={event => this.setState({ logDownloadDialog: event.currentTarget })}\n >\n {this.t('Download log')}\n </Button>\n );\n\n return (\n <TabHeader>\n <Tooltip\n title={this.props.t('Refresh log')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.readLogs(true)}\n >\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n <Tooltip\n title={this.props.t('Pause output')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n style={styles.pauseButton}\n onClick={() => this.handleLogPause()}\n >\n {pauseChild}\n </IconButton>\n </Tooltip>\n <Tooltip\n title={this.props.t('Clear log')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.clearLog()}\n >\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n <Tooltip\n title={this.props.t('Clear on disk permanent')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.setState({ logDeleteDialog: true })}\n >\n <DeleteForeverIcon />\n </IconButton>\n </Tooltip>\n <Tooltip\n title={this.props.t('Show/hide PID')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.changePid()}\n color={!this.state.pid ? 'default' : 'primary'}\n >\n <div style={styles.pidSize}>{this.props.t('PID')}</div>\n </IconButton>\n </Tooltip>\n <Tooltip\n title={this.props.t('Show/hide colors')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'Logs.colors',\n this.state.colors ? 'false' : 'true',\n );\n this.setState({ colors: !this.state.colors });\n }}\n color={!this.state.colors ? 'default' : 'primary'}\n >\n <ColorsIcon style={{ width: '0.8em', height: '0.8em' }} />\n </IconButton>\n </Tooltip>\n <Tooltip\n title={this.props.t('Reverse output direction')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'Log.reverse',\n this.state.reverse ? 'false' : 'true',\n );\n this.setState({ reverse: !this.state.reverse });\n setTimeout(() => {\n // scroll to endOfLog\n const element = document.getElementById('endOfLog');\n element?.scrollIntoView();\n }, 500);\n }}\n color={!this.state.reverse ? 'default' : 'primary'}\n >\n {this.state.reverse ? <ArrowDownward /> : <ArrowUpward />}\n </IconButton>\n </Tooltip>\n <Tooltip\n title={this.props.t('Show errors')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <Badge\n badgeContent={this.state.logErrors}\n color=\"error\"\n sx={{ '& .MuiBadge-badge': { ...styles.badge, ...styles.badgeError } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => {\n if (this.state.severity === 'error') {\n this.setState({ severity: 'debug' });\n } else {\n this.setState({ severity: 'error', logErrors: 0 });\n }\n }}\n color={this.state.severity === 'error' ? 'primary' : 'default'}\n >\n <ErrorIcon />\n </IconButton>\n </Badge>\n </Tooltip>\n <Tooltip\n title={this.props.t('Show errors and warnings')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <Badge\n badgeContent={this.state.logWarnings}\n color=\"default\"\n sx={{ '& .MuiBadge-badge': { ...styles.badge, ...styles.badgeWarn } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => {\n if (this.state.severity === 'warn') {\n this.setState({ severity: 'debug' });\n } else {\n this.setState({ severity: 'warn', logWarnings: 0 });\n }\n }}\n color={this.state.severity === 'warn' ? 'primary' : 'default'}\n >\n <WarningIcon />\n </IconButton>\n </Badge>\n </Tooltip>\n <div style={styles.grow} />\n {this.state.logFiles?.length ? downloadLogButton : null}\n {this.state.logDownloadDialog ? (\n <Menu\n id=\"simple-menu\"\n anchorEl={this.state.logDownloadDialog}\n keepMounted\n open={Boolean(this.state.logDownloadDialog)}\n onClose={() => this.setState({ logDownloadDialog: null })}\n >\n {this.getLogFiles()}\n </Menu>\n ) : null}\n {isMobile ? null : <div style={styles.grow} />}\n {isMobile ? null : (\n <Typography\n variant=\"body2\"\n title={this.state.estimatedSize ? this.props.t('Estimated size') : ''}\n style={styles.logSize}\n >\n {this.t('Log size:')}{' '}\n <span style={this.state.estimatedSize ? styles.logEstimated : undefined}>\n {this.state.logSize === null ? '-' : AdminUtils.formatBytes(this.state.logSize)}\n </span>\n </Typography>\n )}\n </TabHeader>\n );\n }\n\n renderTableHeader(): JSX.Element {\n const sources = Object.keys(this.state.sources).sort();\n sources.unshift('1');\n\n return (\n <TableHead>\n <TableRow>\n <TableCell sx={styles.source}>\n <FormControl\n variant=\"standard\"\n sx={styles.formControl}\n >\n <Select\n variant=\"standard\"\n labelId=\"source-label\"\n value={sources.includes(this.state.source) ? this.state.source : '1'}\n onChange={event => this.handleSourceChange(event.target.value)}\n renderValue={(value: string) => (\n <div\n style={{\n backgroundColor:\n !this.state.colors || value === '1'\n ? undefined\n : this.state.sources[value].color,\n display: 'flex',\n alignItems: 'center',\n }}\n >\n {value === '1' ? null : (\n <Icon\n src={this.state.sources[value].icon || ''}\n style={styles.iconSelect}\n />\n )}\n {value === '1' ? this.t('Source') : value}\n </div>\n )}\n >\n {this.getSources()}\n </Select>\n {(sources.includes(this.state.source) ? this.state.source : '1') !== '1' ? (\n <IconButton\n sx={{\n position: 'absolute',\n top: 1,\n right: 15,\n zIndex: 1,\n }}\n size=\"small\"\n onClick={() => this.handleSourceChange('1')}\n >\n <Clear />\n </IconButton>\n ) : null}\n </FormControl>\n </TableCell>\n {this.state.pid && (\n <TableCell sx={styles.pid}>\n <Box\n component=\"div\"\n sx={styles.header}\n >\n {this.t('PID')}\n </Box>\n </TableCell>\n )}\n <TableCell sx={styles.timestamp}>\n <Box\n component=\"div\"\n sx={styles.header}\n >\n {this.t('Time')}\n </Box>\n </TableCell>\n <TableCell sx={styles.severity}>\n <FormControl\n variant=\"standard\"\n style={styles.formControl}\n >\n <Select\n variant=\"standard\"\n labelId=\"severity-label\"\n value={this.state.severity}\n onChange={event => this.handleSeverityChange(event)}\n renderValue={value => (\n <span style={styles[`${this.props.themeType}_${value}`]}>{value}</span>\n )}\n >\n {this.getSeverities()}\n </Select>\n </FormControl>\n </TableCell>\n <TableCell sx={styles.message}>\n <FormControl\n variant=\"standard\"\n style={styles.formControl}\n >\n <TextField\n variant=\"standard\"\n sx={styles.messageText}\n placeholder={this.t('Message')}\n onChange={event => this.handleMessageChange(event)}\n value={this.state.message}\n slotProps={{\n input: {\n endAdornment: this.state.message ? (\n <IconButton\n size=\"small\"\n onClick={() => {\n (\n ((window as any)._localStorage as Storage) ||\n window.localStorage\n ).removeItem('Log.message');\n this.setState({ message: '' });\n }}\n >\n <CloseIcon />\n </IconButton>\n ) : null,\n },\n }}\n />\n </FormControl>\n </TableCell>\n </TableRow>\n </TableHead>\n );\n }\n\n render(): JSX.Element {\n if (!this.state.logs) {\n return <LinearProgress />;\n }\n\n if (this.state.logFiles === null && !this.readLogsInProcess) {\n this.readLogsInProcess = true;\n setTimeout(\n () =>\n this.readLogFiles().then(logFiles => {\n this.readLogsInProcess = false;\n this.setState({ logFiles });\n }),\n 100,\n );\n }\n\n if (this.props.currentHost !== this.state.currentHost) {\n this.hostsTimer =\n this.hostsTimer ||\n setTimeout(() => {\n this.hostsTimer = null;\n this.setState(\n {\n currentHost: this.props.currentHost,\n logs: [],\n logFiles: null,\n },\n () => this.readLogs(true),\n );\n }, 200);\n }\n\n return (\n <TabContainer>\n {this.renderToolbar()}\n <TabContent>\n <TableContainer style={styles.container}>\n <Table\n stickyHeader\n size=\"small\"\n sx={styles.table}\n >\n {this.renderTableHeader()}\n <TableBody>{this.getRows()}</TableBody>\n </Table>\n </TableContainer>\n </TabContent>\n {this.renderClearDialog()}\n </TabContainer>\n );\n }\n}\n\nexport default withWidth()(Logs);\n"],"names":["styles","container","height","table","tableLayout","minWidth","padding","overflow","whiteSpace","textOverflow","row","fontSize","rowOdd","theme","backgroundColor","palette","background","default","cell","verticalAlign","cellName","lineHeight","updatedRow","animation","formControl","width","position","light_error","color","red","light_warn","amber","light_debug","grey","light_silly","dark_error","dark_warn","dark_debug","dark_silly","source","pid","timestamp","severity","message","hidden","display","grow","flexGrow","logSize","marginRight","marginLeft","logEstimated","fontStyle","closeButton","right","top","header","text","primary","content","borderBottom","pauseButton","pauseCount","downloadLogSize","downloadEntry","justifyContent","pidSize","alignItems","messageText","badge","badgeError","badgeWarn","emptyButton","icon","iconSelect","name","marginTop","iconAndName","tooltip","pointerEvents","COLORS_LIGHT","COLORS_DARK","Logs","Component","constructor","props","super","severities","t","ignoreNextLogs","lastRowRender","lastRowRenderTimeout","readLogsInProcess","hostsTimer","scrollToEnd","logHandler","newLogs","size","this","logs","state","concat","length","splice","sources","logWarnings","logErrors","lastOdd","Object","keys","COLORS","themeType","forEach","item","undefined","odd","time","date","Date","ts","getFullYear","getMonth","toString","padStart","getDate","getHours","getMinutes","getSeconds","getMilliseconds","_sources","_this$state$sources$i","_sources2","_sources2$item$from","from","active","JSON","parse","stringify","getSourceIcon","newState","estimatedSize","reverse","el","document","getElementById","getBoundingClientRect","window","innerHeight","setState","_localStorage","localStorage","getItem","logDeleteDialog","logDownloadDialog","logFiles","pause","colors","adapters","currentHost","hosts","silly","debug","info","warn","error","readLogs","force","cb","logsWorker","getLogs","then","results","values","sort","id","readLogFiles","list","socket","getLogsFiles","file","fileName","split","pop","replace","push","path","componentDidMount","registerHandler","clearErrors","getCompactAdapters","async","_hosts","getCompactHosts","_id","Promise","resolve","componentWillUnmount","unregisterHandler","_this$state$adapters$","adapterName","startsWith","_this$state$hosts","_this$state$hosts$com","common","clearLog","_this$props$logsWorke","clearLines","handleMessageChange","event","setItem","target","value","handleSourceChange","handleSeverityChange","handleLogDelete","delLogs","catch","alert","handleLogPause","openTab","open","focus","getLogFiles","map","entry","_jsxs","MenuItem","style","onClick","children","_jsx","Typography","variant","AdminUtils","formatBytes","getSeverities","i","getSources","unshift","Icon","src","getOneRow","rows","options","_this$state$sources$r","_this$state$sources$r2","regExp","RegExp","matches","match","isHidden","sourceFilter","filterMessage","original","toLowerCase","includes","key","previousKey","TableRow","sx","Utils","getStyle","hover","TableCell","_objectSpread","fontWeight","title","parts","idx","keyPrefix","getRows","setTimeout","scrollIntoView","now","renderClearDialog","Dialog","onClose","DialogTitle","IconButton","CloseIcon","DialogContent","dividers","gutterBottom","DialogActions","Button","autoFocus","startIcon","CheckIcon","changePid","renderToolbar","_this$state$logFiles","pauseChild","PauseIcon","isMobile","downloadLogButton","currentTarget","SaveAltIcon","TabHeader","Tooltip","slotProps","popper","RefreshIcon","DeleteIcon","DeleteForeverIcon","ColorsIcon","element","ArrowDownward","ArrowUpward","Badge","badgeContent","ErrorIcon","WarningIcon","Menu","anchorEl","keepMounted","Boolean","renderTableHeader","TableHead","FormControl","Select","labelId","onChange","renderValue","zIndex","Clear","Box","component","TextField","placeholder","input","endAdornment","removeItem","render","TabContainer","TabContent","TableContainer","Table","stickyHeader","TableBody","LinearProgress","withWidth"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"static/js/1892.3c30ecff.chunk.js","mappings":"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","sources":["tabs/Logs.tsx"],"sourcesContent":["import React, { Component, type JSX } from 'react';\n\nimport {\n Button,\n IconButton,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n TextField,\n Typography,\n Menu,\n MenuItem,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Badge,\n LinearProgress,\n FormControl,\n Select,\n Tooltip,\n type SelectChangeEvent,\n Box,\n} from '@mui/material';\n\nimport {\n Close as CloseIcon,\n Delete as DeleteIcon,\n DeleteForever as DeleteForeverIcon,\n Pause as PauseIcon,\n Refresh as RefreshIcon,\n SaveAlt as SaveAltIcon,\n ErrorOutline as ErrorIcon,\n Warning as WarningIcon,\n Check as CheckIcon,\n ArrowUpward,\n ArrowDownward,\n Clear,\n} from '@mui/icons-material';\nimport { FaPalette as ColorsIcon } from 'react-icons/fa';\n\nimport { amber, grey, red } from '@mui/material/colors';\n\nimport {\n Icon,\n withWidth,\n Utils,\n TabHeader,\n type IobTheme,\n type ThemeType,\n type Translate,\n type AdminConnection,\n TabContainer,\n TabContent,\n} from '@iobroker/adapter-react-v5';\n\nimport type { LogLineSaved, LogsWorker } from '@/Workers/LogsWorker';\nimport type { CompactAdapterInfo, CompactHost } from '@/types';\n\nimport AdminUtils from '../helpers/AdminUtils';\n\nconst MAX_LOGS = 3000;\n\nconst styles: Record<string, any> = {\n container: {\n height: '100%',\n },\n table: {\n tableLayout: 'fixed',\n minWidth: 960,\n '& td,th': {\n padding: '3px 4px',\n },\n '& td:nth-of-type(5)': {\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n },\n },\n row: {\n '@media screen and (max-width: 450px)': {\n '& > *': {\n fontSize: '8px !important',\n },\n },\n },\n rowOdd: (theme: IobTheme) => ({\n backgroundColor: theme.palette.background.default,\n }),\n cell: {\n verticalAlign: 'top',\n },\n cellName: {\n lineHeight: '14px',\n },\n updatedRow: {\n animation: 'updated 1s',\n },\n formControl: {\n width: '100%',\n '@media screen and (max-width: 450px)': {\n '& > *': {\n fontSize: '10px !important',\n },\n position: 'relative',\n },\n },\n light_error: {\n color: red[800],\n },\n light_warn: {\n color: amber[800],\n },\n light_debug: {\n color: grey[800],\n },\n light_silly: {\n color: grey[700],\n },\n dark_error: {\n color: red[200],\n },\n dark_warn: {\n color: amber[200],\n },\n dark_debug: {\n color: '#b1b1b1',\n },\n dark_silly: {\n color: '#7e7e7e',\n },\n source: {\n width: 200,\n '@media screen and (max-width: 450px)': {\n width: 120,\n },\n },\n pid: {\n width: 55,\n '@media screen and (max-width: 450px)': {\n width: 40,\n },\n },\n timestamp: {\n width: 175,\n '@media screen and (max-width: 450px)': {\n width: 100,\n },\n },\n severity: {\n width: 80,\n '@media screen and (max-width: 450px)': {\n width: 61,\n },\n },\n message: {\n minWidth: 300,\n '@media screen and (max-width: 450px)': {\n minWidth: 150,\n },\n },\n hidden: {\n display: 'none',\n },\n grow: {\n flexGrow: 1,\n },\n logSize: {\n marginRight: '1rem',\n marginLeft: '1rem',\n },\n logEstimated: {\n fontStyle: 'italic',\n },\n closeButton: (theme: IobTheme) => ({\n position: 'absolute',\n right: 8,\n top: 8,\n color: theme.palette.grey[500],\n }),\n header: (theme: IobTheme) => ({\n '& .MuiFormLabel-root.Mui-disabled': {\n color: theme.palette.text.primary,\n },\n '& .MuiInput-underline::before': {\n content: '\"\"',\n borderBottom: 'none',\n },\n '@media screen and (max-width: 450px)': {\n '& > *': {\n fontSize: '10px !important',\n },\n },\n }),\n pauseButton: {\n minWidth: 48,\n },\n pauseCount: {\n color: amber[500],\n },\n downloadLogSize: {\n color: grey[500],\n marginLeft: 16,\n },\n downloadEntry: {\n display: 'flex',\n justifyContent: 'space-between',\n },\n pidSize: {\n fontSize: 14,\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n },\n messageText: {\n '@media screen and (max-width: 450px)': {\n '& > *': {\n fontSize: '10px !important',\n },\n },\n },\n badge: {\n top: 10,\n right: 10,\n },\n badgeError: {\n // color: red[500],\n },\n badgeWarn: {\n backgroundColor: amber[500],\n },\n emptyButton: {\n width: 48,\n },\n icon: {\n width: 16,\n height: 16,\n },\n iconSelect: {\n width: 24,\n height: 25,\n marginRight: 4,\n },\n name: {\n verticalAlign: 'top',\n display: 'inline-block',\n marginTop: 1,\n marginLeft: 2,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n width: '100%',\n textOverflow: 'ellipsis',\n },\n iconAndName: {\n whiteSpace: 'nowrap',\n display: 'flex',\n },\n tooltip: {\n pointerEvents: 'none',\n },\n};\n\nconst COLORS_LIGHT = [\n '#ffadad30',\n '#ffd6a530',\n '#fdffb630',\n '#caffbf30',\n '#9bf6ff30',\n '#a0c4ff30',\n '#bdb2ff30',\n '#ffc6ff30',\n '#fffffc30',\n];\n\nconst COLORS_DARK = [\n 'rgba(255,109,109,0.1)',\n 'rgba(253,173,84,0.1)',\n 'rgba(241,255,88,0.1)',\n 'rgba(115,253,81,0.1)',\n 'rgba(71,235,255,0.1)',\n 'rgba(74,145,255,0.1)',\n 'rgba(108,85,255,0.1)',\n 'rgba(250,77,250,0.1)',\n 'rgba(255,255,105,0.1)',\n];\n\ninterface LogLineSavedExtended extends LogLineSaved {\n odd?: boolean;\n time?: string;\n icon?: string;\n}\n\ninterface LogsProps {\n socket: AdminConnection;\n currentHost: string;\n clearErrors: () => void;\n logsWorker: LogsWorker;\n themeType: ThemeType;\n t: Translate;\n width: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n theme: IobTheme;\n}\n\ninterface LogsState {\n source: string;\n severity: string;\n message: string;\n reverse: boolean;\n logDeleteDialog: boolean;\n logDownloadDialog: HTMLButtonElement | null;\n logFiles: { path: { fileName: string; size: number }; name: string }[];\n logs: LogLineSavedExtended[] | null;\n logSize: number | null;\n logErrors: number;\n logWarnings: number;\n estimatedSize: boolean;\n pause: number;\n pid: boolean;\n colors: boolean;\n adapters: Record<string, CompactAdapterInfo>;\n sources: Record<string, { active: boolean; icon: string; color?: string }>;\n currentHost: string;\n hosts: Record<string, CompactHost>;\n}\n\nclass Logs extends Component<LogsProps, LogsState> {\n private readonly severities: Record<string, number>;\n\n private readonly t: Translate;\n\n private ignoreNextLogs: boolean;\n\n private lastRowRender: number;\n\n private lastRowRenderTimeout: ReturnType<typeof setTimeout> | null = null;\n\n private readLogsInProcess: boolean;\n\n private hostsTimer: ReturnType<typeof setTimeout> | null = null;\n\n private scrollToEnd: boolean;\n\n constructor(props: LogsProps) {\n super(props);\n\n this.state = {\n source: (((window as any)._localStorage as Storage) || window.localStorage).getItem('Log.source') || '1',\n severity:\n (((window as any)._localStorage as Storage) || window.localStorage).getItem('Log.severity') || 'debug',\n message: (((window as any)._localStorage as Storage) || window.localStorage).getItem('Log.message') || '',\n reverse:\n (((window as any)._localStorage as Storage) || window.localStorage).getItem('Log.reverse') === 'true',\n logDeleteDialog: false,\n logDownloadDialog: null,\n logFiles: [],\n logs: null,\n logSize: null,\n logErrors: 0,\n logWarnings: 0,\n estimatedSize: true,\n pause: 0,\n // pauseCount: 0,\n pid: (((window as any)._localStorage as Storage) || window.localStorage).getItem('Logs.pid') === 'true',\n colors:\n (((window as any)._localStorage as Storage) || window.localStorage).getItem('Logs.colors') === 'true',\n adapters: {},\n sources: {},\n currentHost: this.props.currentHost,\n hosts: null,\n };\n\n this.scrollToEnd = this.state.reverse;\n\n this.severities = {\n silly: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n };\n\n this.t = props.t;\n }\n\n readLogs(\n force: boolean,\n logFiles?: { path: { fileName: string; size: number }; name: string }[],\n cb?: () => void,\n ): void {\n if (this.props.logsWorker && this.state.hosts) {\n void this.props.logsWorker.getLogs(force).then(results => {\n if (!results) {\n return;\n }\n const logs: LogLineSavedExtended[] = [...results.logs];\n const logSize = results.logSize;\n\n let logWarnings = 0;\n let logErrors = 0;\n let lastOdd = true;\n const sources: Record<string, { active: boolean; icon: string; color?: string }> = JSON.parse(\n JSON.stringify(this.state.sources),\n );\n Object.values(sources).forEach(source => (source.active = false));\n\n logs.forEach(item => {\n lastOdd = !lastOdd;\n item.odd = lastOdd;\n\n if (!item.time) {\n const date = new Date(item.ts);\n item.time =\n `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ` +\n `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}.${date.getMilliseconds().toString().padStart(3, '0')}`;\n }\n if (item.severity === 'error') {\n logErrors++;\n } else if (item.severity === 'warn') {\n logWarnings++;\n }\n\n if (item.from) {\n if (!sources[item.from]) {\n sources[item.from] = { active: true, icon: this.getSourceIcon(item.from) };\n } else {\n sources[item.from].active = true;\n }\n }\n });\n\n // define for every source the own color\n let color = 0;\n const COLORS = this.props.themeType === 'dark' ? COLORS_DARK : COLORS_LIGHT;\n Object.keys(sources)\n .sort()\n .forEach(id => {\n sources[id].color = COLORS[color % COLORS.length];\n color++;\n });\n\n // scroll down by reverse direction\n this.scrollToEnd = this.state.reverse;\n\n const newState: Partial<LogsState> = {\n logs,\n logSize,\n estimatedSize: false,\n logErrors,\n logWarnings,\n sources,\n };\n if (logFiles) {\n newState.logFiles = logFiles;\n }\n this.setState(newState as LogsState, () => cb && cb());\n });\n } else if (logFiles) {\n this.setState({ logFiles }, () => cb && cb());\n }\n }\n\n async readLogFiles(): Promise<{ path: { fileName: string; size: number }; name: string }[]> {\n const list: { fileName: string; size: number }[] = await this.props.socket.getLogsFiles(this.state.currentHost);\n if (list?.length) {\n const logFiles: { path: { fileName: string; size: number }; name: string }[] = [];\n\n list.reverse();\n // first 2018-01-01\n list.forEach(file => {\n const parts = file.fileName.split('/');\n const name = parts\n .pop()\n .replace(/iobroker\\.?/, '')\n .replace('.log', '');\n\n if (name[0] <= '9') {\n logFiles.push({\n path: file,\n name,\n });\n }\n });\n\n // then restart.log and so on\n list.sort();\n list.forEach(file => {\n const parts = file.fileName.split('/');\n const name = parts\n .pop()\n .replace(/iobroker\\.?/, '')\n .replace('.log', '');\n\n if (name[0] > '9') {\n logFiles.push({\n path: file,\n name,\n });\n }\n });\n\n return logFiles;\n }\n return [];\n }\n\n componentDidMount(): void {\n // this.props.logsWorker && this.props.logsWorker.enableCountErrors(false);\n this.props.logsWorker.registerHandler(this.logHandler);\n this.props.clearErrors();\n\n void this.props.socket.getCompactAdapters().then(async (adapters: Record<string, CompactAdapterInfo>) => {\n const _hosts: CompactHost[] = await this.props.socket.getCompactHosts();\n const hosts: Record<string, CompactHost> = {};\n _hosts.forEach(item => (hosts[item._id] = item));\n\n await new Promise<void>(resolve => {\n this.setState({ adapters, hosts }, () => resolve());\n });\n const logFiles = await this.readLogFiles();\n this.readLogs(true, logFiles);\n });\n }\n\n componentWillUnmount(): void {\n // this.props.logsWorker && this.props.logsWorker.enableCountErrors(true);\n this.props.logsWorker.unregisterHandler(this.logHandler);\n this.props.clearErrors();\n }\n\n getSourceIcon(from: string): string | null {\n const adapterName = from.replace(/\\.\\d+$/, '');\n let icon = this.state.adapters[adapterName]?.icon;\n if (icon) {\n if (!icon.startsWith('data:image')) {\n icon = `./files/${adapterName}.admin/${icon}`;\n }\n } else if (this.state.hosts) {\n icon = this.state.hosts[`system.${from}`]?.common?.icon || 'img/no-image.png';\n }\n return icon || null;\n }\n\n logHandler = (newLogs: LogLineSaved[], size: number): void => {\n if (this.ignoreNextLogs) {\n this.ignoreNextLogs = false;\n return;\n }\n\n const oldLogs = this.state.logs || [];\n const logs = oldLogs.concat(newLogs);\n\n if (logs.length > MAX_LOGS) {\n logs.splice(0, logs.length - MAX_LOGS);\n }\n\n let logWarnings = 0;\n let logErrors = 0;\n let lastOdd = false;\n let sources: Record<string, { active: boolean; icon: string; color?: string }>;\n let color = Object.keys(this.state.sources).length;\n const COLORS = this.props.themeType === 'dark' ? COLORS_DARK : COLORS_LIGHT;\n\n logs.forEach(item => {\n if (item.odd !== undefined) {\n lastOdd = item.odd;\n } else {\n lastOdd = !lastOdd;\n item.odd = lastOdd;\n }\n if (!item.time) {\n const date = new Date(item.ts);\n item.time =\n `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ` +\n `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}.${date.getMilliseconds().toString().padStart(3, '0')}`;\n }\n if (item.severity === 'error') {\n logErrors++;\n } else if (item.severity === 'warn') {\n logWarnings++;\n }\n\n if (item.from) {\n if (!this.state.sources[item.from] && !sources?.[item.from]) {\n sources = sources || JSON.parse(JSON.stringify(this.state.sources));\n sources[item.from] = {\n active: true,\n color: COLORS[color % COLORS.length],\n icon: this.getSourceIcon(item.from),\n };\n color++;\n } else if (!this.state.sources[item.from]?.active && !sources?.[item.from]?.active) {\n sources = sources || JSON.parse(JSON.stringify(this.state.sources));\n sources[item.from].active = true;\n }\n }\n });\n\n const newState: Partial<LogsState> = {\n logs,\n logSize: this.state.logSize + size,\n estimatedSize: true,\n logWarnings,\n logErrors,\n };\n if (sources) {\n newState.sources = sources;\n }\n\n if (this.state.reverse) {\n // remember if the last element is visible\n const el = document.getElementById('endOfLog');\n this.scrollToEnd = el ? el.getBoundingClientRect().top < window.innerHeight : true;\n }\n\n this.setState(newState as LogsState);\n };\n\n clearLog(): void {\n this.props.logsWorker?.clearLines();\n this.props.clearErrors();\n this.setState({\n logs: [],\n logSize: null,\n logErrors: 0,\n logWarnings: 0,\n });\n }\n\n handleMessageChange(event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>): void {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem('Log.message', event.target.value);\n this.setState({ message: event.target.value });\n }\n\n handleSourceChange(source: string): void {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem('Log.source', source);\n this.setState({ source });\n }\n\n handleSeverityChange(event: SelectChangeEvent<string>): void {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem('Log.severity', event.target.value);\n this.setState({ severity: event.target.value });\n }\n\n handleLogDelete(): void {\n this.props.socket\n .delLogs(this.state.currentHost)\n .then(() => this.clearLog())\n .then(() => this.readLogs(true, null, () => this.setState({ logDeleteDialog: false })))\n .catch((error: string) => {\n this.setState({ logDeleteDialog: false });\n window.alert(error);\n });\n }\n\n handleLogPause(): void {\n this.setState({ pause: this.state.pause ? 0 : this.state.logs.length });\n }\n\n static openTab(path: string): void {\n const tab = window.open(path, '_blank');\n tab.focus();\n }\n\n getLogFiles(): JSX.Element[] {\n return this.state.logFiles.map(entry => (\n <MenuItem\n style={styles.downloadEntry}\n key={entry.name}\n onClick={() => {\n Logs.openTab(entry.path.fileName);\n this.setState({ logDownloadDialog: null });\n }}\n >\n {entry.name}\n <Typography\n style={styles.downloadLogSize}\n variant=\"caption\"\n >\n {AdminUtils.formatBytes(entry.path.size) || '-'}\n </Typography>\n </MenuItem>\n ));\n }\n\n getSeverities(): JSX.Element[] {\n const severities = [];\n\n for (const i in this.severities) {\n severities.push(\n <MenuItem\n value={i}\n key={i}\n style={styles[`${this.props.themeType}_${i}`]}\n >\n {i}\n </MenuItem>,\n );\n }\n\n return severities;\n }\n\n getSources(): JSX.Element[] {\n const sources = Object.keys(this.state.sources).sort();\n sources.unshift('1');\n\n return sources.map(id => (\n <MenuItem\n value={id}\n key={id}\n style={{\n backgroundColor: !this.state.colors || id === '1' ? undefined : this.state.sources[id].color,\n display: 'flex',\n alignItems: 'center',\n }}\n >\n {id === '1' ? null : (\n <Icon\n src={this.state.sources[id].icon || ''}\n style={styles.iconSelect}\n />\n )}\n {id === '1' ? this.t('Source (show all)') : id}\n </MenuItem>\n ));\n }\n\n getOneRow(\n i: number,\n rows: JSX.Element[],\n options: {\n filterMessage: string;\n sourceFilter: string;\n previousKey: number;\n keyPrefix: 'r' | '';\n length: number;\n },\n ): void {\n const row = this.state.logs[i];\n if (!row) {\n return;\n }\n const severity = row.severity;\n\n let message = row.message || '';\n let id = '';\n\n if (typeof message !== 'object') {\n const regExp = new RegExp(\n `${row.from.replace('.', '\\\\.').replace(')', '\\\\)').replace('(', '\\\\(')} \\\\(\\\\d+\\\\) `,\n 'g',\n );\n const matches = message.match(regExp);\n\n if (matches) {\n message = message.replace(matches[0], '');\n id = matches[0].split(' ')[1].match(/\\d+/g)[0];\n } else {\n message = message.replace(`${row.from} `, '');\n }\n }\n\n const isFrom = options.sourceFilter !== '1' && options.sourceFilter !== row.from;\n\n let isHidden = isFrom || this.severities[severity] < this.severities[this.state.severity];\n if (!isHidden && options.filterMessage) {\n if (typeof message === 'object') {\n isHidden = !message.original.toLowerCase().includes(options.filterMessage);\n } else {\n isHidden = !message.toLowerCase().includes(options.filterMessage);\n }\n }\n\n const key = options.previousKey === row.key ? i : row.key;\n options.previousKey = row.key;\n\n rows.push(\n <TableRow\n id={options.length === i ? 'endOfLog' : undefined}\n sx={Utils.getStyle(\n this.props.theme,\n styles.row,\n row.odd && styles.rowOdd,\n isHidden && styles.hidden,\n this.lastRowRender && row.ts > this.lastRowRender && styles.updatedRow,\n )}\n style={this.state.colors ? { backgroundColor: this.state.sources[row.from]?.color || undefined } : {}}\n key={options.keyPrefix + key}\n hover\n >\n <TableCell style={{ ...styles.cell, ...styles.cellName }}>\n <div style={styles.iconAndName}>\n <Icon\n src={this.state.sources[row.from]?.icon || ''}\n style={styles.icon}\n />\n <div style={styles.name}>{row.from}</div>\n </div>\n </TableCell>\n {this.state.pid && (\n <TableCell style={{ ...styles.cell, ...styles[`${this.props.themeType}_${severity}`] }}>\n {id}\n </TableCell>\n )}\n <TableCell style={{ ...styles.cell, ...styles[`${this.props.themeType}_${severity}`] }}>\n {row.time}\n </TableCell>\n <TableCell\n style={{ ...styles.cell, ...styles[`${this.props.themeType}_${severity}`], fontWeight: 'bold' }}\n >\n {row.severity}\n </TableCell>\n <TableCell\n style={{ ...styles.cell, ...styles[`${this.props.themeType}_${severity}`] }}\n title={typeof message === 'object' ? message.original : message}\n >\n {typeof message === 'object'\n ? message.parts.map((item, idx) => (\n <span\n key={idx}\n style={item.style}\n >\n {item.text}\n </span>\n ))\n : message}\n </TableCell>\n </TableRow>,\n );\n }\n\n getRows(): JSX.Element[] {\n const rows: JSX.Element[] = [];\n const options: {\n filterMessage: string;\n sourceFilter: string;\n previousKey: number;\n keyPrefix: 'r' | '';\n length: number;\n } = {\n filterMessage: this.state.message.toLowerCase(),\n sourceFilter: this.state.source,\n previousKey: 0,\n keyPrefix: '',\n length: 0,\n };\n const sources = Object.keys(this.state.sources).sort();\n sources.unshift('1');\n if (!sources.includes(options.sourceFilter)) {\n options.sourceFilter = '1';\n }\n\n options.previousKey = 0;\n options.keyPrefix = this.state.reverse ? 'r' : '';\n options.length = this.state.pause > 0 ? this.state.pause - 1 : this.state.logs.length - 1;\n if (this.state.reverse) {\n for (let i = 0; i <= options.length; i++) {\n this.getOneRow(i, rows, options);\n }\n } else {\n for (let i = options.length; i >= 0; i--) {\n this.getOneRow(i, rows, options);\n }\n }\n\n // Scroll to last element\n if (options.length > 0 && this.scrollToEnd) {\n setTimeout(() => {\n const el = document.getElementById('endOfLog');\n el?.scrollIntoView();\n }, 200);\n this.scrollToEnd = false;\n }\n\n if (!this.lastRowRender || Date.now() - this.lastRowRender > 1000) {\n if (!this.lastRowRenderTimeout) {\n this.lastRowRenderTimeout = setTimeout(() => {\n this.lastRowRenderTimeout = null;\n this.lastRowRender = Date.now();\n }, 1000);\n }\n }\n\n return rows;\n }\n\n renderClearDialog(): JSX.Element {\n if (!this.state.logDeleteDialog) {\n return null;\n }\n\n return (\n <Dialog\n onClose={() => this.setState({ logDeleteDialog: false })}\n open={!0}\n >\n <DialogTitle>\n {this.t('Please confirm')}\n <IconButton\n size=\"large\"\n sx={styles.closeButton}\n onClick={() => this.setState({ logDeleteDialog: false })}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent dividers>\n <Typography gutterBottom>{this.t('Log file will be deleted. Are you sure?')}</Typography>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n autoFocus\n onClick={() => this.handleLogDelete()}\n color=\"primary\"\n startIcon={<CheckIcon />}\n >\n {this.t('Ok')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => this.setState({ logDeleteDialog: false })}\n color=\"grey\"\n startIcon={<CloseIcon />}\n >\n {this.t('Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n changePid(): void {\n const pid = !this.state.pid;\n (((window as any)._localStorage as Storage) || window.localStorage).setItem('Logs.pid', pid ? 'true' : 'false');\n this.setState({ pid });\n }\n\n renderToolbar(): JSX.Element {\n const pauseChild = !this.state.pause ? (\n <PauseIcon />\n ) : (\n <Typography style={styles.pauseCount}>{this.state.logs.length - this.state.pause}</Typography>\n );\n\n const isMobile = this.props.width === 'xs' || this.props.width === 'sm';\n\n const downloadLogButton = isMobile ? (\n <IconButton\n color=\"primary\"\n onClick={event => this.setState({ logDownloadDialog: event.currentTarget })}\n >\n <SaveAltIcon />\n </IconButton>\n ) : (\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<SaveAltIcon />}\n onClick={event => this.setState({ logDownloadDialog: event.currentTarget })}\n >\n {this.t('Download log')}\n </Button>\n );\n\n return (\n <TabHeader>\n <Tooltip\n title={this.props.t('Refresh log')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.readLogs(true)}\n >\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n <Tooltip\n title={this.props.t('Pause output')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n style={styles.pauseButton}\n onClick={() => this.handleLogPause()}\n >\n {pauseChild}\n </IconButton>\n </Tooltip>\n <Tooltip\n title={this.props.t('Clear log')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.clearLog()}\n >\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n <Tooltip\n title={this.props.t('Clear on disk permanent')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.setState({ logDeleteDialog: true })}\n >\n <DeleteForeverIcon />\n </IconButton>\n </Tooltip>\n <Tooltip\n title={this.props.t('Show/hide PID')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.changePid()}\n color={!this.state.pid ? 'default' : 'primary'}\n >\n <div style={styles.pidSize}>{this.props.t('PID')}</div>\n </IconButton>\n </Tooltip>\n <Tooltip\n title={this.props.t('Show/hide colors')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'Logs.colors',\n this.state.colors ? 'false' : 'true',\n );\n this.setState({ colors: !this.state.colors });\n }}\n color={!this.state.colors ? 'default' : 'primary'}\n >\n <ColorsIcon style={{ width: '0.8em', height: '0.8em' }} />\n </IconButton>\n </Tooltip>\n <Tooltip\n title={this.props.t('Reverse output direction')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'Log.reverse',\n this.state.reverse ? 'false' : 'true',\n );\n this.setState({ reverse: !this.state.reverse });\n setTimeout(() => {\n // scroll to endOfLog\n const element = document.getElementById('endOfLog');\n element?.scrollIntoView();\n }, 500);\n }}\n color={!this.state.reverse ? 'default' : 'primary'}\n >\n {this.state.reverse ? <ArrowDownward /> : <ArrowUpward />}\n </IconButton>\n </Tooltip>\n <Tooltip\n title={this.props.t('Show errors')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <Badge\n badgeContent={this.state.logErrors}\n color=\"error\"\n sx={{ '& .MuiBadge-badge': { ...styles.badge, ...styles.badgeError } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => {\n if (this.state.severity === 'error') {\n this.setState({ severity: 'debug' });\n } else {\n this.setState({ severity: 'error', logErrors: 0 });\n }\n }}\n color={this.state.severity === 'error' ? 'primary' : 'default'}\n >\n <ErrorIcon />\n </IconButton>\n </Badge>\n </Tooltip>\n <Tooltip\n title={this.props.t('Show errors and warnings')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <Badge\n badgeContent={this.state.logWarnings}\n color=\"default\"\n sx={{ '& .MuiBadge-badge': { ...styles.badge, ...styles.badgeWarn } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => {\n if (this.state.severity === 'warn') {\n this.setState({ severity: 'debug' });\n } else {\n this.setState({ severity: 'warn', logWarnings: 0 });\n }\n }}\n color={this.state.severity === 'warn' ? 'primary' : 'default'}\n >\n <WarningIcon />\n </IconButton>\n </Badge>\n </Tooltip>\n <div style={styles.grow} />\n {this.state.logFiles?.length ? downloadLogButton : null}\n {this.state.logDownloadDialog ? (\n <Menu\n id=\"simple-menu\"\n anchorEl={this.state.logDownloadDialog}\n keepMounted\n open={Boolean(this.state.logDownloadDialog)}\n onClose={() => this.setState({ logDownloadDialog: null })}\n >\n {this.getLogFiles()}\n </Menu>\n ) : null}\n {isMobile ? null : <div style={styles.grow} />}\n {isMobile ? null : (\n <Typography\n variant=\"body2\"\n title={this.state.estimatedSize ? this.props.t('Estimated size') : ''}\n style={styles.logSize}\n >\n {this.t('Log size:')}{' '}\n <span style={this.state.estimatedSize ? styles.logEstimated : undefined}>\n {this.state.logSize === null ? '-' : AdminUtils.formatBytes(this.state.logSize)}\n </span>\n </Typography>\n )}\n </TabHeader>\n );\n }\n\n renderTableHeader(): JSX.Element {\n const sources = Object.keys(this.state.sources).sort();\n sources.unshift('1');\n\n return (\n <TableHead>\n <TableRow>\n <TableCell sx={styles.source}>\n <FormControl\n variant=\"standard\"\n sx={styles.formControl}\n >\n <Select\n variant=\"standard\"\n labelId=\"source-label\"\n value={sources.includes(this.state.source) ? this.state.source : '1'}\n onChange={event => this.handleSourceChange(event.target.value)}\n renderValue={(value: string) => (\n <div\n style={{\n backgroundColor:\n !this.state.colors || value === '1'\n ? undefined\n : this.state.sources[value].color,\n display: 'flex',\n alignItems: 'center',\n }}\n >\n {value === '1' ? null : (\n <Icon\n src={this.state.sources[value].icon || ''}\n style={styles.iconSelect}\n />\n )}\n {value === '1' ? this.t('Source') : value}\n </div>\n )}\n >\n {this.getSources()}\n </Select>\n {(sources.includes(this.state.source) ? this.state.source : '1') !== '1' ? (\n <IconButton\n sx={{\n position: 'absolute',\n top: 1,\n right: 15,\n zIndex: 1,\n }}\n size=\"small\"\n onClick={() => this.handleSourceChange('1')}\n >\n <Clear />\n </IconButton>\n ) : null}\n </FormControl>\n </TableCell>\n {this.state.pid && (\n <TableCell sx={styles.pid}>\n <Box\n component=\"div\"\n sx={styles.header}\n >\n {this.t('PID')}\n </Box>\n </TableCell>\n )}\n <TableCell sx={styles.timestamp}>\n <Box\n component=\"div\"\n sx={styles.header}\n >\n {this.t('Time')}\n </Box>\n </TableCell>\n <TableCell sx={styles.severity}>\n <FormControl\n variant=\"standard\"\n style={styles.formControl}\n >\n <Select\n variant=\"standard\"\n labelId=\"severity-label\"\n value={this.state.severity}\n onChange={event => this.handleSeverityChange(event)}\n renderValue={value => (\n <span style={styles[`${this.props.themeType}_${value}`]}>{value}</span>\n )}\n >\n {this.getSeverities()}\n </Select>\n </FormControl>\n </TableCell>\n <TableCell sx={styles.message}>\n <FormControl\n variant=\"standard\"\n style={styles.formControl}\n >\n <TextField\n variant=\"standard\"\n sx={styles.messageText}\n placeholder={this.t('Message')}\n onChange={event => this.handleMessageChange(event)}\n value={this.state.message}\n slotProps={{\n input: {\n endAdornment: this.state.message ? (\n <IconButton\n size=\"small\"\n onClick={() => {\n (\n ((window as any)._localStorage as Storage) ||\n window.localStorage\n ).removeItem('Log.message');\n this.setState({ message: '' });\n }}\n >\n <CloseIcon />\n </IconButton>\n ) : null,\n },\n }}\n />\n </FormControl>\n </TableCell>\n </TableRow>\n </TableHead>\n );\n }\n\n render(): JSX.Element {\n if (!this.state.logs) {\n return <LinearProgress />;\n }\n\n if (this.state.logFiles === null && !this.readLogsInProcess) {\n this.readLogsInProcess = true;\n setTimeout(\n () =>\n this.readLogFiles().then(logFiles => {\n this.readLogsInProcess = false;\n this.setState({ logFiles });\n }),\n 100,\n );\n }\n\n if (this.props.currentHost !== this.state.currentHost) {\n this.hostsTimer =\n this.hostsTimer ||\n setTimeout(() => {\n this.hostsTimer = null;\n this.setState(\n {\n currentHost: this.props.currentHost,\n logs: [],\n logFiles: null,\n },\n () => this.readLogs(true),\n );\n }, 200);\n }\n\n return (\n <TabContainer>\n {this.renderToolbar()}\n <TabContent>\n <TableContainer style={styles.container}>\n <Table\n stickyHeader\n size=\"small\"\n sx={styles.table}\n >\n {this.renderTableHeader()}\n <TableBody>{this.getRows()}</TableBody>\n </Table>\n </TableContainer>\n </TabContent>\n {this.renderClearDialog()}\n </TabContainer>\n );\n }\n}\n\nexport default withWidth()(Logs);\n"],"names":["styles","container","height","table","tableLayout","minWidth","padding","overflow","whiteSpace","textOverflow","row","fontSize","rowOdd","theme","backgroundColor","palette","background","default","cell","verticalAlign","cellName","lineHeight","updatedRow","animation","formControl","width","position","light_error","color","red","light_warn","amber","light_debug","grey","light_silly","dark_error","dark_warn","dark_debug","dark_silly","source","pid","timestamp","severity","message","hidden","display","grow","flexGrow","logSize","marginRight","marginLeft","logEstimated","fontStyle","closeButton","right","top","header","text","primary","content","borderBottom","pauseButton","pauseCount","downloadLogSize","downloadEntry","justifyContent","pidSize","alignItems","messageText","badge","badgeError","badgeWarn","emptyButton","icon","iconSelect","name","marginTop","iconAndName","tooltip","pointerEvents","COLORS_LIGHT","COLORS_DARK","Logs","Component","constructor","props","super","severities","t","ignoreNextLogs","lastRowRender","lastRowRenderTimeout","readLogsInProcess","hostsTimer","scrollToEnd","logHandler","newLogs","size","this","logs","state","concat","length","splice","sources","logWarnings","logErrors","lastOdd","Object","keys","COLORS","themeType","forEach","item","undefined","odd","time","date","Date","ts","getFullYear","getMonth","toString","padStart","getDate","getHours","getMinutes","getSeconds","getMilliseconds","_sources","_this$state$sources$i","_sources2","_sources2$item$from","from","active","JSON","parse","stringify","getSourceIcon","newState","estimatedSize","reverse","el","document","getElementById","getBoundingClientRect","window","innerHeight","setState","_localStorage","localStorage","getItem","logDeleteDialog","logDownloadDialog","logFiles","pause","colors","adapters","currentHost","hosts","silly","debug","info","warn","error","readLogs","force","cb","logsWorker","getLogs","then","results","values","sort","id","readLogFiles","list","socket","getLogsFiles","file","fileName","split","pop","replace","push","path","componentDidMount","registerHandler","clearErrors","getCompactAdapters","async","_hosts","getCompactHosts","_id","Promise","resolve","componentWillUnmount","unregisterHandler","_this$state$adapters$","adapterName","startsWith","_this$state$hosts","_this$state$hosts$com","common","clearLog","_this$props$logsWorke","clearLines","handleMessageChange","event","setItem","target","value","handleSourceChange","handleSeverityChange","handleLogDelete","delLogs","catch","alert","handleLogPause","openTab","open","focus","getLogFiles","map","entry","_jsxs","MenuItem","style","onClick","children","_jsx","Typography","variant","AdminUtils","formatBytes","getSeverities","i","getSources","unshift","Icon","src","getOneRow","rows","options","_this$state$sources$r","_this$state$sources$r2","regExp","RegExp","matches","match","isHidden","sourceFilter","filterMessage","original","toLowerCase","includes","key","previousKey","TableRow","sx","Utils","getStyle","hover","TableCell","_objectSpread","fontWeight","title","parts","idx","keyPrefix","getRows","setTimeout","scrollIntoView","now","renderClearDialog","Dialog","onClose","DialogTitle","IconButton","CloseIcon","DialogContent","dividers","gutterBottom","DialogActions","Button","autoFocus","startIcon","CheckIcon","changePid","renderToolbar","_this$state$logFiles","pauseChild","PauseIcon","isMobile","downloadLogButton","currentTarget","SaveAltIcon","TabHeader","Tooltip","slotProps","popper","RefreshIcon","DeleteIcon","DeleteForeverIcon","ColorsIcon","element","ArrowDownward","ArrowUpward","Badge","badgeContent","ErrorIcon","WarningIcon","Menu","anchorEl","keepMounted","Boolean","renderTableHeader","TableHead","FormControl","Select","labelId","onChange","renderValue","zIndex","Clear","Box","component","TextField","placeholder","input","endAdornment","removeItem","render","TabContainer","TabContent","TableContainer","Table","stickyHeader","TableBody","LinearProgress","withWidth"],"sourceRoot":""}
|