@matter-server/dashboard 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/components/dialogs/acl/acl-actions.d.ts +12 -0
- package/dist/esm/components/dialogs/acl/acl-actions.d.ts.map +1 -0
- package/dist/esm/components/dialogs/acl/acl-actions.js +56 -0
- package/dist/esm/components/dialogs/acl/acl-actions.js.map +6 -0
- package/dist/esm/components/dialogs/acl/model.d.ts +2 -2
- package/dist/esm/components/dialogs/acl/model.d.ts.map +1 -1
- package/dist/esm/components/dialogs/acl/model.js +11 -15
- package/dist/esm/components/dialogs/acl/model.js.map +1 -1
- package/dist/esm/components/dialogs/acl/node-acl-add-dialog.d.ts +43 -0
- package/dist/esm/components/dialogs/acl/node-acl-add-dialog.d.ts.map +1 -0
- package/dist/esm/components/dialogs/acl/node-acl-add-dialog.js +353 -0
- package/dist/esm/components/dialogs/acl/node-acl-add-dialog.js.map +6 -0
- package/dist/esm/components/dialogs/acl/show-node-acl-add-dialog.d.ts +8 -0
- package/dist/esm/components/dialogs/acl/show-node-acl-add-dialog.d.ts.map +1 -0
- package/dist/esm/components/dialogs/acl/show-node-acl-add-dialog.js +15 -0
- package/dist/esm/components/dialogs/acl/show-node-acl-add-dialog.js.map +6 -0
- package/dist/esm/components/dialogs/binding/binding-actions.d.ts +17 -0
- package/dist/esm/components/dialogs/binding/binding-actions.d.ts.map +1 -0
- package/dist/esm/components/dialogs/binding/binding-actions.js +135 -0
- package/dist/esm/components/dialogs/binding/binding-actions.js.map +6 -0
- package/dist/esm/components/dialogs/binding/model.d.ts +1 -1
- package/dist/esm/components/dialogs/binding/model.d.ts.map +1 -1
- package/dist/esm/components/dialogs/binding/model.js +8 -3
- package/dist/esm/components/dialogs/binding/model.js.map +1 -1
- package/dist/esm/components/dialogs/binding/node-binding-dialog.d.ts +16 -24
- package/dist/esm/components/dialogs/binding/node-binding-dialog.d.ts.map +1 -1
- package/dist/esm/components/dialogs/binding/node-binding-dialog.js +210 -332
- package/dist/esm/components/dialogs/binding/node-binding-dialog.js.map +1 -1
- package/dist/esm/pages/cluster-commands/clusters/access-control-commands.d.ts +37 -0
- package/dist/esm/pages/cluster-commands/clusters/access-control-commands.d.ts.map +1 -0
- package/dist/esm/pages/cluster-commands/clusters/access-control-commands.js +387 -0
- package/dist/esm/pages/cluster-commands/clusters/access-control-commands.js.map +6 -0
- package/dist/esm/pages/cluster-commands/clusters/binding-commands.d.ts +35 -0
- package/dist/esm/pages/cluster-commands/clusters/binding-commands.d.ts.map +1 -0
- package/dist/esm/pages/cluster-commands/clusters/binding-commands.js +254 -0
- package/dist/esm/pages/cluster-commands/clusters/binding-commands.js.map +6 -0
- package/dist/esm/pages/cluster-commands/index.d.ts +2 -0
- package/dist/esm/pages/cluster-commands/index.d.ts.map +1 -1
- package/dist/esm/pages/cluster-commands/index.js +2 -0
- package/dist/esm/pages/cluster-commands/index.js.map +1 -1
- package/dist/esm/pages/components/node-details.d.ts +0 -1
- package/dist/esm/pages/components/node-details.d.ts.map +1 -1
- package/dist/esm/pages/components/node-details.js +2 -18
- package/dist/esm/pages/components/node-details.js.map +1 -1
- package/dist/esm/pages/components/server-details.js +3 -3
- package/dist/esm/pages/components/server-details.js.map +1 -1
- package/dist/esm/pages/matter-cluster-view.d.ts.map +1 -1
- package/dist/esm/pages/matter-cluster-view.js +2 -1
- package/dist/esm/pages/matter-cluster-view.js.map +1 -1
- package/dist/esm/pages/matter-endpoint-view.d.ts +3 -3
- package/dist/esm/pages/matter-endpoint-view.d.ts.map +1 -1
- package/dist/esm/pages/matter-endpoint-view.js +13 -10
- package/dist/esm/pages/matter-endpoint-view.js.map +1 -1
- package/dist/esm/pages/matter-node-view.js +2 -2
- package/dist/esm/pages/matter-node-view.js.map +1 -1
- package/dist/esm/pages/network/network-utils.d.ts +1 -5
- package/dist/esm/pages/network/network-utils.d.ts.map +1 -1
- package/dist/esm/pages/network/network-utils.js +1 -11
- package/dist/esm/pages/network/network-utils.js.map +1 -1
- package/dist/esm/util/access-control.d.ts +54 -0
- package/dist/esm/util/access-control.d.ts.map +1 -0
- package/dist/esm/util/access-control.js +100 -0
- package/dist/esm/util/access-control.js.map +6 -0
- package/dist/esm/util/binding.d.ts +54 -0
- package/dist/esm/util/binding.d.ts.map +1 -0
- package/dist/esm/util/binding.js +113 -0
- package/dist/esm/util/binding.js.map +6 -0
- package/dist/esm/util/endpoints.d.ts +9 -0
- package/dist/esm/util/endpoints.d.ts.map +1 -0
- package/dist/esm/util/endpoints.js +18 -0
- package/dist/esm/util/endpoints.js.map +6 -0
- package/dist/esm/util/node-name.d.ts +12 -0
- package/dist/esm/util/node-name.d.ts.map +1 -0
- package/dist/esm/util/node-name.js +15 -0
- package/dist/esm/util/node-name.js.map +6 -0
- package/dist/web/js/{attribute-write-dialog-W7xpCE2E.js → attribute-write-dialog-CqqdRniU.js} +1 -1
- package/dist/web/js/{command-invoke-dialog-BAqAAdJw.js → command-invoke-dialog-BuvBOrdC.js} +1 -1
- package/dist/web/js/{commission-node-dialog-BTzCGgdy.js → commission-node-dialog-nVZp3go0.js} +5 -5
- package/dist/web/js/{commission-node-existing-B2M2hyDh.js → commission-node-existing-Cx3Ahk2t.js} +2 -2
- package/dist/web/js/{commission-node-thread-djdz2dXW.js → commission-node-thread-CI8mWWPs.js} +2 -2
- package/dist/web/js/{commission-node-wifi-DxAYNS1A.js → commission-node-wifi-lUX4LK2R.js} +2 -2
- package/dist/web/js/{dialog-box-tHvPVxDN.js → dialog-box-bAdbnf-T.js} +1 -1
- package/dist/web/js/{fire_event-BleYfTLc.js → fire_event-tWhqPfdz.js} +1 -1
- package/dist/web/js/main.js +1 -1
- package/dist/web/js/{matter-dashboard-app-CVi_GDky.js → matter-dashboard-app-CONA_608.js} +1485 -390
- package/dist/web/js/node-acl-add-dialog-DlR-sF-b.js +320 -0
- package/dist/web/js/node-binding-dialog-DhnX_86M.js +267 -0
- package/dist/web/js/{node-label-dialog-DVZSjsXU.js → node-label-dialog-T3nPG-Qy.js} +1 -1
- package/dist/web/js/{settings-dialog-BG5MgZcO.js → settings-dialog-DrHzJtsi.js} +1 -1
- package/package.json +4 -4
- package/src/components/dialogs/acl/acl-actions.ts +71 -0
- package/src/components/dialogs/acl/model.ts +18 -17
- package/src/components/dialogs/acl/node-acl-add-dialog.ts +350 -0
- package/src/components/dialogs/acl/show-node-acl-add-dialog.ts +14 -0
- package/src/components/dialogs/binding/binding-actions.ts +201 -0
- package/src/components/dialogs/binding/model.ts +11 -4
- package/src/components/dialogs/binding/node-binding-dialog.ts +221 -399
- package/src/pages/cluster-commands/clusters/access-control-commands.ts +407 -0
- package/src/pages/cluster-commands/clusters/binding-commands.ts +273 -0
- package/src/pages/cluster-commands/index.ts +2 -0
- package/src/pages/components/node-details.ts +2 -21
- package/src/pages/components/server-details.ts +3 -3
- package/src/pages/matter-cluster-view.ts +4 -1
- package/src/pages/matter-endpoint-view.ts +16 -10
- package/src/pages/matter-node-view.ts +2 -2
- package/src/pages/network/network-utils.ts +1 -18
- package/src/util/access-control.ts +135 -0
- package/src/util/binding.ts +182 -0
- package/src/util/endpoints.ts +17 -0
- package/src/util/node-name.ts +18 -0
- package/dist/web/js/node-binding-dialog-B9IdqHrZ.js +0 -624
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binding-actions.d.ts","sourceRoot":"","sources":["../../../../../src/components/dialogs/binding/binding-actions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAqC,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAsEvG,0GAA0G;AAC1G,wBAAsB,gBAAgB,CAClC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,MAAM,GAAG,MAAM,EAC7B,YAAY,EAAE,MAAM,GAAG,MAAM,EAC7B,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED,yFAAyF;AACzF,wBAAsB,2BAA2B,CAC7C,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,MAAM,GAAG,MAAM,EAC7B,YAAY,EAAE,MAAM,GAAG,MAAM,EAC7B,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAsB,UAAU,CAC5B,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GAAG,MAAM,EAC7B,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACtC,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import {
|
|
7
|
+
AuthMode,
|
|
8
|
+
Privilege,
|
|
9
|
+
attributeArray,
|
|
10
|
+
entriesForFabric,
|
|
11
|
+
entryMatchesTarget,
|
|
12
|
+
isWholeNode,
|
|
13
|
+
nodeIdKey,
|
|
14
|
+
subjectsInclude
|
|
15
|
+
} from "../../../util/access-control.js";
|
|
16
|
+
import { AccessControlEntryDataTransformer } from "../acl/model.js";
|
|
17
|
+
import { BindingEntryDataTransformer } from "./model.js";
|
|
18
|
+
function toBindingTarget(e) {
|
|
19
|
+
return { node: e.node ?? null, group: e.group ?? null, endpoint: e.endpoint ?? null, cluster: e.cluster ?? null };
|
|
20
|
+
}
|
|
21
|
+
function toApiAcl(e) {
|
|
22
|
+
return {
|
|
23
|
+
privilege: e.privilege,
|
|
24
|
+
auth_mode: e.authMode,
|
|
25
|
+
subjects: e.subjects ?? null,
|
|
26
|
+
targets: e.targets?.map((t) => ({
|
|
27
|
+
cluster: t.cluster ?? null,
|
|
28
|
+
endpoint: t.endpoint ?? null,
|
|
29
|
+
device_type: t.deviceType ?? null
|
|
30
|
+
})) ?? null
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function requireFabricIndex(res, nodeId) {
|
|
34
|
+
const fi = res["0/62/5"];
|
|
35
|
+
if (typeof fi !== "number") {
|
|
36
|
+
throw new Error(`Cannot determine the current fabric index (0/62/5) for node ${nodeId}`);
|
|
37
|
+
}
|
|
38
|
+
return fi;
|
|
39
|
+
}
|
|
40
|
+
async function freshOurAcl(client, nodeId) {
|
|
41
|
+
const res = await client.readAttribute(nodeId, ["0/31/0", "0/62/5"]);
|
|
42
|
+
const all = attributeArray(res["0/31/0"]).map((v) => AccessControlEntryDataTransformer.transform(v));
|
|
43
|
+
return entriesForFabric(all, requireFabricIndex(res, nodeId));
|
|
44
|
+
}
|
|
45
|
+
async function freshOurBindings(client, nodeId, endpoint) {
|
|
46
|
+
const res = await client.readAttribute(nodeId, [`${endpoint}/30/0`, "0/62/5"]);
|
|
47
|
+
const all = attributeArray(res[`${endpoint}/30/0`]).map((v) => BindingEntryDataTransformer.transform(v));
|
|
48
|
+
const fabricIndex = requireFabricIndex(res, nodeId);
|
|
49
|
+
return all.filter((b) => b.fabricIndex === fabricIndex);
|
|
50
|
+
}
|
|
51
|
+
function hasTarget(e, endpoint, cluster) {
|
|
52
|
+
return (e.targets ?? []).some((t) => t.endpoint === endpoint && t.cluster === cluster);
|
|
53
|
+
}
|
|
54
|
+
function aclTargetsMax(client, nodeId) {
|
|
55
|
+
const raw = client.nodes[nodeIdKey(nodeId)]?.attributes["0/31/3"];
|
|
56
|
+
return typeof raw === "number" && raw > 0 ? raw : Number.MAX_SAFE_INTEGER;
|
|
57
|
+
}
|
|
58
|
+
async function ensureBindingAcl(client, sourceNodeId, targetNodeId, targetEndpoint, cluster) {
|
|
59
|
+
const acl = await freshOurAcl(client, targetNodeId);
|
|
60
|
+
const alreadyGranted = acl.some(
|
|
61
|
+
(e) => e.authMode === AuthMode.Case && e.privilege >= Privilege.Operate && subjectsInclude(e, sourceNodeId) && entryMatchesTarget(e, targetEndpoint, cluster)
|
|
62
|
+
);
|
|
63
|
+
if (alreadyGranted) return;
|
|
64
|
+
const targetsMax = aclTargetsMax(client, targetNodeId);
|
|
65
|
+
const reusable = acl.find(
|
|
66
|
+
(e) => e.authMode === AuthMode.Case && e.privilege >= Privilege.Operate && subjectsInclude(e, sourceNodeId) && (isWholeNode(e) || hasTarget(e, targetEndpoint, cluster) || (e.targets?.length ?? 0) < targetsMax)
|
|
67
|
+
);
|
|
68
|
+
if (reusable) {
|
|
69
|
+
if (!isWholeNode(reusable) && !hasTarget(reusable, targetEndpoint, cluster)) {
|
|
70
|
+
reusable.targets = reusable.targets ?? [];
|
|
71
|
+
reusable.targets.push({ endpoint: targetEndpoint, cluster, deviceType: void 0 });
|
|
72
|
+
}
|
|
73
|
+
} else {
|
|
74
|
+
acl.push({
|
|
75
|
+
privilege: Privilege.Operate,
|
|
76
|
+
authMode: AuthMode.Case,
|
|
77
|
+
subjects: [sourceNodeId],
|
|
78
|
+
targets: [{ endpoint: targetEndpoint, cluster, deviceType: void 0 }],
|
|
79
|
+
fabricIndex: 0
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
await client.setACLEntry(targetNodeId, acl.map(toApiAcl));
|
|
83
|
+
}
|
|
84
|
+
async function fixOverPrivilegedBindingAcl(client, sourceNodeId, targetNodeId, targetEndpoint, cluster) {
|
|
85
|
+
const acl = await freshOurAcl(client, targetNodeId);
|
|
86
|
+
const updated = acl.map(
|
|
87
|
+
(e) => e.authMode === AuthMode.Case && subjectsInclude(e, sourceNodeId) && e.privilege > Privilege.Operate && entryMatchesTarget(e, targetEndpoint, cluster) ? { ...e, privilege: Privilege.Operate } : e
|
|
88
|
+
);
|
|
89
|
+
await client.setACLEntry(targetNodeId, updated.map(toApiAcl));
|
|
90
|
+
}
|
|
91
|
+
async function addBinding(client, sourceNode, sourceEndpoint, targetNodeId, targetEndpoint, cluster) {
|
|
92
|
+
await ensureBindingAcl(client, sourceNode.node_id, targetNodeId, targetEndpoint, cluster);
|
|
93
|
+
const bindings = await freshOurBindings(client, sourceNode.node_id, sourceEndpoint);
|
|
94
|
+
const targetKey = nodeIdKey(targetNodeId);
|
|
95
|
+
const exists = bindings.some(
|
|
96
|
+
(b) => b.node != null && nodeIdKey(b.node) === targetKey && b.endpoint === targetEndpoint && b.cluster === cluster
|
|
97
|
+
);
|
|
98
|
+
if (exists) return;
|
|
99
|
+
bindings.push({ node: targetNodeId, group: void 0, endpoint: targetEndpoint, cluster, fabricIndex: void 0 });
|
|
100
|
+
await client.setNodeBinding(sourceNode.node_id, sourceEndpoint, bindings.map(toBindingTarget));
|
|
101
|
+
}
|
|
102
|
+
async function deleteBindingAtIndex(client, sourceNode, sourceEndpoint, index) {
|
|
103
|
+
const bindings = await freshOurBindings(client, sourceNode.node_id, sourceEndpoint);
|
|
104
|
+
const removed = bindings[index];
|
|
105
|
+
if (!removed) return;
|
|
106
|
+
const updated = [...bindings.slice(0, index), ...bindings.slice(index + 1)];
|
|
107
|
+
await client.setNodeBinding(sourceNode.node_id, sourceEndpoint, updated.map(toBindingTarget));
|
|
108
|
+
if (removed.node == null || removed.endpoint == null) return;
|
|
109
|
+
const targetEndpoint = removed.endpoint;
|
|
110
|
+
const removedCluster = removed.cluster;
|
|
111
|
+
try {
|
|
112
|
+
const acl = await freshOurAcl(client, removed.node);
|
|
113
|
+
const kept = acl.map((e) => {
|
|
114
|
+
if (!subjectsInclude(e, sourceNode.node_id) || isWholeNode(e)) return e;
|
|
115
|
+
const targets = e.targets.filter(
|
|
116
|
+
(t) => !(t.endpoint === targetEndpoint && t.cluster === removedCluster)
|
|
117
|
+
);
|
|
118
|
+
if (targets.length === 0) return void 0;
|
|
119
|
+
return { ...e, targets };
|
|
120
|
+
}).filter((e) => e !== void 0);
|
|
121
|
+
await client.setACLEntry(removed.node, kept.map(toApiAcl));
|
|
122
|
+
} catch (err) {
|
|
123
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
124
|
+
throw new Error(
|
|
125
|
+
`Binding removed, but cleaning up the access control entry on the target node failed: ${detail}. The target may retain a stale access grant.`
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
export {
|
|
130
|
+
addBinding,
|
|
131
|
+
deleteBindingAtIndex,
|
|
132
|
+
ensureBindingAcl,
|
|
133
|
+
fixOverPrivilegedBindingAcl
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=binding-actions.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/components/dialogs/binding/binding-actions.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -15,6 +15,6 @@ export interface BindingEntryStruct {
|
|
|
15
15
|
}
|
|
16
16
|
export declare class BindingEntryDataTransformer {
|
|
17
17
|
private static readonly KEY_MAPPING;
|
|
18
|
-
static transform(input:
|
|
18
|
+
static transform(input: unknown): BindingEntryStruct;
|
|
19
19
|
}
|
|
20
20
|
//# sourceMappingURL=model.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../../src/components/dialogs/binding/model.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GAAG;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CAChD,CAAC;AAEF,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAClC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../../src/components/dialogs/binding/model.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GAAG;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CAChD,CAAC;AAEF,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAClC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAMD,qBAAa,2BAA2B;IACpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAQjC;IAEF,OAAc,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CA+B1D;CACJ"}
|
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
* Copyright 2025-2026 Open Home Foundation
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
+
function isRecord(value) {
|
|
7
|
+
return typeof value === "object" && value !== null;
|
|
8
|
+
}
|
|
6
9
|
class BindingEntryDataTransformer {
|
|
7
10
|
static {
|
|
8
11
|
this.KEY_MAPPING = {
|
|
@@ -14,7 +17,7 @@ class BindingEntryDataTransformer {
|
|
|
14
17
|
};
|
|
15
18
|
}
|
|
16
19
|
static transform(input) {
|
|
17
|
-
if (!input
|
|
20
|
+
if (!isRecord(input)) {
|
|
18
21
|
throw new Error("Invalid input: expected an object");
|
|
19
22
|
}
|
|
20
23
|
const result = {};
|
|
@@ -24,11 +27,13 @@ class BindingEntryDataTransformer {
|
|
|
24
27
|
const mappedKey = keyMapping[key];
|
|
25
28
|
if (mappedKey) {
|
|
26
29
|
const value = input[key];
|
|
27
|
-
if (value
|
|
30
|
+
if (value == null) {
|
|
28
31
|
continue;
|
|
29
32
|
}
|
|
30
33
|
if (mappedKey === "node") {
|
|
31
|
-
|
|
34
|
+
if (typeof value === "number" || typeof value === "bigint") {
|
|
35
|
+
result.node = value;
|
|
36
|
+
}
|
|
32
37
|
} else {
|
|
33
38
|
result[mappedKey] = Number(value);
|
|
34
39
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/components/dialogs/binding/model.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA,SAAS,SAAS,OAAkD;AAChE,SAAO,OAAO,UAAU,YAAY,UAAU;AAClD;AAEO,MAAM,4BAA4B;AAAA,EACrC;AAAA,SAAwB,cAEpB;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,OAAO;AAAA,IACX;AAAA;AAAA,EAEA,OAAc,UAAU,OAAoC;AACxD,QAAI,CAAC,SAAS,KAAK,GAAG;AAClB,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACvD;AAEA,UAAM,SAAsC,CAAC;AAC7C,UAAM,aAAa,4BAA4B;AAE/C,eAAW,OAAO,OAAO;AACrB,UAAI,OAAO,YAAY;AACnB,cAAM,YAAY,WAAW,GAAG;AAChC,YAAI,WAAW;AACX,gBAAM,QAAQ,MAAM,GAAG;AAEvB,cAAI,SAAS,MAAM;AACf;AAAA,UACJ;AACA,cAAI,cAAc,QAAQ;AAEtB,gBAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AACxD,qBAAO,OAAO;AAAA,YAClB;AAAA,UACJ,OAAO;AAEH,mBAAO,SAAS,IAAI,OAAO,KAAK;AAAA,UACpC;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AACJ;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -5,38 +5,30 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import "@material/web/button/text-button";
|
|
7
7
|
import "@material/web/dialog/dialog";
|
|
8
|
-
import "@material/web/
|
|
9
|
-
import "@material/web/
|
|
8
|
+
import "@material/web/select/outlined-select";
|
|
9
|
+
import "@material/web/select/select-option";
|
|
10
10
|
import "@material/web/textfield/outlined-text-field";
|
|
11
|
-
import "../../../components/ha-svg-icon";
|
|
12
11
|
import { MatterClient, MatterNode } from "@matter-server/ws-client";
|
|
13
|
-
import { LitElement } from "lit";
|
|
12
|
+
import { LitElement, nothing } from "lit";
|
|
14
13
|
export declare class NodeBindingDialog extends LitElement {
|
|
15
14
|
client: MatterClient;
|
|
16
15
|
node?: MatterNode;
|
|
17
16
|
endpoint: number;
|
|
18
|
-
private
|
|
19
|
-
private
|
|
20
|
-
private
|
|
21
|
-
private
|
|
22
|
-
private
|
|
23
|
-
private
|
|
24
|
-
private
|
|
25
|
-
private
|
|
26
|
-
private
|
|
27
|
-
private
|
|
28
|
-
private
|
|
29
|
-
private add_target_acl;
|
|
30
|
-
/** Convert local BindingEntryStruct to API BindingTarget (without fabricIndex) */
|
|
31
|
-
private toBindingTarget;
|
|
32
|
-
/** Convert local AccessControlEntryStruct to API AccessControlEntry (without fabricIndex) */
|
|
33
|
-
private toAccessControlEntry;
|
|
34
|
-
private add_bindings;
|
|
35
|
-
addBindingHandler(): Promise<void>;
|
|
17
|
+
private _nodeIdInput;
|
|
18
|
+
private _endpointInput;
|
|
19
|
+
private _clusterSelection;
|
|
20
|
+
private _customClusterInput;
|
|
21
|
+
private _busy;
|
|
22
|
+
private _knownNodes;
|
|
23
|
+
private _resolveTarget;
|
|
24
|
+
private _nodeEndpoints;
|
|
25
|
+
private _clusterLabel;
|
|
26
|
+
private _onNodeSelect;
|
|
27
|
+
private _add;
|
|
36
28
|
private _close;
|
|
37
29
|
private _handleClosed;
|
|
38
|
-
private
|
|
39
|
-
protected render(): import("lit-html").TemplateResult<1>;
|
|
30
|
+
private _renderClusterField;
|
|
31
|
+
protected render(): typeof nothing | import("lit-html").TemplateResult<1>;
|
|
40
32
|
static styles: import("lit").CSSResult;
|
|
41
33
|
}
|
|
42
34
|
declare global {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-binding-dialog.d.ts","sourceRoot":"","sources":["../../../../../src/components/dialogs/binding/node-binding-dialog.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,kCAAkC,CAAC;AAC1C,OAAO,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"node-binding-dialog.d.ts","sourceRoot":"","sources":["../../../../../src/components/dialogs/binding/node-binding-dialog.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,kCAAkC,CAAC;AAC1C,OAAO,6BAA6B,CAAC;AACrC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,oCAAoC,CAAC;AAC5C,OAAO,6CAA6C,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAa,UAAU,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAgBrD,qBACa,iBAAkB,SAAQ,UAAU;IAGtC,MAAM,EAAG,YAAY,CAAC;IAGtB,IAAI,CAAC,EAAE,UAAU,CAAC;IAGzB,QAAQ,EAAG,MAAM,CAAC;IAET,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,mBAAmB,CAAM;IACjC,OAAO,CAAC,KAAK,CAAS;IAE/B,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,aAAa;YAOP,IAAI;IAkDlB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,mBAAmB;IA+D3B,UAAmB,MAAM,0DA+ExB;IAED,OAAgB,MAAM,0BAcpB;CACL;AAED,OAAO,CAAC,MAAM,CAAC,CAAC;IACZ,UAAU,qBAAqB;QAC3B,qBAAqB,EAAE,iBAAiB,CAAC;KAC5C;CACJ"}
|