@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.
Files changed (111) hide show
  1. package/dist/esm/components/dialog-box/dialog-box.d.ts +1 -0
  2. package/dist/esm/components/dialog-box/dialog-box.d.ts.map +1 -1
  3. package/dist/esm/components/dialog-box/dialog-box.js +15 -1
  4. package/dist/esm/components/dialog-box/dialog-box.js.map +1 -1
  5. package/dist/esm/components/dialogs/binding/node-binding-dialog.js +15 -19
  6. package/dist/esm/components/dialogs/binding/node-binding-dialog.js.map +1 -1
  7. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-existing.d.ts.map +1 -1
  8. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-existing.js +2 -1
  9. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-existing.js.map +1 -1
  10. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.d.ts.map +1 -1
  11. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.js +13 -5
  12. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.js.map +1 -1
  13. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.d.ts.map +1 -1
  14. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.js +13 -9
  15. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.js.map +1 -1
  16. package/dist/esm/components/dialogs/settings/log-level-dialog.d.ts.map +1 -1
  17. package/dist/esm/components/dialogs/settings/log-level-dialog.js +2 -1
  18. package/dist/esm/components/dialogs/settings/log-level-dialog.js.map +1 -1
  19. package/dist/esm/components/ha-svg-icon.d.ts.map +1 -1
  20. package/dist/esm/components/ha-svg-icon.js +0 -1
  21. package/dist/esm/components/ha-svg-icon.js.map +1 -1
  22. package/dist/esm/entrypoint/main.js +1 -1
  23. package/dist/esm/entrypoint/main.js.map +1 -1
  24. package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts.map +1 -1
  25. package/dist/esm/pages/cluster-commands/base-cluster-commands.js +72 -68
  26. package/dist/esm/pages/cluster-commands/base-cluster-commands.js.map +1 -1
  27. package/dist/esm/pages/components/header.d.ts +1 -1
  28. package/dist/esm/pages/components/header.d.ts.map +1 -1
  29. package/dist/esm/pages/components/header.js +59 -55
  30. package/dist/esm/pages/components/header.js.map +1 -1
  31. package/dist/esm/pages/components/node-details.js +1 -1
  32. package/dist/esm/pages/components/server-details.d.ts.map +1 -1
  33. package/dist/esm/pages/components/server-details.js +2 -0
  34. package/dist/esm/pages/components/server-details.js.map +1 -1
  35. package/dist/esm/pages/matter-cluster-view.d.ts +2 -1
  36. package/dist/esm/pages/matter-cluster-view.d.ts.map +1 -1
  37. package/dist/esm/pages/matter-cluster-view.js +49 -39
  38. package/dist/esm/pages/matter-cluster-view.js.map +1 -1
  39. package/dist/esm/pages/matter-endpoint-view.d.ts +2 -1
  40. package/dist/esm/pages/matter-endpoint-view.d.ts.map +1 -1
  41. package/dist/esm/pages/matter-endpoint-view.js +44 -35
  42. package/dist/esm/pages/matter-endpoint-view.js.map +1 -1
  43. package/dist/esm/pages/matter-network-view.d.ts +1 -1
  44. package/dist/esm/pages/matter-network-view.d.ts.map +1 -1
  45. package/dist/esm/pages/matter-network-view.js +216 -207
  46. package/dist/esm/pages/matter-network-view.js.map +1 -1
  47. package/dist/esm/pages/matter-node-view.d.ts +2 -1
  48. package/dist/esm/pages/matter-node-view.d.ts.map +1 -1
  49. package/dist/esm/pages/matter-node-view.js +104 -94
  50. package/dist/esm/pages/matter-node-view.js.map +1 -1
  51. package/dist/esm/pages/network/base-network-graph.d.ts.map +1 -1
  52. package/dist/esm/pages/network/base-network-graph.js +12 -5
  53. package/dist/esm/pages/network/base-network-graph.js.map +1 -1
  54. package/dist/esm/pages/network/device-panel.d.ts +1 -0
  55. package/dist/esm/pages/network/device-panel.d.ts.map +1 -1
  56. package/dist/esm/pages/network/device-panel.js +19 -5
  57. package/dist/esm/pages/network/device-panel.js.map +1 -1
  58. package/dist/esm/pages/network/network-details.d.ts +1 -1
  59. package/dist/esm/pages/network/network-details.d.ts.map +1 -1
  60. package/dist/esm/pages/network/network-details.js +275 -272
  61. package/dist/esm/pages/network/network-details.js.map +1 -1
  62. package/dist/esm/pages/network/network-utils.d.ts +5 -0
  63. package/dist/esm/pages/network/network-utils.d.ts.map +1 -1
  64. package/dist/esm/pages/network/network-utils.js +47 -17
  65. package/dist/esm/pages/network/network-utils.js.map +1 -1
  66. package/dist/esm/pages/network/update-connections-dialog.d.ts +1 -1
  67. package/dist/esm/pages/network/update-connections-dialog.d.ts.map +1 -1
  68. package/dist/esm/pages/network/update-connections-dialog.js +51 -47
  69. package/dist/esm/pages/network/update-connections-dialog.js.map +1 -1
  70. package/dist/esm/util/device-icons.d.ts.map +1 -1
  71. package/dist/esm/util/device-icons.js +6 -6
  72. package/dist/esm/util/device-icons.js.map +1 -1
  73. package/dist/esm/util/shared-styles.d.ts +10 -0
  74. package/dist/esm/util/shared-styles.d.ts.map +1 -0
  75. package/dist/esm/util/shared-styles.js +56 -0
  76. package/dist/esm/util/shared-styles.js.map +6 -0
  77. package/dist/web/index.html +53 -1
  78. package/dist/web/js/{commission-node-dialog-ByflSEDK.js → commission-node-dialog-DfwKU9qk.js} +4 -4
  79. package/dist/web/js/{commission-node-existing-CD6-Epwb.js → commission-node-existing-C7ITvNfj.js} +6 -3
  80. package/dist/web/js/{commission-node-thread-CekKshVL.js → commission-node-thread-D-icSzto.js} +23 -7
  81. package/dist/web/js/{commission-node-wifi-D_VKTWwF.js → commission-node-wifi-DwUkXlWz.js} +29 -11
  82. package/dist/web/js/{dialog-box-DdVdxz2_.js → dialog-box-BmpaTrvT.js} +16 -2
  83. package/dist/web/js/{fire_event-uMluKQub.js → fire_event-2ZxL-AHZ.js} +1 -1
  84. package/dist/web/js/{log-level-dialog-BO1OSL0z.js → log-level-dialog-D4hubdib.js} +5 -2
  85. package/dist/web/js/main.js +2 -2
  86. package/dist/web/js/{matter-dashboard-app-b1R3Pout.js → matter-dashboard-app-BtHTmAPq.js} +874 -788
  87. package/dist/web/js/{node-binding-dialog-rikORH9_.js → node-binding-dialog-MMx9rkCF.js} +40 -20
  88. package/package.json +4 -4
  89. package/src/components/dialog-box/dialog-box.ts +16 -1
  90. package/src/components/dialogs/binding/node-binding-dialog.ts +15 -15
  91. package/src/components/dialogs/commission-node-dialog/commission-node-existing.ts +2 -1
  92. package/src/components/dialogs/commission-node-dialog/commission-node-thread.ts +13 -5
  93. package/src/components/dialogs/commission-node-dialog/commission-node-wifi.ts +13 -9
  94. package/src/components/dialogs/settings/log-level-dialog.ts +2 -1
  95. package/src/components/ha-svg-icon.ts +0 -1
  96. package/src/entrypoint/main.ts +1 -1
  97. package/src/pages/cluster-commands/base-cluster-commands.ts +84 -80
  98. package/src/pages/components/header.ts +59 -55
  99. package/src/pages/components/node-details.ts +1 -1
  100. package/src/pages/components/server-details.ts +2 -0
  101. package/src/pages/matter-cluster-view.ts +49 -39
  102. package/src/pages/matter-endpoint-view.ts +49 -40
  103. package/src/pages/matter-network-view.ts +200 -191
  104. package/src/pages/matter-node-view.ts +94 -84
  105. package/src/pages/network/base-network-graph.ts +12 -5
  106. package/src/pages/network/device-panel.ts +20 -5
  107. package/src/pages/network/network-details.ts +236 -231
  108. package/src/pages/network/network-utils.ts +51 -17
  109. package/src/pages/network/update-connections-dialog.ts +51 -47
  110. package/src/util/device-icons.ts +12 -6
  111. package/src/util/shared-styles.ts +58 -0
@@ -1,4 +1,4 @@
1
- import { k as i, G as c, H as clientContext, n, a as e, i as i$1, I as showPromptDialog, J as showAlertDialog, A, j as b, F as handleAsync, t } from './matter-dashboard-app-b1R3Pout.js';
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
- alert("Please enter a valid target node ID");
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
- alert("Please enter a valid target node ID");
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
- alert("Please enter a valid target endpoint");
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
- alert("Please enter a valid target cluster");
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
- alert(`Failed to add ACL entry:
417
- ${aclResult.message}`);
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
- alert(`ACL entry partially failed:
422
- ${aclResult.message}`);
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
- alert(`Binding partially failed:
441
- ${bindingResult.message}`);
456
+ showAlertDialog({
457
+ title: "Binding partially failed",
458
+ text: bindingResult.message
459
+ });
442
460
  this.requestUpdate();
443
461
  } else {
444
- alert(`Failed to add binding:
445
- ${bindingResult.message}`);
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:18px;">
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:10px;">
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
- <Text style="font-size: 10px;font-style: italic;font-weight: bold;">
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
- </Text>
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: 20px 10px 10px 10px;
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: 15px;
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: 3px 15px;
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.5.15",
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-20260410-36535f904",
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.5.15",
41
- "@matter-server/custom-clusters": "0.5.15",
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
- alert("Please enter a valid target node ID");
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
- alert("Please enter a valid target node ID");
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
- alert("Please enter a valid target endpoint");
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
- alert("Please enter a valid target cluster");
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
- alert(`Failed to add ACL entry:\n${aclResult.message}`);
297
+ showAlertDialog({ title: "Failed to add ACL entry", text: aclResult.message });
298
298
  return;
299
299
  }
300
300
  if (aclResult.outcome === "partial") {
301
- alert(`ACL entry partially failed:\n${aclResult.message}`);
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
- alert(`Binding partially failed:\n${bindingResult.message}`);
323
+ showAlertDialog({ title: "Binding partially failed", text: bindingResult.message });
324
324
  this.requestUpdate(); // Update UI to show what succeeded
325
325
  } else {
326
- alert(`Failed to add binding:\n${bindingResult.message}`);
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:18px;">
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:10px;">
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
- <Text style="font-size: 10px;font-style: italic;font-weight: bold;">
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
- </Text>
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: 20px 10px 10px 10px;
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: 15px;
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: 3px 15px;
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
- alert(`Error commissioning node: ${(err as Error).message}`);
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 label="Thread dataset" .disabled="${this._loading}">
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
- alert("Dataset is required");
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
- alert("Invalid Thread dataset: must be a hex string with even length (each byte is two hex characters)");
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
- alert(`Error setting Thread dataset: ${(err as Error).message}`);
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
- alert(`Error commissioning node: ${(err as Error).message}`);
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 label="SSID" .disabled="${this._loading}"> </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
- alert("SSID is required");
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
- alert("Password is required");
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
- alert(`Error setting WiFi credentials: \n${(err as Error).message}`);
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
- alert("Pairing code is required");
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
- alert(`Error commissioning node: \n${(err as Error).message}`);
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
- alert("Failed to apply log levels");
77
+ showAlertDialog({ title: "Error", text: "Failed to apply log levels" });
77
78
  } finally {
78
79
  this._applying = false;
79
80
  }
@@ -21,7 +21,6 @@ export class HaSvgIcon extends LitElement {
21
21
  viewBox=${this.viewBox ?? "0 0 24 24"}
22
22
  preserveAspectRatio="xMidYMid meet"
23
23
  focusable="false"
24
- role="img"
25
24
  aria-hidden="true"
26
25
  >
27
26
  <g>
@@ -31,7 +31,7 @@ async function main() {
31
31
  suggestedUrl ?? "ws://localhost:5580/ws",
32
32
  );
33
33
  if (!storageUrl) {
34
- alert("Unable to connect without URL");
34
+ document.body.textContent = "Unable to connect: no WebSocket URL provided.";
35
35
  return;
36
36
  }
37
37
  if (suggestedUrl) {