@victronenergy/mfd-modules 11.1.5 → 11.1.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchingPane.provider.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.provider.ts"],"names":[],"mappings":"AAKA,OAAO,EAAiC,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AACrG,OAAO,EAIL,kBAAkB,EAKnB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAA8B,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAYpF,eAAO,MAAM,gBAAgB,GAAI,yBAAyB,MAAM,uDA6T/D,CAAA;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM;;cAQ8B,yBAAyB;cACjC,kBAAkB;EAEhG;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM;;cAQ0B,yBAAyB;aAC5B,cAAc;EAEzF;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAGtD"}
1
+ {"version":3,"file":"SwitchingPane.provider.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.provider.ts"],"names":[],"mappings":"AAKA,OAAO,EAAiC,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AACrG,OAAO,EAIL,kBAAkB,EAKnB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAA8B,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAYpF,eAAO,MAAM,gBAAgB,GAAI,yBAAyB,MAAM,uDAqQ/D,CAAA;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM;;cAQ8B,yBAAyB;cACjC,kBAAkB;EAEhG;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM;;cAQ0B,yBAAyB;aAC5B,cAAc;EAEzF;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAGtD"}
@@ -1,4 +1,4 @@
1
- import { autorun } from "mobx";
1
+ import { runInAction, untracked } from "mobx";
2
2
  import Logger from "../../utils/logger";
3
3
  import { useMqtt } from "../Mqtt";
4
4
  import { useMemo, useEffect } from "react";
@@ -9,153 +9,89 @@ import { getGenericInputStateTopics } from "./GenericInput.provider";
9
9
  import { remapGenericInputType, SWITCHABLE_OUTPUT_FUNCTION, SWITCHABLE_OUTPUT_VISIBILITY, } from "../../utils/constants";
10
10
  const hasMessages = (messages) => messages && Object.keys(messages).length > 0;
11
11
  export const useSwitchingPane = (gxDeviceRelaysGroupName) => {
12
- const switchingPaneStore = useSwitchingPaneStore();
13
- const getTopics = (portalId) => ({
14
- switchableOutputs: `N/${portalId}/(${SWITCHABLE_OUTPUT_TREES.join("|")})/+/SwitchableOutput/+/Settings/+`,
15
- genericInputs: `N/${portalId}/(${SWITCHABLE_OUTPUT_TREES.join("|")})/+/GenericInput/+/Settings/+`,
16
- switchingDevices: `N/${portalId}/switch/+`,
17
- });
12
+ const store = useSwitchingPaneStore();
18
13
  const mqtt = useMqtt();
19
- const topics = useMemo(() => getTopics(mqtt.portalId), [mqtt.portalId]);
20
- const messagesForSwitchableOutputs = mqtt.messagesByWildcard(topics.switchableOutputs);
21
- const messagesForGenericInputs = mqtt.messagesByWildcard(topics.genericInputs);
14
+ const topics = useMemo(() => ({
15
+ systemOutputs: `N/${mqtt.portalId}/system/+/SwitchableOutput/+/Settings/+`,
16
+ switchOutputs: `N/${mqtt.portalId}/switch/+/SwitchableOutput/+/Settings/+`,
17
+ genericInputs: `N/${mqtt.portalId}/switch/+/GenericInput/+/Settings/+`,
18
+ switchingDevices: `N/${mqtt.portalId}/switch/+`,
19
+ }), [mqtt.portalId]);
20
+ const messagesForSystemOutputs = mqtt.messagesByWildcard(topics.systemOutputs);
21
+ const messagesForSwitchOutputs = mqtt.messagesByWildcard(topics.switchOutputs);
22
+ const messagesForInputs = mqtt.messagesByWildcard(topics.genericInputs);
22
23
  const messagesForSwitchingDevices = mqtt.messagesByWildcard(topics.switchingDevices);
23
- // Examine MQTT to find all available switchable outputs, generic inputs, and their group assignments
24
24
  useEffect(() => {
25
- if (!hasMessages(messagesForSwitchableOutputs) && !hasMessages(messagesForGenericInputs)) {
25
+ if (!hasMessages(messagesForSystemOutputs) &&
26
+ !hasMessages(messagesForSwitchOutputs) &&
27
+ !hasMessages(messagesForInputs)) {
26
28
  Logger.log("Waiting for switchable outputs or generic inputs...");
27
29
  return;
28
30
  }
29
- // All switchable outputs in array sorted by topic
30
- const availableSwitchableOutputs = messagesForSwitchableOutputs
31
- ? Object.keys(messagesForSwitchableOutputs)
32
- .filter((key) => key.endsWith("/Settings/Group"))
33
- .sort()
34
- : [];
35
- // All switchable outputs group assignments in array sorted by topic
36
- const customGroupAssigments = availableSwitchableOutputs.map((topic) => {
37
- return messagesForSwitchableOutputs[topic];
38
- });
39
- // All switchable outputs types in array sorted by topic
40
- const availableSwitchableOutputTypes = availableSwitchableOutputs.map((topic) => {
41
- return Number(messagesForSwitchableOutputs[`${topic.slice(0, -"/Group".length)}/Type`]);
42
- });
43
- // All switchable outputs names in array sorted by topic
44
- const availableSwitchableOutputNames = availableSwitchableOutputs.map((topic) => {
45
- return messagesForSwitchableOutputs[`${topic.slice(0, -"/Group".length)}/CustomName`];
46
- });
47
- // All switchable outputs visibility in array sorted by topic
48
- const availableSwitchableOutputVisibilityFlags = availableSwitchableOutputs.map((topic) => {
49
- return Number(messagesForSwitchableOutputs[`${topic.slice(0, -"/Group".length)}/ShowUIControl`]);
50
- });
51
- // All switchable outputs functions in array sorted by topic
52
- const availableSwitchableOutputFunctions = availableSwitchableOutputs.map((topic) => {
53
- return Number(messagesForSwitchableOutputs[`${topic.slice(0, -"/Group".length)}/Function`]);
54
- });
55
- // All generic inputs in array sorted by topic
56
- const availableGenericInputs = messagesForGenericInputs
57
- ? Object.keys(messagesForGenericInputs)
58
- .filter((key) => key.endsWith("/Settings/Group"))
59
- .sort()
60
- : [];
61
- // All generic input group assignments in array sorted by topic
62
- const genericInputGroupAssignments = availableGenericInputs.map((topic) => {
63
- return messagesForGenericInputs[topic];
64
- });
65
- // All generic input types in array sorted by topic
66
- const availableGenericInputTypes = availableGenericInputs.map((topic) => {
67
- return Number(messagesForGenericInputs[`${topic.slice(0, -"/Group".length)}/Type`]);
68
- });
69
- // All generic input names in array sorted by topic
70
- const availableGenericInputNames = availableGenericInputs.map((topic) => {
71
- return messagesForGenericInputs[`${topic.slice(0, -"/Group".length)}/CustomName`];
72
- });
73
- // All generic input visibility in array sorted by topic
74
- const availableGenericInputVisibilityFlags = availableGenericInputs.map((topic) => {
75
- return Number(messagesForGenericInputs[`${topic.slice(0, -"/Group".length)}/ShowUIInput`]);
76
- });
77
- // All switching devices in array sorted by instance number
78
- const availableSwitchingDevices = Object.keys(messagesForSwitchingDevices)
79
- .filter((key) => key.endsWith("/DeviceInstance"))
31
+ // --- Phase A: Extract comparison arrays from wildcard messages (cheap) ---
32
+ const messagesForOutputs = Object.assign(Object.assign({}, messagesForSystemOutputs), messagesForSwitchOutputs);
33
+ const outputGroupTopics = Object.keys(messagesForOutputs)
34
+ .filter((k) => k.endsWith("/Settings/Group"))
35
+ .sort();
36
+ const customGroupAssignments = outputGroupTopics.map((t) => messagesForOutputs[t]);
37
+ const outputTypes = outputGroupTopics.map((t) => Number(messagesForOutputs[`${t.slice(0, -"/Group".length)}/Type`]));
38
+ const outputNames = outputGroupTopics.map((t) => messagesForOutputs[`${t.slice(0, -"/Group".length)}/CustomName`]);
39
+ const outputVisibilityFlags = outputGroupTopics.map((t) => Number(messagesForOutputs[`${t.slice(0, -"/Group".length)}/ShowUIControl`]));
40
+ const outputFunctions = outputGroupTopics.map((t) => Number(messagesForOutputs[`${t.slice(0, -"/Group".length)}/Function`]));
41
+ const inputGroupTopics = Object.keys(messagesForInputs)
42
+ .filter((k) => k.endsWith("/Settings/Group"))
80
43
  .sort();
81
- // All switching device names in array sorted by instance number
82
- const availableSwitchingDeviceNames = availableSwitchingDevices.map((topic) => {
83
- const topicPrefix = topic.slice(0, -"/DeviceInstance".length);
84
- return (messagesForSwitchingDevices[`${topicPrefix}/CustomName`] ||
85
- messagesForSwitchingDevices[`${topicPrefix}/ProductName`]);
44
+ const genericInputGroupAssignments = inputGroupTopics.map((t) => messagesForInputs[t]);
45
+ const genericInputTypes = inputGroupTopics.map((t) => Number(messagesForInputs[`${t.slice(0, -"/Group".length)}/Type`]));
46
+ const genericInputNames = inputGroupTopics.map((t) => messagesForInputs[`${t.slice(0, -"/Group".length)}/CustomName`]);
47
+ const genericInputVisibilityFlags = inputGroupTopics.map((t) => Number(messagesForInputs[`${t.slice(0, -"/Group".length)}/ShowUIInput`]));
48
+ const switchingDevices = Object.keys(messagesForSwitchingDevices)
49
+ .filter((k) => k.endsWith("/DeviceInstance"))
50
+ .sort();
51
+ const switchingDeviceNames = switchingDevices.map((t) => {
52
+ const prefix = t.slice(0, -"/DeviceInstance".length);
53
+ return messagesForSwitchingDevices[`${prefix}/CustomName`] || messagesForSwitchingDevices[`${prefix}/ProductName`];
86
54
  });
87
- const dispose = autorun(() => {
88
- const oldAssignments = switchingPaneStore.customGroupAssignments;
89
- const newAssignments = customGroupAssigments;
90
- const groupAssignmentsChanged = !arraysEqual(oldAssignments, newAssignments);
91
- if (groupAssignmentsChanged) {
92
- switchingPaneStore.setCustomGroupAssignments(newAssignments);
93
- }
94
- const oldOutputTypes = switchingPaneStore.outputTypes;
95
- const newOutputTypes = availableSwitchableOutputTypes;
96
- const outputTypesChanged = !arraysEqual(oldOutputTypes, newOutputTypes);
97
- if (outputTypesChanged) {
98
- switchingPaneStore.setOutputTypes(newOutputTypes);
99
- }
100
- const oldOutputNames = switchingPaneStore.outputNames;
101
- const newOutputNames = availableSwitchableOutputNames;
102
- const outputNamesChanged = !arraysEqual(oldOutputNames, newOutputNames);
103
- if (outputNamesChanged) {
104
- switchingPaneStore.setOutputNames(newOutputNames);
105
- }
106
- const oldOutputVisibilityFlags = switchingPaneStore.outputVisibilityFlags;
107
- const newOutputVisibilityFlags = availableSwitchableOutputVisibilityFlags;
108
- const outputVisibilityFlagsChanged = !arraysEqual(oldOutputVisibilityFlags, newOutputVisibilityFlags);
109
- if (outputVisibilityFlagsChanged) {
110
- switchingPaneStore.setOutputVisibilityFlags(newOutputVisibilityFlags);
111
- }
112
- const oldOutputFunctions = switchingPaneStore.outputFunctions;
113
- const newOutputFunctions = availableSwitchableOutputFunctions;
114
- const outputFunctionsChanged = !arraysEqual(oldOutputFunctions, newOutputFunctions);
115
- if (outputFunctionsChanged) {
116
- switchingPaneStore.setOutputFunctions(newOutputFunctions);
117
- }
118
- const oldSwitchingDevices = switchingPaneStore.switchingDevices;
119
- const newSwitchingDevices = availableSwitchingDevices;
120
- const switchingDevicesChanged = !arraysEqual(oldSwitchingDevices, newSwitchingDevices);
121
- if (switchingDevicesChanged) {
122
- switchingPaneStore.setSwitchingDevices(newSwitchingDevices);
123
- }
124
- const oldSwitchingDeviceNames = switchingPaneStore.switchingDeviceNames;
125
- const newSwitchingDeviceNames = availableSwitchingDeviceNames;
126
- const switchingDeviceNamesChanged = !arraysEqual(oldSwitchingDeviceNames, newSwitchingDeviceNames);
127
- if (switchingDeviceNamesChanged) {
128
- switchingPaneStore.setSwitchingDeviceNames(newSwitchingDeviceNames);
129
- }
130
- const oldGiAssignments = switchingPaneStore.genericInputGroupAssignments;
131
- const newGiAssignments = genericInputGroupAssignments;
132
- const giGroupAssignmentsChanged = !arraysEqual(oldGiAssignments, newGiAssignments);
133
- if (giGroupAssignmentsChanged) {
134
- switchingPaneStore.setGenericInputGroupAssignments(newGiAssignments);
135
- }
136
- const oldGiTypes = switchingPaneStore.genericInputTypes;
137
- const newGiTypes = availableGenericInputTypes;
138
- const giTypesChanged = !arraysEqual(oldGiTypes, newGiTypes);
139
- if (giTypesChanged) {
140
- switchingPaneStore.setGenericInputTypes(newGiTypes);
141
- }
142
- const oldGiNames = switchingPaneStore.genericInputNames;
143
- const newGiNames = availableGenericInputNames;
144
- const giNamesChanged = !arraysEqual(oldGiNames, newGiNames);
145
- if (giNamesChanged) {
146
- switchingPaneStore.setGenericInputNames(newGiNames);
147
- }
148
- const oldGiVisibilityFlags = switchingPaneStore.genericInputVisibilityFlags;
149
- const newGiVisibilityFlags = availableGenericInputVisibilityFlags;
150
- const giVisibilityFlagsChanged = !arraysEqual(oldGiVisibilityFlags, newGiVisibilityFlags);
151
- if (giVisibilityFlagsChanged) {
152
- switchingPaneStore.setGenericInputVisibilityFlags(newGiVisibilityFlags);
153
- }
154
- // On initial population (all old arrays empty), skip per-field logging
155
- const isInitialLoad = oldAssignments.length === 0 &&
156
- oldOutputTypes.length === 0 &&
157
- oldSwitchingDevices.length === 0 &&
158
- oldGiAssignments.length === 0;
55
+ // --- Phase B: comparison guard, batched in a single action ---
56
+ runInAction(() => {
57
+ var _a, _b;
58
+ const groupAssignmentsChanged = !arraysEqual(store.customGroupAssignments, customGroupAssignments);
59
+ if (groupAssignmentsChanged)
60
+ store.setCustomGroupAssignments(customGroupAssignments);
61
+ const outputTypesChanged = !arraysEqual(store.outputTypes, outputTypes);
62
+ if (outputTypesChanged)
63
+ store.setOutputTypes(outputTypes);
64
+ const outputNamesChanged = !arraysEqual(store.outputNames, outputNames);
65
+ if (outputNamesChanged)
66
+ store.setOutputNames(outputNames);
67
+ const outputVisibilityFlagsChanged = !arraysEqual(store.outputVisibilityFlags, outputVisibilityFlags);
68
+ if (outputVisibilityFlagsChanged)
69
+ store.setOutputVisibilityFlags(outputVisibilityFlags);
70
+ const outputFunctionsChanged = !arraysEqual(store.outputFunctions, outputFunctions);
71
+ if (outputFunctionsChanged)
72
+ store.setOutputFunctions(outputFunctions);
73
+ const switchingDevicesChanged = !arraysEqual(store.switchingDevices, switchingDevices);
74
+ if (switchingDevicesChanged)
75
+ store.setSwitchingDevices(switchingDevices);
76
+ const switchingDeviceNamesChanged = !arraysEqual(store.switchingDeviceNames, switchingDeviceNames);
77
+ if (switchingDeviceNamesChanged)
78
+ store.setSwitchingDeviceNames(switchingDeviceNames);
79
+ const giGroupAssignmentsChanged = !arraysEqual(store.genericInputGroupAssignments, genericInputGroupAssignments);
80
+ if (giGroupAssignmentsChanged)
81
+ store.setGenericInputGroupAssignments(genericInputGroupAssignments);
82
+ const giTypesChanged = !arraysEqual(store.genericInputTypes, genericInputTypes);
83
+ if (giTypesChanged)
84
+ store.setGenericInputTypes(genericInputTypes);
85
+ const giNamesChanged = !arraysEqual(store.genericInputNames, genericInputNames);
86
+ if (giNamesChanged)
87
+ store.setGenericInputNames(genericInputNames);
88
+ const giVisibilityFlagsChanged = !arraysEqual(store.genericInputVisibilityFlags, genericInputVisibilityFlags);
89
+ if (giVisibilityFlagsChanged)
90
+ store.setGenericInputVisibilityFlags(genericInputVisibilityFlags);
91
+ const isInitialLoad = store.customGroupAssignments.length === 0 &&
92
+ store.outputTypes.length === 0 &&
93
+ store.switchingDevices.length === 0 &&
94
+ store.genericInputGroupAssignments.length === 0;
159
95
  if (!isInitialLoad) {
160
96
  if (groupAssignmentsChanged)
161
97
  Logger.log(`Switchable outputs group assignments changed, recomputing...`);
@@ -191,83 +127,88 @@ export const useSwitchingPane = (gxDeviceRelaysGroupName) => {
191
127
  giTypesChanged ||
192
128
  giNamesChanged ||
193
129
  giVisibilityFlagsChanged) {
194
- // Collect all switching pane items (switchable outputs + generic inputs) with their group info
195
130
  const items = [];
196
- availableSwitchableOutputs.forEach((output, index) => {
197
- const swo = extractSwitchableOutputInfo(output);
198
- const switchingDevice = mqtt.messagesByTopics(getSwitchingDeviceStateTopics(mqtt.portalId, swo.tree, swo.deviceId));
199
- const customGroupAssignment = customGroupAssigments[index].trim();
200
- const deviceName = switchingDevice.customName || switchingDevice.productName || gxDeviceRelaysGroupName;
201
- const groupName = customGroupAssignment === "" ? deviceName : customGroupAssignment;
202
- const switchableOutput = mqtt.messagesByTopics(getSwitchableOutputStateTopics(mqtt.portalId, swo.tree, swo.deviceId, swo.outputId));
203
- if (!(switchableOutput.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE ||
204
- switchableOutput.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE_LOCAL_UI)) {
205
- return;
131
+ for (const topic of outputGroupTopics) {
132
+ const info = extractSwitchableOutputInfo(topic);
133
+ const { deviceName, output } = untracked(() => {
134
+ const device = mqtt.messagesByTopics(getSwitchingDeviceStateTopics(mqtt.portalId, info.tree, info.deviceId));
135
+ const out = mqtt.messagesByTopics(getSwitchableOutputStateTopics(mqtt.portalId, info.tree, info.deviceId, info.outputId));
136
+ return {
137
+ deviceName: device.customName || device.productName || gxDeviceRelaysGroupName,
138
+ output: out,
139
+ };
140
+ });
141
+ if (!(output.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE ||
142
+ output.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE_LOCAL_UI)) {
143
+ continue;
206
144
  }
207
145
  // GX system relays: only show when Function is Manual (matching gui-v2)
208
- if (swo.tree === "system" &&
209
- switchableOutput.function != null &&
210
- switchableOutput.function !== SWITCHABLE_OUTPUT_FUNCTION.MANUAL) {
211
- return;
146
+ if (info.tree === "system" &&
147
+ output.function != null &&
148
+ output.function !== SWITCHABLE_OUTPUT_FUNCTION.MANUAL) {
149
+ continue;
212
150
  }
151
+ const customGroup = ((_a = messagesForOutputs[topic]) !== null && _a !== void 0 ? _a : "").trim();
213
152
  items.push({
214
- groupName,
215
- item: Object.assign(Object.assign({}, switchableOutput), { kind: "switchableOutput", tree: swo.tree, deviceId: swo.deviceId, outputId: swo.outputId, parentDeviceName: deviceName }),
153
+ groupName: customGroup === "" ? deviceName : customGroup,
154
+ item: Object.assign(Object.assign({}, output), { kind: "switchableOutput", tree: info.tree, deviceId: info.deviceId, outputId: info.outputId, parentDeviceName: deviceName }),
155
+ });
156
+ }
157
+ for (const topic of inputGroupTopics) {
158
+ const info = extractGenericInputInfo(topic);
159
+ const { deviceName, input } = untracked(() => {
160
+ const device = mqtt.messagesByTopics(getSwitchingDeviceStateTopics(mqtt.portalId, info.tree, info.deviceId));
161
+ const inp = mqtt.messagesByTopics(getGenericInputStateTopics(mqtt.portalId, info.tree, info.deviceId, info.inputId));
162
+ return {
163
+ deviceName: device.customName || device.productName || gxDeviceRelaysGroupName,
164
+ input: inp,
165
+ };
216
166
  });
217
- });
218
- availableGenericInputs.forEach((input, index) => {
219
- const gi = extractGenericInputInfo(input);
220
- const switchingDevice = mqtt.messagesByTopics(getSwitchingDeviceStateTopics(mqtt.portalId, gi.tree, gi.deviceId));
221
- const customGroupAssignment = genericInputGroupAssignments[index].trim();
222
- const deviceName = switchingDevice.customName || switchingDevice.productName || gxDeviceRelaysGroupName;
223
- const groupName = customGroupAssignment === "" ? deviceName : customGroupAssignment;
224
- const genericInput = mqtt.messagesByTopics(getGenericInputStateTopics(mqtt.portalId, gi.tree, gi.deviceId, gi.inputId));
225
- if (!(genericInput.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE ||
226
- genericInput.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE_LOCAL_UI)) {
227
- return;
167
+ if (!(input.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE ||
168
+ input.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE_LOCAL_UI)) {
169
+ continue;
228
170
  }
171
+ const customGroup = ((_b = messagesForInputs[topic]) !== null && _b !== void 0 ? _b : "").trim();
229
172
  items.push({
230
- groupName,
231
- item: Object.assign(Object.assign({}, genericInput), { kind: "genericInput", tree: gi.tree, deviceId: gi.deviceId, outputId: gi.inputId, parentDeviceName: deviceName, type: remapGenericInputType(genericInput.type) }),
173
+ groupName: customGroup === "" ? deviceName : customGroup,
174
+ item: Object.assign(Object.assign({}, input), { kind: "genericInput", tree: info.tree, deviceId: info.deviceId, outputId: info.inputId, parentDeviceName: deviceName, type: remapGenericInputType(input.type) }),
232
175
  });
233
- });
234
- // Distribute items to groups
235
- const newGroups = {};
236
- items.forEach(({ groupName, item }) => {
237
- newGroups[groupName] || (newGroups[groupName] = []);
238
- newGroups[groupName].push(item);
239
- });
240
- // Sort items in each group by display name
241
- Object.values(newGroups).forEach((array) => {
242
- array.sort((a, b) => {
176
+ }
177
+ const groups = {};
178
+ for (const { groupName, item } of items) {
179
+ ;
180
+ (groups[groupName] || (groups[groupName] = [])).push(item);
181
+ }
182
+ for (const arr of Object.values(groups)) {
183
+ arr.sort((a, b) => {
243
184
  const aName = getSwitchingPaneItemNameForDisplay(a, a.parentDeviceName);
244
185
  const bName = getSwitchingPaneItemNameForDisplay(b, b.parentDeviceName);
245
186
  return aName.localeCompare(bName);
246
187
  });
247
- });
248
- Logger.log(`New switching pane groups: ${JSON.stringify(Object.keys(newGroups))}`);
249
- switchingPaneStore.setGroups(newGroups);
188
+ }
189
+ Logger.log(`New switching pane groups: ${JSON.stringify(Object.keys(groups))}`);
190
+ store.setGroups(groups);
250
191
  }
251
192
  });
252
- return () => dispose();
253
193
  }, [
254
- messagesForSwitchableOutputs,
255
- messagesForGenericInputs,
194
+ messagesForSystemOutputs,
195
+ messagesForSwitchOutputs,
196
+ messagesForInputs,
256
197
  messagesForSwitchingDevices,
257
198
  gxDeviceRelaysGroupName,
258
199
  mqtt,
259
- switchingPaneStore,
200
+ store,
260
201
  ]);
261
- return switchingPaneStore;
202
+ return store;
262
203
  };
263
204
  export function extractSwitchableOutputInfo(topic) {
264
205
  var _a;
265
206
  const pattern = new RegExp(`/(${SWITCHABLE_OUTPUT_TREES.join("|")})/`);
266
207
  const match = topic.match(pattern);
267
- const switchStart = match ? match.index + match[0].length : -1; // length of `/system/`, or `/switch/`, or ...
268
- const outputStart = topic.indexOf("/SwitchableOutput/") + 18; // length of `/SwitchableOutput/`
208
+ const switchStart = match ? match.index + match[0].length : -1;
209
+ const outputStart = topic.indexOf("/SwitchableOutput/") + 18;
269
210
  return {
270
- tree: (_a = match === null || match === void 0 ? void 0 : match[1]) !== null && _a !== void 0 ? _a : null, // "switch", "system", ...
211
+ tree: (_a = match === null || match === void 0 ? void 0 : match[1]) !== null && _a !== void 0 ? _a : null,
271
212
  deviceId: Number(topic.substring(switchStart, topic.indexOf("/", switchStart))),
272
213
  outputId: topic.substring(outputStart, topic.indexOf("/", outputStart)),
273
214
  };
@@ -277,7 +218,7 @@ export function extractGenericInputInfo(topic) {
277
218
  const pattern = new RegExp(`/(${SWITCHABLE_OUTPUT_TREES.join("|")})/`);
278
219
  const match = topic.match(pattern);
279
220
  const treeEnd = match ? match.index + match[0].length : -1;
280
- const inputStart = topic.indexOf("/GenericInput/") + 14; // length of `/GenericInput/`
221
+ const inputStart = topic.indexOf("/GenericInput/") + 14;
281
222
  return {
282
223
  tree: (_a = match === null || match === void 0 ? void 0 : match[1]) !== null && _a !== void 0 ? _a : null,
283
224
  deviceId: Number(topic.substring(treeEnd, topic.indexOf("/", treeEnd))),
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchingPane.provider.js","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAY,OAAO,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EAAE,6BAA6B,EAA6B,MAAM,4BAA4B,CAAA;AACrG,OAAO,EACL,kCAAkC,EAClC,8BAA8B,EAC9B,uBAAuB,GAMxB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,0BAA0B,EAAkB,MAAM,yBAAyB,CAAA;AACpF,OAAO,EAEL,qBAAqB,EAGrB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,uBAAuB,CAAA;AAE9B,MAAM,WAAW,GAAG,CAAC,QAA4C,EAAE,EAAE,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;AAElH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,uBAA+B,EAAE,EAAE;IAClE,MAAM,kBAAkB,GAAG,qBAAqB,EAAE,CAAA;IAElD,MAAM,SAAS,GAAG,CAAC,QAAkB,EAAE,EAAE,CAAC,CAAC;QACzC,iBAAiB,EAAE,KAAK,QAAQ,KAAK,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,mCAAmC;QACzG,aAAa,EAAE,KAAK,QAAQ,KAAK,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,+BAA+B;QACjG,gBAAgB,EAAE,KAAK,QAAQ,WAAW;KAC3C,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;IACtB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEvE,MAAM,4BAA4B,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;IACtF,MAAM,wBAAwB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IAC9E,MAAM,2BAA2B,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;IAEpF,qGAAqG;IACrG,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,WAAW,CAAC,4BAA4B,CAAC,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,EAAE,CAAC;YACzF,MAAM,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAA;YACjE,OAAM;QACR,CAAC;QAED,kDAAkD;QAClD,MAAM,0BAA0B,GAAG,4BAA4B;YAC7D,CAAC,CAAE,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC;iBACvC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;iBAChD,IAAI,EAAe;YACxB,CAAC,CAAC,EAAE,CAAA;QAEN,oEAAoE;QACpE,MAAM,qBAAqB,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACrE,OAAO,4BAA4B,CAAC,KAAK,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;QACF,wDAAwD;QACxD,MAAM,8BAA8B,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9E,OAAO,MAAM,CAAC,4BAA4B,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAyB,CAAA;QACjH,CAAC,CAAC,CAAA;QACF,wDAAwD;QACxD,MAAM,8BAA8B,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9E,OAAO,4BAA4B,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QACvF,CAAC,CAAC,CAAA;QACF,6DAA6D;QAC7D,MAAM,wCAAwC,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACxF,OAAO,MAAM,CACX,4BAA4B,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,CACpD,CAAA;QACjC,CAAC,CAAC,CAAA;QACF,4DAA4D;QAC5D,MAAM,kCAAkC,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAClF,OAAO,MAAM,CAAC,4BAA4B,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;QAC7F,CAAC,CAAC,CAAA;QAEF,8CAA8C;QAC9C,MAAM,sBAAsB,GAAG,wBAAwB;YACrD,CAAC,CAAE,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC;iBACnC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;iBAChD,IAAI,EAAe;YACxB,CAAC,CAAC,EAAE,CAAA;QAEN,+DAA+D;QAC/D,MAAM,4BAA4B,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACxE,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;QACF,mDAAmD;QACnD,MAAM,0BAA0B,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACtE,OAAO,MAAM,CAAC,wBAAwB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAqB,CAAA;QACzG,CAAC,CAAC,CAAA;QACF,mDAAmD;QACnD,MAAM,0BAA0B,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACtE,OAAO,wBAAwB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QACnF,CAAC,CAAC,CAAA;QACF,wDAAwD;QACxD,MAAM,oCAAoC,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAChF,OAAO,MAAM,CACX,wBAAwB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAC9C,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,2DAA2D;QAC3D,MAAM,yBAAyB,GAAG,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC;aACvE,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;aAChD,IAAI,EAAc,CAAA;QAErB,gEAAgE;QAChE,MAAM,6BAA6B,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC5E,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;YAC7D,OAAO,CACL,2BAA2B,CAAC,GAAG,WAAW,aAAa,CAAC;gBACxD,2BAA2B,CAAC,GAAG,WAAW,cAAc,CAAC,CAC1D,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;YAC3B,MAAM,cAAc,GAAG,kBAAkB,CAAC,sBAAsB,CAAA;YAChE,MAAM,cAAc,GAAG,qBAAqB,CAAA;YAC5C,MAAM,uBAAuB,GAAG,CAAC,WAAW,CAAC,cAAc,EAAE,cAAc,CAAC,CAAA;YAC5E,IAAI,uBAAuB,EAAE,CAAC;gBAC5B,kBAAkB,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAA;YAC9D,CAAC;YAED,MAAM,cAAc,GAAG,kBAAkB,CAAC,WAAW,CAAA;YACrD,MAAM,cAAc,GAAG,8BAA8B,CAAA;YACrD,MAAM,kBAAkB,GAAG,CAAC,WAAW,CAAC,cAAc,EAAE,cAAc,CAAC,CAAA;YACvE,IAAI,kBAAkB,EAAE,CAAC;gBACvB,kBAAkB,CAAC,cAAc,CAAC,cAAc,CAAC,CAAA;YACnD,CAAC;YAED,MAAM,cAAc,GAAG,kBAAkB,CAAC,WAAW,CAAA;YACrD,MAAM,cAAc,GAAG,8BAA8B,CAAA;YACrD,MAAM,kBAAkB,GAAG,CAAC,WAAW,CAAC,cAAc,EAAE,cAAc,CAAC,CAAA;YACvE,IAAI,kBAAkB,EAAE,CAAC;gBACvB,kBAAkB,CAAC,cAAc,CAAC,cAAc,CAAC,CAAA;YACnD,CAAC;YAED,MAAM,wBAAwB,GAAG,kBAAkB,CAAC,qBAAqB,CAAA;YACzE,MAAM,wBAAwB,GAAG,wCAAwC,CAAA;YACzE,MAAM,4BAA4B,GAAG,CAAC,WAAW,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAA;YACrG,IAAI,4BAA4B,EAAE,CAAC;gBACjC,kBAAkB,CAAC,wBAAwB,CAAC,wBAAwB,CAAC,CAAA;YACvE,CAAC;YAED,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,eAAe,CAAA;YAC7D,MAAM,kBAAkB,GAAG,kCAAkC,CAAA;YAC7D,MAAM,sBAAsB,GAAG,CAAC,WAAW,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;YACnF,IAAI,sBAAsB,EAAE,CAAC;gBAC3B,kBAAkB,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAA;YAC3D,CAAC;YAED,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,gBAAgB,CAAA;YAC/D,MAAM,mBAAmB,GAAG,yBAAyB,CAAA;YACrD,MAAM,uBAAuB,GAAG,CAAC,WAAW,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAA;YACtF,IAAI,uBAAuB,EAAE,CAAC;gBAC5B,kBAAkB,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAA;YAC7D,CAAC;YAED,MAAM,uBAAuB,GAAG,kBAAkB,CAAC,oBAAoB,CAAA;YACvE,MAAM,uBAAuB,GAAG,6BAA6B,CAAA;YAC7D,MAAM,2BAA2B,GAAG,CAAC,WAAW,CAAC,uBAAuB,EAAE,uBAAuB,CAAC,CAAA;YAClG,IAAI,2BAA2B,EAAE,CAAC;gBAChC,kBAAkB,CAAC,uBAAuB,CAAC,uBAAuB,CAAC,CAAA;YACrE,CAAC;YAED,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,4BAA4B,CAAA;YACxE,MAAM,gBAAgB,GAAG,4BAA4B,CAAA;YACrD,MAAM,yBAAyB,GAAG,CAAC,WAAW,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAA;YAClF,IAAI,yBAAyB,EAAE,CAAC;gBAC9B,kBAAkB,CAAC,+BAA+B,CAAC,gBAAgB,CAAC,CAAA;YACtE,CAAC;YAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,iBAAiB,CAAA;YACvD,MAAM,UAAU,GAAG,0BAA0B,CAAA;YAC7C,MAAM,cAAc,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;YAC3D,IAAI,cAAc,EAAE,CAAC;gBACnB,kBAAkB,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAA;YACrD,CAAC;YAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,iBAAiB,CAAA;YACvD,MAAM,UAAU,GAAG,0BAA0B,CAAA;YAC7C,MAAM,cAAc,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;YAC3D,IAAI,cAAc,EAAE,CAAC;gBACnB,kBAAkB,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAA;YACrD,CAAC;YAED,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,2BAA2B,CAAA;YAC3E,MAAM,oBAAoB,GAAG,oCAAoC,CAAA;YACjE,MAAM,wBAAwB,GAAG,CAAC,WAAW,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAA;YACzF,IAAI,wBAAwB,EAAE,CAAC;gBAC7B,kBAAkB,CAAC,8BAA8B,CAAC,oBAAoB,CAAC,CAAA;YACzE,CAAC;YAED,uEAAuE;YACvE,MAAM,aAAa,GACjB,cAAc,CAAC,MAAM,KAAK,CAAC;gBAC3B,cAAc,CAAC,MAAM,KAAK,CAAC;gBAC3B,mBAAmB,CAAC,MAAM,KAAK,CAAC;gBAChC,gBAAgB,CAAC,MAAM,KAAK,CAAC,CAAA;YAE/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,IAAI,uBAAuB;oBAAE,MAAM,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAA;gBACvG,IAAI,kBAAkB;oBAAE,MAAM,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAA;gBACtF,IAAI,kBAAkB;oBAAE,MAAM,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAA;gBACtF,IAAI,4BAA4B;oBAAE,MAAM,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAA;gBAC3G,IAAI,sBAAsB;oBAAE,MAAM,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAA;gBAC9F,IAAI,uBAAuB;oBAAE,MAAM,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAA;gBACpF,IAAI,2BAA2B;oBAAE,MAAM,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAA;gBAC7F,IAAI,yBAAyB;oBAAE,MAAM,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAA;gBACpG,IAAI,cAAc;oBAAE,MAAM,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAA;gBAC7E,IAAI,cAAc;oBAAE,MAAM,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAA;gBAC7E,IAAI,wBAAwB;oBAAE,MAAM,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAA;YACpG,CAAC;YAED,IACE,uBAAuB;gBACvB,kBAAkB;gBAClB,kBAAkB;gBAClB,4BAA4B;gBAC5B,sBAAsB;gBACtB,uBAAuB;gBACvB,2BAA2B;gBAC3B,yBAAyB;gBACzB,cAAc;gBACd,cAAc;gBACd,wBAAwB,EACxB,CAAC;gBACD,+FAA+F;gBAC/F,MAAM,KAAK,GAAqD,EAAE,CAAA;gBAElE,0BAA0B,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBACnD,MAAM,GAAG,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAA;oBAC/C,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAC3C,6BAA6B,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAChC,CAAA;oBACtC,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;oBACjE,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,IAAI,eAAe,CAAC,WAAW,IAAI,uBAAuB,CAAA;oBACvG,MAAM,SAAS,GAAG,qBAAqB,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAA;oBACnF,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAC5C,8BAA8B,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAChD,CAAA;oBAErC,IACE,CAAC,CACC,gBAAgB,CAAC,aAAa,GAAG,4BAA4B,CAAC,OAAO;wBACrE,gBAAgB,CAAC,aAAa,GAAG,4BAA4B,CAAC,gBAAgB,CAC/E,EACD,CAAC;wBACD,OAAM;oBACR,CAAC;oBAED,wEAAwE;oBACxE,IACE,GAAG,CAAC,IAAI,KAAK,QAAQ;wBACrB,gBAAgB,CAAC,QAAQ,IAAI,IAAI;wBACjC,gBAAgB,CAAC,QAAQ,KAAK,0BAA0B,CAAC,MAAM,EAC/D,CAAC;wBACD,OAAM;oBACR,CAAC;oBAED,KAAK,CAAC,IAAI,CAAC;wBACT,SAAS;wBACT,IAAI,kCACC,gBAAgB,KACnB,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,GAAG,CAAC,IAAI,EACd,QAAQ,EAAE,GAAG,CAAC,QAAQ,EACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ,EACtB,gBAAgB,EAAE,UAAoB,GACvC;qBACF,CAAC,CAAA;gBACJ,CAAC,CAAC,CAAA;gBAEF,sBAAsB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;oBAC9C,MAAM,EAAE,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAA;oBACzC,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAC3C,6BAA6B,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,CAC9B,CAAA;oBACtC,MAAM,qBAAqB,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;oBACxE,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,IAAI,eAAe,CAAC,WAAW,IAAI,uBAAuB,CAAA;oBACvG,MAAM,SAAS,GAAG,qBAAqB,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAA;oBACnF,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CACxC,0BAA0B,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,CAC5C,CAAA;oBAEjC,IACE,CAAC,CACC,YAAY,CAAC,aAAa,GAAG,4BAA4B,CAAC,OAAO;wBACjE,YAAY,CAAC,aAAa,GAAG,4BAA4B,CAAC,gBAAgB,CAC3E,EACD,CAAC;wBACD,OAAM;oBACR,CAAC;oBAED,KAAK,CAAC,IAAI,CAAC;wBACT,SAAS;wBACT,IAAI,kCACC,YAAY,KACf,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACrB,QAAQ,EAAE,EAAE,CAAC,OAAO,EACpB,gBAAgB,EAAE,UAAoB,EACtC,IAAI,EAAE,qBAAqB,CAAC,YAAY,CAAC,IAAc,CAAC,GACzD;qBACF,CAAC,CAAA;gBACJ,CAAC,CAAC,CAAA;gBAEF,6BAA6B;gBAC7B,MAAM,SAAS,GAA2C,EAAE,CAAA;gBAC5D,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;oBACpC,SAAS,CAAC,SAAS,MAAnB,SAAS,CAAC,SAAS,IAAM,EAAE,EAAA;oBAC3B,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACjC,CAAC,CAAC,CAAA;gBAEF,2CAA2C;gBAC3C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;oBACzC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;wBAClB,MAAM,KAAK,GAAG,kCAAkC,CAAC,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAA;wBACvE,MAAM,KAAK,GAAG,kCAAkC,CAAC,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAA;wBACvE,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;oBACnC,CAAC,CAAC,CAAA;gBACJ,CAAC,CAAC,CAAA;gBAEF,MAAM,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAA;gBAClF,kBAAkB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;YACzC,CAAC;QACH,CAAC,CAAC,CAAA;QACF,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAA;IACxB,CAAC,EAAE;QACD,4BAA4B;QAC5B,wBAAwB;QACxB,2BAA2B;QAC3B,uBAAuB;QACvB,IAAI;QACJ,kBAAkB;KACnB,CAAC,CAAA;IAEF,OAAO,kBAAkB,CAAA;AAC3B,CAAC,CAAA;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAa;;IACvD,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,KAAK,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACtE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,8CAA8C;IAC9G,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAA,CAAC,iCAAiC;IAE9F,OAAO;QACL,IAAI,EAAE,MAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAG,CAAC,CAA0B,mCAAI,IAAI,EAAE,0BAA0B;QAC9E,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAA8B;QAC5G,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAuB;KAC9F,CAAA;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa;;IACnD,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,KAAK,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACtE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3D,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAA,CAAC,6BAA6B;IAErF,OAAO;QACL,IAAI,EAAE,MAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAG,CAAC,CAA0B,mCAAI,IAAI;QAClD,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAA8B;QACpG,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAmB;KACvF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAI,CAAM,EAAE,CAAM;IAC3C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACvC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAClE,CAAC","sourcesContent":["import { autorun } from \"mobx\"\nimport Logger from \"../../utils/logger\"\nimport { PortalId, useMqtt } from \"../Mqtt\"\nimport { useMemo, useEffect } from \"react\"\nimport { useSwitchingPaneStore } from \"./SwitchingPane.store\"\nimport { getSwitchingDeviceStateTopics, SwitchingDeviceInstanceId } from \"./SwitchingDevice.provider\"\nimport {\n getSwitchingPaneItemNameForDisplay,\n getSwitchableOutputStateTopics,\n SWITCHABLE_OUTPUT_TREES,\n SwitchableOutputId,\n SwitchableOutputState,\n SwitchableOutputTree,\n GenericInputState,\n SwitchingPaneItem,\n} from \"./SwitchableOutput.provider\"\nimport { getGenericInputStateTopics, GenericInputId } from \"./GenericInput.provider\"\nimport {\n GenericInputType,\n remapGenericInputType,\n SwitchableOutputType,\n SwitchableOutputVisibility,\n SWITCHABLE_OUTPUT_FUNCTION,\n SWITCHABLE_OUTPUT_VISIBILITY,\n} from \"../../utils/constants\"\n\nconst hasMessages = (messages: Record<string, string> | undefined) => messages && Object.keys(messages).length > 0\n\nexport const useSwitchingPane = (gxDeviceRelaysGroupName: string) => {\n const switchingPaneStore = useSwitchingPaneStore()\n\n const getTopics = (portalId: PortalId) => ({\n switchableOutputs: `N/${portalId}/(${SWITCHABLE_OUTPUT_TREES.join(\"|\")})/+/SwitchableOutput/+/Settings/+`,\n genericInputs: `N/${portalId}/(${SWITCHABLE_OUTPUT_TREES.join(\"|\")})/+/GenericInput/+/Settings/+`,\n switchingDevices: `N/${portalId}/switch/+`,\n })\n\n const mqtt = useMqtt()\n const topics = useMemo(() => getTopics(mqtt.portalId), [mqtt.portalId])\n\n const messagesForSwitchableOutputs = mqtt.messagesByWildcard(topics.switchableOutputs)\n const messagesForGenericInputs = mqtt.messagesByWildcard(topics.genericInputs)\n const messagesForSwitchingDevices = mqtt.messagesByWildcard(topics.switchingDevices)\n\n // Examine MQTT to find all available switchable outputs, generic inputs, and their group assignments\n useEffect(() => {\n if (!hasMessages(messagesForSwitchableOutputs) && !hasMessages(messagesForGenericInputs)) {\n Logger.log(\"Waiting for switchable outputs or generic inputs...\")\n return\n }\n\n // All switchable outputs in array sorted by topic\n const availableSwitchableOutputs = messagesForSwitchableOutputs\n ? (Object.keys(messagesForSwitchableOutputs)\n .filter((key) => key.endsWith(\"/Settings/Group\"))\n .sort() as string[])\n : []\n\n // All switchable outputs group assignments in array sorted by topic\n const customGroupAssigments = availableSwitchableOutputs.map((topic) => {\n return messagesForSwitchableOutputs[topic]\n })\n // All switchable outputs types in array sorted by topic\n const availableSwitchableOutputTypes = availableSwitchableOutputs.map((topic) => {\n return Number(messagesForSwitchableOutputs[`${topic.slice(0, -\"/Group\".length)}/Type`]) as SwitchableOutputType\n })\n // All switchable outputs names in array sorted by topic\n const availableSwitchableOutputNames = availableSwitchableOutputs.map((topic) => {\n return messagesForSwitchableOutputs[`${topic.slice(0, -\"/Group\".length)}/CustomName`]\n })\n // All switchable outputs visibility in array sorted by topic\n const availableSwitchableOutputVisibilityFlags = availableSwitchableOutputs.map((topic) => {\n return Number(\n messagesForSwitchableOutputs[`${topic.slice(0, -\"/Group\".length)}/ShowUIControl`]\n ) as SwitchableOutputVisibility\n })\n // All switchable outputs functions in array sorted by topic\n const availableSwitchableOutputFunctions = availableSwitchableOutputs.map((topic) => {\n return Number(messagesForSwitchableOutputs[`${topic.slice(0, -\"/Group\".length)}/Function`])\n })\n\n // All generic inputs in array sorted by topic\n const availableGenericInputs = messagesForGenericInputs\n ? (Object.keys(messagesForGenericInputs)\n .filter((key) => key.endsWith(\"/Settings/Group\"))\n .sort() as string[])\n : []\n\n // All generic input group assignments in array sorted by topic\n const genericInputGroupAssignments = availableGenericInputs.map((topic) => {\n return messagesForGenericInputs[topic]\n })\n // All generic input types in array sorted by topic\n const availableGenericInputTypes = availableGenericInputs.map((topic) => {\n return Number(messagesForGenericInputs[`${topic.slice(0, -\"/Group\".length)}/Type`]) as GenericInputType\n })\n // All generic input names in array sorted by topic\n const availableGenericInputNames = availableGenericInputs.map((topic) => {\n return messagesForGenericInputs[`${topic.slice(0, -\"/Group\".length)}/CustomName`]\n })\n // All generic input visibility in array sorted by topic\n const availableGenericInputVisibilityFlags = availableGenericInputs.map((topic) => {\n return Number(\n messagesForGenericInputs[`${topic.slice(0, -\"/Group\".length)}/ShowUIInput`]\n ) as SwitchableOutputVisibility\n })\n\n // All switching devices in array sorted by instance number\n const availableSwitchingDevices = Object.keys(messagesForSwitchingDevices)\n .filter((key) => key.endsWith(\"/DeviceInstance\"))\n .sort() as string[]\n\n // All switching device names in array sorted by instance number\n const availableSwitchingDeviceNames = availableSwitchingDevices.map((topic) => {\n const topicPrefix = topic.slice(0, -\"/DeviceInstance\".length)\n return (\n messagesForSwitchingDevices[`${topicPrefix}/CustomName`] ||\n messagesForSwitchingDevices[`${topicPrefix}/ProductName`]\n )\n })\n\n const dispose = autorun(() => {\n const oldAssignments = switchingPaneStore.customGroupAssignments\n const newAssignments = customGroupAssigments\n const groupAssignmentsChanged = !arraysEqual(oldAssignments, newAssignments)\n if (groupAssignmentsChanged) {\n switchingPaneStore.setCustomGroupAssignments(newAssignments)\n }\n\n const oldOutputTypes = switchingPaneStore.outputTypes\n const newOutputTypes = availableSwitchableOutputTypes\n const outputTypesChanged = !arraysEqual(oldOutputTypes, newOutputTypes)\n if (outputTypesChanged) {\n switchingPaneStore.setOutputTypes(newOutputTypes)\n }\n\n const oldOutputNames = switchingPaneStore.outputNames\n const newOutputNames = availableSwitchableOutputNames\n const outputNamesChanged = !arraysEqual(oldOutputNames, newOutputNames)\n if (outputNamesChanged) {\n switchingPaneStore.setOutputNames(newOutputNames)\n }\n\n const oldOutputVisibilityFlags = switchingPaneStore.outputVisibilityFlags\n const newOutputVisibilityFlags = availableSwitchableOutputVisibilityFlags\n const outputVisibilityFlagsChanged = !arraysEqual(oldOutputVisibilityFlags, newOutputVisibilityFlags)\n if (outputVisibilityFlagsChanged) {\n switchingPaneStore.setOutputVisibilityFlags(newOutputVisibilityFlags)\n }\n\n const oldOutputFunctions = switchingPaneStore.outputFunctions\n const newOutputFunctions = availableSwitchableOutputFunctions\n const outputFunctionsChanged = !arraysEqual(oldOutputFunctions, newOutputFunctions)\n if (outputFunctionsChanged) {\n switchingPaneStore.setOutputFunctions(newOutputFunctions)\n }\n\n const oldSwitchingDevices = switchingPaneStore.switchingDevices\n const newSwitchingDevices = availableSwitchingDevices\n const switchingDevicesChanged = !arraysEqual(oldSwitchingDevices, newSwitchingDevices)\n if (switchingDevicesChanged) {\n switchingPaneStore.setSwitchingDevices(newSwitchingDevices)\n }\n\n const oldSwitchingDeviceNames = switchingPaneStore.switchingDeviceNames\n const newSwitchingDeviceNames = availableSwitchingDeviceNames\n const switchingDeviceNamesChanged = !arraysEqual(oldSwitchingDeviceNames, newSwitchingDeviceNames)\n if (switchingDeviceNamesChanged) {\n switchingPaneStore.setSwitchingDeviceNames(newSwitchingDeviceNames)\n }\n\n const oldGiAssignments = switchingPaneStore.genericInputGroupAssignments\n const newGiAssignments = genericInputGroupAssignments\n const giGroupAssignmentsChanged = !arraysEqual(oldGiAssignments, newGiAssignments)\n if (giGroupAssignmentsChanged) {\n switchingPaneStore.setGenericInputGroupAssignments(newGiAssignments)\n }\n\n const oldGiTypes = switchingPaneStore.genericInputTypes\n const newGiTypes = availableGenericInputTypes\n const giTypesChanged = !arraysEqual(oldGiTypes, newGiTypes)\n if (giTypesChanged) {\n switchingPaneStore.setGenericInputTypes(newGiTypes)\n }\n\n const oldGiNames = switchingPaneStore.genericInputNames\n const newGiNames = availableGenericInputNames\n const giNamesChanged = !arraysEqual(oldGiNames, newGiNames)\n if (giNamesChanged) {\n switchingPaneStore.setGenericInputNames(newGiNames)\n }\n\n const oldGiVisibilityFlags = switchingPaneStore.genericInputVisibilityFlags\n const newGiVisibilityFlags = availableGenericInputVisibilityFlags\n const giVisibilityFlagsChanged = !arraysEqual(oldGiVisibilityFlags, newGiVisibilityFlags)\n if (giVisibilityFlagsChanged) {\n switchingPaneStore.setGenericInputVisibilityFlags(newGiVisibilityFlags)\n }\n\n // On initial population (all old arrays empty), skip per-field logging\n const isInitialLoad =\n oldAssignments.length === 0 &&\n oldOutputTypes.length === 0 &&\n oldSwitchingDevices.length === 0 &&\n oldGiAssignments.length === 0\n\n if (!isInitialLoad) {\n if (groupAssignmentsChanged) Logger.log(`Switchable outputs group assignments changed, recomputing...`)\n if (outputTypesChanged) Logger.log(`Switchable outputs types changed, recomputing...`)\n if (outputNamesChanged) Logger.log(`Switchable outputs names changed, recomputing...`)\n if (outputVisibilityFlagsChanged) Logger.log(`Switchable outputs visibility flags changed, recomputing...`)\n if (outputFunctionsChanged) Logger.log(`Switchable outputs functions changed, recomputing...`)\n if (switchingDevicesChanged) Logger.log(`Switching devices changed, recomputing...`)\n if (switchingDeviceNamesChanged) Logger.log(`Switching device names changed, recomputing...`)\n if (giGroupAssignmentsChanged) Logger.log(`Generic input group assignments changed, recomputing...`)\n if (giTypesChanged) Logger.log(`Generic input types changed, recomputing...`)\n if (giNamesChanged) Logger.log(`Generic input names changed, recomputing...`)\n if (giVisibilityFlagsChanged) Logger.log(`Generic input visibility flags changed, recomputing...`)\n }\n\n if (\n groupAssignmentsChanged ||\n outputTypesChanged ||\n outputNamesChanged ||\n outputVisibilityFlagsChanged ||\n outputFunctionsChanged ||\n switchingDevicesChanged ||\n switchingDeviceNamesChanged ||\n giGroupAssignmentsChanged ||\n giTypesChanged ||\n giNamesChanged ||\n giVisibilityFlagsChanged\n ) {\n // Collect all switching pane items (switchable outputs + generic inputs) with their group info\n const items: { groupName: string; item: SwitchingPaneItem }[] = []\n\n availableSwitchableOutputs.forEach((output, index) => {\n const swo = extractSwitchableOutputInfo(output)\n const switchingDevice = mqtt.messagesByTopics(\n getSwitchingDeviceStateTopics(mqtt.portalId, swo.tree, swo.deviceId)\n ) as unknown as Record<string, string>\n const customGroupAssignment = customGroupAssigments[index].trim()\n const deviceName = switchingDevice.customName || switchingDevice.productName || gxDeviceRelaysGroupName\n const groupName = customGroupAssignment === \"\" ? deviceName : customGroupAssignment\n const switchableOutput = mqtt.messagesByTopics(\n getSwitchableOutputStateTopics(mqtt.portalId, swo.tree, swo.deviceId, swo.outputId)\n ) as unknown as SwitchableOutputState\n\n if (\n !(\n switchableOutput.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE ||\n switchableOutput.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE_LOCAL_UI\n )\n ) {\n return\n }\n\n // GX system relays: only show when Function is Manual (matching gui-v2)\n if (\n swo.tree === \"system\" &&\n switchableOutput.function != null &&\n switchableOutput.function !== SWITCHABLE_OUTPUT_FUNCTION.MANUAL\n ) {\n return\n }\n\n items.push({\n groupName,\n item: {\n ...switchableOutput,\n kind: \"switchableOutput\",\n tree: swo.tree,\n deviceId: swo.deviceId,\n outputId: swo.outputId,\n parentDeviceName: deviceName as string,\n },\n })\n })\n\n availableGenericInputs.forEach((input, index) => {\n const gi = extractGenericInputInfo(input)\n const switchingDevice = mqtt.messagesByTopics(\n getSwitchingDeviceStateTopics(mqtt.portalId, gi.tree, gi.deviceId)\n ) as unknown as Record<string, string>\n const customGroupAssignment = genericInputGroupAssignments[index].trim()\n const deviceName = switchingDevice.customName || switchingDevice.productName || gxDeviceRelaysGroupName\n const groupName = customGroupAssignment === \"\" ? deviceName : customGroupAssignment\n const genericInput = mqtt.messagesByTopics(\n getGenericInputStateTopics(mqtt.portalId, gi.tree, gi.deviceId, gi.inputId)\n ) as unknown as GenericInputState\n\n if (\n !(\n genericInput.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE ||\n genericInput.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE_LOCAL_UI\n )\n ) {\n return\n }\n\n items.push({\n groupName,\n item: {\n ...genericInput,\n kind: \"genericInput\",\n tree: gi.tree,\n deviceId: gi.deviceId,\n outputId: gi.inputId,\n parentDeviceName: deviceName as string,\n type: remapGenericInputType(genericInput.type as number),\n },\n })\n })\n\n // Distribute items to groups\n const newGroups: { [key: string]: SwitchingPaneItem[] } = {}\n items.forEach(({ groupName, item }) => {\n newGroups[groupName] ||= []\n newGroups[groupName].push(item)\n })\n\n // Sort items in each group by display name\n Object.values(newGroups).forEach((array) => {\n array.sort((a, b) => {\n const aName = getSwitchingPaneItemNameForDisplay(a, a.parentDeviceName)\n const bName = getSwitchingPaneItemNameForDisplay(b, b.parentDeviceName)\n return aName.localeCompare(bName)\n })\n })\n\n Logger.log(`New switching pane groups: ${JSON.stringify(Object.keys(newGroups))}`)\n switchingPaneStore.setGroups(newGroups)\n }\n })\n return () => dispose()\n }, [\n messagesForSwitchableOutputs,\n messagesForGenericInputs,\n messagesForSwitchingDevices,\n gxDeviceRelaysGroupName,\n mqtt,\n switchingPaneStore,\n ])\n\n return switchingPaneStore\n}\n\nexport function extractSwitchableOutputInfo(topic: string) {\n const pattern = new RegExp(`/(${SWITCHABLE_OUTPUT_TREES.join(\"|\")})/`)\n const match = topic.match(pattern)\n const switchStart = match ? match.index! + match[0].length : -1 // length of `/system/`, or `/switch/`, or ...\n const outputStart = topic.indexOf(\"/SwitchableOutput/\") + 18 // length of `/SwitchableOutput/`\n\n return {\n tree: (match?.[1] as SwitchableOutputTree) ?? null, // \"switch\", \"system\", ...\n deviceId: Number(topic.substring(switchStart, topic.indexOf(\"/\", switchStart))) as SwitchingDeviceInstanceId,\n outputId: topic.substring(outputStart, topic.indexOf(\"/\", outputStart)) as SwitchableOutputId,\n }\n}\n\nexport function extractGenericInputInfo(topic: string) {\n const pattern = new RegExp(`/(${SWITCHABLE_OUTPUT_TREES.join(\"|\")})/`)\n const match = topic.match(pattern)\n const treeEnd = match ? match.index! + match[0].length : -1\n const inputStart = topic.indexOf(\"/GenericInput/\") + 14 // length of `/GenericInput/`\n\n return {\n tree: (match?.[1] as SwitchableOutputTree) ?? null,\n deviceId: Number(topic.substring(treeEnd, topic.indexOf(\"/\", treeEnd))) as SwitchingDeviceInstanceId,\n inputId: topic.substring(inputStart, topic.indexOf(\"/\", inputStart)) as GenericInputId,\n }\n}\n\nexport function arraysEqual<T>(a: T[], b: T[]): boolean {\n if (a.length !== b.length) return false\n return a.every((element, index) => Object.is(element, b[index]))\n}\n"]}
1
+ {"version":3,"file":"SwitchingPane.provider.js","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAC7C,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EAAE,6BAA6B,EAA6B,MAAM,4BAA4B,CAAA;AACrG,OAAO,EACL,kCAAkC,EAClC,8BAA8B,EAC9B,uBAAuB,GAMxB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,0BAA0B,EAAkB,MAAM,yBAAyB,CAAA;AACpF,OAAO,EAEL,qBAAqB,EAGrB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,uBAAuB,CAAA;AAE9B,MAAM,WAAW,GAAG,CAAC,QAA4C,EAAE,EAAE,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;AAElH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,uBAA+B,EAAE,EAAE;IAClE,MAAM,KAAK,GAAG,qBAAqB,EAAE,CAAA;IACrC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;IAEtB,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CAAC,CAAC;QACL,aAAa,EAAE,KAAK,IAAI,CAAC,QAAQ,yCAAyC;QAC1E,aAAa,EAAE,KAAK,IAAI,CAAC,QAAQ,yCAAyC;QAC1E,aAAa,EAAE,KAAK,IAAI,CAAC,QAAQ,qCAAqC;QACtE,gBAAgB,EAAE,KAAK,IAAI,CAAC,QAAQ,WAAW;KAChD,CAAC,EACF,CAAC,IAAI,CAAC,QAAQ,CAAC,CAChB,CAAA;IAED,MAAM,wBAAwB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IAC9E,MAAM,wBAAwB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IAC9E,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IACvE,MAAM,2BAA2B,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;IAEpF,SAAS,CAAC,GAAG,EAAE;QACb,IACE,CAAC,WAAW,CAAC,wBAAwB,CAAC;YACtC,CAAC,WAAW,CAAC,wBAAwB,CAAC;YACtC,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAC/B,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAA;YACjE,OAAM;QACR,CAAC;QAED,4EAA4E;QAE5E,MAAM,kBAAkB,mCAAQ,wBAAwB,GAAK,wBAAwB,CAAE,CAAA;QAEvF,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC;aACtD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;aAC5C,IAAI,EAAE,CAAA;QAET,MAAM,sBAAsB,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAA;QAClF,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAyB,CAClG,CAAA;QACD,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAA;QAClH,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,GAAG,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAA+B,CACjH,CAAA;QACD,MAAM,eAAe,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAClD,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CACvE,CAAA;QAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC;aACpD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;aAC5C,IAAI,EAAE,CAAA;QAET,MAAM,4BAA4B,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;QACtF,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,GAAG,CAC5C,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAqB,CAC7F,CAAA;QACD,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,GAAG,CAC5C,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CACvE,CAAA;QACD,MAAM,2BAA2B,GAAG,gBAAgB,CAAC,GAAG,CACtD,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAA+B,CAC9G,CAAA;QAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC;aAC9D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;aAC5C,IAAI,EAAE,CAAA;QACT,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACtD,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;YACpD,OAAO,2BAA2B,CAAC,GAAG,MAAM,aAAa,CAAC,IAAI,2BAA2B,CAAC,GAAG,MAAM,cAAc,CAAC,CAAA;QACpH,CAAC,CAAC,CAAA;QAEF,gEAAgE;QAEhE,WAAW,CAAC,GAAG,EAAE;;YACf,MAAM,uBAAuB,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,sBAAsB,EAAE,sBAAsB,CAAC,CAAA;YAClG,IAAI,uBAAuB;gBAAE,KAAK,CAAC,yBAAyB,CAAC,sBAAsB,CAAC,CAAA;YAEpF,MAAM,kBAAkB,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;YACvE,IAAI,kBAAkB;gBAAE,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;YAEzD,MAAM,kBAAkB,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;YACvE,IAAI,kBAAkB;gBAAE,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;YAEzD,MAAM,4BAA4B,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,qBAAqB,EAAE,qBAAqB,CAAC,CAAA;YACrG,IAAI,4BAA4B;gBAAE,KAAK,CAAC,wBAAwB,CAAC,qBAAqB,CAAC,CAAA;YAEvF,MAAM,sBAAsB,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,eAAe,EAAE,eAAe,CAAC,CAAA;YACnF,IAAI,sBAAsB;gBAAE,KAAK,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAA;YAErE,MAAM,uBAAuB,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAA;YACtF,IAAI,uBAAuB;gBAAE,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAA;YAExE,MAAM,2BAA2B,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAA;YAClG,IAAI,2BAA2B;gBAAE,KAAK,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,CAAA;YAEpF,MAAM,yBAAyB,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,4BAA4B,EAAE,4BAA4B,CAAC,CAAA;YAChH,IAAI,yBAAyB;gBAAE,KAAK,CAAC,+BAA+B,CAAC,4BAA4B,CAAC,CAAA;YAElG,MAAM,cAAc,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAA;YAC/E,IAAI,cAAc;gBAAE,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAA;YAEjE,MAAM,cAAc,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAA;YAC/E,IAAI,cAAc;gBAAE,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAA;YAEjE,MAAM,wBAAwB,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,2BAA2B,EAAE,2BAA2B,CAAC,CAAA;YAC7G,IAAI,wBAAwB;gBAAE,KAAK,CAAC,8BAA8B,CAAC,2BAA2B,CAAC,CAAA;YAE/F,MAAM,aAAa,GACjB,KAAK,CAAC,sBAAsB,CAAC,MAAM,KAAK,CAAC;gBACzC,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;gBAC9B,KAAK,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;gBACnC,KAAK,CAAC,4BAA4B,CAAC,MAAM,KAAK,CAAC,CAAA;YAEjD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,IAAI,uBAAuB;oBAAE,MAAM,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAA;gBACvG,IAAI,kBAAkB;oBAAE,MAAM,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAA;gBACtF,IAAI,kBAAkB;oBAAE,MAAM,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAA;gBACtF,IAAI,4BAA4B;oBAAE,MAAM,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAA;gBAC3G,IAAI,sBAAsB;oBAAE,MAAM,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAA;gBAC9F,IAAI,uBAAuB;oBAAE,MAAM,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAA;gBACpF,IAAI,2BAA2B;oBAAE,MAAM,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAA;gBAC7F,IAAI,yBAAyB;oBAAE,MAAM,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAA;gBACpG,IAAI,cAAc;oBAAE,MAAM,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAA;gBAC7E,IAAI,cAAc;oBAAE,MAAM,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAA;gBAC7E,IAAI,wBAAwB;oBAAE,MAAM,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAA;YACpG,CAAC;YAED,IACE,uBAAuB;gBACvB,kBAAkB;gBAClB,kBAAkB;gBAClB,4BAA4B;gBAC5B,sBAAsB;gBACtB,uBAAuB;gBACvB,2BAA2B;gBAC3B,yBAAyB;gBACzB,cAAc;gBACd,cAAc;gBACd,wBAAwB,EACxB,CAAC;gBACD,MAAM,KAAK,GAAqD,EAAE,CAAA;gBAElE,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;oBACtC,MAAM,IAAI,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAA;oBAE/C,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE;wBAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAClC,6BAA6B,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAClC,CAAA;wBACtC,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAC/B,8BAA8B,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CACnD,CAAA;wBACrC,OAAO;4BACL,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,WAAW,IAAI,uBAAuB;4BAC9E,MAAM,EAAE,GAAG;yBACZ,CAAA;oBACH,CAAC,CAAC,CAAA;oBAEF,IACE,CAAC,CACC,MAAM,CAAC,aAAa,GAAG,4BAA4B,CAAC,OAAO;wBAC3D,MAAM,CAAC,aAAa,GAAG,4BAA4B,CAAC,gBAAgB,CACrE,EACD,CAAC;wBACD,SAAQ;oBACV,CAAC;oBAED,wEAAwE;oBACxE,IACE,IAAI,CAAC,IAAI,KAAK,QAAQ;wBACtB,MAAM,CAAC,QAAQ,IAAI,IAAI;wBACvB,MAAM,CAAC,QAAQ,KAAK,0BAA0B,CAAC,MAAM,EACrD,CAAC;wBACD,SAAQ;oBACV,CAAC;oBAED,MAAM,WAAW,GAAG,CAAC,MAAA,kBAAkB,CAAC,KAAK,CAAC,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;oBAE5D,KAAK,CAAC,IAAI,CAAC;wBACT,SAAS,EAAE,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;wBACxD,IAAI,kCACC,MAAM,KACT,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,gBAAgB,EAAE,UAAoB,GACvC;qBACF,CAAC,CAAA;gBACJ,CAAC;gBAED,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;oBACrC,MAAM,IAAI,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAA;oBAE3C,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE;wBAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAClC,6BAA6B,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAClC,CAAA;wBACtC,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAC/B,0BAA0B,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAClD,CAAA;wBACjC,OAAO;4BACL,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,WAAW,IAAI,uBAAuB;4BAC9E,KAAK,EAAE,GAAG;yBACX,CAAA;oBACH,CAAC,CAAC,CAAA;oBAEF,IACE,CAAC,CACC,KAAK,CAAC,aAAa,GAAG,4BAA4B,CAAC,OAAO;wBAC1D,KAAK,CAAC,aAAa,GAAG,4BAA4B,CAAC,gBAAgB,CACpE,EACD,CAAC;wBACD,SAAQ;oBACV,CAAC;oBAED,MAAM,WAAW,GAAG,CAAC,MAAA,iBAAiB,CAAC,KAAK,CAAC,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;oBAE3D,KAAK,CAAC,IAAI,CAAC;wBACT,SAAS,EAAE,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;wBACxD,IAAI,kCACC,KAAK,KACR,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,QAAQ,EAAE,IAAI,CAAC,OAAO,EACtB,gBAAgB,EAAE,UAAoB,EACtC,IAAI,EAAE,qBAAqB,CAAC,KAAK,CAAC,IAAc,CAAC,GAClD;qBACF,CAAC,CAAA;gBACJ,CAAC;gBAED,MAAM,MAAM,GAA2C,EAAE,CAAA;gBACzD,KAAK,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC;oBACxC,CAAC;oBAAA,CAAC,MAAM,CAAC,SAAS,MAAhB,MAAM,CAAC,SAAS,IAAM,EAAE,EAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACxC,CAAC;gBAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;oBACxC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;wBAChB,MAAM,KAAK,GAAG,kCAAkC,CAAC,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAA;wBACvE,MAAM,KAAK,GAAG,kCAAkC,CAAC,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAA;wBACvE,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;oBACnC,CAAC,CAAC,CAAA;gBACJ,CAAC;gBAED,MAAM,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAA;gBAC/E,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;YACzB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE;QACD,wBAAwB;QACxB,wBAAwB;QACxB,iBAAiB;QACjB,2BAA2B;QAC3B,uBAAuB;QACvB,IAAI;QACJ,KAAK;KACN,CAAC,CAAA;IAEF,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAa;;IACvD,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,KAAK,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACtE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/D,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAA;IAE5D,OAAO;QACL,IAAI,EAAE,MAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAG,CAAC,CAA0B,mCAAI,IAAI;QAClD,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAA8B;QAC5G,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAuB;KAC9F,CAAA;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa;;IACnD,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,KAAK,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACtE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3D,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAA;IAEvD,OAAO;QACL,IAAI,EAAE,MAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAG,CAAC,CAA0B,mCAAI,IAAI;QAClD,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAA8B;QACpG,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAmB;KACvF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAI,CAAM,EAAE,CAAM;IAC3C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACvC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAClE,CAAC","sourcesContent":["import { runInAction, untracked } from \"mobx\"\nimport Logger from \"../../utils/logger\"\nimport { useMqtt } from \"../Mqtt\"\nimport { useMemo, useEffect } from \"react\"\nimport { useSwitchingPaneStore } from \"./SwitchingPane.store\"\nimport { getSwitchingDeviceStateTopics, SwitchingDeviceInstanceId } from \"./SwitchingDevice.provider\"\nimport {\n getSwitchingPaneItemNameForDisplay,\n getSwitchableOutputStateTopics,\n SWITCHABLE_OUTPUT_TREES,\n SwitchableOutputId,\n SwitchableOutputState,\n SwitchableOutputTree,\n GenericInputState,\n SwitchingPaneItem,\n} from \"./SwitchableOutput.provider\"\nimport { getGenericInputStateTopics, GenericInputId } from \"./GenericInput.provider\"\nimport {\n GenericInputType,\n remapGenericInputType,\n SwitchableOutputType,\n SwitchableOutputVisibility,\n SWITCHABLE_OUTPUT_FUNCTION,\n SWITCHABLE_OUTPUT_VISIBILITY,\n} from \"../../utils/constants\"\n\nconst hasMessages = (messages: Record<string, string> | undefined) => messages && Object.keys(messages).length > 0\n\nexport const useSwitchingPane = (gxDeviceRelaysGroupName: string) => {\n const store = useSwitchingPaneStore()\n const mqtt = useMqtt()\n\n const topics = useMemo(\n () => ({\n systemOutputs: `N/${mqtt.portalId}/system/+/SwitchableOutput/+/Settings/+`,\n switchOutputs: `N/${mqtt.portalId}/switch/+/SwitchableOutput/+/Settings/+`,\n genericInputs: `N/${mqtt.portalId}/switch/+/GenericInput/+/Settings/+`,\n switchingDevices: `N/${mqtt.portalId}/switch/+`,\n }),\n [mqtt.portalId]\n )\n\n const messagesForSystemOutputs = mqtt.messagesByWildcard(topics.systemOutputs)\n const messagesForSwitchOutputs = mqtt.messagesByWildcard(topics.switchOutputs)\n const messagesForInputs = mqtt.messagesByWildcard(topics.genericInputs)\n const messagesForSwitchingDevices = mqtt.messagesByWildcard(topics.switchingDevices)\n\n useEffect(() => {\n if (\n !hasMessages(messagesForSystemOutputs) &&\n !hasMessages(messagesForSwitchOutputs) &&\n !hasMessages(messagesForInputs)\n ) {\n Logger.log(\"Waiting for switchable outputs or generic inputs...\")\n return\n }\n\n // --- Phase A: Extract comparison arrays from wildcard messages (cheap) ---\n\n const messagesForOutputs = { ...messagesForSystemOutputs, ...messagesForSwitchOutputs }\n\n const outputGroupTopics = Object.keys(messagesForOutputs)\n .filter((k) => k.endsWith(\"/Settings/Group\"))\n .sort()\n\n const customGroupAssignments = outputGroupTopics.map((t) => messagesForOutputs[t])\n const outputTypes = outputGroupTopics.map(\n (t) => Number(messagesForOutputs[`${t.slice(0, -\"/Group\".length)}/Type`]) as SwitchableOutputType\n )\n const outputNames = outputGroupTopics.map((t) => messagesForOutputs[`${t.slice(0, -\"/Group\".length)}/CustomName`])\n const outputVisibilityFlags = outputGroupTopics.map(\n (t) => Number(messagesForOutputs[`${t.slice(0, -\"/Group\".length)}/ShowUIControl`]) as SwitchableOutputVisibility\n )\n const outputFunctions = outputGroupTopics.map((t) =>\n Number(messagesForOutputs[`${t.slice(0, -\"/Group\".length)}/Function`])\n )\n\n const inputGroupTopics = Object.keys(messagesForInputs)\n .filter((k) => k.endsWith(\"/Settings/Group\"))\n .sort()\n\n const genericInputGroupAssignments = inputGroupTopics.map((t) => messagesForInputs[t])\n const genericInputTypes = inputGroupTopics.map(\n (t) => Number(messagesForInputs[`${t.slice(0, -\"/Group\".length)}/Type`]) as GenericInputType\n )\n const genericInputNames = inputGroupTopics.map(\n (t) => messagesForInputs[`${t.slice(0, -\"/Group\".length)}/CustomName`]\n )\n const genericInputVisibilityFlags = inputGroupTopics.map(\n (t) => Number(messagesForInputs[`${t.slice(0, -\"/Group\".length)}/ShowUIInput`]) as SwitchableOutputVisibility\n )\n\n const switchingDevices = Object.keys(messagesForSwitchingDevices)\n .filter((k) => k.endsWith(\"/DeviceInstance\"))\n .sort()\n const switchingDeviceNames = switchingDevices.map((t) => {\n const prefix = t.slice(0, -\"/DeviceInstance\".length)\n return messagesForSwitchingDevices[`${prefix}/CustomName`] || messagesForSwitchingDevices[`${prefix}/ProductName`]\n })\n\n // --- Phase B: comparison guard, batched in a single action ---\n\n runInAction(() => {\n const groupAssignmentsChanged = !arraysEqual(store.customGroupAssignments, customGroupAssignments)\n if (groupAssignmentsChanged) store.setCustomGroupAssignments(customGroupAssignments)\n\n const outputTypesChanged = !arraysEqual(store.outputTypes, outputTypes)\n if (outputTypesChanged) store.setOutputTypes(outputTypes)\n\n const outputNamesChanged = !arraysEqual(store.outputNames, outputNames)\n if (outputNamesChanged) store.setOutputNames(outputNames)\n\n const outputVisibilityFlagsChanged = !arraysEqual(store.outputVisibilityFlags, outputVisibilityFlags)\n if (outputVisibilityFlagsChanged) store.setOutputVisibilityFlags(outputVisibilityFlags)\n\n const outputFunctionsChanged = !arraysEqual(store.outputFunctions, outputFunctions)\n if (outputFunctionsChanged) store.setOutputFunctions(outputFunctions)\n\n const switchingDevicesChanged = !arraysEqual(store.switchingDevices, switchingDevices)\n if (switchingDevicesChanged) store.setSwitchingDevices(switchingDevices)\n\n const switchingDeviceNamesChanged = !arraysEqual(store.switchingDeviceNames, switchingDeviceNames)\n if (switchingDeviceNamesChanged) store.setSwitchingDeviceNames(switchingDeviceNames)\n\n const giGroupAssignmentsChanged = !arraysEqual(store.genericInputGroupAssignments, genericInputGroupAssignments)\n if (giGroupAssignmentsChanged) store.setGenericInputGroupAssignments(genericInputGroupAssignments)\n\n const giTypesChanged = !arraysEqual(store.genericInputTypes, genericInputTypes)\n if (giTypesChanged) store.setGenericInputTypes(genericInputTypes)\n\n const giNamesChanged = !arraysEqual(store.genericInputNames, genericInputNames)\n if (giNamesChanged) store.setGenericInputNames(genericInputNames)\n\n const giVisibilityFlagsChanged = !arraysEqual(store.genericInputVisibilityFlags, genericInputVisibilityFlags)\n if (giVisibilityFlagsChanged) store.setGenericInputVisibilityFlags(genericInputVisibilityFlags)\n\n const isInitialLoad =\n store.customGroupAssignments.length === 0 &&\n store.outputTypes.length === 0 &&\n store.switchingDevices.length === 0 &&\n store.genericInputGroupAssignments.length === 0\n\n if (!isInitialLoad) {\n if (groupAssignmentsChanged) Logger.log(`Switchable outputs group assignments changed, recomputing...`)\n if (outputTypesChanged) Logger.log(`Switchable outputs types changed, recomputing...`)\n if (outputNamesChanged) Logger.log(`Switchable outputs names changed, recomputing...`)\n if (outputVisibilityFlagsChanged) Logger.log(`Switchable outputs visibility flags changed, recomputing...`)\n if (outputFunctionsChanged) Logger.log(`Switchable outputs functions changed, recomputing...`)\n if (switchingDevicesChanged) Logger.log(`Switching devices changed, recomputing...`)\n if (switchingDeviceNamesChanged) Logger.log(`Switching device names changed, recomputing...`)\n if (giGroupAssignmentsChanged) Logger.log(`Generic input group assignments changed, recomputing...`)\n if (giTypesChanged) Logger.log(`Generic input types changed, recomputing...`)\n if (giNamesChanged) Logger.log(`Generic input names changed, recomputing...`)\n if (giVisibilityFlagsChanged) Logger.log(`Generic input visibility flags changed, recomputing...`)\n }\n\n if (\n groupAssignmentsChanged ||\n outputTypesChanged ||\n outputNamesChanged ||\n outputVisibilityFlagsChanged ||\n outputFunctionsChanged ||\n switchingDevicesChanged ||\n switchingDeviceNamesChanged ||\n giGroupAssignmentsChanged ||\n giTypesChanged ||\n giNamesChanged ||\n giVisibilityFlagsChanged\n ) {\n const items: { groupName: string; item: SwitchingPaneItem }[] = []\n\n for (const topic of outputGroupTopics) {\n const info = extractSwitchableOutputInfo(topic)\n\n const { deviceName, output } = untracked(() => {\n const device = mqtt.messagesByTopics(\n getSwitchingDeviceStateTopics(mqtt.portalId, info.tree, info.deviceId)\n ) as unknown as Record<string, string>\n const out = mqtt.messagesByTopics(\n getSwitchableOutputStateTopics(mqtt.portalId, info.tree, info.deviceId, info.outputId)\n ) as unknown as SwitchableOutputState\n return {\n deviceName: device.customName || device.productName || gxDeviceRelaysGroupName,\n output: out,\n }\n })\n\n if (\n !(\n output.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE ||\n output.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE_LOCAL_UI\n )\n ) {\n continue\n }\n\n // GX system relays: only show when Function is Manual (matching gui-v2)\n if (\n info.tree === \"system\" &&\n output.function != null &&\n output.function !== SWITCHABLE_OUTPUT_FUNCTION.MANUAL\n ) {\n continue\n }\n\n const customGroup = (messagesForOutputs[topic] ?? \"\").trim()\n\n items.push({\n groupName: customGroup === \"\" ? deviceName : customGroup,\n item: {\n ...output,\n kind: \"switchableOutput\",\n tree: info.tree,\n deviceId: info.deviceId,\n outputId: info.outputId,\n parentDeviceName: deviceName as string,\n },\n })\n }\n\n for (const topic of inputGroupTopics) {\n const info = extractGenericInputInfo(topic)\n\n const { deviceName, input } = untracked(() => {\n const device = mqtt.messagesByTopics(\n getSwitchingDeviceStateTopics(mqtt.portalId, info.tree, info.deviceId)\n ) as unknown as Record<string, string>\n const inp = mqtt.messagesByTopics(\n getGenericInputStateTopics(mqtt.portalId, info.tree, info.deviceId, info.inputId)\n ) as unknown as GenericInputState\n return {\n deviceName: device.customName || device.productName || gxDeviceRelaysGroupName,\n input: inp,\n }\n })\n\n if (\n !(\n input.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE ||\n input.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE_LOCAL_UI\n )\n ) {\n continue\n }\n\n const customGroup = (messagesForInputs[topic] ?? \"\").trim()\n\n items.push({\n groupName: customGroup === \"\" ? deviceName : customGroup,\n item: {\n ...input,\n kind: \"genericInput\",\n tree: info.tree,\n deviceId: info.deviceId,\n outputId: info.inputId,\n parentDeviceName: deviceName as string,\n type: remapGenericInputType(input.type as number),\n },\n })\n }\n\n const groups: { [key: string]: SwitchingPaneItem[] } = {}\n for (const { groupName, item } of items) {\n ;(groups[groupName] ||= []).push(item)\n }\n\n for (const arr of Object.values(groups)) {\n arr.sort((a, b) => {\n const aName = getSwitchingPaneItemNameForDisplay(a, a.parentDeviceName)\n const bName = getSwitchingPaneItemNameForDisplay(b, b.parentDeviceName)\n return aName.localeCompare(bName)\n })\n }\n\n Logger.log(`New switching pane groups: ${JSON.stringify(Object.keys(groups))}`)\n store.setGroups(groups)\n }\n })\n }, [\n messagesForSystemOutputs,\n messagesForSwitchOutputs,\n messagesForInputs,\n messagesForSwitchingDevices,\n gxDeviceRelaysGroupName,\n mqtt,\n store,\n ])\n\n return store\n}\n\nexport function extractSwitchableOutputInfo(topic: string) {\n const pattern = new RegExp(`/(${SWITCHABLE_OUTPUT_TREES.join(\"|\")})/`)\n const match = topic.match(pattern)\n const switchStart = match ? match.index! + match[0].length : -1\n const outputStart = topic.indexOf(\"/SwitchableOutput/\") + 18\n\n return {\n tree: (match?.[1] as SwitchableOutputTree) ?? null,\n deviceId: Number(topic.substring(switchStart, topic.indexOf(\"/\", switchStart))) as SwitchingDeviceInstanceId,\n outputId: topic.substring(outputStart, topic.indexOf(\"/\", outputStart)) as SwitchableOutputId,\n }\n}\n\nexport function extractGenericInputInfo(topic: string) {\n const pattern = new RegExp(`/(${SWITCHABLE_OUTPUT_TREES.join(\"|\")})/`)\n const match = topic.match(pattern)\n const treeEnd = match ? match.index! + match[0].length : -1\n const inputStart = topic.indexOf(\"/GenericInput/\") + 14\n\n return {\n tree: (match?.[1] as SwitchableOutputTree) ?? null,\n deviceId: Number(topic.substring(treeEnd, topic.indexOf(\"/\", treeEnd))) as SwitchingDeviceInstanceId,\n inputId: topic.substring(inputStart, topic.indexOf(\"/\", inputStart)) as GenericInputId,\n }\n}\n\nexport function arraysEqual<T>(a: T[], b: T[]): boolean {\n if (a.length !== b.length) return false\n return a.every((element, index) => Object.is(element, b[index]))\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchingPane.store.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAA;AAI1G,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAA;KAAE,CAAA;IAE9C,sBAAsB,EAAE,MAAM,EAAE,CAAA;IAEhC,WAAW,EAAE,oBAAoB,EAAE,CAAA;IAEnC,WAAW,EAAE,MAAM,EAAE,CAAA;IAErB,qBAAqB,EAAE,0BAA0B,EAAE,CAAA;IAEnD,eAAe,EAAE,MAAM,EAAE,CAAA;IAEzB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAE1B,oBAAoB,EAAE,MAAM,EAAE,CAAA;IAE9B,4BAA4B,EAAE,MAAM,EAAE,CAAA;IAEtC,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;IAErC,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAE3B,2BAA2B,EAAE,0BAA0B,EAAE,CAAA;CAC1D;AAED,qBAAa,kBAAkB;IAC7B,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAA;KAAE,CAAK;IACnD,sBAAsB,EAAE,MAAM,EAAE,CAAK;IACrC,WAAW,EAAE,oBAAoB,EAAE,CAAK;IACxC,WAAW,EAAE,MAAM,EAAE,CAAK;IAC1B,qBAAqB,EAAE,0BAA0B,EAAE,CAAK;IACxD,eAAe,EAAE,MAAM,EAAE,CAAK;IAC9B,gBAAgB,EAAE,MAAM,EAAE,CAAK;IAC/B,oBAAoB,EAAE,MAAM,EAAE,CAAK;IACnC,4BAA4B,EAAE,MAAM,EAAE,CAAK;IAC3C,iBAAiB,EAAE,gBAAgB,EAAE,CAAK;IAC1C,iBAAiB,EAAE,MAAM,EAAE,CAAK;IAChC,2BAA2B,EAAE,0BAA0B,EAAE,CAAK;;IAkB9D,SAAS,GAAI,QAAQ;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAA;KAAE;;MAA2B;IACtF,yBAAyB,GAAI,aAAa,MAAM,EAAE,cAAgD;IAClG,cAAc,GAAI,aAAa,oBAAoB,EAAE,4BAAqC;IAC1F,cAAc,GAAI,aAAa,MAAM,EAAE,cAAqC;IAC5E,wBAAwB,GAAI,uBAAuB,0BAA0B,EAAE,cACzB;IACtD,kBAAkB,GAAI,iBAAiB,MAAM,EAAE,cAA6C;IAC5F,mBAAmB,GAAI,kBAAkB,MAAM,EAAE,cAA+C;IAChG,uBAAuB,GAAI,sBAAsB,MAAM,EAAE,cAAuD;IAChH,+BAA+B,GAAI,aAAa,MAAM,EAAE,cAAsD;IAC9G,oBAAoB,GAAI,OAAO,gBAAgB,EAAE,wBAAqC;IACtF,oBAAoB,GAAI,OAAO,MAAM,EAAE,cAAqC;IAC5E,8BAA8B,GAAI,OAAO,0BAA0B,EAAE,cAA+C;CACrH;AAYD,wBAAgB,qBAAqB,uBAEpC"}
1
+ {"version":3,"file":"SwitchingPane.store.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAA;AAI1G,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAA;KAAE,CAAA;IAC9C,sBAAsB,EAAE,MAAM,EAAE,CAAA;IAChC,WAAW,EAAE,oBAAoB,EAAE,CAAA;IACnC,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,qBAAqB,EAAE,0BAA0B,EAAE,CAAA;IACnD,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,oBAAoB,EAAE,MAAM,EAAE,CAAA;IAC9B,4BAA4B,EAAE,MAAM,EAAE,CAAA;IACtC,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;IACrC,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,2BAA2B,EAAE,0BAA0B,EAAE,CAAA;CAC1D;AAED,qBAAa,kBAAkB;IAC7B,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAA;KAAE,CAAK;IACnD,sBAAsB,EAAE,MAAM,EAAE,CAAK;IACrC,WAAW,EAAE,oBAAoB,EAAE,CAAK;IACxC,WAAW,EAAE,MAAM,EAAE,CAAK;IAC1B,qBAAqB,EAAE,0BAA0B,EAAE,CAAK;IACxD,eAAe,EAAE,MAAM,EAAE,CAAK;IAC9B,gBAAgB,EAAE,MAAM,EAAE,CAAK;IAC/B,oBAAoB,EAAE,MAAM,EAAE,CAAK;IACnC,4BAA4B,EAAE,MAAM,EAAE,CAAK;IAC3C,iBAAiB,EAAE,gBAAgB,EAAE,CAAK;IAC1C,iBAAiB,EAAE,MAAM,EAAE,CAAK;IAChC,2BAA2B,EAAE,0BAA0B,EAAE,CAAK;;IAkB9D,SAAS,GAAI,QAAQ;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAA;KAAE;;MAA2B;IACtF,yBAAyB,GAAI,aAAa,MAAM,EAAE,cAAgD;IAClG,cAAc,GAAI,aAAa,oBAAoB,EAAE,4BAAqC;IAC1F,cAAc,GAAI,aAAa,MAAM,EAAE,cAAqC;IAC5E,wBAAwB,GAAI,uBAAuB,0BAA0B,EAAE,cACzB;IACtD,kBAAkB,GAAI,iBAAiB,MAAM,EAAE,cAA6C;IAC5F,mBAAmB,GAAI,kBAAkB,MAAM,EAAE,cAA+C;IAChG,uBAAuB,GAAI,sBAAsB,MAAM,EAAE,cAAuD;IAChH,+BAA+B,GAAI,aAAa,MAAM,EAAE,cAAsD;IAC9G,oBAAoB,GAAI,OAAO,gBAAgB,EAAE,wBAAqC;IACtF,oBAAoB,GAAI,OAAO,MAAM,EAAE,cAAqC;IAC5E,8BAA8B,GAAI,OAAO,0BAA0B,EAAE,cAA+C;CACrH;AAYD,wBAAgB,qBAAqB,uBAEpC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchingPane.store.js","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.store.ts"],"names":[],"mappings":"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","sourcesContent":["import { action, makeAutoObservable } from \"mobx\"\nimport { useMemo } from \"react\"\nimport { SwitchingPaneItem } from \"./SwitchableOutput.provider\"\nimport { GenericInputType, SwitchableOutputType, SwitchableOutputVisibility } from \"../../utils/constants\"\n\nlet store: SwitchingPaneStore\n\nexport interface SwitchingPaneState {\n groups: { [key: string]: SwitchingPaneItem[] }\n // custom group assignments for available switchable outputs sorted by their topic path\n customGroupAssignments: string[]\n // types of switchable outputs sorted by their topic path\n outputTypes: SwitchableOutputType[]\n // custom names of switchable outputs sorted by their topic path\n outputNames: string[]\n // visibility status of switchable outputs sorted by their topic path\n outputVisibilityFlags: SwitchableOutputVisibility[]\n // function of switchable outputs sorted by their topic path\n outputFunctions: number[]\n // switching devices\n switchingDevices: string[]\n // switching devices custom names\n switchingDeviceNames: string[]\n // custom group assignments for available generic inputs sorted by their topic path\n genericInputGroupAssignments: string[]\n // types of generic inputs sorted by their topic path\n genericInputTypes: GenericInputType[]\n // custom names of generic inputs sorted by their topic path\n genericInputNames: string[]\n // visibility status of generic inputs sorted by their topic path\n genericInputVisibilityFlags: SwitchableOutputVisibility[]\n}\n\nexport class SwitchingPaneStore {\n groups: { [key: string]: SwitchingPaneItem[] } = {}\n customGroupAssignments: string[] = []\n outputTypes: SwitchableOutputType[] = []\n outputNames: string[] = []\n outputVisibilityFlags: SwitchableOutputVisibility[] = []\n outputFunctions: number[] = []\n switchingDevices: string[] = []\n switchingDeviceNames: string[] = []\n genericInputGroupAssignments: string[] = []\n genericInputTypes: GenericInputType[] = []\n genericInputNames: string[] = []\n genericInputVisibilityFlags: SwitchableOutputVisibility[] = []\n\n constructor() {\n makeAutoObservable(this, {\n setGroups: action,\n setCustomGroupAssignments: action,\n setOutputTypes: action,\n setOutputVisibilityFlags: action,\n setOutputFunctions: action,\n setSwitchingDevices: action,\n setSwitchingDeviceNames: action,\n setGenericInputGroupAssignments: action,\n setGenericInputTypes: action,\n setGenericInputNames: action,\n setGenericInputVisibilityFlags: action,\n })\n }\n\n setGroups = (groups: { [key: string]: SwitchingPaneItem[] }) => (this.groups = groups)\n setCustomGroupAssignments = (assignments: string[]) => (this.customGroupAssignments = assignments)\n setOutputTypes = (outputTypes: SwitchableOutputType[]) => (this.outputTypes = outputTypes)\n setOutputNames = (outputNames: string[]) => (this.outputNames = outputNames)\n setOutputVisibilityFlags = (outputVisibilityFlags: SwitchableOutputVisibility[]) =>\n (this.outputVisibilityFlags = outputVisibilityFlags)\n setOutputFunctions = (outputFunctions: number[]) => (this.outputFunctions = outputFunctions)\n setSwitchingDevices = (switchingDevices: string[]) => (this.switchingDevices = switchingDevices)\n setSwitchingDeviceNames = (switchingDeviceNames: string[]) => (this.switchingDeviceNames = switchingDeviceNames)\n setGenericInputGroupAssignments = (assignments: string[]) => (this.genericInputGroupAssignments = assignments)\n setGenericInputTypes = (types: GenericInputType[]) => (this.genericInputTypes = types)\n setGenericInputNames = (names: string[]) => (this.genericInputNames = names)\n setGenericInputVisibilityFlags = (flags: SwitchableOutputVisibility[]) => (this.genericInputVisibilityFlags = flags)\n}\n\nfunction initializeStore() {\n const _store = store ?? new SwitchingPaneStore()\n // For SSG and SSR always create a new store\n if (typeof window === \"undefined\") return _store\n // Create the store once in the client\n if (!store) store = _store\n\n return _store\n}\n\nexport function useSwitchingPaneStore() {\n return useMemo(() => initializeStore(), [])\n}\n"]}
1
+ {"version":3,"file":"SwitchingPane.store.js","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.store.ts"],"names":[],"mappings":"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","sourcesContent":["import { action, makeAutoObservable } from \"mobx\"\nimport { useMemo } from \"react\"\nimport { SwitchingPaneItem } from \"./SwitchableOutput.provider\"\nimport { GenericInputType, SwitchableOutputType, SwitchableOutputVisibility } from \"../../utils/constants\"\n\nlet store: SwitchingPaneStore\n\nexport interface SwitchingPaneState {\n groups: { [key: string]: SwitchingPaneItem[] }\n customGroupAssignments: string[]\n outputTypes: SwitchableOutputType[]\n outputNames: string[]\n outputVisibilityFlags: SwitchableOutputVisibility[]\n outputFunctions: number[]\n switchingDevices: string[]\n switchingDeviceNames: string[]\n genericInputGroupAssignments: string[]\n genericInputTypes: GenericInputType[]\n genericInputNames: string[]\n genericInputVisibilityFlags: SwitchableOutputVisibility[]\n}\n\nexport class SwitchingPaneStore {\n groups: { [key: string]: SwitchingPaneItem[] } = {}\n customGroupAssignments: string[] = []\n outputTypes: SwitchableOutputType[] = []\n outputNames: string[] = []\n outputVisibilityFlags: SwitchableOutputVisibility[] = []\n outputFunctions: number[] = []\n switchingDevices: string[] = []\n switchingDeviceNames: string[] = []\n genericInputGroupAssignments: string[] = []\n genericInputTypes: GenericInputType[] = []\n genericInputNames: string[] = []\n genericInputVisibilityFlags: SwitchableOutputVisibility[] = []\n\n constructor() {\n makeAutoObservable(this, {\n setGroups: action,\n setCustomGroupAssignments: action,\n setOutputTypes: action,\n setOutputVisibilityFlags: action,\n setOutputFunctions: action,\n setSwitchingDevices: action,\n setSwitchingDeviceNames: action,\n setGenericInputGroupAssignments: action,\n setGenericInputTypes: action,\n setGenericInputNames: action,\n setGenericInputVisibilityFlags: action,\n })\n }\n\n setGroups = (groups: { [key: string]: SwitchingPaneItem[] }) => (this.groups = groups)\n setCustomGroupAssignments = (assignments: string[]) => (this.customGroupAssignments = assignments)\n setOutputTypes = (outputTypes: SwitchableOutputType[]) => (this.outputTypes = outputTypes)\n setOutputNames = (outputNames: string[]) => (this.outputNames = outputNames)\n setOutputVisibilityFlags = (outputVisibilityFlags: SwitchableOutputVisibility[]) =>\n (this.outputVisibilityFlags = outputVisibilityFlags)\n setOutputFunctions = (outputFunctions: number[]) => (this.outputFunctions = outputFunctions)\n setSwitchingDevices = (switchingDevices: string[]) => (this.switchingDevices = switchingDevices)\n setSwitchingDeviceNames = (switchingDeviceNames: string[]) => (this.switchingDeviceNames = switchingDeviceNames)\n setGenericInputGroupAssignments = (assignments: string[]) => (this.genericInputGroupAssignments = assignments)\n setGenericInputTypes = (types: GenericInputType[]) => (this.genericInputTypes = types)\n setGenericInputNames = (names: string[]) => (this.genericInputNames = names)\n setGenericInputVisibilityFlags = (flags: SwitchableOutputVisibility[]) => (this.genericInputVisibilityFlags = flags)\n}\n\nfunction initializeStore() {\n const _store = store ?? new SwitchingPaneStore()\n // For SSG and SSR always create a new store\n if (typeof window === \"undefined\") return _store\n // Create the store once in the client\n if (!store) store = _store\n\n return _store\n}\n\nexport function useSwitchingPaneStore() {\n return useMemo(() => initializeStore(), [])\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@victronenergy/mfd-modules",
3
- "version": "11.1.5",
3
+ "version": "11.1.6",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -26,7 +26,7 @@
26
26
  "js-cookie": "^3.0.8",
27
27
  "localforage": "^1.10.0",
28
28
  "lodash-es": "^4.18.1",
29
- "mobx": "^6.16.0",
29
+ "mobx": "^6.16.1",
30
30
  "mobx-persist-store": "^1.1.8",
31
31
  "mobx-utils": "^6.1.1",
32
32
  "mqtt": "^4.3.8"
@@ -38,7 +38,7 @@
38
38
  "@testing-library/react": "^16.3.2",
39
39
  "@types/js-cookie": "^3.0.6",
40
40
  "@types/lodash-es": "^4.17.12",
41
- "@types/react": "^19.2.16",
41
+ "@types/react": "^19.2.17",
42
42
  "es-check": "^9.6.4",
43
43
  "eslint": "^10.4.1",
44
44
  "eslint-config-prettier": "^10.1.8",
@@ -46,12 +46,12 @@
46
46
  "eslint-plugin-prettier": "^5.5.6",
47
47
  "eslint-plugin-react-hooks": "^7.1.1",
48
48
  "jsdom": "^29.1.1",
49
- "prettier": "^3.8.3",
49
+ "prettier": "^3.8.4",
50
50
  "react": "^19.2.7",
51
51
  "react-dom": "^19.2.7",
52
52
  "semantic-release": "^25.0.3",
53
53
  "typescript": "^6.0.3",
54
- "typescript-eslint": "^8.60.1",
54
+ "typescript-eslint": "^8.61.0",
55
55
  "vitest": "^4.1.8"
56
56
  },
57
57
  "peerDependencies": {