@matter-server/dashboard 0.3.6-alpha.0-20260211-63a0097 → 0.3.7

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 (91) hide show
  1. package/dist/esm/client/models/descriptions.d.ts.map +1 -1
  2. package/dist/esm/client/models/descriptions.js +6 -0
  3. package/dist/esm/client/models/descriptions.js.map +1 -1
  4. package/dist/esm/components/dialog-box/dialog-box.d.ts.map +1 -1
  5. package/dist/esm/components/dialog-box/dialog-box.js.map +1 -1
  6. package/dist/esm/components/dialogs/binding/node-binding-dialog.d.ts.map +1 -1
  7. package/dist/esm/components/dialogs/binding/node-binding-dialog.js +4 -4
  8. package/dist/esm/components/dialogs/binding/node-binding-dialog.js.map +1 -1
  9. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-dialog.d.ts.map +1 -1
  10. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-dialog.js +7 -1
  11. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-dialog.js.map +1 -1
  12. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-existing.d.ts.map +1 -1
  13. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-existing.js +3 -1
  14. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-existing.js.map +1 -1
  15. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.d.ts.map +1 -1
  16. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.js +6 -2
  17. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.js.map +1 -1
  18. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.d.ts.map +1 -1
  19. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.js +3 -1
  20. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.js.map +1 -1
  21. package/dist/esm/components/dialogs/settings/log-level-dialog.d.ts.map +1 -1
  22. package/dist/esm/components/dialogs/settings/log-level-dialog.js +3 -1
  23. package/dist/esm/components/dialogs/settings/log-level-dialog.js.map +1 -1
  24. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.d.ts.map +1 -1
  25. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.js +3 -1
  26. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.js.map +1 -1
  27. package/dist/esm/pages/components/footer.d.ts.map +1 -1
  28. package/dist/esm/pages/components/footer.js +1 -3
  29. package/dist/esm/pages/components/footer.js.map +1 -1
  30. package/dist/esm/pages/components/header.d.ts.map +1 -1
  31. package/dist/esm/pages/components/header.js.map +1 -1
  32. package/dist/esm/pages/components/node-details.d.ts.map +1 -1
  33. package/dist/esm/pages/components/node-details.js +6 -4
  34. package/dist/esm/pages/components/node-details.js.map +1 -1
  35. package/dist/esm/pages/components/server-details.d.ts.map +1 -1
  36. package/dist/esm/pages/components/server-details.js +3 -1
  37. package/dist/esm/pages/components/server-details.js.map +1 -1
  38. package/dist/esm/pages/matter-cluster-view.d.ts.map +1 -1
  39. package/dist/esm/pages/matter-cluster-view.js +1 -1
  40. package/dist/esm/pages/matter-cluster-view.js.map +1 -1
  41. package/dist/esm/pages/matter-node-view.d.ts.map +1 -1
  42. package/dist/esm/pages/matter-node-view.js.map +1 -1
  43. package/dist/esm/pages/matter-server-view.d.ts.map +1 -1
  44. package/dist/esm/pages/matter-server-view.js +3 -1
  45. package/dist/esm/pages/matter-server-view.js.map +1 -1
  46. package/dist/esm/pages/network/device-panel.d.ts.map +1 -1
  47. package/dist/esm/pages/network/device-panel.js.map +1 -1
  48. package/dist/esm/pages/network/network-details.d.ts.map +1 -1
  49. package/dist/esm/pages/network/network-details.js +9 -3
  50. package/dist/esm/pages/network/network-details.js.map +1 -1
  51. package/dist/esm/pages/network/thread-graph.d.ts.map +1 -1
  52. package/dist/esm/pages/network/thread-graph.js +3 -1
  53. package/dist/esm/pages/network/thread-graph.js.map +1 -1
  54. package/dist/esm/pages/network/update-connections-dialog.d.ts.map +1 -1
  55. package/dist/esm/pages/network/update-connections-dialog.js +6 -2
  56. package/dist/esm/pages/network/update-connections-dialog.js.map +1 -1
  57. package/dist/esm/pages/network/wifi-graph.d.ts.map +1 -1
  58. package/dist/esm/pages/network/wifi-graph.js +3 -1
  59. package/dist/esm/pages/network/wifi-graph.js.map +1 -1
  60. package/dist/web/js/{commission-node-dialog-D_kXrsWp.js → commission-node-dialog-h9QTg0uL.js} +11 -5
  61. package/dist/web/js/{commission-node-existing-CEkNAN0-.js → commission-node-existing-TnFjP70Q.js} +5 -3
  62. package/dist/web/js/{commission-node-thread-DTypS5Nj.js → commission-node-thread-DumLBlyw.js} +8 -4
  63. package/dist/web/js/{commission-node-wifi-zcguyiy4.js → commission-node-wifi-CbT2wQDc.js} +5 -3
  64. package/dist/web/js/{dialog-box-CdWMQOWo.js → dialog-box-DVtkVga3.js} +1 -1
  65. package/dist/web/js/{fire_event-CNtKSQP4.js → fire_event-D_gZK7cY.js} +1 -1
  66. package/dist/web/js/{log-level-dialog-CUFDb4Oi.js → log-level-dialog-ChcYXgfz.js} +4 -2
  67. package/dist/web/js/main.js +1 -1
  68. package/dist/web/js/{matter-dashboard-app-CFuq-DRi.js → matter-dashboard-app-Dpr9EPlS.js} +76 -50
  69. package/dist/web/js/{node-binding-dialog-CLXvh5GP.js → node-binding-dialog-BI9spkUK.js} +115 -115
  70. package/package.json +4 -4
  71. package/src/client/models/descriptions.ts +6 -0
  72. package/src/components/dialog-box/dialog-box.ts +15 -9
  73. package/src/components/dialogs/binding/node-binding-dialog.ts +6 -9
  74. package/src/components/dialogs/commission-node-dialog/commission-node-dialog.ts +15 -7
  75. package/src/components/dialogs/commission-node-dialog/commission-node-existing.ts +7 -1
  76. package/src/components/dialogs/commission-node-dialog/commission-node-thread.ts +14 -2
  77. package/src/components/dialogs/commission-node-dialog/commission-node-wifi.ts +12 -4
  78. package/src/components/dialogs/settings/log-level-dialog.ts +13 -7
  79. package/src/pages/cluster-commands/clusters/basic-information-commands.ts +7 -3
  80. package/src/pages/components/footer.ts +1 -3
  81. package/src/pages/components/header.ts +25 -15
  82. package/src/pages/components/node-details.ts +34 -21
  83. package/src/pages/components/server-details.ts +7 -1
  84. package/src/pages/matter-cluster-view.ts +10 -6
  85. package/src/pages/matter-node-view.ts +5 -3
  86. package/src/pages/matter-server-view.ts +7 -1
  87. package/src/pages/network/device-panel.ts +5 -3
  88. package/src/pages/network/network-details.ts +134 -82
  89. package/src/pages/network/thread-graph.ts +3 -1
  90. package/src/pages/network/update-connections-dialog.ts +31 -17
  91. package/src/pages/network/wifi-graph.ts +3 -1
@@ -4020,7 +4020,7 @@ MdListItem = __decorate([t$1('md-list-item')], MdListItem);
4020
4020
  */
4021
4021
  const showLogLevelDialog = async client => {
4022
4022
  var _document$querySelect;
4023
- await import('./log-level-dialog-CUFDb4Oi.js');
4023
+ await import('./log-level-dialog-ChcYXgfz.js');
4024
4024
  const dialog = document.createElement("log-level-dialog");
4025
4025
  dialog.client = client;
4026
4026
  (_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
@@ -15574,6 +15574,12 @@ const clusters = {
15574
15574
  "label": "ObstructionDetected",
15575
15575
  "type": "Optional[bool]"
15576
15576
  },
15577
+ "319422481": {
15578
+ "id": 319422481,
15579
+ "cluster_id": 319486977,
15580
+ "label": "ChildLock",
15581
+ "type": "Optional[bool]"
15582
+ },
15577
15583
  "319422483": {
15578
15584
  "id": 319422483,
15579
15585
  "cluster_id": 319486977,
@@ -15674,7 +15680,7 @@ const clusters = {
15674
15680
  * SPDX-License-Identifier: Apache-2.0
15675
15681
  */
15676
15682
  const showDialogBox = async (type, dialogParams) => {
15677
- await import('./dialog-box-CdWMQOWo.js');
15683
+ await import('./dialog-box-DVtkVga3.js');
15678
15684
  return new Promise(resolve => {
15679
15685
  const dialog = document.createElement("dialog-box");
15680
15686
  dialog.params = dialogParams;
@@ -15841,6 +15847,39 @@ let MdTextButton = class MdTextButton extends TextButton {};
15841
15847
  MdTextButton.styles = [styles$g, styles$6];
15842
15848
  MdTextButton = __decorate([t$1('md-text-button')], MdTextButton);
15843
15849
 
15850
+ /**
15851
+ * @license
15852
+ * Copyright 2025-2026 Open Home Foundation
15853
+ * SPDX-License-Identifier: Apache-2.0
15854
+ */
15855
+ const showNodeBindingDialog = async (client, node, endpoint) => {
15856
+ var _document$querySelect;
15857
+ await import('./node-binding-dialog-BI9spkUK.js');
15858
+ const dialog = document.createElement("node-binding-dialog");
15859
+ dialog.client = client;
15860
+ dialog.node = node;
15861
+ dialog.endpoint = endpoint;
15862
+ (_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
15863
+ };
15864
+
15865
+ /**
15866
+ * @license
15867
+ * Copyright 2025-2026 Open Home Foundation
15868
+ * SPDX-License-Identifier: Apache-2.0
15869
+ */
15870
+ function handleAsync(fn, onError) {
15871
+ return () => {
15872
+ fn().catch(error => {
15873
+ console.error("Async operation failed:", error);
15874
+ });
15875
+ };
15876
+ }
15877
+ function fireAndForget(promise, onError) {
15878
+ promise.catch(error => {
15879
+ console.error("Async operation failed:", error);
15880
+ });
15881
+ }
15882
+
15844
15883
  /**
15845
15884
  * @license
15846
15885
  * Copyright 2025-2026 Open Home Foundation
@@ -16126,39 +16165,6 @@ function createWiFiRouterIconDataUrl(isSelected = false) {
16126
16165
  return createIconDataUrl(mdiWifi, color);
16127
16166
  }
16128
16167
 
16129
- /**
16130
- * @license
16131
- * Copyright 2025-2026 Open Home Foundation
16132
- * SPDX-License-Identifier: Apache-2.0
16133
- */
16134
- const showNodeBindingDialog = async (client, node, endpoint) => {
16135
- var _document$querySelect;
16136
- await import('./node-binding-dialog-CLXvh5GP.js');
16137
- const dialog = document.createElement("node-binding-dialog");
16138
- dialog.client = client;
16139
- dialog.node = node;
16140
- dialog.endpoint = endpoint;
16141
- (_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
16142
- };
16143
-
16144
- /**
16145
- * @license
16146
- * Copyright 2025-2026 Open Home Foundation
16147
- * SPDX-License-Identifier: Apache-2.0
16148
- */
16149
- function handleAsync(fn, onError) {
16150
- return () => {
16151
- fn().catch(error => {
16152
- console.error("Async operation failed:", error);
16153
- });
16154
- };
16155
- }
16156
- function fireAndForget(promise, onError) {
16157
- promise.catch(error => {
16158
- console.error("Async operation failed:", error);
16159
- });
16160
- }
16161
-
16162
16168
  /**
16163
16169
  * @license
16164
16170
  * Copyright 2018 Google LLC
@@ -16397,7 +16403,9 @@ let NodeDetails = class extends i$4 {
16397
16403
  <ha-svg-icon slot="start" class="device-icon" .path=${getDeviceIcon(this.node)}></ha-svg-icon>
16398
16404
  <div slot="headline">
16399
16405
  <b>${this.node.nodeLabel || "Node Info"}</b>
16400
- ${this.node.available ? A : b`<span class="status">OFFLINE</span>`}
16406
+ ${this.node.available ? A : b`
16407
+ <span class="status">OFFLINE</span>
16408
+ `}
16401
16409
  </div>
16402
16410
  </md-list-item>
16403
16411
  <md-list-item>
@@ -18904,7 +18912,9 @@ let BasicInformationClusterCommands = class extends BaseClusterCommands {
18904
18912
  <details class="command-panel">
18905
18913
  <summary>Node Label</summary>
18906
18914
  <div class="command-content">
18907
- ${!this._isNodeAvailable ? b`<div class="offline-warning">Node is offline - cannot edit label</div>` : A}
18915
+ ${!this._isNodeAvailable ? b`
18916
+ <div class="offline-warning">Node is offline - cannot edit label</div>
18917
+ ` : A}
18908
18918
  <div class="command-row">
18909
18919
  <md-outlined-text-field
18910
18920
  label="Node Label"
@@ -19328,9 +19338,7 @@ let DashboardFooter = class extends i$4 {
19328
19338
  return b`
19329
19339
  <div class="footer">
19330
19340
  The OHF Matter Server is a project by the Open Home Foundation.
19331
- <a href="https://www.openhomefoundation.org/structure/#support-our-work" target="_blank"
19332
- >Support development</a
19333
- >
19341
+ <a href="https://www.openhomefoundation.org/structure/#support-our-work" target="_blank">Support development</a>
19334
19342
  </div>
19335
19343
  `;
19336
19344
  }
@@ -21150,7 +21158,9 @@ let UpdateConnectionsDialog = class extends i$4 {
21150
21158
  Update network data from its ${this.onlineNeighborIds.length} online
21151
21159
  neighbor${this.onlineNeighborIds.length !== 1 ? "s" : ""} to refresh connection info.
21152
21160
  </p>
21153
- ` : b` <p>No online neighbors available to update.</p> `}
21161
+ ` : b`
21162
+ <p>No online neighbors available to update.</p>
21163
+ `}
21154
21164
  `;
21155
21165
  }
21156
21166
  _renderUnknownContent() {
@@ -21162,7 +21172,9 @@ let UpdateConnectionsDialog = class extends i$4 {
21162
21172
  node${this.onlineNeighborIds.length !== 1 ? "s" : ""} that
21163
21173
  see${this.onlineNeighborIds.length === 1 ? "s" : ""} this device to refresh info.
21164
21174
  </p>
21165
- ` : b` <p>No online nodes available that see this device.</p> `}
21175
+ ` : b`
21176
+ <p>No online nodes available that see this device.</p>
21177
+ `}
21166
21178
  `;
21167
21179
  }
21168
21180
  render() {
@@ -21445,7 +21457,9 @@ let NetworkDetails = class extends i$4 {
21445
21457
  ${conn.rssi !== null ? b`RSSI: ${conn.rssi} dBm` : A}${conn.rssi !== null && conn.lqi !== null ? ", " : A}${conn.lqi !== null ? b`LQI: ${conn.lqi}` : A}${conn.bidirectionalLqi !== void 0 ? b`<span class="route-info"
21446
21458
  >, Bidir: ${conn.bidirectionalLqi}</span
21447
21459
  >` : A}${conn.pathCost !== void 0 ? b`<span class="route-info">, Cost: ${conn.pathCost}</span>` : A}
21448
- ${!conn.isOutgoing ? b`<span class="direction-hint">(reverse)</span>` : A}
21460
+ ${!conn.isOutgoing ? b`
21461
+ <span class="direction-hint">(reverse)</span>
21462
+ ` : A}
21449
21463
  </div>
21450
21464
  </div>
21451
21465
  </div>
@@ -21517,7 +21531,9 @@ let NetworkDetails = class extends i$4 {
21517
21531
  _renderUnknownDeviceInfo(deviceId) {
21518
21532
  const unknown = this.unknownDevices.get(deviceId);
21519
21533
  if (!unknown) {
21520
- return b`<p>Unknown device data not available</p>`;
21534
+ return b`
21535
+ <p>Unknown device data not available</p>
21536
+ `;
21521
21537
  }
21522
21538
  return b`
21523
21539
  <div class="section">
@@ -21677,7 +21693,9 @@ let NetworkDetails = class extends i$4 {
21677
21693
  _renderWiFiAccessPointInfo(apId) {
21678
21694
  const ap = this.wifiAccessPoints.get(apId);
21679
21695
  if (!ap) {
21680
- return b`<p>Access point data not available</p>`;
21696
+ return b`
21697
+ <p>Access point data not available</p>
21698
+ `;
21681
21699
  }
21682
21700
  return b`
21683
21701
  <div class="section">
@@ -30633,7 +30651,9 @@ let ThreadGraph = class extends BaseNetworkGraph {
30633
30651
  </div>
30634
30652
  `;
30635
30653
  }
30636
- return b`<div class="graph-container"></div>`;
30654
+ return b`
30655
+ <div class="graph-container"></div>
30656
+ `;
30637
30657
  }
30638
30658
  };
30639
30659
  ThreadGraph = __decorateClass$6([t$1("thread-graph")], ThreadGraph);
@@ -30777,7 +30797,9 @@ let WiFiGraph = class extends BaseNetworkGraph {
30777
30797
  </div>
30778
30798
  `;
30779
30799
  }
30780
- return b`<div class="graph-container"></div>`;
30800
+ return b`
30801
+ <div class="graph-container"></div>
30802
+ `;
30781
30803
  }
30782
30804
  };
30783
30805
  WiFiGraph = __decorateClass$5([t$1("wifi-graph")], WiFiGraph);
@@ -31339,7 +31361,7 @@ MatterNodeView = __decorateClass$3([t$1("matter-node-view")], MatterNodeView);
31339
31361
  */
31340
31362
  const showCommissionNodeDialog = async client => {
31341
31363
  var _document$querySelect;
31342
- await import('./commission-node-dialog-D_kXrsWp.js');
31364
+ await import('./commission-node-dialog-h9QTg0uL.js');
31343
31365
  const dialog = document.createElement("commission-node-dialog");
31344
31366
  dialog.client = client;
31345
31367
  (_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
@@ -31382,7 +31404,9 @@ let ServerDetails = class extends i$4 {
31382
31404
  <md-list-item>
31383
31405
  <div slot="headline">
31384
31406
  <b>Open Home Foundation Matter Server ${this.client.isProduction ? "" : `(${this.client.serverBaseAddress})`}</b>
31385
- ${this.client.connection.connected ? A : b`<span class="status">OFFLINE</span>`}
31407
+ ${this.client.connection.connected ? A : b`
31408
+ <span class="status">OFFLINE</span>
31409
+ `}
31386
31410
  </div>
31387
31411
  </md-list-item>
31388
31412
  <md-list-item>
@@ -31522,7 +31546,9 @@ let MatterServerView = class extends i$4 {
31522
31546
  <span class="hex-id"
31523
31547
  >(${formatNodeAddress(isTestNodeId(node.node_id) || this.client.serverInfo.fabric_index === void 0 ? void 0 : this.client.serverInfo.fabric_index, node.node_id)})</span
31524
31548
  >
31525
- ${node.available ? "" : b`<span class="status">OFFLINE</span>`}
31549
+ ${node.available ? "" : b`
31550
+ <span class="status">OFFLINE</span>
31551
+ `}
31526
31552
  </div>
31527
31553
  <div slot="supporting-text">
31528
31554
  ${node.nodeLabel ? `${node.nodeLabel} | ` : A} ${node.vendorName} |
@@ -1,121 +1,7 @@
1
- import { k as i, G as c, H as clientContext, n, a as e, i as i$1, A, j as b, F as handleAsync, t } from './matter-dashboard-app-CFuq-DRi.js';
1
+ import { k as i, G as c, H as clientContext, n, a as e, i as i$1, A, j as b, F as handleAsync, t } from './matter-dashboard-app-Dpr9EPlS.js';
2
2
  import { p as preventDefault } from './prevent_default-D-ohDGsN.js';
3
3
  import './main.js';
4
4
 
5
- var _staticBlock$1;
6
- /**
7
- * @license
8
- * Copyright 2025-2026 Open Home Foundation
9
- * SPDX-License-Identifier: Apache-2.0
10
- */
11
- class BindingEntryDataTransformer {
12
- static transform(input) {
13
- if (!input || typeof input !== "object") {
14
- throw new Error("Invalid input: expected an object");
15
- }
16
- const result = {};
17
- const keyMapping = BindingEntryDataTransformer.KEY_MAPPING;
18
- for (const key in input) {
19
- if (key in keyMapping) {
20
- const mappedKey = keyMapping[key];
21
- if (mappedKey) {
22
- const value = input[key];
23
- if (value === void 0) {
24
- continue;
25
- }
26
- if (mappedKey === "fabricIndex") {
27
- result[mappedKey] = value === void 0 ? void 0 : Number(value);
28
- } else if (mappedKey === "node" || mappedKey === "endpoint") {
29
- result[mappedKey] = Number(value);
30
- } else {
31
- result[mappedKey] = value;
32
- }
33
- }
34
- }
35
- }
36
- return result;
37
- }
38
- static #_ = _staticBlock$1 = () => this.KEY_MAPPING = {
39
- "1": "node",
40
- "3": "endpoint",
41
- "4": "cluster",
42
- "254": "fabricIndex"
43
- };
44
- }
45
- _staticBlock$1();
46
-
47
- var _staticBlock, _staticBlock2;
48
- /**
49
- * @license
50
- * Copyright 2025-2026 Open Home Foundation
51
- * SPDX-License-Identifier: Apache-2.0
52
- */
53
- class AccessControlTargetTransformer {
54
- static transform(input) {
55
- if (!input || typeof input !== "object") {
56
- throw new Error("Invalid input: expected an object");
57
- }
58
- const result = {};
59
- const keyMapping = AccessControlTargetTransformer.KEY_MAPPING;
60
- for (const key in input) {
61
- if (key in keyMapping) {
62
- const mappedKey = keyMapping[key];
63
- if (mappedKey) {
64
- const value = input[key];
65
- if (value === void 0) continue;
66
- result[mappedKey] = value;
67
- }
68
- }
69
- }
70
- return result;
71
- }
72
- static #_ = _staticBlock = () => this.KEY_MAPPING = {
73
- "0": "cluster",
74
- "1": "endpoint",
75
- "2": "deviceType"
76
- };
77
- }
78
- _staticBlock();
79
- class AccessControlEntryDataTransformer {
80
- static transform(input) {
81
- if (!input || typeof input !== "object") {
82
- throw new Error("Invalid input: expected an object");
83
- }
84
- const result = {};
85
- const keyMapping = AccessControlEntryDataTransformer.KEY_MAPPING;
86
- for (const key in input) {
87
- if (key in keyMapping) {
88
- const mappedKey = keyMapping[key];
89
- if (mappedKey) {
90
- const value = input[key];
91
- if (value === void 0) continue;
92
- if (mappedKey === "subjects") {
93
- result[mappedKey] = Array.isArray(value) ? value : void 0;
94
- } else if (mappedKey === "targets") {
95
- if (Array.isArray(value)) {
96
- const _targets = Object.values(value).map(val => AccessControlTargetTransformer.transform(val));
97
- result[mappedKey] = _targets;
98
- } else {
99
- result[mappedKey] = void 0;
100
- }
101
- } else {
102
- result[mappedKey] = value;
103
- }
104
- }
105
- }
106
- }
107
- return result;
108
- }
109
- static #_ = _staticBlock2 = () => this.KEY_MAPPING = {
110
- "1": "privilege",
111
- "2": "authMode",
112
- "3": "subjects",
113
- "4": "targets",
114
- "254": "fabricIndex"
115
- };
116
- }
117
- _staticBlock2();
118
-
119
5
  /**
120
6
  * @license
121
7
  * Copyright 2025-2026 Open Home Foundation
@@ -214,6 +100,120 @@ function formatBatchMessage(outcome, successCount, failureCount, errorCounts) {
214
100
  return `Partial failure: ${successCount} ${entryWord(successCount)} succeeded, ${failureCount} failed (${errorParts}). Please verify.`;
215
101
  }
216
102
 
103
+ var _staticBlock$1, _staticBlock2;
104
+ /**
105
+ * @license
106
+ * Copyright 2025-2026 Open Home Foundation
107
+ * SPDX-License-Identifier: Apache-2.0
108
+ */
109
+ class AccessControlTargetTransformer {
110
+ static transform(input) {
111
+ if (!input || typeof input !== "object") {
112
+ throw new Error("Invalid input: expected an object");
113
+ }
114
+ const result = {};
115
+ const keyMapping = AccessControlTargetTransformer.KEY_MAPPING;
116
+ for (const key in input) {
117
+ if (key in keyMapping) {
118
+ const mappedKey = keyMapping[key];
119
+ if (mappedKey) {
120
+ const value = input[key];
121
+ if (value === void 0) continue;
122
+ result[mappedKey] = value;
123
+ }
124
+ }
125
+ }
126
+ return result;
127
+ }
128
+ static #_ = _staticBlock$1 = () => this.KEY_MAPPING = {
129
+ "0": "cluster",
130
+ "1": "endpoint",
131
+ "2": "deviceType"
132
+ };
133
+ }
134
+ _staticBlock$1();
135
+ class AccessControlEntryDataTransformer {
136
+ static transform(input) {
137
+ if (!input || typeof input !== "object") {
138
+ throw new Error("Invalid input: expected an object");
139
+ }
140
+ const result = {};
141
+ const keyMapping = AccessControlEntryDataTransformer.KEY_MAPPING;
142
+ for (const key in input) {
143
+ if (key in keyMapping) {
144
+ const mappedKey = keyMapping[key];
145
+ if (mappedKey) {
146
+ const value = input[key];
147
+ if (value === void 0) continue;
148
+ if (mappedKey === "subjects") {
149
+ result[mappedKey] = Array.isArray(value) ? value : void 0;
150
+ } else if (mappedKey === "targets") {
151
+ if (Array.isArray(value)) {
152
+ const _targets = Object.values(value).map(val => AccessControlTargetTransformer.transform(val));
153
+ result[mappedKey] = _targets;
154
+ } else {
155
+ result[mappedKey] = void 0;
156
+ }
157
+ } else {
158
+ result[mappedKey] = value;
159
+ }
160
+ }
161
+ }
162
+ }
163
+ return result;
164
+ }
165
+ static #_ = _staticBlock2 = () => this.KEY_MAPPING = {
166
+ "1": "privilege",
167
+ "2": "authMode",
168
+ "3": "subjects",
169
+ "4": "targets",
170
+ "254": "fabricIndex"
171
+ };
172
+ }
173
+ _staticBlock2();
174
+
175
+ var _staticBlock;
176
+ /**
177
+ * @license
178
+ * Copyright 2025-2026 Open Home Foundation
179
+ * SPDX-License-Identifier: Apache-2.0
180
+ */
181
+ class BindingEntryDataTransformer {
182
+ static transform(input) {
183
+ if (!input || typeof input !== "object") {
184
+ throw new Error("Invalid input: expected an object");
185
+ }
186
+ const result = {};
187
+ const keyMapping = BindingEntryDataTransformer.KEY_MAPPING;
188
+ for (const key in input) {
189
+ if (key in keyMapping) {
190
+ const mappedKey = keyMapping[key];
191
+ if (mappedKey) {
192
+ const value = input[key];
193
+ if (value === void 0) {
194
+ continue;
195
+ }
196
+ if (mappedKey === "fabricIndex") {
197
+ result[mappedKey] = value === void 0 ? void 0 : Number(value);
198
+ } else if (mappedKey === "node" || mappedKey === "endpoint") {
199
+ result[mappedKey] = Number(value);
200
+ } else {
201
+ result[mappedKey] = value;
202
+ }
203
+ }
204
+ }
205
+ }
206
+ return result;
207
+ }
208
+ static #_ = _staticBlock = () => this.KEY_MAPPING = {
209
+ "1": "node",
210
+ "3": "endpoint",
211
+ "4": "cluster",
212
+ "254": "fabricIndex"
213
+ };
214
+ }
215
+ _staticBlock();
216
+
217
217
  var __defProp = Object.defineProperty;
218
218
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
219
219
  var __decorateClass = (decorators, target, key, kind) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter-server/dashboard",
3
- "version": "0.3.6-alpha.0-20260211-63a0097",
3
+ "version": "0.3.7",
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.0",
26
- "@matter/main": "0.16.9-alpha.0-20260204-fd5b6ed86",
26
+ "@matter/main": "0.16.9-alpha.0-20260211-5dcebea26",
27
27
  "@rollup/plugin-babel": "^6.1.0",
28
28
  "@rollup/plugin-commonjs": "^29.0.0",
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.3.6-alpha.0-20260211-63a0097",
41
- "@matter-server/custom-clusters": "0.3.6-alpha.0-20260211-63a0097",
40
+ "@matter-server/ws-client": "0.3.7",
41
+ "@matter-server/custom-clusters": "0.3.7",
42
42
  "@mdi/js": "^7.4.47",
43
43
  "lit": "^3.3.2",
44
44
  "tslib": "^2.8.1",
@@ -11339,6 +11339,12 @@ export const clusters: Record<number, ClusterDescription> = {
11339
11339
  "label": "ObstructionDetected",
11340
11340
  "type": "Optional[bool]"
11341
11341
  },
11342
+ "319422481": {
11343
+ "id": 319422481,
11344
+ "cluster_id": 319486977,
11345
+ "label": "ChildLock",
11346
+ "type": "Optional[bool]"
11347
+ },
11342
11348
  "319422483": {
11343
11349
  "id": 319422483,
11344
11350
  "cluster_id": 319486977,
@@ -24,19 +24,25 @@ export class DialogBox extends LitElement {
24
24
  return html`
25
25
  <md-dialog open @cancel=${preventDefault} @closed=${this._handleClosed}>
26
26
  ${params.title ? html`<div slot="headline">${params.title}</div>` : ""}
27
- ${params.text
28
- ? html`<div slot="content">
29
- ${params.asCodeBlock && typeof params.text === "string"
30
- ? html`<code>${params.text}</code>`
31
- : params.text}
27
+ ${
28
+ params.text
29
+ ? html`<div slot="content">
30
+ ${
31
+ params.asCodeBlock && typeof params.text === "string"
32
+ ? html`<code>${params.text}</code>`
33
+ : params.text
34
+ }
32
35
  </div>`
33
- : ""}
36
+ : ""
37
+ }
34
38
  <div slot="actions">
35
- ${this.type === "prompt"
36
- ? html`
39
+ ${
40
+ this.type === "prompt"
41
+ ? html`
37
42
  <md-text-button @click=${this._cancel}>${params.cancelText ?? "Cancel"}</md-text-button>
38
43
  `
39
- : ""}
44
+ : ""
45
+ }
40
46
  <md-text-button @click=${this._confirm}>${params.confirmText ?? "OK"}</md-text-button>
41
47
  </div>
42
48
  </md-dialog>
@@ -6,29 +6,26 @@
6
6
 
7
7
  import "@material/web/button/text-button";
8
8
  import "@material/web/dialog/dialog";
9
- import type { MdDialog } from "@material/web/dialog/dialog.js";
9
+ import { consume } from "@lit/context";
10
10
  import "@material/web/list/list";
11
11
  import "@material/web/list/list-item";
12
12
  import "@material/web/textfield/outlined-text-field";
13
- import type { MdOutlinedTextField } from "@material/web/textfield/outlined-text-field.js";
13
+ import type { MdDialog } from "@material/web/dialog/dialog.js";
14
14
  import "../../../components/ha-svg-icon";
15
-
15
+ import type { MdOutlinedTextField } from "@material/web/textfield/outlined-text-field.js";
16
16
  import { AccessControlEntry, BindingTarget, MatterClient, MatterNode } from "@matter-server/ws-client";
17
17
  import { css, html, LitElement, nothing } from "lit";
18
18
  import { customElement, property, query } from "lit/decorators.js";
19
+ import { clientContext } from "../../../client/client-context.js";
19
20
  import { handleAsync } from "../../../util/async-handler.js";
21
+ import { analyzeBatchResults, type MatterBatchResult } from "../../../util/matter-status.js";
20
22
  import { preventDefault } from "../../../util/prevent_default.js";
21
- import { BindingEntryDataTransformer, BindingEntryStruct, InputType } from "./model.js";
22
-
23
23
  import {
24
24
  AccessControlEntryDataTransformer,
25
25
  AccessControlEntryStruct,
26
26
  AccessControlTargetStruct,
27
27
  } from "../acl/model.js";
28
-
29
- import { consume } from "@lit/context";
30
- import { clientContext } from "../../../client/client-context.js";
31
- import { analyzeBatchResults, type MatterBatchResult } from "../../../util/matter-status.js";
28
+ import { BindingEntryDataTransformer, BindingEntryStruct, InputType } from "./model.js";
32
29
 
33
30
  @customElement("node-binding-dialog")
34
31
  export class NodeBindingDialog extends LitElement {
@@ -25,8 +25,9 @@ export class ComissionNodeDialog extends LitElement {
25
25
  <md-dialog open @cancel=${preventDefault} @closed=${this._handleClosed}>
26
26
  <div slot="headline">Commission node</div>
27
27
  <div slot="content" @node-commissioned=${this._nodeCommissioned}>
28
- ${!this._mode
29
- ? html`<md-list>
28
+ ${
29
+ !this._mode
30
+ ? html`<md-list>
30
31
  <md-list-item
31
32
  type="button"
32
33
  .disabled=${!this.client.serverInfo.bluetooth_enabled}
@@ -43,11 +44,18 @@ export class ComissionNodeDialog extends LitElement {
43
44
  >Commission existing device</md-list-item
44
45
  >
45
46
  </md-list>`
46
- : this._mode === "wifi"
47
- ? html`<commission-node-wifi></commission-node-wifi>`
48
- : this._mode === "thread"
49
- ? html`<commission-node-thread></commission-node-thread>`
50
- : html`<commission-node-existing></commission-node-existing>`}
47
+ : this._mode === "wifi"
48
+ ? html`
49
+ <commission-node-wifi></commission-node-wifi>
50
+ `
51
+ : this._mode === "thread"
52
+ ? html`
53
+ <commission-node-thread></commission-node-thread>
54
+ `
55
+ : html`
56
+ <commission-node-existing></commission-node-existing>
57
+ `
58
+ }
51
59
  </div>
52
60
  <div slot="actions">
53
61
  <md-text-button @click=${this._close}>Cancel</md-text-button>
@@ -33,7 +33,13 @@ export class CommissionNodeExisting extends LitElement {
33
33
  <br />
34
34
  <md-outlined-button @click=${handleAsync(() => this._commissionNode())} .disabled="${this._loading}"
35
35
  >Commission</md-outlined-button
36
- >${this._loading ? html`<md-circular-progress indeterminate></md-circular-progress>` : nothing}`;
36
+ >${
37
+ this._loading
38
+ ? html`
39
+ <md-circular-progress indeterminate></md-circular-progress>
40
+ `
41
+ : nothing
42
+ }`;
37
43
  }
38
44
 
39
45
  private async _commissionNode() {