@matter-server/dashboard 0.5.15 → 0.6.0
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/dist/esm/components/dialog-box/dialog-box.d.ts +1 -0
- package/dist/esm/components/dialog-box/dialog-box.d.ts.map +1 -1
- package/dist/esm/components/dialog-box/dialog-box.js +15 -1
- package/dist/esm/components/dialog-box/dialog-box.js.map +1 -1
- package/dist/esm/components/dialogs/binding/node-binding-dialog.js +15 -19
- package/dist/esm/components/dialogs/binding/node-binding-dialog.js.map +1 -1
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-existing.d.ts.map +1 -1
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-existing.js +2 -1
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-existing.js.map +1 -1
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.d.ts.map +1 -1
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.js +13 -5
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.js.map +1 -1
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.d.ts.map +1 -1
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.js +13 -9
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.js.map +1 -1
- package/dist/esm/components/dialogs/settings/log-level-dialog.d.ts.map +1 -1
- package/dist/esm/components/dialogs/settings/log-level-dialog.js +2 -1
- package/dist/esm/components/dialogs/settings/log-level-dialog.js.map +1 -1
- package/dist/esm/components/ha-svg-icon.d.ts.map +1 -1
- package/dist/esm/components/ha-svg-icon.js +0 -1
- package/dist/esm/components/ha-svg-icon.js.map +1 -1
- package/dist/esm/entrypoint/main.js +1 -1
- package/dist/esm/entrypoint/main.js.map +1 -1
- package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts.map +1 -1
- package/dist/esm/pages/cluster-commands/base-cluster-commands.js +72 -68
- package/dist/esm/pages/cluster-commands/base-cluster-commands.js.map +1 -1
- package/dist/esm/pages/components/header.d.ts +1 -1
- package/dist/esm/pages/components/header.d.ts.map +1 -1
- package/dist/esm/pages/components/header.js +59 -55
- package/dist/esm/pages/components/header.js.map +1 -1
- package/dist/esm/pages/components/node-details.js +1 -1
- package/dist/esm/pages/components/server-details.d.ts.map +1 -1
- package/dist/esm/pages/components/server-details.js +2 -0
- package/dist/esm/pages/components/server-details.js.map +1 -1
- package/dist/esm/pages/matter-cluster-view.d.ts +2 -1
- package/dist/esm/pages/matter-cluster-view.d.ts.map +1 -1
- package/dist/esm/pages/matter-cluster-view.js +49 -39
- package/dist/esm/pages/matter-cluster-view.js.map +1 -1
- package/dist/esm/pages/matter-endpoint-view.d.ts +2 -1
- package/dist/esm/pages/matter-endpoint-view.d.ts.map +1 -1
- package/dist/esm/pages/matter-endpoint-view.js +44 -35
- package/dist/esm/pages/matter-endpoint-view.js.map +1 -1
- package/dist/esm/pages/matter-network-view.d.ts +1 -1
- package/dist/esm/pages/matter-network-view.d.ts.map +1 -1
- package/dist/esm/pages/matter-network-view.js +216 -207
- package/dist/esm/pages/matter-network-view.js.map +1 -1
- package/dist/esm/pages/matter-node-view.d.ts +2 -1
- package/dist/esm/pages/matter-node-view.d.ts.map +1 -1
- package/dist/esm/pages/matter-node-view.js +104 -94
- package/dist/esm/pages/matter-node-view.js.map +1 -1
- package/dist/esm/pages/network/base-network-graph.d.ts.map +1 -1
- package/dist/esm/pages/network/base-network-graph.js +12 -5
- package/dist/esm/pages/network/base-network-graph.js.map +1 -1
- package/dist/esm/pages/network/device-panel.d.ts +1 -0
- package/dist/esm/pages/network/device-panel.d.ts.map +1 -1
- package/dist/esm/pages/network/device-panel.js +19 -5
- package/dist/esm/pages/network/device-panel.js.map +1 -1
- package/dist/esm/pages/network/network-details.d.ts +1 -1
- package/dist/esm/pages/network/network-details.d.ts.map +1 -1
- package/dist/esm/pages/network/network-details.js +275 -272
- package/dist/esm/pages/network/network-details.js.map +1 -1
- package/dist/esm/pages/network/network-utils.d.ts +5 -0
- package/dist/esm/pages/network/network-utils.d.ts.map +1 -1
- package/dist/esm/pages/network/network-utils.js +47 -17
- package/dist/esm/pages/network/network-utils.js.map +1 -1
- package/dist/esm/pages/network/update-connections-dialog.d.ts +1 -1
- package/dist/esm/pages/network/update-connections-dialog.d.ts.map +1 -1
- package/dist/esm/pages/network/update-connections-dialog.js +51 -47
- package/dist/esm/pages/network/update-connections-dialog.js.map +1 -1
- package/dist/esm/util/device-icons.d.ts.map +1 -1
- package/dist/esm/util/device-icons.js +6 -6
- package/dist/esm/util/device-icons.js.map +1 -1
- package/dist/esm/util/shared-styles.d.ts +10 -0
- package/dist/esm/util/shared-styles.d.ts.map +1 -0
- package/dist/esm/util/shared-styles.js +56 -0
- package/dist/esm/util/shared-styles.js.map +6 -0
- package/dist/web/index.html +53 -1
- package/dist/web/js/{commission-node-dialog-ByflSEDK.js → commission-node-dialog-DfwKU9qk.js} +4 -4
- package/dist/web/js/{commission-node-existing-CD6-Epwb.js → commission-node-existing-C7ITvNfj.js} +6 -3
- package/dist/web/js/{commission-node-thread-CekKshVL.js → commission-node-thread-D-icSzto.js} +23 -7
- package/dist/web/js/{commission-node-wifi-D_VKTWwF.js → commission-node-wifi-DwUkXlWz.js} +29 -11
- package/dist/web/js/{dialog-box-DdVdxz2_.js → dialog-box-BmpaTrvT.js} +16 -2
- package/dist/web/js/{fire_event-uMluKQub.js → fire_event-2ZxL-AHZ.js} +1 -1
- package/dist/web/js/{log-level-dialog-BO1OSL0z.js → log-level-dialog-D4hubdib.js} +5 -2
- package/dist/web/js/main.js +2 -2
- package/dist/web/js/{matter-dashboard-app-b1R3Pout.js → matter-dashboard-app-BtHTmAPq.js} +874 -788
- package/dist/web/js/{node-binding-dialog-rikORH9_.js → node-binding-dialog-MMx9rkCF.js} +40 -20
- package/package.json +4 -4
- package/src/components/dialog-box/dialog-box.ts +16 -1
- package/src/components/dialogs/binding/node-binding-dialog.ts +15 -15
- package/src/components/dialogs/commission-node-dialog/commission-node-existing.ts +2 -1
- package/src/components/dialogs/commission-node-dialog/commission-node-thread.ts +13 -5
- package/src/components/dialogs/commission-node-dialog/commission-node-wifi.ts +13 -9
- package/src/components/dialogs/settings/log-level-dialog.ts +2 -1
- package/src/components/ha-svg-icon.ts +0 -1
- package/src/entrypoint/main.ts +1 -1
- package/src/pages/cluster-commands/base-cluster-commands.ts +84 -80
- package/src/pages/components/header.ts +59 -55
- package/src/pages/components/node-details.ts +1 -1
- package/src/pages/components/server-details.ts +2 -0
- package/src/pages/matter-cluster-view.ts +49 -39
- package/src/pages/matter-endpoint-view.ts +49 -40
- package/src/pages/matter-network-view.ts +200 -191
- package/src/pages/matter-node-view.ts +94 -84
- package/src/pages/network/base-network-graph.ts +12 -5
- package/src/pages/network/device-panel.ts +20 -5
- package/src/pages/network/network-details.ts +236 -231
- package/src/pages/network/network-utils.ts +51 -17
- package/src/pages/network/update-connections-dialog.ts +51 -47
- package/src/util/device-icons.ts +12 -6
- package/src/util/shared-styles.ts +58 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { k as i,
|
|
1
|
+
import { k as i, H as c, I as clientContext, n, a as e, i as i$1, J as showPromptDialog, F as showAlertDialog, A, j as b, G as handleAsync, t } from './matter-dashboard-app-BtHTmAPq.js';
|
|
2
2
|
import { p as preventDefault } from './prevent_default-D-ohDGsN.js';
|
|
3
3
|
import './main.js';
|
|
4
4
|
|
|
@@ -377,7 +377,10 @@ let NodeBindingDialog = class extends i$1 {
|
|
|
377
377
|
const rawNodeId = (_this$_targetNodeId$v = this._targetNodeId.value) === null || _this$_targetNodeId$v === void 0 ? void 0 : _this$_targetNodeId$v.trim();
|
|
378
378
|
if (rawNodeId) {
|
|
379
379
|
if (!/^\d+$/.test(rawNodeId)) {
|
|
380
|
-
|
|
380
|
+
showAlertDialog({
|
|
381
|
+
title: "Validation error",
|
|
382
|
+
text: "Please enter a valid target node ID"
|
|
383
|
+
});
|
|
381
384
|
return;
|
|
382
385
|
}
|
|
383
386
|
targetNodeId = BigInt(rawNodeId);
|
|
@@ -385,16 +388,25 @@ let NodeBindingDialog = class extends i$1 {
|
|
|
385
388
|
const targetEndpoint = this._targetEndpoint.value ? parseInt(this._targetEndpoint.value, 10) : void 0;
|
|
386
389
|
const targetCluster = this._targetCluster.value ? parseInt(this._targetCluster.value, 10) : void 0;
|
|
387
390
|
if (targetNodeId === void 0 || targetNodeId <= 0n) {
|
|
388
|
-
|
|
391
|
+
showAlertDialog({
|
|
392
|
+
title: "Validation error",
|
|
393
|
+
text: "Please enter a valid target node ID"
|
|
394
|
+
});
|
|
389
395
|
return;
|
|
390
396
|
}
|
|
391
397
|
if (targetEndpoint === void 0 || targetEndpoint <= 0 || targetEndpoint > 65534) {
|
|
392
|
-
|
|
398
|
+
showAlertDialog({
|
|
399
|
+
title: "Validation error",
|
|
400
|
+
text: "Please enter a valid target endpoint"
|
|
401
|
+
});
|
|
393
402
|
return;
|
|
394
403
|
}
|
|
395
404
|
if (targetCluster !== void 0) {
|
|
396
405
|
if (targetCluster < 0 || targetCluster > 32767) {
|
|
397
|
-
|
|
406
|
+
showAlertDialog({
|
|
407
|
+
title: "Validation error",
|
|
408
|
+
text: "Please enter a valid target cluster"
|
|
409
|
+
});
|
|
398
410
|
return;
|
|
399
411
|
}
|
|
400
412
|
}
|
|
@@ -413,13 +425,17 @@ let NodeBindingDialog = class extends i$1 {
|
|
|
413
425
|
};
|
|
414
426
|
const aclResult = await this.add_target_acl(targetNodeId, acl_entry);
|
|
415
427
|
if (aclResult.outcome === "all_failed") {
|
|
416
|
-
|
|
417
|
-
|
|
428
|
+
showAlertDialog({
|
|
429
|
+
title: "Failed to add ACL entry",
|
|
430
|
+
text: aclResult.message
|
|
431
|
+
});
|
|
418
432
|
return;
|
|
419
433
|
}
|
|
420
434
|
if (aclResult.outcome === "partial") {
|
|
421
|
-
|
|
422
|
-
|
|
435
|
+
showAlertDialog({
|
|
436
|
+
title: "ACL entry partially failed",
|
|
437
|
+
text: aclResult.message
|
|
438
|
+
});
|
|
423
439
|
}
|
|
424
440
|
const endpoint = this.endpoint;
|
|
425
441
|
const bindingEntry = {
|
|
@@ -437,12 +453,16 @@ ${aclResult.message}`);
|
|
|
437
453
|
this._targetCluster.value = "";
|
|
438
454
|
this.requestUpdate();
|
|
439
455
|
} else if (bindingResult.outcome === "partial") {
|
|
440
|
-
|
|
441
|
-
|
|
456
|
+
showAlertDialog({
|
|
457
|
+
title: "Binding partially failed",
|
|
458
|
+
text: bindingResult.message
|
|
459
|
+
});
|
|
442
460
|
this.requestUpdate();
|
|
443
461
|
} else {
|
|
444
|
-
|
|
445
|
-
|
|
462
|
+
showAlertDialog({
|
|
463
|
+
title: "Failed to add binding",
|
|
464
|
+
text: bindingResult.message
|
|
465
|
+
});
|
|
446
466
|
}
|
|
447
467
|
}
|
|
448
468
|
_close() {
|
|
@@ -478,10 +498,10 @@ ${bindingResult.message}`);
|
|
|
478
498
|
</div>
|
|
479
499
|
<div slot="content">
|
|
480
500
|
<div>
|
|
481
|
-
<md-list style="padding-bottom:
|
|
501
|
+
<md-list style="padding-bottom:16px;">
|
|
482
502
|
${Object.values(bindings).map((entry, index) => b`
|
|
483
503
|
<md-list-item class="binding-item">
|
|
484
|
-
<div style="display:flex;gap:
|
|
504
|
+
<div style="display:flex;gap:8px;">
|
|
485
505
|
<div>node:${entry["node"]}</div>
|
|
486
506
|
<div>endpoint:${entry["endpoint"]}</div>
|
|
487
507
|
${entry["cluster"] ? b` <div>cluster:${entry["cluster"]}</div> ` : A}
|
|
@@ -529,13 +549,13 @@ ${bindingResult.message}`);
|
|
|
529
549
|
</div>
|
|
530
550
|
</div>
|
|
531
551
|
<div style="margin:8px;">
|
|
532
|
-
<
|
|
552
|
+
<span style="font-size: 0.75rem;font-style: italic;font-weight: bold;">
|
|
533
553
|
Note: The Cluster ID field is optional according to the Matter specification. If you
|
|
534
554
|
leave it blank, the binding applies to all eligible clusters on the target endpoint.
|
|
535
555
|
However, some devices may require a specific cluster to be set in order for the binding
|
|
536
556
|
to function correctly. If you experience unexpected behavior, try specifying the cluster
|
|
537
557
|
explicitly.
|
|
538
|
-
</
|
|
558
|
+
</span>
|
|
539
559
|
</div>
|
|
540
560
|
</div>
|
|
541
561
|
</div>
|
|
@@ -568,7 +588,7 @@ NodeBindingDialog.styles = i`
|
|
|
568
588
|
|
|
569
589
|
.target-item {
|
|
570
590
|
display: inline-block;
|
|
571
|
-
padding:
|
|
591
|
+
padding: 16px 8px 8px 8px;
|
|
572
592
|
border-radius: 4px;
|
|
573
593
|
vertical-align: middle;
|
|
574
594
|
min-width: 80px;
|
|
@@ -578,11 +598,11 @@ NodeBindingDialog.styles = i`
|
|
|
578
598
|
|
|
579
599
|
.group-label {
|
|
580
600
|
position: absolute;
|
|
581
|
-
left:
|
|
601
|
+
left: 16px;
|
|
582
602
|
top: -12px;
|
|
583
603
|
background: var(--md-sys-color-primary);
|
|
584
604
|
color: var(--md-sys-color-on-primary);
|
|
585
|
-
padding:
|
|
605
|
+
padding: 4px 16px;
|
|
586
606
|
border-radius: 4px;
|
|
587
607
|
}
|
|
588
608
|
`;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter-server/dashboard",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Dashboard for OHF Matter Server",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/matter-js/matterjs-server/issues"
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@babel/preset-env": "^7.29.2",
|
|
26
|
-
"@matter/main": "0.17.0-alpha.0-
|
|
26
|
+
"@matter/main": "0.17.0-alpha.0-20260415-d9b8bc8d3",
|
|
27
27
|
"@rollup/plugin-babel": "^7.0.0",
|
|
28
28
|
"@rollup/plugin-commonjs": "^29.0.2",
|
|
29
29
|
"rollup-plugin-copy": "^3.5.0",
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@lit/context": "^1.1.6",
|
|
39
39
|
"@material/web": "^2.4.1",
|
|
40
|
-
"@matter-server/ws-client": "0.
|
|
41
|
-
"@matter-server/custom-clusters": "0.
|
|
40
|
+
"@matter-server/ws-client": "0.6.0",
|
|
41
|
+
"@matter-server/custom-clusters": "0.6.0",
|
|
42
42
|
"@mdi/js": "^7.4.47",
|
|
43
43
|
"lit": "^3.3.2",
|
|
44
44
|
"tslib": "^2.8.1",
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import "@material/web/button/text-button";
|
|
8
8
|
import "@material/web/dialog/dialog";
|
|
9
9
|
import type { MdDialog } from "@material/web/dialog/dialog.js";
|
|
10
|
-
import { html, LitElement } from "lit";
|
|
10
|
+
import { css, html, LitElement } from "lit";
|
|
11
11
|
import { customElement, property } from "lit/decorators.js";
|
|
12
12
|
import { preventDefault } from "../../util/prevent_default.js";
|
|
13
13
|
import type { PromptDialogBoxParams } from "./show-dialog-box.js";
|
|
@@ -59,6 +59,21 @@ export class DialogBox extends LitElement {
|
|
|
59
59
|
private _handleClosed() {
|
|
60
60
|
this.parentElement!.removeChild(this);
|
|
61
61
|
}
|
|
62
|
+
|
|
63
|
+
static override styles = css`
|
|
64
|
+
code {
|
|
65
|
+
display: block;
|
|
66
|
+
white-space: pre-wrap;
|
|
67
|
+
word-break: break-all;
|
|
68
|
+
overflow-y: auto;
|
|
69
|
+
max-height: 60vh;
|
|
70
|
+
font-size: 0.8rem;
|
|
71
|
+
line-height: 1.4;
|
|
72
|
+
padding: 8px;
|
|
73
|
+
background-color: var(--md-sys-color-surface-container-highest);
|
|
74
|
+
border-radius: 4px;
|
|
75
|
+
}
|
|
76
|
+
`;
|
|
62
77
|
}
|
|
63
78
|
|
|
64
79
|
declare global {
|
|
@@ -250,7 +250,7 @@ export class NodeBindingDialog extends LitElement {
|
|
|
250
250
|
const rawNodeId = this._targetNodeId.value?.trim();
|
|
251
251
|
if (rawNodeId) {
|
|
252
252
|
if (!/^\d+$/.test(rawNodeId)) {
|
|
253
|
-
|
|
253
|
+
showAlertDialog({ title: "Validation error", text: "Please enter a valid target node ID" });
|
|
254
254
|
return;
|
|
255
255
|
}
|
|
256
256
|
targetNodeId = BigInt(rawNodeId);
|
|
@@ -259,12 +259,12 @@ export class NodeBindingDialog extends LitElement {
|
|
|
259
259
|
const targetCluster = this._targetCluster.value ? parseInt(this._targetCluster.value, 10) : undefined;
|
|
260
260
|
|
|
261
261
|
if (targetNodeId === undefined || targetNodeId <= 0n) {
|
|
262
|
-
|
|
262
|
+
showAlertDialog({ title: "Validation error", text: "Please enter a valid target node ID" });
|
|
263
263
|
return;
|
|
264
264
|
}
|
|
265
265
|
|
|
266
266
|
if (targetEndpoint === undefined || targetEndpoint <= 0 || targetEndpoint > 0xfffe) {
|
|
267
|
-
|
|
267
|
+
showAlertDialog({ title: "Validation error", text: "Please enter a valid target endpoint" });
|
|
268
268
|
return;
|
|
269
269
|
}
|
|
270
270
|
|
|
@@ -272,7 +272,7 @@ export class NodeBindingDialog extends LitElement {
|
|
|
272
272
|
if (targetCluster !== undefined) {
|
|
273
273
|
// We ignore vendor specific clusters for now
|
|
274
274
|
if (targetCluster < 0 || targetCluster > 0x7fff) {
|
|
275
|
-
|
|
275
|
+
showAlertDialog({ title: "Validation error", text: "Please enter a valid target cluster" });
|
|
276
276
|
return;
|
|
277
277
|
}
|
|
278
278
|
}
|
|
@@ -294,11 +294,11 @@ export class NodeBindingDialog extends LitElement {
|
|
|
294
294
|
|
|
295
295
|
const aclResult = await this.add_target_acl(targetNodeId, acl_entry);
|
|
296
296
|
if (aclResult.outcome === "all_failed") {
|
|
297
|
-
|
|
297
|
+
showAlertDialog({ title: "Failed to add ACL entry", text: aclResult.message });
|
|
298
298
|
return;
|
|
299
299
|
}
|
|
300
300
|
if (aclResult.outcome === "partial") {
|
|
301
|
-
|
|
301
|
+
showAlertDialog({ title: "ACL entry partially failed", text: aclResult.message });
|
|
302
302
|
// Continue with binding attempt since some ACL entries succeeded
|
|
303
303
|
}
|
|
304
304
|
|
|
@@ -320,10 +320,10 @@ export class NodeBindingDialog extends LitElement {
|
|
|
320
320
|
this._targetCluster.value = "";
|
|
321
321
|
this.requestUpdate();
|
|
322
322
|
} else if (bindingResult.outcome === "partial") {
|
|
323
|
-
|
|
323
|
+
showAlertDialog({ title: "Binding partially failed", text: bindingResult.message });
|
|
324
324
|
this.requestUpdate(); // Update UI to show what succeeded
|
|
325
325
|
} else {
|
|
326
|
-
|
|
326
|
+
showAlertDialog({ title: "Failed to add binding", text: bindingResult.message });
|
|
327
327
|
}
|
|
328
328
|
}
|
|
329
329
|
|
|
@@ -367,11 +367,11 @@ export class NodeBindingDialog extends LitElement {
|
|
|
367
367
|
</div>
|
|
368
368
|
<div slot="content">
|
|
369
369
|
<div>
|
|
370
|
-
<md-list style="padding-bottom:
|
|
370
|
+
<md-list style="padding-bottom:16px;">
|
|
371
371
|
${Object.values(bindings).map(
|
|
372
372
|
(entry, index) => html`
|
|
373
373
|
<md-list-item class="binding-item">
|
|
374
|
-
<div style="display:flex;gap:
|
|
374
|
+
<div style="display:flex;gap:8px;">
|
|
375
375
|
<div>node:${entry["node"]}</div>
|
|
376
376
|
<div>endpoint:${entry["endpoint"]}</div>
|
|
377
377
|
${entry["cluster"] ? html` <div>cluster:${entry["cluster"]}</div> ` : nothing}
|
|
@@ -420,13 +420,13 @@ export class NodeBindingDialog extends LitElement {
|
|
|
420
420
|
</div>
|
|
421
421
|
</div>
|
|
422
422
|
<div style="margin:8px;">
|
|
423
|
-
<
|
|
423
|
+
<span style="font-size: 0.75rem;font-style: italic;font-weight: bold;">
|
|
424
424
|
Note: The Cluster ID field is optional according to the Matter specification. If you
|
|
425
425
|
leave it blank, the binding applies to all eligible clusters on the target endpoint.
|
|
426
426
|
However, some devices may require a specific cluster to be set in order for the binding
|
|
427
427
|
to function correctly. If you experience unexpected behavior, try specifying the cluster
|
|
428
428
|
explicitly.
|
|
429
|
-
</
|
|
429
|
+
</span>
|
|
430
430
|
</div>
|
|
431
431
|
</div>
|
|
432
432
|
</div>
|
|
@@ -459,7 +459,7 @@ export class NodeBindingDialog extends LitElement {
|
|
|
459
459
|
|
|
460
460
|
.target-item {
|
|
461
461
|
display: inline-block;
|
|
462
|
-
padding:
|
|
462
|
+
padding: 16px 8px 8px 8px;
|
|
463
463
|
border-radius: 4px;
|
|
464
464
|
vertical-align: middle;
|
|
465
465
|
min-width: 80px;
|
|
@@ -469,11 +469,11 @@ export class NodeBindingDialog extends LitElement {
|
|
|
469
469
|
|
|
470
470
|
.group-label {
|
|
471
471
|
position: absolute;
|
|
472
|
-
left:
|
|
472
|
+
left: 16px;
|
|
473
473
|
top: -12px;
|
|
474
474
|
background: var(--md-sys-color-primary);
|
|
475
475
|
color: var(--md-sys-color-on-primary);
|
|
476
|
-
padding:
|
|
476
|
+
padding: 4px 16px;
|
|
477
477
|
border-radius: 4px;
|
|
478
478
|
}
|
|
479
479
|
`;
|
|
@@ -14,6 +14,7 @@ import { customElement, property, query, state } from "lit/decorators.js";
|
|
|
14
14
|
import { clientContext } from "../../../client/client-context.js";
|
|
15
15
|
import { handleAsync } from "../../../util/async-handler.js";
|
|
16
16
|
import { fireEvent } from "../../../util/fire_event.js";
|
|
17
|
+
import { showAlertDialog } from "../../dialog-box/show-dialog-box.js";
|
|
17
18
|
|
|
18
19
|
@customElement("commission-node-existing")
|
|
19
20
|
export class CommissionNodeExisting extends LitElement {
|
|
@@ -42,7 +43,7 @@ export class CommissionNodeExisting extends LitElement {
|
|
|
42
43
|
const node = await this.client.commissionWithCode(this._pairingCodeField.value, true);
|
|
43
44
|
fireEvent(this, "node-commissioned", node);
|
|
44
45
|
} catch (err) {
|
|
45
|
-
|
|
46
|
+
showAlertDialog({ title: "Error commissioning node", text: (err as Error).message });
|
|
46
47
|
} finally {
|
|
47
48
|
this._loading = false;
|
|
48
49
|
}
|
|
@@ -14,6 +14,7 @@ import { customElement, property, query, state } from "lit/decorators.js";
|
|
|
14
14
|
import { clientContext } from "../../../client/client-context.js";
|
|
15
15
|
import { handleAsync } from "../../../util/async-handler.js";
|
|
16
16
|
import { fireEvent } from "../../../util/fire_event.js";
|
|
17
|
+
import { showAlertDialog } from "../../dialog-box/show-dialog-box.js";
|
|
17
18
|
|
|
18
19
|
@customElement("commission-node-thread")
|
|
19
20
|
export class CommissionNodeThread extends LitElement {
|
|
@@ -31,7 +32,11 @@ export class CommissionNodeThread extends LitElement {
|
|
|
31
32
|
|
|
32
33
|
protected override render() {
|
|
33
34
|
if (!this.client.serverInfo.thread_credentials_set) {
|
|
34
|
-
return html`<md-outlined-text-field
|
|
35
|
+
return html`<md-outlined-text-field
|
|
36
|
+
label="Thread dataset"
|
|
37
|
+
.disabled="${this._loading}"
|
|
38
|
+
supporting-text="Hex string (e.g. 0E080000...)"
|
|
39
|
+
>
|
|
35
40
|
</md-outlined-text-field>
|
|
36
41
|
<br />
|
|
37
42
|
<br />
|
|
@@ -50,18 +55,21 @@ export class CommissionNodeThread extends LitElement {
|
|
|
50
55
|
private async _setThreadDataset() {
|
|
51
56
|
const dataset = this._datasetField.value.trim();
|
|
52
57
|
if (!dataset) {
|
|
53
|
-
|
|
58
|
+
showAlertDialog({ title: "Validation error", text: "Dataset is required" });
|
|
54
59
|
return;
|
|
55
60
|
}
|
|
56
61
|
if (!/^[0-9a-fA-F]*$/.test(dataset) || dataset.length % 2 !== 0) {
|
|
57
|
-
|
|
62
|
+
showAlertDialog({
|
|
63
|
+
title: "Invalid Thread dataset",
|
|
64
|
+
text: "Must be a hex string with even length (each byte is two hex characters)",
|
|
65
|
+
});
|
|
58
66
|
return;
|
|
59
67
|
}
|
|
60
68
|
this._loading = true;
|
|
61
69
|
try {
|
|
62
70
|
await this.client.setThreadOperationalDataset(dataset);
|
|
63
71
|
} catch (err) {
|
|
64
|
-
|
|
72
|
+
showAlertDialog({ title: "Error setting Thread dataset", text: (err as Error).message });
|
|
65
73
|
} finally {
|
|
66
74
|
this._loading = false;
|
|
67
75
|
}
|
|
@@ -73,7 +81,7 @@ export class CommissionNodeThread extends LitElement {
|
|
|
73
81
|
const node = await this.client.commissionWithCode(this._pairingCodeField.value, false);
|
|
74
82
|
fireEvent(this, "node-commissioned", node);
|
|
75
83
|
} catch (err) {
|
|
76
|
-
|
|
84
|
+
showAlertDialog({ title: "Error commissioning node", text: (err as Error).message });
|
|
77
85
|
} finally {
|
|
78
86
|
this._loading = false;
|
|
79
87
|
}
|
|
@@ -14,6 +14,7 @@ import { customElement, property, query, state } from "lit/decorators.js";
|
|
|
14
14
|
import { clientContext } from "../../../client/client-context.js";
|
|
15
15
|
import { handleAsync } from "../../../util/async-handler.js";
|
|
16
16
|
import { fireEvent } from "../../../util/fire_event.js";
|
|
17
|
+
import { showAlertDialog } from "../../dialog-box/show-dialog-box.js";
|
|
17
18
|
|
|
18
19
|
@customElement("commission-node-wifi")
|
|
19
20
|
export class CommissionNodeWifi extends LitElement {
|
|
@@ -33,16 +34,19 @@ export class CommissionNodeWifi extends LitElement {
|
|
|
33
34
|
|
|
34
35
|
protected override render() {
|
|
35
36
|
if (!this.client.serverInfo.wifi_credentials_set) {
|
|
36
|
-
return html`<md-outlined-text-field
|
|
37
|
+
return html`<md-outlined-text-field
|
|
38
|
+
label="SSID"
|
|
39
|
+
.disabled="${this._loading}"
|
|
40
|
+
supporting-text="Network name"
|
|
41
|
+
>
|
|
42
|
+
</md-outlined-text-field>
|
|
37
43
|
<md-outlined-text-field label="Password" type="password" .disabled="${this._loading}">
|
|
38
44
|
</md-outlined-text-field>
|
|
39
45
|
<br />
|
|
40
46
|
<br />
|
|
41
47
|
<md-outlined-button @click=${handleAsync(() => this._setWifiCredentials())} .disabled="${this._loading}"
|
|
42
48
|
>Set WiFi Credentials</md-outlined-button
|
|
43
|
-
>${this._loading
|
|
44
|
-
? html`<md-circular-progress indeterminate .visible="${this._loading}"></md-circular-progress>`
|
|
45
|
-
: nothing}`;
|
|
49
|
+
>${this._loading ? html`<md-circular-progress indeterminate></md-circular-progress>` : nothing}`;
|
|
46
50
|
}
|
|
47
51
|
return html`<md-outlined-text-field label="Pairing code" .disabled="${this._loading}"> </md-outlined-text-field>
|
|
48
52
|
<br />
|
|
@@ -55,19 +59,19 @@ export class CommissionNodeWifi extends LitElement {
|
|
|
55
59
|
private async _setWifiCredentials() {
|
|
56
60
|
const ssid = this._ssidField.value;
|
|
57
61
|
if (!ssid) {
|
|
58
|
-
|
|
62
|
+
showAlertDialog({ title: "Validation error", text: "SSID is required" });
|
|
59
63
|
return;
|
|
60
64
|
}
|
|
61
65
|
const password = this._passwordField.value;
|
|
62
66
|
if (!password) {
|
|
63
|
-
|
|
67
|
+
showAlertDialog({ title: "Validation error", text: "Password is required" });
|
|
64
68
|
return;
|
|
65
69
|
}
|
|
66
70
|
this._loading = true;
|
|
67
71
|
try {
|
|
68
72
|
await this.client.setWifiCredentials(ssid, password);
|
|
69
73
|
} catch (err) {
|
|
70
|
-
|
|
74
|
+
showAlertDialog({ title: "Error setting WiFi credentials", text: (err as Error).message });
|
|
71
75
|
} finally {
|
|
72
76
|
this._loading = false;
|
|
73
77
|
}
|
|
@@ -76,14 +80,14 @@ export class CommissionNodeWifi extends LitElement {
|
|
|
76
80
|
private async _commissionNode() {
|
|
77
81
|
try {
|
|
78
82
|
if (!this._pairingCodeField.value) {
|
|
79
|
-
|
|
83
|
+
showAlertDialog({ title: "Validation error", text: "Pairing code is required" });
|
|
80
84
|
return;
|
|
81
85
|
}
|
|
82
86
|
this._loading = true;
|
|
83
87
|
const node = await this.client.commissionWithCode(this._pairingCodeField.value, false);
|
|
84
88
|
fireEvent(this, "node-commissioned", node);
|
|
85
89
|
} catch (err) {
|
|
86
|
-
|
|
90
|
+
showAlertDialog({ title: "Error commissioning node", text: (err as Error).message });
|
|
87
91
|
} finally {
|
|
88
92
|
this._loading = false;
|
|
89
93
|
}
|
|
@@ -15,6 +15,7 @@ import { css, html, LitElement, nothing } from "lit";
|
|
|
15
15
|
import { customElement, property, query, state } from "lit/decorators.js";
|
|
16
16
|
import { fireAndForget, handleAsync } from "../../../util/async-handler.js";
|
|
17
17
|
import { preventDefault } from "../../../util/prevent_default.js";
|
|
18
|
+
import { showAlertDialog } from "../../dialog-box/show-dialog-box.js";
|
|
18
19
|
|
|
19
20
|
const LOG_LEVELS: { value: LogLevelString; label: string }[] = [
|
|
20
21
|
{ value: "critical", label: "Critical" },
|
|
@@ -73,7 +74,7 @@ export class LogLevelDialog extends LitElement {
|
|
|
73
74
|
this._close();
|
|
74
75
|
} catch (err) {
|
|
75
76
|
console.error("Failed to apply log levels:", err);
|
|
76
|
-
|
|
77
|
+
showAlertDialog({ title: "Error", text: "Failed to apply log levels" });
|
|
77
78
|
} finally {
|
|
78
79
|
this._applying = false;
|
|
79
80
|
}
|
package/src/entrypoint/main.ts
CHANGED