@matter-server/dashboard 0.3.1 → 0.3.2

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 (44) hide show
  1. package/dist/esm/components/dialog-box/dialog-box.d.ts +1 -1
  2. package/dist/esm/components/dialog-box/dialog-box.d.ts.map +1 -1
  3. package/dist/esm/components/dialog-box/dialog-box.js +6 -4
  4. package/dist/esm/components/dialog-box/dialog-box.js.map +1 -1
  5. package/dist/esm/components/dialog-box/show-dialog-box.d.ts +1 -0
  6. package/dist/esm/components/dialog-box/show-dialog-box.d.ts.map +1 -1
  7. package/dist/esm/components/dialog-box/show-dialog-box.js +1 -1
  8. package/dist/esm/components/dialog-box/show-dialog-box.js.map +1 -1
  9. package/dist/esm/components/ha-svg-icon.js +1 -1
  10. package/dist/esm/entrypoint/main.js +1 -1
  11. package/dist/esm/pages/components/header.js +1 -1
  12. package/dist/esm/pages/components/node-details.d.ts.map +1 -1
  13. package/dist/esm/pages/components/node-details.js +7 -4
  14. package/dist/esm/pages/components/node-details.js.map +1 -1
  15. package/dist/esm/pages/components/server-details.js +1 -1
  16. package/dist/esm/pages/matter-cluster-view.d.ts.map +1 -1
  17. package/dist/esm/pages/matter-cluster-view.js +6 -5
  18. package/dist/esm/pages/matter-cluster-view.js.map +1 -1
  19. package/dist/esm/pages/matter-endpoint-view.js +2 -2
  20. package/dist/esm/util/fire_event.js +1 -1
  21. package/dist/web/js/{commission-node-dialog-BBmcax4x.js → commission-node-dialog-CBSDiqRW.js} +5 -5
  22. package/dist/web/js/{commission-node-existing-BpZvHj-g.js → commission-node-existing-TP6s8Tez.js} +5 -5
  23. package/dist/web/js/{commission-node-thread-r1tiXZpS.js → commission-node-thread-DOB8pu6x.js} +5 -5
  24. package/dist/web/js/{commission-node-wifi-BoGa1n6O.js → commission-node-wifi-tzavmk1j.js} +5 -5
  25. package/dist/web/js/{dialog-box-RjYIjGvB.js → dialog-box-Dknil_Be.js} +8 -6
  26. package/dist/web/js/{fire_event-CtgWQuh0.js → fire_event-DRpOSjJR.js} +2 -2
  27. package/dist/web/js/{log-level-dialog-CO5YoPgN.js → log-level-dialog-TXkma-7Z.js} +3 -3
  28. package/dist/web/js/main.js +9 -3
  29. package/dist/web/js/{matter-dashboard-app-BrrI804e.js → matter-dashboard-app-B7GUghkC.js} +23 -19
  30. package/dist/web/js/{node-binding-dialog-vDVm_W7d.js → node-binding-dialog-D52FCBFP.js} +4 -4
  31. package/dist/web/js/{outlined-text-field-DwmSQzCx.js → outlined-text-field-D1DyKQY-.js} +3 -3
  32. package/dist/web/js/{prevent_default-BCNFIsLL.js → prevent_default-BPgSQsuY.js} +1 -1
  33. package/dist/web/js/{validator-DpwNYslY.js → validator-C735j770.js} +1 -1
  34. package/package.json +4 -4
  35. package/src/components/dialog-box/dialog-box.ts +11 -5
  36. package/src/components/dialog-box/show-dialog-box.ts +2 -1
  37. package/src/components/ha-svg-icon.ts +1 -1
  38. package/src/entrypoint/main.ts +1 -1
  39. package/src/pages/components/header.ts +1 -1
  40. package/src/pages/components/node-details.ts +9 -4
  41. package/src/pages/components/server-details.ts +1 -1
  42. package/src/pages/matter-cluster-view.ts +5 -4
  43. package/src/pages/matter-endpoint-view.ts +2 -2
  44. package/src/util/fire_event.ts +1 -1
@@ -19,7 +19,7 @@ export declare class DialogBox extends LitElement {
19
19
  }
20
20
  declare global {
21
21
  interface HTMLElementTagNameMap {
22
- "dialox-box": DialogBox;
22
+ "dialog-box": DialogBox;
23
23
  }
24
24
  }
25
25
  //# sourceMappingURL=dialog-box.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dialog-box.d.ts","sourceRoot":"","sources":["../../../../src/components/dialog-box/dialog-box.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,kCAAkC,CAAC;AAC1C,OAAO,6BAA6B,CAAC;AAErC,OAAO,EAAQ,UAAU,EAAE,MAAM,KAAK,CAAC;AAGvC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,qBACa,SAAU,SAAQ,UAAU;IACE,MAAM,EAAG,qBAAqB,CAAC;IAE/B,YAAY,EAAG,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAE7D,IAAI,EAAG,OAAO,GAAG,QAAQ,CAAC;cAE1B,MAAM;IAkBzB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,QAAQ;IAIhB,UAAU,CAAC,MAAM,EAAE,OAAO;IAK1B,OAAO,CAAC,aAAa;CAGxB;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,YAAY,EAAE,SAAS,CAAC;KAC3B;CACJ"}
1
+ {"version":3,"file":"dialog-box.d.ts","sourceRoot":"","sources":["../../../../src/components/dialog-box/dialog-box.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,kCAAkC,CAAC;AAC1C,OAAO,6BAA6B,CAAC;AAErC,OAAO,EAAQ,UAAU,EAAE,MAAM,KAAK,CAAC;AAGvC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,qBACa,SAAU,SAAQ,UAAU;IACE,MAAM,EAAG,qBAAqB,CAAC;IAE/B,YAAY,EAAG,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAE7D,IAAI,EAAG,OAAO,GAAG,QAAQ,CAAC;cAE1B,MAAM;IAwBzB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,QAAQ;IAIhB,UAAU,CAAC,MAAM,EAAE,OAAO;IAK1B,OAAO,CAAC,aAAa;CAGxB;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,YAAY,EAAE,SAAS,CAAC;KAC3B;CACJ"}
@@ -24,12 +24,14 @@ let DialogBox = class 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 ? html`<div slot="content">${params.text}</div>` : ""}
27
+ ${params.text ? html`<div slot="content">
28
+ ${params.asCodeBlock && typeof params.text === "string" ? html`<code>${params.text}</code>` : params.text}
29
+ </div>` : ""}
28
30
  <div slot="actions">
29
31
  ${this.type === "prompt" ? html`
30
- <md-text-button @click=${this._cancel}> ${params.cancelText || "Cancel"} </md-text-button>
32
+ <md-text-button @click=${this._cancel}>${params.cancelText ?? "Cancel"}</md-text-button>
31
33
  ` : ""}
32
- <md-text-button @click=${this._confirm}> ${params.confirmText || "OK"} </md-text-button>
34
+ <md-text-button @click=${this._confirm}>${params.confirmText ?? "OK"}</md-text-button>
33
35
  </div>
34
36
  </md-dialog>
35
37
  `;
@@ -58,7 +60,7 @@ __decorateClass([
58
60
  property()
59
61
  ], DialogBox.prototype, "type", 2);
60
62
  DialogBox = __decorateClass([
61
- customElement("dialox-box")
63
+ customElement("dialog-box")
62
64
  ], DialogBox);
63
65
  export {
64
66
  DialogBox
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/dialog-box/dialog-box.ts"],
4
- "mappings": ";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,OAAO;AACP,OAAO;AAEP,SAAS,MAAM,kBAAkB;AACjC,SAAS,eAAe,gBAAgB;AACxC,SAAS,sBAAsB;AAGxB,IAAM,YAAN,cAAwB,WAAW;AAAA,EAOnB,SAAS;AACxB,UAAM,SAAS,KAAK;AACpB,WAAO;AAAA,sCACuB,cAAc,YAAY,KAAK,aAAa;AAAA,kBAChE,OAAO,QAAQ,4BAA4B,OAAO,KAAK,WAAW,EAAE;AAAA,kBACpE,OAAO,OAAO,2BAA2B,OAAO,IAAI,WAAW,EAAE;AAAA;AAAA,sBAE7D,KAAK,SAAS,WACV;AAAA,uDAC6B,KAAK,OAAO,KAAK,OAAO,cAAc,QAAQ;AAAA,8BAE3E,EAAE;AAAA,6CACiB,KAAK,QAAQ,KAAK,OAAO,eAAe,IAAI;AAAA;AAAA;AAAA;AAAA,EAIrF;AAAA,EAEQ,UAAU;AACd,SAAK,WAAW,KAAK;AAAA,EACzB;AAAA,EAEQ,WAAW;AACf,SAAK,WAAW,IAAI;AAAA,EACxB;AAAA,EAEA,WAAW,QAAiB;AACxB,SAAK,aAAa,MAAM;AACxB,SAAK,WAAY,cAAwB,WAAW,EAAG,MAAM;AAAA,EACjE;AAAA,EAEQ,gBAAgB;AACpB,SAAK,cAAe,YAAY,IAAI;AAAA,EACxC;AACJ;AAxC2C;AAAA,EAAtC,SAAS,EAAE,WAAW,MAAM,CAAC;AAAA,GADrB,UAC8B;AAEA;AAAA,EAAtC,SAAS,EAAE,WAAW,MAAM,CAAC;AAAA,GAHrB,UAG8B;AAEpB;AAAA,EAAlB,SAAS;AAAA,GALD,UAKU;AALV,YAAN;AAAA,EADN,cAAc,YAAY;AAAA,GACd;",
4
+ "mappings": ";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,OAAO;AACP,OAAO;AAEP,SAAS,MAAM,kBAAkB;AACjC,SAAS,eAAe,gBAAgB;AACxC,SAAS,sBAAsB;AAGxB,IAAM,YAAN,cAAwB,WAAW;AAAA,EAOnB,SAAS;AACxB,UAAM,SAAS,KAAK;AACpB,WAAO;AAAA,sCACuB,cAAc,YAAY,KAAK,aAAa;AAAA,kBAChE,OAAO,QAAQ,4BAA4B,OAAO,KAAK,WAAW,EAAE;AAAA,kBACpE,OAAO,OACH;AAAA,4BACM,OAAO,eAAe,OAAO,OAAO,SAAS,WACzC,aAAa,OAAO,IAAI,YACxB,OAAO,IAAI;AAAA,gCAErB,EAAE;AAAA;AAAA,sBAEF,KAAK,SAAS,WACV;AAAA,uDAC6B,KAAK,OAAO,IAAI,OAAO,cAAc,QAAQ;AAAA,8BAE1E,EAAE;AAAA,6CACiB,KAAK,QAAQ,IAAI,OAAO,eAAe,IAAI;AAAA;AAAA;AAAA;AAAA,EAIpF;AAAA,EAEQ,UAAU;AACd,SAAK,WAAW,KAAK;AAAA,EACzB;AAAA,EAEQ,WAAW;AACf,SAAK,WAAW,IAAI;AAAA,EACxB;AAAA,EAEA,WAAW,QAAiB;AACxB,SAAK,aAAa,MAAM;AACxB,SAAK,WAAY,cAAwB,WAAW,EAAG,MAAM;AAAA,EACjE;AAAA,EAEQ,gBAAgB;AACpB,SAAK,cAAe,YAAY,IAAI;AAAA,EACxC;AACJ;AA9C2C;AAAA,EAAtC,SAAS,EAAE,WAAW,MAAM,CAAC;AAAA,GADrB,UAC8B;AAEA;AAAA,EAAtC,SAAS,EAAE,WAAW,MAAM,CAAC;AAAA,GAHrB,UAG8B;AAEpB;AAAA,EAAlB,SAAS;AAAA,GALD,UAKU;AALV,YAAN;AAAA,EADN,cAAc,YAAY;AAAA,GACd;",
5
5
  "names": []
6
6
  }
@@ -8,6 +8,7 @@ interface BaseDialogBoxParams {
8
8
  confirmText?: string;
9
9
  text: string | TemplateResult;
10
10
  title: string;
11
+ asCodeBlock?: boolean;
11
12
  }
12
13
  export interface PromptDialogBoxParams extends BaseDialogBoxParams {
13
14
  cancelText?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"show-dialog-box.d.ts","sourceRoot":"","sources":["../../../../src/components/dialog-box/show-dialog-box.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAE1C,UAAU,mBAAmB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAsB,SAAQ,mBAAmB;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAaD,eAAO,MAAM,eAAe,GAAI,cAAc,mBAAmB,qBAAyC,CAAC;AAE3G,eAAO,MAAM,gBAAgB,GAAI,cAAc,mBAAmB,qBAA0C,CAAC"}
1
+ {"version":3,"file":"show-dialog-box.d.ts","sourceRoot":"","sources":["../../../../src/components/dialog-box/show-dialog-box.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAE1C,UAAU,mBAAmB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,qBAAsB,SAAQ,mBAAmB;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAaD,eAAO,MAAM,eAAe,GAAI,cAAc,mBAAmB,qBAAyC,CAAC;AAE3G,eAAO,MAAM,gBAAgB,GAAI,cAAc,mBAAmB,qBAA0C,CAAC"}
@@ -6,7 +6,7 @@
6
6
  const showDialogBox = async (type, dialogParams) => {
7
7
  await import("./dialog-box.js");
8
8
  return new Promise((resolve) => {
9
- const dialog = document.createElement("dialox-box");
9
+ const dialog = document.createElement("dialog-box");
10
10
  dialog.params = dialogParams;
11
11
  dialog.dialogResult = resolve;
12
12
  dialog.type = type;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/dialog-box/show-dialog-box.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA,MAAM,gBAAgB,OAAO,MAA0B,iBAAwC;AAC3F,QAAM,OAAO,iBAAiB;AAC9B,SAAO,IAAI,QAAiB,aAAW;AACnC,UAAM,SAAS,SAAS,cAAc,YAAY;AAClD,WAAO,SAAS;AAChB,WAAO,eAAe;AACtB,WAAO,OAAO;AACd,aAAS,KAAK,YAAY,MAAM;AAAA,EACpC,CAAC;AACL;AAEO,MAAM,kBAAkB,CAAC,iBAAsC,cAAc,SAAS,YAAY;AAElG,MAAM,mBAAmB,CAAC,iBAAsC,cAAc,UAAU,YAAY;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAmBA,MAAM,gBAAgB,OAAO,MAA0B,iBAAwC;AAC3F,QAAM,OAAO,iBAAiB;AAC9B,SAAO,IAAI,QAAiB,aAAW;AACnC,UAAM,SAAS,SAAS,cAAc,YAAY;AAClD,WAAO,SAAS;AAChB,WAAO,eAAe;AACtB,WAAO,OAAO;AACd,aAAS,KAAK,YAAY,MAAM;AAAA,EACpC,CAAC;AACL;AAEO,MAAM,kBAAkB,CAAC,iBAAsC,cAAc,SAAS,YAAY;AAElG,MAAM,mBAAmB,CAAC,iBAAsC,cAAc,UAAU,YAAY;",
5
5
  "names": []
6
6
  }
@@ -19,7 +19,7 @@ let HaSvgIcon = class extends LitElement {
19
19
  render() {
20
20
  return svg`
21
21
  <svg
22
- viewBox=${this.viewBox || "0 0 24 24"}
22
+ viewBox=${this.viewBox ?? "0 0 24 24"}
23
23
  preserveAspectRatio="xMidYMid meet"
24
24
  focusable="false"
25
25
  role="img"
@@ -16,7 +16,7 @@ async function main() {
16
16
  const suggestedUrl = urlParams.get("url");
17
17
  storageUrl = prompt(
18
18
  "Enter Websocket URL to a running Matter Server",
19
- suggestedUrl || "ws://localhost:5580/ws"
19
+ suggestedUrl ?? "ws://localhost:5580/ws"
20
20
  );
21
21
  if (!storageUrl) {
22
22
  alert("Unable to connect without URL");
@@ -79,7 +79,7 @@ let DashboardHeader = class extends LitElement {
79
79
  </md-icon-button>
80
80
  </a>` : ""}
81
81
 
82
- <div class="title">${this.title || ""}</div>
82
+ <div class="title">${this.title ?? ""}</div>
83
83
  <div class="actions">
84
84
  ${this.actions?.map((action) => {
85
85
  return html`
@@ -1 +1 @@
1
- {"version":3,"file":"node-details.d.ts","sourceRoot":"","sources":["../../../../src/pages/components/node-details.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,oCAAoC,CAAC;AAC5C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,+BAA+B,CAAC;AACvC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AAItC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAKrD,OAAO,8BAA8B,CAAC;AAqCtC,qBACa,WAAY,SAAQ,UAAU;IAChC,MAAM,EAAG,YAAY,CAAC;IAEV,IAAI,CAAC,EAAE,UAAU,CAAC;IAGrC,OAAO,CAAC,gBAAgB,CAAkB;IAI1C,QAAQ,EAAG,MAAM,CAAC;cAEC,MAAM;YA0EX,YAAY;YAyBZ,OAAO;YAsBP,QAAQ;YAQR,aAAa;YAmCb,wBAAwB;IAwBtC,OAAgB,MAAM,0BAgCpB;CACL"}
1
+ {"version":3,"file":"node-details.d.ts","sourceRoot":"","sources":["../../../../src/pages/components/node-details.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,oCAAoC,CAAC;AAC5C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,+BAA+B,CAAC;AACvC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AAItC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAKrD,OAAO,8BAA8B,CAAC;AAqCtC,qBACa,WAAY,SAAQ,UAAU;IAChC,MAAM,EAAG,YAAY,CAAC;IAEV,IAAI,CAAC,EAAE,UAAU,CAAC;IAGrC,OAAO,CAAC,gBAAgB,CAAkB;IAI1C,QAAQ,EAAG,MAAM,CAAC;cAEC,MAAM;YA+EX,YAAY;YAyBZ,OAAO;YAsBP,QAAQ;YAQR,aAAa;YAmCb,wBAAwB;IAwBtC,OAAgB,MAAM,0BAgCpB;CACL"}
@@ -41,7 +41,7 @@ const UPDATE_STATE_LABELS = {
41
41
  8: "Waiting for consent"
42
42
  };
43
43
  function getUpdateStateLabel(state2, progress) {
44
- const label = UPDATE_STATE_LABELS[state2] || `Unknown (${state2})`;
44
+ const label = UPDATE_STATE_LABELS[state2] ?? `Unknown (${state2})`;
45
45
  if (state2 === 4 && progress !== void 0) {
46
46
  return `${label} (${progress}%)`;
47
47
  }
@@ -75,7 +75,7 @@ let NodeDetails = class extends LitElement {
75
75
  </md-list-item>
76
76
  <md-list-item>
77
77
  <div slot="supporting-text"><span class="left">VendorName: </span>${this.node.vendorName}</div>
78
- <div slot="supporting-text"><span class="left">productName: </span>${this.node.productName}</div>
78
+ <div slot="supporting-text"><span class="left">ProductName: </span>${this.node.productName}</div>
79
79
  <div slot="supporting-text">
80
80
  <span class="left">Commissioned: </span>${this.node.date_commissioned}
81
81
  </div>
@@ -84,6 +84,9 @@ let NodeDetails = class extends LitElement {
84
84
  </div>
85
85
  <div slot="supporting-text"><span class="left">Is bridge: </span>${this.node.is_bridge}</div>
86
86
  <div slot="supporting-text"><span class="left">Serialnumber: </span>${this.node.serialNumber}</div>
87
+ ${this.node.matter_version ? html`<div slot="supporting-text">
88
+ <span class="left">Matter version: </span>${this.node.matter_version}
89
+ </div>` : nothing}
87
90
  ${this.node.is_bridge ? "" : html` <div slot="supporting-text">
88
91
  <span class="left">All device types: </span>${getNodeDeviceTypes(this.node).map((deviceType) => {
89
92
  return deviceType.label;
@@ -97,7 +100,7 @@ let NodeDetails = class extends LitElement {
97
100
  ></md-outlined-button>
98
101
  ${this._updateInitiated ? html` <md-outlined-button disabled
99
102
  >Checking for updates<ha-svg-icon slot="icon" .path=${mdiUpdate}></ha-svg-icon
100
- ></md-outlined-button>` : (this.node.updateState || 0) > 1 ? html` <md-outlined-button disabled
103
+ ></md-outlined-button>` : (this.node.updateState ?? 0) > 1 ? html` <md-outlined-button disabled
101
104
  >${getUpdateStateLabel(
102
105
  this.node.updateState,
103
106
  this.node.updateStateProgress
@@ -184,7 +187,7 @@ let NodeDetails = class extends LitElement {
184
187
  text: `Found a firmware update for this node on ${nodeUpdate.update_source}.
185
188
  Do you want to update this node to version ${nodeUpdate.software_version_string}?
186
189
  Note that updating firmware is at your own risk and may cause the device to
187
- malfunction or needs additional handling such as power cycling it and/or recommisisoning it.
190
+ malfunction or needs additional handling such as power cycling it and/or recommissioning it.
188
191
  Use with care.
189
192
  ${nodeUpdate.firmware_information}`,
190
193
  confirmText: "Start Update"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/pages/components/node-details.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": ["state"]
6
6
  }
@@ -38,7 +38,7 @@ let ServerDetails = class extends LitElement {
38
38
  reader.readAsText(selectedFile, "UTF-8");
39
39
  reader.onload = async () => {
40
40
  try {
41
- await this.client.importTestNode(reader.result?.toString() || "");
41
+ await this.client.importTestNode(reader.result?.toString() ?? "");
42
42
  } catch (err) {
43
43
  showAlertDialog({
44
44
  title: "Failed to import test node",
@@ -1 +1 @@
1
- {"version":3,"file":"matter-cluster-view.d.ts","sourceRoot":"","sources":["../../../src/pages/matter-cluster-view.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,+BAA+B,CAAC;AACvC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAqB,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAK5C,OAAO,2BAA2B,CAAC;AACnC,OAAO,kCAAkC,CAAC;AAM1C,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,qBAAqB,EAAE,iBAAiB,CAAC;KAC5C;CACJ;AA+BD,cACM,iBAAkB,SAAQ,UAAU;IAC/B,MAAM,EAAG,YAAY,CAAC;IAGtB,IAAI,CAAC,EAAE,UAAU,CAAC;IAIlB,QAAQ,EAAG,MAAM,CAAC;IAGlB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEf,MAAM;YAkED,mBAAmB;IAOjC,OAAO,CAAC,sBAAsB;IAkBrB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAgBxD,OAAO,CAAC,OAAO;IAIf,OAAgB,MAAM,0BAwCpB;CACL"}
1
+ {"version":3,"file":"matter-cluster-view.d.ts","sourceRoot":"","sources":["../../../src/pages/matter-cluster-view.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,+BAA+B,CAAC;AACvC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAqB,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAK5C,OAAO,2BAA2B,CAAC;AACnC,OAAO,kCAAkC,CAAC;AAM1C,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,qBAAqB,EAAE,iBAAiB,CAAC;KAC5C;CACJ;AA+BD,cACM,iBAAkB,SAAQ,UAAU;IAC/B,MAAM,EAAG,YAAY,CAAC;IAGtB,IAAI,CAAC,EAAE,UAAU,CAAC;IAIlB,QAAQ,EAAG,MAAM,CAAC;IAGlB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEf,MAAM;YAkED,mBAAmB;IAQjC,OAAO,CAAC,sBAAsB;IAkBrB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAgBxD,OAAO,CAAC,OAAO;IAIf,OAAgB,MAAM,0BAwCpB;CACL"}
@@ -76,7 +76,7 @@ let MatterClusterView = class extends LitElement {
76
76
  <md-list-item>
77
77
  <div slot="headline">
78
78
  <b
79
- >Attributes of ${clusters[this.cluster]?.label || "Custom/Unknown Cluster"} Cluster on
79
+ >Attributes of ${clusters[this.cluster]?.label ?? "Custom/Unknown Cluster"} Cluster on
80
80
  Endpoint ${this.endpoint}</b
81
81
  >
82
82
  </div>
@@ -87,11 +87,11 @@ let MatterClusterView = class extends LitElement {
87
87
  (attribute, index) => html`
88
88
  <md-list-item class=${index % 2 === 1 ? "alternate-row" : ""}>
89
89
  <div slot="headline">
90
- ${clusters[this.cluster]?.attributes[attribute.key]?.label || "Custom/Unknown Attribute"}
90
+ ${clusters[this.cluster]?.attributes[attribute.key]?.label ?? "Custom/Unknown Attribute"}
91
91
  </div>
92
92
  <div slot="supporting-text">
93
93
  AttributeId: ${attribute.key} (${formatHex(attribute.key)}) - Value type:
94
- ${clusters[this.cluster]?.attributes[attribute.key]?.type || "unknown"}
94
+ ${clusters[this.cluster]?.attributes[attribute.key]?.type ?? "unknown"}
95
95
  </div>
96
96
  <div slot="end">
97
97
  ${toBigIntAwareJson(attribute.value).length > 20 ? html`<button
@@ -100,7 +100,7 @@ let MatterClusterView = class extends LitElement {
100
100
  }}
101
101
  >
102
102
  Show value
103
- </button>` : toBigIntAwareJson(attribute.value)}
103
+ </button>` : html`<code>${toBigIntAwareJson(attribute.value)}</code>`}
104
104
  </div>
105
105
  </md-list-item>
106
106
  `
@@ -112,7 +112,8 @@ let MatterClusterView = class extends LitElement {
112
112
  async _showAttributeValue(value) {
113
113
  showAlertDialog({
114
114
  title: "Attribute value",
115
- text: toBigIntAwareJson(value)
115
+ text: toBigIntAwareJson(value),
116
+ asCodeBlock: true
116
117
  });
117
118
  }
118
119
  _renderClusterCommands() {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/pages/matter-cluster-view.ts"],
4
- "mappings": "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",
4
+ "mappings": ";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,eAAe;AACxB,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,SAAmC,yBAAyB;AAC5D,SAAS,YAAY,KAAK,YAAY;AACtC,SAAS,eAAe,gBAAgB;AACxC,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,OAAO;AACP,OAAO;AACP,SAAS,sBAAsB;AAE/B,SAAS,iBAAiB;AAC1B,SAAS,6BAA6B;AAStC,MAAM,uBAAuB;AAC7B,MAAM,uBAAuB;AAE7B,SAAS,kBAAkB,IAAqB;AAC5C,SAAO,MAAM,wBAAwB,MAAM;AAC/C;AAEA,SAAS,kBAAkB,YAAoC,UAAkB,SAAiB;AAE9F,SAAO,OAAO,KAAK,UAAU,EACxB,OAAO,SAAO,IAAI,WAAW,GAAG,QAAQ,IAAI,OAAO,GAAG,CAAC,EACvD,IAAI,SAAO;AACR,UAAM,eAAe,OAAO,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;AAC7C,WAAO,EAAE,KAAK,cAAc,OAAO,WAAW,GAAG,EAAE;AAAA,EACvD,CAAC,EACA,KAAK,CAAC,GAAG,MAAM;AACZ,UAAM,YAAY,kBAAkB,EAAE,GAAG;AACzC,UAAM,YAAY,kBAAkB,EAAE,GAAG;AAGzC,QAAI,cAAc,WAAW;AACzB,aAAO,YAAY,IAAI;AAAA,IAC3B;AAEA,WAAO,EAAE,MAAM,EAAE;AAAA,EACrB,CAAC;AACT;AAGA,IAAM,oBAAN,cAAgC,WAAW;AAAA,EAa9B,SAAS;AACd,QAAI,CAAC,KAAK,QAAQ,KAAK,YAAY,UAAa,KAAK,WAAW,QAAW;AACvE,aAAO;AAAA;AAAA,iCAEc,KAAK,OAAO;AAAA;AAAA,IAErC;AAEA,WAAO;AAAA;AAAA,yBAEU,QAAQ,KAAK,KAAK,OAAO,iBAAiB,KAAK,QAAQ,gBAAgB,KAAK,OAAO,EAAE;AAAA,8BAChF,SAAS,KAAK,KAAK,OAAO,IAAI,KAAK,QAAQ,EAAE;AAAA,0BACjD,KAAK,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,sCAKC,KAAK,IAAI,YAAY,KAAK,MAAM;AAAA;AAAA;AAAA;AAAA,cAIxD,KAAK,uBAAuB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iDAQM,SAAS,KAAK,OAAO,GAAG,SAAS,wBAAwB;AAAA,2CAC/D,KAAK,QAAQ;AAAA;AAAA;AAAA,gEAGQ,KAAK,OAAO,KAAK,UAAU,KAAK,OAAO,CAAC;AAAA;AAAA;AAAA,sBAGlF,kBAAkB,KAAK,KAAK,YAAY,KAAK,UAAU,KAAK,OAAO,EAAE;AAAA,MACnE,CAAC,WAAW,UAAU;AAAA,kDACI,QAAQ,MAAM,IAAI,kBAAkB,EAAE;AAAA;AAAA,sCAElD,SAAS,KAAK,OAAQ,GAAG,WAAW,UAAU,GAAG,GAAG,SACtD,0BAA0B;AAAA;AAAA;AAAA,mDAGX,UAAU,GAAG,KAAK,UAAU,UAAU,GAAG,CAAC;AAAA,sCACvD,SAAS,KAAK,OAAQ,GAAG,WAAW,UAAU,GAAG,GAAG,QAAQ,SAAS;AAAA;AAAA;AAAA,sCAGrE,kBAAkB,UAAU,KAAK,EAAE,SAAS,KACxC;AAAA,uDACa,MAAM;AACX,aAAK,oBAAoB,UAAU,KAAK;AAAA,MAC5C,CAAC;AAAA;AAAA;AAAA,uDAIL,aAAa,kBAAkB,UAAU,KAAK,CAAC,SAAS;AAAA;AAAA;AAAA;AAAA,IAI9E,CAAC;AAAA;AAAA;AAAA;AAAA,EAIjB;AAAA,EAEA,MAAc,oBAAoB,OAAY;AAC1C,oBAAgB;AAAA,MACZ,OAAO;AAAA,MACP,MAAM,kBAAkB,KAAK;AAAA,MAC7B,aAAa;AAAA,IACjB,CAAC;AAAA,EACL;AAAA,EAEQ,yBAAyB;AAC7B,QAAI,KAAK,YAAY,OAAW,QAAO;AACvC,QAAI,CAAC,KAAK,MAAM,UAAW,QAAO;AAElC,UAAM,UAAU,sBAAsB,KAAK,OAAO;AAClD,QAAI,CAAC,QAAS,QAAO;AAGrB,UAAM,gBAAgB,IAAI,OAAO,MAAM,OAAO;AAC9C,UAAM,UAAU,WAAW,aAAa;AAExC,WAAO;AAAA;AAAA,uDAEwC,OAAO;AAAA;AAAA;AAAA,EAG1D;AAAA,EAES,QAAQ,mBAAyC;AACtD,UAAM,QAAQ,iBAAiB;AAG/B,UAAM,YAAY,KAAK,YAAY,eAAe,4BAA4B;AAC9E,QAAI,WAAW;AACX,YAAM,kBAAkB,UAAU;AAClC,UAAI,mBAAmB,KAAK,QAAQ,KAAK,QAAQ;AAC7C,wBAAgB,SAAS,KAAK;AAC9B,wBAAgB,OAAO,KAAK;AAC5B,wBAAgB,WAAW,KAAK;AAChC,wBAAgB,UAAU,KAAK;AAAA,MACnC;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,UAAU;AACd,YAAQ,KAAK;AAAA,EACjB;AA2CJ;AAtKM,kBA6Hc,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzHlB;AAAA,EADN,SAAS;AAAA,GAHR,kBAIK;AAIA;AAAA,EAFN,QAAQ,EAAE,SAAS,eAAe,CAAC;AAAA,EACnC,SAAS;AAAA,GAPR,kBAQK;AAGA;AAAA,EADN,SAAS;AAAA,GAVR,kBAWK;AAXL,oBAAN;AAAA,EADC,cAAc,qBAAqB;AAAA,GAC9B;",
5
5
  "names": []
6
6
  }
@@ -38,7 +38,7 @@ function getEndpointDeviceTypes(node, endpoint) {
38
38
  if (!rawValues) return [];
39
39
  return rawValues.map((rawValue) => {
40
40
  const id = rawValue["0"] ?? rawValue["deviceType"];
41
- return device_types[id] || { id: id ?? -1, label: `Unknown Device Type (${id})`, clusters: [] };
41
+ return device_types[id] ?? { id: id ?? -1, label: `Unknown Device Type (${id})`, clusters: [] };
42
42
  });
43
43
  }
44
44
  let MatterEndpointView = class extends LitElement {
@@ -83,7 +83,7 @@ let MatterEndpointView = class extends LitElement {
83
83
  type="link"
84
84
  href=${`#node/${this.node.node_id}/${this.endpoint}/${cluster}`}
85
85
  >
86
- <div slot="headline">${clusters[cluster]?.label || "Custom/Unknown Cluster"}</div>
86
+ <div slot="headline">${clusters[cluster]?.label ?? "Custom/Unknown Cluster"}</div>
87
87
  <div slot="supporting-text">ClusterId ${cluster} (${formatHex(cluster)})</div>
88
88
  <ha-svg-icon slot="end" .path=${mdiChevronRight}></ha-svg-icon>
89
89
  </md-list-item>
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  const fireEvent = (node, type, detail, options) => {
7
- options = options || {};
7
+ options = options ?? {};
8
8
  const event = new Event(type, {
9
9
  bubbles: options.bubbles === void 0 ? true : options.bubbles,
10
10
  cancelable: Boolean(options.cancelable),
@@ -1,5 +1,5 @@
1
- import { r, n, t, i, h as b } from './matter-dashboard-app-BrrI804e.js';
2
- import { p as preventDefault } from './prevent_default-BCNFIsLL.js';
1
+ import { r, n, t, i, h as b } from './matter-dashboard-app-B7GUghkC.js';
2
+ import { p as preventDefault } from './prevent_default-BPgSQsuY.js';
3
3
  import './main.js';
4
4
 
5
5
  var __defProp = Object.defineProperty;
@@ -44,18 +44,18 @@ let ComissionNodeDialog = class extends i {
44
44
  if (!this.client.serverInfo.bluetooth_enabled) {
45
45
  return;
46
46
  }
47
- import('./commission-node-wifi-BoGa1n6O.js');
47
+ import('./commission-node-wifi-tzavmk1j.js');
48
48
  this._mode = "wifi";
49
49
  }
50
50
  _commissionThread() {
51
51
  if (!this.client.serverInfo.bluetooth_enabled) {
52
52
  return;
53
53
  }
54
- import('./commission-node-thread-r1tiXZpS.js');
54
+ import('./commission-node-thread-DOB8pu6x.js');
55
55
  this._mode = "thread";
56
56
  }
57
57
  _commissionExisting() {
58
- import('./commission-node-existing-BpZvHj-g.js');
58
+ import('./commission-node-existing-TP6s8Tez.js');
59
59
  this._mode = "existing";
60
60
  }
61
61
  _nodeCommissioned(ev) {
@@ -1,9 +1,9 @@
1
- import { r, s as c, v as clientContext, n, a as e, t, i, A, q as handleAsync, h as b } from './matter-dashboard-app-BrrI804e.js';
2
- import { f as fireEvent } from './fire_event-CtgWQuh0.js';
3
- import './outlined-text-field-DwmSQzCx.js';
1
+ import { r, s as c, v as clientContext, n, a as e, t, i, A, q as handleAsync, h as b } from './matter-dashboard-app-B7GUghkC.js';
2
+ import { f as fireEvent } from './fire_event-DRpOSjJR.js';
3
+ import './outlined-text-field-D1DyKQY-.js';
4
4
  import './main.js';
5
- import './validator-DpwNYslY.js';
6
- import './prevent_default-BCNFIsLL.js';
5
+ import './validator-C735j770.js';
6
+ import './prevent_default-BPgSQsuY.js';
7
7
 
8
8
  var __defProp = Object.defineProperty;
9
9
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -1,9 +1,9 @@
1
- import { r, s as c, v as clientContext, n, a as e, t, i, A, q as handleAsync, h as b } from './matter-dashboard-app-BrrI804e.js';
2
- import { f as fireEvent } from './fire_event-CtgWQuh0.js';
3
- import './outlined-text-field-DwmSQzCx.js';
1
+ import { r, s as c, v as clientContext, n, a as e, t, i, A, q as handleAsync, h as b } from './matter-dashboard-app-B7GUghkC.js';
2
+ import { f as fireEvent } from './fire_event-DRpOSjJR.js';
3
+ import './outlined-text-field-D1DyKQY-.js';
4
4
  import './main.js';
5
- import './validator-DpwNYslY.js';
6
- import './prevent_default-BCNFIsLL.js';
5
+ import './validator-C735j770.js';
6
+ import './prevent_default-BPgSQsuY.js';
7
7
 
8
8
  var __defProp = Object.defineProperty;
9
9
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -1,9 +1,9 @@
1
- import { r, s as c, v as clientContext, n, a as e, t, i, A, q as handleAsync, h as b } from './matter-dashboard-app-BrrI804e.js';
2
- import { f as fireEvent } from './fire_event-CtgWQuh0.js';
3
- import './outlined-text-field-DwmSQzCx.js';
1
+ import { r, s as c, v as clientContext, n, a as e, t, i, A, q as handleAsync, h as b } from './matter-dashboard-app-B7GUghkC.js';
2
+ import { f as fireEvent } from './fire_event-DRpOSjJR.js';
3
+ import './outlined-text-field-D1DyKQY-.js';
4
4
  import './main.js';
5
- import './validator-DpwNYslY.js';
6
- import './prevent_default-BCNFIsLL.js';
5
+ import './validator-C735j770.js';
6
+ import './prevent_default-BPgSQsuY.js';
7
7
 
8
8
  var __defProp = Object.defineProperty;
9
9
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -1,5 +1,5 @@
1
- import { n, t, i, h as b } from './matter-dashboard-app-BrrI804e.js';
2
- import { p as preventDefault } from './prevent_default-BCNFIsLL.js';
1
+ import { n, t, i, h as b } from './matter-dashboard-app-B7GUghkC.js';
2
+ import { p as preventDefault } from './prevent_default-BPgSQsuY.js';
3
3
  import './main.js';
4
4
 
5
5
  var __defProp = Object.defineProperty;
@@ -16,12 +16,14 @@ let DialogBox = class extends i {
16
16
  return b`
17
17
  <md-dialog open @cancel=${preventDefault} @closed=${this._handleClosed}>
18
18
  ${params.title ? b`<div slot="headline">${params.title}</div>` : ""}
19
- ${params.text ? b`<div slot="content">${params.text}</div>` : ""}
19
+ ${params.text ? b`<div slot="content">
20
+ ${params.asCodeBlock && typeof params.text === "string" ? b`<code>${params.text}</code>` : params.text}
21
+ </div>` : ""}
20
22
  <div slot="actions">
21
23
  ${this.type === "prompt" ? b`
22
- <md-text-button @click=${this._cancel}> ${params.cancelText || "Cancel"} </md-text-button>
24
+ <md-text-button @click=${this._cancel}>${params.cancelText ?? "Cancel"}</md-text-button>
23
25
  ` : ""}
24
- <md-text-button @click=${this._confirm}> ${params.confirmText || "OK"} </md-text-button>
26
+ <md-text-button @click=${this._confirm}>${params.confirmText ?? "OK"}</md-text-button>
25
27
  </div>
26
28
  </md-dialog>
27
29
  `;
@@ -47,6 +49,6 @@ __decorateClass([n({
47
49
  attribute: false
48
50
  })], DialogBox.prototype, "dialogResult", 2);
49
51
  __decorateClass([n()], DialogBox.prototype, "type", 2);
50
- DialogBox = __decorateClass([t("dialox-box")], DialogBox);
52
+ DialogBox = __decorateClass([t("dialog-box")], DialogBox);
51
53
 
52
54
  export { DialogBox };
@@ -1,4 +1,4 @@
1
- import { m as mixinDelegatesAria, i, _ as __decorate, n, A, f as e, h as b, j as i$1, t } from './matter-dashboard-app-BrrI804e.js';
1
+ import { m as mixinDelegatesAria, i, _ as __decorate, n, A, f as e, h as b, j as i$1, t } from './matter-dashboard-app-B7GUghkC.js';
2
2
 
3
3
  /**
4
4
  * @license
@@ -154,7 +154,7 @@ MdCircularProgress = __decorate([t('md-circular-progress')], MdCircularProgress)
154
154
  * SPDX-License-Identifier: Apache-2.0
155
155
  */
156
156
  const fireEvent = (node, type, detail, options) => {
157
- options = options || {};
157
+ options = options ?? {};
158
158
  const event = new Event(type, {
159
159
  bubbles: options.bubbles === void 0 ? true : options.bubbles,
160
160
  cancelable: Boolean(options.cancelable),
@@ -1,6 +1,6 @@
1
- import { e, N as NavigableKeys, _ as __decorate, a as e$1, n as n$1, o, r, i, c as createAnimationSignal, L as ListController, g as getActiveItem, b as getLastActivatableItem, d as getFirstActivatableItem, A, f as e$2, h as b, E as EASING, j as i$1, t, D, m as mixinDelegatesAria, k as mixinElementInternals, u, l as i$2, p as fireAndForget, q as handleAsync } from './matter-dashboard-app-BrrI804e.js';
2
- import { r as redispatchEvent, p as preventDefault } from './prevent_default-BCNFIsLL.js';
3
- import { o as o$1, V as Validator, m as mixinOnReportValidity, a as mixinConstraintValidation, b as mixinFormAssociated, c as onReportValidity, g as getFormValue, d as createValidator, e as getValidityAnchor } from './validator-DpwNYslY.js';
1
+ import { e, N as NavigableKeys, _ as __decorate, a as e$1, n as n$1, o, r, i, c as createAnimationSignal, L as ListController, g as getActiveItem, b as getLastActivatableItem, d as getFirstActivatableItem, A, f as e$2, h as b, E as EASING, j as i$1, t, D, m as mixinDelegatesAria, k as mixinElementInternals, u, l as i$2, p as fireAndForget, q as handleAsync } from './matter-dashboard-app-B7GUghkC.js';
2
+ import { r as redispatchEvent, p as preventDefault } from './prevent_default-BPgSQsuY.js';
3
+ import { o as o$1, V as Validator, m as mixinOnReportValidity, a as mixinConstraintValidation, b as mixinFormAssociated, c as onReportValidity, g as getFormValue, d as createValidator, e as getValidityAnchor } from './validator-C735j770.js';
4
4
  import './main.js';
5
5
 
6
6
  /**
@@ -221,6 +221,7 @@ class MatterNode {
221
221
  this.is_bridge = data.is_bridge;
222
222
  this.attributes = data.attributes;
223
223
  this.attribute_subscriptions = data.attribute_subscriptions;
224
+ this.matter_version = data.matter_version;
224
225
  }
225
226
  node_id;
226
227
  date_commissioned;
@@ -230,6 +231,11 @@ class MatterNode {
230
231
  is_bridge;
231
232
  attributes;
232
233
  attribute_subscriptions;
234
+ /**
235
+ * Matter specification version of the node (e.g., "1.2.0", "1.3.0", "1.4.0").
236
+ * Optional - not available in Python Matter Server.
237
+ */
238
+ matter_version;
233
239
  get nodeLabel() {
234
240
  const label = this.attributes["0/40/5"];
235
241
  if (typeof label !== "string") return "";
@@ -285,7 +291,7 @@ class MatterClient {
285
291
  this.url = url;
286
292
  this.url = url;
287
293
  this.connection = new Connection(this.url, wsFactory);
288
- this.serverBaseAddress = this.url.split("://")[1].split(":")[0] || "";
294
+ this.serverBaseAddress = this.url.split("://")[1].split(":")[0] ?? "";
289
295
  }
290
296
  connection;
291
297
  nodes = {};
@@ -742,7 +748,7 @@ const ThemeService = new ThemeServiceImpl();
742
748
  * SPDX-License-Identifier: Apache-2.0
743
749
  */
744
750
  async function main() {
745
- import('./matter-dashboard-app-BrrI804e.js').then(function (n) { return n.C; });
751
+ import('./matter-dashboard-app-B7GUghkC.js').then(function (n) { return n.C; });
746
752
  let url = "";
747
753
  const isProductionServer = location.origin.includes(":5580") || location.href.includes("hassio_ingress") || location.href.includes("/api/ingress/");
748
754
  if (!isProductionServer) {
@@ -750,7 +756,7 @@ async function main() {
750
756
  if (!storageUrl) {
751
757
  const urlParams = new URLSearchParams(window.location.search);
752
758
  const suggestedUrl = urlParams.get("url");
753
- storageUrl = prompt("Enter Websocket URL to a running Matter Server", suggestedUrl || "ws://localhost:5580/ws");
759
+ storageUrl = prompt("Enter Websocket URL to a running Matter Server", suggestedUrl ?? "ws://localhost:5580/ws");
754
760
  if (!storageUrl) {
755
761
  alert("Unable to connect without URL");
756
762
  return;
@@ -1086,7 +1086,7 @@ let HaSvgIcon = class extends i$3 {
1086
1086
  render() {
1087
1087
  return w`
1088
1088
  <svg
1089
- viewBox=${this.viewBox || "0 0 24 24"}
1089
+ viewBox=${this.viewBox ?? "0 0 24 24"}
1090
1090
  preserveAspectRatio="xMidYMid meet"
1091
1091
  focusable="false"
1092
1092
  role="img"
@@ -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-CO5YoPgN.js');
4023
+ await import('./log-level-dialog-TXkma-7Z.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);
@@ -4091,7 +4091,7 @@ let DashboardHeader = class extends i$3 {
4091
4091
  </md-icon-button>
4092
4092
  </a>` : ""}
4093
4093
 
4094
- <div class="title">${this.title || ""}</div>
4094
+ <div class="title">${this.title ?? ""}</div>
4095
4095
  <div class="actions">
4096
4096
  ${(_this$actions = this.actions) === null || _this$actions === void 0 ? void 0 : _this$actions.map(action => {
4097
4097
  return b`
@@ -15601,9 +15601,9 @@ const clusters = {
15601
15601
  * SPDX-License-Identifier: Apache-2.0
15602
15602
  */
15603
15603
  const showDialogBox = async (type, dialogParams) => {
15604
- await import('./dialog-box-RjYIjGvB.js');
15604
+ await import('./dialog-box-Dknil_Be.js');
15605
15605
  return new Promise(resolve => {
15606
- const dialog = document.createElement("dialox-box");
15606
+ const dialog = document.createElement("dialog-box");
15607
15607
  dialog.params = dialogParams;
15608
15608
  dialog.dialogResult = resolve;
15609
15609
  dialog.type = type;
@@ -15775,7 +15775,7 @@ MdTextButton = __decorate([t$1('md-text-button')], MdTextButton);
15775
15775
  */
15776
15776
  const showNodeBindingDialog = async (client, node, endpoint) => {
15777
15777
  var _document$querySelect;
15778
- await import('./node-binding-dialog-vDVm_W7d.js');
15778
+ await import('./node-binding-dialog-D52FCBFP.js');
15779
15779
  const dialog = document.createElement("node-binding-dialog");
15780
15780
  dialog.client = client;
15781
15781
  dialog.node = node;
@@ -15859,7 +15859,7 @@ function getEndpointDeviceTypes(node, endpoint) {
15859
15859
  if (!rawValues) return [];
15860
15860
  return rawValues.map(rawValue => {
15861
15861
  const id = rawValue["0"] ?? rawValue["deviceType"];
15862
- return device_types[id] || {
15862
+ return device_types[id] ?? {
15863
15863
  id: id ?? -1,
15864
15864
  label: `Unknown Device Type (${id})`,
15865
15865
  clusters: []
@@ -15908,7 +15908,7 @@ let MatterEndpointView = class extends i$3 {
15908
15908
  type="link"
15909
15909
  href=${`#node/${this.node.node_id}/${this.endpoint}/${cluster}`}
15910
15910
  >
15911
- <div slot="headline">${((_clusters$cluster = clusters[cluster]) === null || _clusters$cluster === void 0 ? void 0 : _clusters$cluster.label) || "Custom/Unknown Cluster"}</div>
15911
+ <div slot="headline">${((_clusters$cluster = clusters[cluster]) === null || _clusters$cluster === void 0 ? void 0 : _clusters$cluster.label) ?? "Custom/Unknown Cluster"}</div>
15912
15912
  <div slot="supporting-text">ClusterId ${cluster} (${formatHex(cluster)})</div>
15913
15913
  <ha-svg-icon slot="end" .path=${mdiChevronRight}></ha-svg-icon>
15914
15914
  </md-list-item>
@@ -15989,7 +15989,7 @@ const UPDATE_STATE_LABELS = {
15989
15989
  8: "Waiting for consent"
15990
15990
  };
15991
15991
  function getUpdateStateLabel(state2, progress) {
15992
- const label = UPDATE_STATE_LABELS[state2] || `Unknown (${state2})`;
15992
+ const label = UPDATE_STATE_LABELS[state2] ?? `Unknown (${state2})`;
15993
15993
  if (state2 === 4 && progress !== void 0) {
15994
15994
  return `${label} (${progress}%)`;
15995
15995
  }
@@ -16023,7 +16023,7 @@ let NodeDetails = class extends i$3 {
16023
16023
  </md-list-item>
16024
16024
  <md-list-item>
16025
16025
  <div slot="supporting-text"><span class="left">VendorName: </span>${this.node.vendorName}</div>
16026
- <div slot="supporting-text"><span class="left">productName: </span>${this.node.productName}</div>
16026
+ <div slot="supporting-text"><span class="left">ProductName: </span>${this.node.productName}</div>
16027
16027
  <div slot="supporting-text">
16028
16028
  <span class="left">Commissioned: </span>${this.node.date_commissioned}
16029
16029
  </div>
@@ -16032,6 +16032,9 @@ let NodeDetails = class extends i$3 {
16032
16032
  </div>
16033
16033
  <div slot="supporting-text"><span class="left">Is bridge: </span>${this.node.is_bridge}</div>
16034
16034
  <div slot="supporting-text"><span class="left">Serialnumber: </span>${this.node.serialNumber}</div>
16035
+ ${this.node.matter_version ? b`<div slot="supporting-text">
16036
+ <span class="left">Matter version: </span>${this.node.matter_version}
16037
+ </div>` : A}
16035
16038
  ${this.node.is_bridge ? "" : b` <div slot="supporting-text">
16036
16039
  <span class="left">All device types: </span>${getNodeDeviceTypes(this.node).map(deviceType => {
16037
16040
  return deviceType.label;
@@ -16045,7 +16048,7 @@ let NodeDetails = class extends i$3 {
16045
16048
  ></md-outlined-button>
16046
16049
  ${this._updateInitiated ? b` <md-outlined-button disabled
16047
16050
  >Checking for updates<ha-svg-icon slot="icon" .path=${mdiUpdate}></ha-svg-icon
16048
- ></md-outlined-button>` : (this.node.updateState || 0) > 1 ? b` <md-outlined-button disabled
16051
+ ></md-outlined-button>` : (this.node.updateState ?? 0) > 1 ? b` <md-outlined-button disabled
16049
16052
  >${getUpdateStateLabel(this.node.updateState, this.node.updateStateProgress)}<ha-svg-icon slot="icon" .path=${mdiUpdate}></ha-svg-icon
16050
16053
  ></md-outlined-button>` : b`<md-outlined-button @click=${handleAsync(() => this._searchUpdate())}
16051
16054
  >Update<ha-svg-icon slot="icon" .path=${mdiUpdate}></ha-svg-icon
@@ -16129,7 +16132,7 @@ let NodeDetails = class extends i$3 {
16129
16132
  text: `Found a firmware update for this node on ${nodeUpdate.update_source}.
16130
16133
  Do you want to update this node to version ${nodeUpdate.software_version_string}?
16131
16134
  Note that updating firmware is at your own risk and may cause the device to
16132
- malfunction or needs additional handling such as power cycling it and/or recommisisoning it.
16135
+ malfunction or needs additional handling such as power cycling it and/or recommissioning it.
16133
16136
  Use with care.
16134
16137
  ${nodeUpdate.firmware_information}`,
16135
16138
  confirmText: "Start Update"
@@ -16552,7 +16555,7 @@ let MatterClusterView = class extends i$3 {
16552
16555
  <md-list-item>
16553
16556
  <div slot="headline">
16554
16557
  <b
16555
- >Attributes of ${((_clusters$this$cluste = clusters[this.cluster]) === null || _clusters$this$cluste === void 0 ? void 0 : _clusters$this$cluste.label) || "Custom/Unknown Cluster"} Cluster on
16558
+ >Attributes of ${((_clusters$this$cluste = clusters[this.cluster]) === null || _clusters$this$cluste === void 0 ? void 0 : _clusters$this$cluste.label) ?? "Custom/Unknown Cluster"} Cluster on
16556
16559
  Endpoint ${this.endpoint}</b
16557
16560
  >
16558
16561
  </div>
@@ -16564,11 +16567,11 @@ let MatterClusterView = class extends i$3 {
16564
16567
  return b`
16565
16568
  <md-list-item class=${index % 2 === 1 ? "alternate-row" : ""}>
16566
16569
  <div slot="headline">
16567
- ${((_clusters$this$cluste2 = clusters[this.cluster]) === null || _clusters$this$cluste2 === void 0 || (_clusters$this$cluste2 = _clusters$this$cluste2.attributes[attribute.key]) === null || _clusters$this$cluste2 === void 0 ? void 0 : _clusters$this$cluste2.label) || "Custom/Unknown Attribute"}
16570
+ ${((_clusters$this$cluste2 = clusters[this.cluster]) === null || _clusters$this$cluste2 === void 0 || (_clusters$this$cluste2 = _clusters$this$cluste2.attributes[attribute.key]) === null || _clusters$this$cluste2 === void 0 ? void 0 : _clusters$this$cluste2.label) ?? "Custom/Unknown Attribute"}
16568
16571
  </div>
16569
16572
  <div slot="supporting-text">
16570
16573
  AttributeId: ${attribute.key} (${formatHex(attribute.key)}) - Value type:
16571
- ${((_clusters$this$cluste3 = clusters[this.cluster]) === null || _clusters$this$cluste3 === void 0 || (_clusters$this$cluste3 = _clusters$this$cluste3.attributes[attribute.key]) === null || _clusters$this$cluste3 === void 0 ? void 0 : _clusters$this$cluste3.type) || "unknown"}
16574
+ ${((_clusters$this$cluste3 = clusters[this.cluster]) === null || _clusters$this$cluste3 === void 0 || (_clusters$this$cluste3 = _clusters$this$cluste3.attributes[attribute.key]) === null || _clusters$this$cluste3 === void 0 ? void 0 : _clusters$this$cluste3.type) ?? "unknown"}
16572
16575
  </div>
16573
16576
  <div slot="end">
16574
16577
  ${toBigIntAwareJson(attribute.value).length > 20 ? b`<button
@@ -16577,7 +16580,7 @@ let MatterClusterView = class extends i$3 {
16577
16580
  }}
16578
16581
  >
16579
16582
  Show value
16580
- </button>` : toBigIntAwareJson(attribute.value)}
16583
+ </button>` : b`<code>${toBigIntAwareJson(attribute.value)}</code>`}
16581
16584
  </div>
16582
16585
  </md-list-item>
16583
16586
  `;
@@ -16589,7 +16592,8 @@ let MatterClusterView = class extends i$3 {
16589
16592
  async _showAttributeValue(value) {
16590
16593
  showAlertDialog({
16591
16594
  title: "Attribute value",
16592
- text: toBigIntAwareJson(value)
16595
+ text: toBigIntAwareJson(value),
16596
+ asCodeBlock: true
16593
16597
  });
16594
16598
  }
16595
16599
  _renderClusterCommands() {
@@ -16812,7 +16816,7 @@ DashboardFooter = __decorateClass$3([t$1("dashboard-footer")], DashboardFooter);
16812
16816
  */
16813
16817
  const showCommissionNodeDialog = async client => {
16814
16818
  var _document$querySelect;
16815
- await import('./commission-node-dialog-BBmcax4x.js');
16819
+ await import('./commission-node-dialog-CBSDiqRW.js');
16816
16820
  const dialog = document.createElement("commission-node-dialog");
16817
16821
  dialog.client = client;
16818
16822
  (_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
@@ -16836,7 +16840,7 @@ let ServerDetails = class extends i$3 {
16836
16840
  reader.onload = async () => {
16837
16841
  try {
16838
16842
  var _reader$result;
16839
- await this.client.importTestNode(((_reader$result = reader.result) === null || _reader$result === void 0 ? void 0 : _reader$result.toString()) || "");
16843
+ await this.client.importTestNode(((_reader$result = reader.result) === null || _reader$result === void 0 ? void 0 : _reader$result.toString()) ?? "");
16840
16844
  } catch (err) {
16841
16845
  showAlertDialog({
16842
16846
  title: "Failed to import test node",
@@ -1,8 +1,8 @@
1
- import { j as i, s as c, v as clientContext, n, a as e, i as i$1, A, h as b, q as handleAsync, t } from './matter-dashboard-app-BrrI804e.js';
2
- import { p as preventDefault } from './prevent_default-BCNFIsLL.js';
3
- import './outlined-text-field-DwmSQzCx.js';
1
+ import { j as i, s as c, v as clientContext, n, a as e, i as i$1, A, h as b, q as handleAsync, t } from './matter-dashboard-app-B7GUghkC.js';
2
+ import { p as preventDefault } from './prevent_default-BPgSQsuY.js';
3
+ import './outlined-text-field-D1DyKQY-.js';
4
4
  import './main.js';
5
- import './validator-DpwNYslY.js';
5
+ import './validator-C735j770.js';
6
6
 
7
7
  var _staticBlock$1;
8
8
  /**
@@ -1,6 +1,6 @@
1
- import { j as i, w as e, x as i$1, y as t, z as E, A, m as mixinDelegatesAria, k as mixinElementInternals, i as i$2, _ as __decorate, n, r as r$1, a as e$1, o, f as e$2, h as b, u, l as i$3, t as t$1 } from './matter-dashboard-app-BrrI804e.js';
2
- import { V as Validator, m as mixinOnReportValidity, a as mixinConstraintValidation, b as mixinFormAssociated, o as o$1, g as getFormValue, d as createValidator, e as getValidityAnchor, c as onReportValidity } from './validator-DpwNYslY.js';
3
- import { r as redispatchEvent } from './prevent_default-BCNFIsLL.js';
1
+ import { j as i, w as e, x as i$1, y as t, z as E, A, m as mixinDelegatesAria, k as mixinElementInternals, i as i$2, _ as __decorate, n, r as r$1, a as e$1, o, f as e$2, h as b, u, l as i$3, t as t$1 } from './matter-dashboard-app-B7GUghkC.js';
2
+ import { V as Validator, m as mixinOnReportValidity, a as mixinConstraintValidation, b as mixinFormAssociated, o as o$1, g as getFormValue, d as createValidator, e as getValidityAnchor, c as onReportValidity } from './validator-C735j770.js';
3
+ import { r as redispatchEvent } from './prevent_default-BPgSQsuY.js';
4
4
 
5
5
  /**
6
6
  * @license
@@ -1,4 +1,4 @@
1
- import { E as EASING, m as mixinDelegatesAria, i, _ as __decorate, n, a as e, r, h as b, A, f as e$1, j as i$1, t } from './matter-dashboard-app-BrrI804e.js';
1
+ import { E as EASING, m as mixinDelegatesAria, i, _ as __decorate, n, a as e, r, h as b, A, f as e$1, j as i$1, t } from './matter-dashboard-app-B7GUghkC.js';
2
2
 
3
3
  /**
4
4
  * @license
@@ -1,4 +1,4 @@
1
- import { _ as __decorate, n as n$1, o as o$1, r, a as e, i as i$1, A, f as e$1, h as b, D, E as EASING, j as i$2, t, w as e$2, x as i$3, y as t$1, z as E, B as internals } from './matter-dashboard-app-BrrI804e.js';
1
+ import { _ as __decorate, n as n$1, o as o$1, r, a as e, i as i$1, A, f as e$1, h as b, D, E as EASING, j as i$2, t, w as e$2, x as i$3, y as t$1, z as E, B as internals } from './matter-dashboard-app-B7GUghkC.js';
2
2
 
3
3
  /**
4
4
  * @license
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter-server/dashboard",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
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.28.6",
26
- "@matter/main": "0.16.8-alpha.0-20260128-0ff06da17",
26
+ "@matter/main": "0.16.8-alpha.0-20260130-2554cb6e2",
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.1",
41
- "@matter-server/custom-clusters": "0.3.1",
40
+ "@matter-server/ws-client": "0.3.2",
41
+ "@matter-server/custom-clusters": "0.3.2",
42
42
  "@mdi/js": "^7.4.47",
43
43
  "lit": "^3.3.2",
44
44
  "tslib": "^2.8.1"
@@ -11,7 +11,7 @@ import { 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";
14
- @customElement("dialox-box")
14
+ @customElement("dialog-box")
15
15
  export class DialogBox extends LitElement {
16
16
  @property({ attribute: false }) public params!: PromptDialogBoxParams;
17
17
 
@@ -24,14 +24,20 @@ 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 ? html`<div slot="content">${params.text}</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}
32
+ </div>`
33
+ : ""}
28
34
  <div slot="actions">
29
35
  ${this.type === "prompt"
30
36
  ? html`
31
- <md-text-button @click=${this._cancel}> ${params.cancelText || "Cancel"} </md-text-button>
37
+ <md-text-button @click=${this._cancel}>${params.cancelText ?? "Cancel"}</md-text-button>
32
38
  `
33
39
  : ""}
34
- <md-text-button @click=${this._confirm}> ${params.confirmText || "OK"} </md-text-button>
40
+ <md-text-button @click=${this._confirm}>${params.confirmText ?? "OK"}</md-text-button>
35
41
  </div>
36
42
  </md-dialog>
37
43
  `;
@@ -57,6 +63,6 @@ export class DialogBox extends LitElement {
57
63
 
58
64
  declare global {
59
65
  interface HTMLElementTagNameMap {
60
- "dialox-box": DialogBox;
66
+ "dialog-box": DialogBox;
61
67
  }
62
68
  }
@@ -10,6 +10,7 @@ interface BaseDialogBoxParams {
10
10
  confirmText?: string;
11
11
  text: string | TemplateResult;
12
12
  title: string;
13
+ asCodeBlock?: boolean;
13
14
  }
14
15
 
15
16
  export interface PromptDialogBoxParams extends BaseDialogBoxParams {
@@ -19,7 +20,7 @@ export interface PromptDialogBoxParams extends BaseDialogBoxParams {
19
20
  const showDialogBox = async (type: "alert" | "prompt", dialogParams: PromptDialogBoxParams) => {
20
21
  await import("./dialog-box.js");
21
22
  return new Promise<boolean>(resolve => {
22
- const dialog = document.createElement("dialox-box");
23
+ const dialog = document.createElement("dialog-box");
23
24
  dialog.params = dialogParams;
24
25
  dialog.dialogResult = resolve;
25
26
  dialog.type = type;
@@ -18,7 +18,7 @@ export class HaSvgIcon extends LitElement {
18
18
  protected override render(): SVGTemplateResult {
19
19
  return svg`
20
20
  <svg
21
- viewBox=${this.viewBox || "0 0 24 24"}
21
+ viewBox=${this.viewBox ?? "0 0 24 24"}
22
22
  preserveAspectRatio="xMidYMid meet"
23
23
  focusable="false"
24
24
  role="img"
@@ -26,7 +26,7 @@ async function main() {
26
26
  const suggestedUrl = urlParams.get("url");
27
27
  storageUrl = prompt(
28
28
  "Enter Websocket URL to a running Matter Server",
29
- suggestedUrl || "ws://localhost:5580/ws",
29
+ suggestedUrl ?? "ws://localhost:5580/ws",
30
30
  );
31
31
  if (!storageUrl) {
32
32
  alert("Unable to connect without URL");
@@ -92,7 +92,7 @@ export class DashboardHeader extends LitElement {
92
92
  </a>`
93
93
  : ""}
94
94
 
95
- <div class="title">${this.title || ""}</div>
95
+ <div class="title">${this.title ?? ""}</div>
96
96
  <div class="actions">
97
97
  ${this.actions?.map(action => {
98
98
  return html`
@@ -38,7 +38,7 @@ const UPDATE_STATE_LABELS: Record<number, string> = {
38
38
  };
39
39
 
40
40
  function getUpdateStateLabel(state: number, progress?: number): string {
41
- const label = UPDATE_STATE_LABELS[state] || `Unknown (${state})`;
41
+ const label = UPDATE_STATE_LABELS[state] ?? `Unknown (${state})`;
42
42
  // Show progress only for downloading state
43
43
  if (state === 4 && progress !== undefined) {
44
44
  return `${label} (${progress}%)`;
@@ -85,7 +85,7 @@ export class NodeDetails extends LitElement {
85
85
  </md-list-item>
86
86
  <md-list-item>
87
87
  <div slot="supporting-text"><span class="left">VendorName: </span>${this.node.vendorName}</div>
88
- <div slot="supporting-text"><span class="left">productName: </span>${this.node.productName}</div>
88
+ <div slot="supporting-text"><span class="left">ProductName: </span>${this.node.productName}</div>
89
89
  <div slot="supporting-text">
90
90
  <span class="left">Commissioned: </span>${this.node.date_commissioned}
91
91
  </div>
@@ -94,6 +94,11 @@ export class NodeDetails extends LitElement {
94
94
  </div>
95
95
  <div slot="supporting-text"><span class="left">Is bridge: </span>${this.node.is_bridge}</div>
96
96
  <div slot="supporting-text"><span class="left">Serialnumber: </span>${this.node.serialNumber}</div>
97
+ ${this.node.matter_version
98
+ ? html`<div slot="supporting-text">
99
+ <span class="left">Matter version: </span>${this.node.matter_version}
100
+ </div>`
101
+ : nothing}
97
102
  ${this.node.is_bridge
98
103
  ? ""
99
104
  : html` <div slot="supporting-text">
@@ -113,7 +118,7 @@ export class NodeDetails extends LitElement {
113
118
  ? html` <md-outlined-button disabled
114
119
  >Checking for updates<ha-svg-icon slot="icon" .path=${mdiUpdate}></ha-svg-icon
115
120
  ></md-outlined-button>`
116
- : (this.node.updateState || 0) > 1
121
+ : (this.node.updateState ?? 0) > 1
117
122
  ? html` <md-outlined-button disabled
118
123
  >${getUpdateStateLabel(
119
124
  this.node.updateState!,
@@ -214,7 +219,7 @@ export class NodeDetails extends LitElement {
214
219
  text: `Found a firmware update for this node on ${nodeUpdate.update_source}.
215
220
  Do you want to update this node to version ${nodeUpdate.software_version_string}?
216
221
  Note that updating firmware is at your own risk and may cause the device to
217
- malfunction or needs additional handling such as power cycling it and/or recommisisoning it.
222
+ malfunction or needs additional handling such as power cycling it and/or recommissioning it.
218
223
  Use with care.\n${nodeUpdate.firmware_information}`,
219
224
  confirmText: "Start Update",
220
225
  }))
@@ -97,7 +97,7 @@ export class ServerDetails extends LitElement {
97
97
  reader.readAsText(selectedFile, "UTF-8");
98
98
  reader.onload = async () => {
99
99
  try {
100
- await this.client!.importTestNode(reader.result?.toString() || "");
100
+ await this.client!.importTestNode(reader.result?.toString() ?? "");
101
101
  } catch (err: any) {
102
102
  showAlertDialog({
103
103
  title: "Failed to import test node",
@@ -100,7 +100,7 @@ class MatterClusterView extends LitElement {
100
100
  <md-list-item>
101
101
  <div slot="headline">
102
102
  <b
103
- >Attributes of ${clusters[this.cluster]?.label || "Custom/Unknown Cluster"} Cluster on
103
+ >Attributes of ${clusters[this.cluster]?.label ?? "Custom/Unknown Cluster"} Cluster on
104
104
  Endpoint ${this.endpoint}</b
105
105
  >
106
106
  </div>
@@ -111,12 +111,12 @@ class MatterClusterView extends LitElement {
111
111
  (attribute, index) => html`
112
112
  <md-list-item class=${index % 2 === 1 ? "alternate-row" : ""}>
113
113
  <div slot="headline">
114
- ${clusters[this.cluster!]?.attributes[attribute.key]?.label ||
114
+ ${clusters[this.cluster!]?.attributes[attribute.key]?.label ??
115
115
  "Custom/Unknown Attribute"}
116
116
  </div>
117
117
  <div slot="supporting-text">
118
118
  AttributeId: ${attribute.key} (${formatHex(attribute.key)}) - Value type:
119
- ${clusters[this.cluster!]?.attributes[attribute.key]?.type || "unknown"}
119
+ ${clusters[this.cluster!]?.attributes[attribute.key]?.type ?? "unknown"}
120
120
  </div>
121
121
  <div slot="end">
122
122
  ${toBigIntAwareJson(attribute.value).length > 20
@@ -127,7 +127,7 @@ class MatterClusterView extends LitElement {
127
127
  >
128
128
  Show value
129
129
  </button>`
130
- : toBigIntAwareJson(attribute.value)}
130
+ : html`<code>${toBigIntAwareJson(attribute.value)}</code>`}
131
131
  </div>
132
132
  </md-list-item>
133
133
  `,
@@ -141,6 +141,7 @@ class MatterClusterView extends LitElement {
141
141
  showAlertDialog({
142
142
  title: "Attribute value",
143
143
  text: toBigIntAwareJson(value),
144
+ asCodeBlock: true,
144
145
  });
145
146
  }
146
147
 
@@ -40,7 +40,7 @@ export function getEndpointDeviceTypes(node: MatterNode, endpoint: number): Devi
40
40
  if (!rawValues) return [];
41
41
  return rawValues.map(rawValue => {
42
42
  const id = rawValue["0"] ?? rawValue["deviceType"];
43
- return device_types[id] || { id: id ?? -1, label: `Unknown Device Type (${id})`, clusters: [] };
43
+ return device_types[id] ?? { id: id ?? -1, label: `Unknown Device Type (${id})`, clusters: [] };
44
44
  });
45
45
  }
46
46
 
@@ -97,7 +97,7 @@ class MatterEndpointView extends LitElement {
97
97
  type="link"
98
98
  href=${`#node/${this.node!.node_id}/${this.endpoint}/${cluster}`}
99
99
  >
100
- <div slot="headline">${clusters[cluster]?.label || "Custom/Unknown Cluster"}</div>
100
+ <div slot="headline">${clusters[cluster]?.label ?? "Custom/Unknown Cluster"}</div>
101
101
  <div slot="supporting-text">ClusterId ${cluster} (${formatHex(cluster)})</div>
102
102
  <ha-svg-icon slot="end" .path=${mdiChevronRight}></ha-svg-icon>
103
103
  </md-list-item>
@@ -69,7 +69,7 @@ export const fireEvent = <HassEvent extends ValidHassDomEvent>(
69
69
  composed?: boolean;
70
70
  },
71
71
  ) => {
72
- options = options || {};
72
+ options = options ?? {};
73
73
  const event = new Event(type, {
74
74
  bubbles: options.bubbles === undefined ? true : options.bubbles,
75
75
  cancelable: Boolean(options.cancelable),