iobroker.devices 1.2.12 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +17 -6
  2. package/admin/assets/index-Csa94g2Q.js +845 -0
  3. package/admin/assets/index-pCeIEsc7.css +1 -0
  4. package/admin/assets/ioBrokerLogo-D4L_xR2G.png +0 -0
  5. package/admin/index_m.html +2 -2
  6. package/admin/tab.html +2 -2
  7. package/build/lib/DeviceManagement.js +618 -0
  8. package/build/lib/DeviceManagement.js.map +1 -0
  9. package/build/lib/WidgetsManagement.js +627 -0
  10. package/build/lib/WidgetsManagement.js.map +1 -0
  11. package/build/main.js +53 -0
  12. package/build/main.js.map +1 -0
  13. package/build/widget-utils/WidgetsManagement.js +121 -0
  14. package/build/widget-utils/WidgetsManagement.js.map +1 -0
  15. package/build/widget-utils/index.js +18 -0
  16. package/build/widget-utils/index.js.map +1 -0
  17. package/build/widget-utils/types/api.js +3 -0
  18. package/build/widget-utils/types/api.js.map +1 -0
  19. package/build/widget-utils/types/base.js +3 -0
  20. package/build/widget-utils/types/base.js.map +1 -0
  21. package/build/widget-utils/types/common.js +3 -0
  22. package/build/widget-utils/types/common.js.map +1 -0
  23. package/build/widget-utils/types/index.js +3 -0
  24. package/build/widget-utils/types/index.js.map +1 -0
  25. package/img/ioBrokerLogo.png +0 -0
  26. package/io-package.json +59 -31
  27. package/package.json +27 -15
  28. package/www/assets/index-CmwOqvIb.css +1 -0
  29. package/www/assets/index-DHISOGRL.js +748 -0
  30. package/www/assets/ioBrokerLogo-D4L_xR2G.png +0 -0
  31. package/www/devices.svg +26 -0
  32. package/www/favicon.ico +0 -0
  33. package/www/index.html +30 -0
  34. package/www/manifest.json +15 -0
  35. package/admin/assets/index-CKue6Ph0.css +0 -1
  36. package/admin/assets/index-ChCHYkC8.js +0 -826
@@ -0,0 +1,627 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const type_detector_1 = __importDefault(require("@iobroker/type-detector"));
7
+ const widget_utils_1 = require("../widget-utils");
8
+ const ROOT_CATEGORY = '__root__';
9
+ const ALIAS = 'alias.';
10
+ const ALIAS_MAX = 'alias.0.\u9999';
11
+ const LINKEDDEVICES = 'linkeddevices.';
12
+ function findMainStateId(device) {
13
+ const state = device.states.find(s => s.id && s.required);
14
+ return state?.id;
15
+ }
16
+ function getParentId(id) {
17
+ const pos = id.lastIndexOf('.');
18
+ return pos !== -1 ? id.substring(0, pos) : '';
19
+ }
20
+ class DevicesWidgetsManagement extends widget_utils_1.WidgetsManagement {
21
+ detector = new type_detector_1.default();
22
+ objects = {};
23
+ enumIds = [];
24
+ /** IDs collected from enum members only */
25
+ enumMemberIds = [];
26
+ idsInEnums = [];
27
+ /** All detected devices */
28
+ allDevices = [];
29
+ /** Only devices with `common.custom[namespace].enabled === true` */
30
+ enabledDevices = [];
31
+ loaded = null;
32
+ notifyTimeout = null;
33
+ /** Lazily rebuilt sorted keys cache */
34
+ _sortedKeys = null;
35
+ // ── Sorted keys cache ──────────────────────────────────────────────
36
+ getSortedKeys() {
37
+ this._sortedKeys ||= Object.keys(this.objects).sort();
38
+ return this._sortedKeys;
39
+ }
40
+ invalidateKeys() {
41
+ this._sortedKeys = null;
42
+ }
43
+ // ── Helpers ────────────────────────────────────────────────────────
44
+ /**
45
+ * Resolve the channelId for a detected device (same logic as updateEnumsForOneDevice).
46
+ */
47
+ resolveChannelId(device) {
48
+ const mainStateId = findMainStateId(device);
49
+ if (!mainStateId) {
50
+ device.storeId = '';
51
+ return;
52
+ }
53
+ const statesCount = device.states.filter(state => state.id).length;
54
+ let storeId = mainStateId;
55
+ if (mainStateId.includes('.') &&
56
+ (statesCount > 1 || storeId.startsWith(ALIAS) || storeId.startsWith(LINKEDDEVICES))) {
57
+ storeId = getParentId(mainStateId);
58
+ if (!this.objects[storeId]?.common ||
59
+ (this.objects[storeId].type !== 'channel' &&
60
+ this.objects[storeId].type !== 'device' &&
61
+ this.objects[storeId].type !== 'folder')) {
62
+ storeId = mainStateId;
63
+ }
64
+ }
65
+ device.storeId = storeId;
66
+ const channelId = getParentId(storeId);
67
+ if (this.objects[channelId]?.common &&
68
+ (this.objects[channelId].type === 'device' || this.objects[channelId].type === 'channel')) {
69
+ device.channelId = channelId;
70
+ if (this.objects[channelId].type === 'channel') {
71
+ const deviceId = getParentId(channelId);
72
+ if (this.objects[deviceId]?.type === 'device') {
73
+ device.deviceId = deviceId;
74
+ }
75
+ }
76
+ }
77
+ else {
78
+ device.channelId = storeId;
79
+ }
80
+ }
81
+ /**
82
+ * Rebuild enumIds and enumMemberIds by scanning all objects for enums.
83
+ * This is the expensive part — only call when enums are actually changed.
84
+ */
85
+ rebuildEnumMemberIds() {
86
+ this.enumIds = [];
87
+ const ids = [];
88
+ for (const [id, obj] of Object.entries(this.objects)) {
89
+ if (obj.type === 'enum') {
90
+ this.enumIds.push(id);
91
+ const members = obj.common?.members;
92
+ if (members) {
93
+ for (const m of members) {
94
+ if (!ids.includes(m)) {
95
+ ids.push(m);
96
+ }
97
+ }
98
+ }
99
+ }
100
+ }
101
+ this.enumIds.sort();
102
+ this.enumMemberIds = ids;
103
+ }
104
+ rebuildCategories() {
105
+ const structure = {
106
+ [ROOT_CATEGORY]: [],
107
+ };
108
+ const keys = this.getSortedKeys();
109
+ for (const key of keys) {
110
+ if (key < ALIAS) {
111
+ continue;
112
+ }
113
+ if (key > ALIAS_MAX) {
114
+ break;
115
+ }
116
+ if (!this.objects[key]) {
117
+ return;
118
+ }
119
+ if (this.objects[key].type === 'folder') {
120
+ structure[key] ||= [];
121
+ const parent = getParentId(key);
122
+ if (this.objects[parent]?.type === 'folder' || parent === 'alias.0') {
123
+ if (parent === 'alias.0') {
124
+ structure[ROOT_CATEGORY].push(key);
125
+ }
126
+ else {
127
+ structure[parent] ||= [];
128
+ structure[parent].push(key);
129
+ }
130
+ }
131
+ }
132
+ else if (this.objects[key].type === 'device' || this.objects[key].type === 'channel') {
133
+ // get parent
134
+ const parent = getParentId(key);
135
+ if (this.objects[parent]?.type === 'folder' || parent === 'alias.0') {
136
+ if (parent === 'alias.0') {
137
+ structure[ROOT_CATEGORY].push(key);
138
+ }
139
+ else {
140
+ structure[parent] ||= [];
141
+ structure[parent].push(key);
142
+ }
143
+ }
144
+ }
145
+ }
146
+ this.categories = new Map();
147
+ const categories = Object.keys(structure).filter(key => structure[key].length);
148
+ for (const category of categories) {
149
+ const parentId = category === ROOT_CATEGORY ? '' : getParentId(category);
150
+ this.categories.set(category, {
151
+ type: 'category',
152
+ id: category,
153
+ name: this.objects[category]
154
+ ? this.objects[category].common.name || category.split('.').pop() || ''
155
+ : '',
156
+ icon: this.objects[category] ? this.objects[category].common.icon : undefined,
157
+ color: this.objects[category] ? this.objects[category].common.color : undefined,
158
+ parent: category === ROOT_CATEGORY ? undefined : parentId !== 'alias.0' ? parentId : ROOT_CATEGORY,
159
+ custom: category !== ROOT_CATEGORY && this.objects[category]
160
+ ? this.objects[category].common.custom?.[this.adapter.namespace]
161
+ : undefined,
162
+ });
163
+ }
164
+ // Remove all orphan categories
165
+ for (const [id, category] of this.categories) {
166
+ if (category.parent && !this.categories.has(category.parent)) {
167
+ this.categories.delete(id);
168
+ }
169
+ }
170
+ }
171
+ /**
172
+ * Rebuild idsInEnums by adding alias/linkeddevices channels/devices
173
+ * not already covered by enumMemberIds. Cheap — only scans the relevant key range.
174
+ */
175
+ rebuildAliasIds() {
176
+ const ids = [...this.enumMemberIds];
177
+ const keys = this.getSortedKeys();
178
+ const END = `${LINKEDDEVICES}\u9999`;
179
+ for (const key of keys) {
180
+ if (key < ALIAS) {
181
+ continue;
182
+ }
183
+ if (key > END) {
184
+ break;
185
+ }
186
+ if ((key.startsWith(ALIAS) || key.startsWith(LINKEDDEVICES)) && this.objects[key] && !ids.includes(key)) {
187
+ if (this.objects[key].type === 'device') {
188
+ ids.push(key);
189
+ }
190
+ else if (this.objects[key].type === 'channel') {
191
+ const parentId = getParentId(key);
192
+ if (!this.objects[parentId] || !ids.includes(parentId)) {
193
+ ids.push(key);
194
+ }
195
+ }
196
+ }
197
+ }
198
+ this.idsInEnums = ids.sort();
199
+ }
200
+ /**
201
+ * Full rebuild of idsInEnums (enum scan + alias scan). Only used for initial load.
202
+ */
203
+ rebuildIdsInEnums() {
204
+ this.rebuildEnumMemberIds();
205
+ this.rebuildAliasIds();
206
+ this.rebuildCategories();
207
+ }
208
+ /**
209
+ * Run ChannelDetector.detect() only for the given IDs. Returns newly detected devices.
210
+ */
211
+ detectForIds(ids) {
212
+ if (!ids.length) {
213
+ return [];
214
+ }
215
+ const keys = this.getSortedKeys();
216
+ const usedIds = [];
217
+ const result = [];
218
+ for (const id of ids) {
219
+ const detected = this.detector.detect({
220
+ id,
221
+ objects: this.objects,
222
+ _usedIdsOptional: usedIds,
223
+ _keysOptional: keys,
224
+ ignoreCache: true,
225
+ });
226
+ if (detected) {
227
+ for (const device of detected) {
228
+ const d = device;
229
+ this.resolveChannelId(d);
230
+ if (d.storeId) {
231
+ result.push(d);
232
+ break; // ignore "smaller" devices
233
+ }
234
+ }
235
+ }
236
+ }
237
+ return result;
238
+ }
239
+ /**
240
+ * Remove devices from allDevices whose channelId matches any of the given IDs.
241
+ */
242
+ removeDevicesForChannelIds(channelIds) {
243
+ if (!channelIds.length) {
244
+ return;
245
+ }
246
+ const set = new Set(channelIds);
247
+ this.allDevices = this.allDevices.filter(d => !set.has(d.storeId));
248
+ }
249
+ findIdInEnums(lookForId) {
250
+ // Try to find room, to which this device belongs to
251
+ let useEnum = '';
252
+ for (const enumId of this.enumIds) {
253
+ if (enumId.startsWith('enum.rooms.')) {
254
+ const enumObj = this.objects[enumId];
255
+ if (enumObj?.common?.members?.includes(lookForId) ||
256
+ enumObj?.common?.members?.find(id => id.startsWith(`${lookForId}.`))) {
257
+ useEnum = enumId;
258
+ }
259
+ }
260
+ }
261
+ if (!useEnum) {
262
+ for (const enumId of this.enumIds) {
263
+ if (enumId.startsWith('enum.functions.')) {
264
+ const enumObj = this.objects[enumId];
265
+ if (enumObj?.common?.members?.includes(lookForId) ||
266
+ enumObj?.common?.members?.find(id => id.startsWith(`${lookForId}.`))) {
267
+ useEnum = enumId;
268
+ }
269
+ }
270
+ }
271
+ }
272
+ if (!useEnum) {
273
+ for (const enumId of this.enumIds) {
274
+ const enumObj = this.objects[enumId];
275
+ if (enumObj?.common?.members?.includes(lookForId) ||
276
+ enumObj?.common?.members?.find(id => id.startsWith(`${lookForId}.`))) {
277
+ useEnum = enumId;
278
+ }
279
+ }
280
+ }
281
+ return useEnum;
282
+ }
283
+ /**
284
+ * Rebuild enabledDevices from allDevices (cheap, no I/O, no detection).
285
+ * Only devices with `common.custom[namespace].enabled === true` are included.
286
+ */
287
+ rebuildEnabledDevices() {
288
+ const customKey = this.adapter.namespace;
289
+ this.enabledDevices = this.allDevices.filter(d => d.storeId && this.objects[d.storeId]?.common?.custom?.[customKey]?.enabled);
290
+ // Special case: the devices not from alias.0
291
+ for (const device of this.enabledDevices) {
292
+ // try to find a parent category
293
+ let parentId = getParentId(device.storeId);
294
+ if (parentId && this.categories?.has(parentId)) {
295
+ device.parentId = parentId;
296
+ continue;
297
+ }
298
+ if (parentId.startsWith(ALIAS) || parentId.startsWith(LINKEDDEVICES)) {
299
+ device.parentId = parentId;
300
+ let parentCategoryId = getParentId(parentId);
301
+ // Create virtual category
302
+ this.categories?.set(parentId, {
303
+ type: 'category',
304
+ id: parentId,
305
+ name: this.objects[parentId]
306
+ ? this.objects[parentId].common.name || parentId.split('.').pop() || ''
307
+ : '',
308
+ icon: this.objects[parentId] ? this.objects[parentId].common.icon : undefined,
309
+ color: this.objects[parentId] ? this.objects[parentId].common.color : undefined,
310
+ parent: parentCategoryId === 'alias.0' ? ROOT_CATEGORY : parentCategoryId,
311
+ custom: this.objects[parentId]?.common.custom?.[this.adapter.namespace],
312
+ });
313
+ parentId = parentCategoryId;
314
+ parentCategoryId = getParentId(parentId);
315
+ while (parentId !== 'alias.0' && parentId && !this.categories?.has(parentId)) {
316
+ // Create virtual category
317
+ this.categories?.set(parentId, {
318
+ type: 'category',
319
+ id: parentId,
320
+ name: this.objects[parentId]
321
+ ? this.objects[parentId].common.name || parentId.split('.').pop() || ''
322
+ : '',
323
+ icon: this.objects[parentId] ? this.objects[parentId].common.icon : undefined,
324
+ color: this.objects[parentId] ? this.objects[parentId].common.color : undefined,
325
+ parent: parentCategoryId === 'alias.0' ? ROOT_CATEGORY : parentCategoryId,
326
+ custom: this.objects[parentId]?.common.custom?.[this.adapter.namespace],
327
+ });
328
+ parentId = parentCategoryId;
329
+ parentCategoryId = getParentId(parentId);
330
+ }
331
+ }
332
+ else {
333
+ // Try to find room, to which this device belongs to
334
+ let useEnum = this.findIdInEnums(device.storeId);
335
+ useEnum ||= this.findIdInEnums(device.channelId);
336
+ useEnum ||= this.findIdInEnums(device.deviceId);
337
+ if (useEnum) {
338
+ device.parentId = useEnum;
339
+ let parentCategoryId = getParentId(useEnum);
340
+ // if no parent category, assign to root
341
+ this.categories?.set(useEnum, {
342
+ type: 'category',
343
+ id: useEnum,
344
+ name: this.objects[useEnum]
345
+ ? this.objects[useEnum].common.name || useEnum.split('.').pop() || ''
346
+ : '',
347
+ icon: this.objects[useEnum] ? this.objects[useEnum].common.icon : undefined,
348
+ color: this.objects[useEnum] ? this.objects[useEnum].common.color : undefined,
349
+ parent: parentCategoryId.split('.').length > 2 ? parentCategoryId : ROOT_CATEGORY,
350
+ custom: this.objects[useEnum]?.common.custom?.[this.adapter.namespace],
351
+ });
352
+ parentId = parentCategoryId;
353
+ parentCategoryId = getParentId(parentId);
354
+ while (parentId.split('.').length > 2 && parentId && !this.categories?.has(parentId)) {
355
+ // Create virtual category
356
+ this.categories?.set(parentId, {
357
+ type: 'category',
358
+ id: parentId,
359
+ name: this.objects[parentId]
360
+ ? this.objects[parentId].common.name || parentId.split('.').pop() || ''
361
+ : '',
362
+ icon: this.objects[parentId] ? this.objects[parentId].common.icon : undefined,
363
+ color: this.objects[parentId] ? this.objects[parentId].common.color : undefined,
364
+ parent: parentCategoryId.split('.').length > 2 ? parentCategoryId : ROOT_CATEGORY,
365
+ custom: this.objects[parentId]?.common.custom?.[this.adapter.namespace],
366
+ });
367
+ parentId = parentCategoryId;
368
+ parentCategoryId = getParentId(parentId);
369
+ }
370
+ }
371
+ else {
372
+ this.adapter.log.warn(`Cannot find parent for "${device.storeId}"!`);
373
+ }
374
+ }
375
+ }
376
+ }
377
+ /**
378
+ * For a given changed object ID, find the detection IDs (from idsInEnums) that are affected.
379
+ * A state change affects its parent channel/device.
380
+ */
381
+ getAffectedChannelIds(id) {
382
+ // Direct match in idsInEnums
383
+ if (this.idsInEnums.includes(id)) {
384
+ return [id];
385
+ }
386
+ // Parent is a detection ID (state changed under a channel)
387
+ const parentId = getParentId(id);
388
+ if (parentId && this.idsInEnums.includes(parentId)) {
389
+ return [parentId];
390
+ }
391
+ // Grandparent (state under device>channel hierarchy)
392
+ const grandParentId = getParentId(parentId);
393
+ if (grandParentId && this.idsInEnums.includes(grandParentId)) {
394
+ return [grandParentId];
395
+ }
396
+ // Check if any existing device references this ID in its states
397
+ const affected = [];
398
+ for (const device of this.allDevices) {
399
+ if (device.storeId === id || device.states.some(s => s.id === id)) {
400
+ if (!affected.includes(device.storeId)) {
401
+ affected.push(device.storeId);
402
+ }
403
+ }
404
+ }
405
+ return affected;
406
+ }
407
+ // ── GUI notification ───────────────────────────────────────────────
408
+ /**
409
+ * Debounced GUI notification (100ms) to batch rapid changes.
410
+ */
411
+ scheduleNotify() {
412
+ if (this.notifyTimeout) {
413
+ clearTimeout(this.notifyTimeout);
414
+ }
415
+ this.notifyTimeout = setTimeout(async () => {
416
+ this.notifyTimeout = null;
417
+ try {
418
+ await this.sendCommandToGui({ command: 'all' });
419
+ }
420
+ catch {
421
+ // GUI may not be open — ignore
422
+ }
423
+ }, 100);
424
+ }
425
+ // ── Object change (incremental) ───────────────────────────────────
426
+ objectChange(id, obj) {
427
+ const oldObj = this.objects[id];
428
+ if (!oldObj && !obj) {
429
+ return;
430
+ }
431
+ // Update local cache
432
+ if (obj) {
433
+ this.objects[id] = obj;
434
+ }
435
+ else {
436
+ delete this.objects[id];
437
+ }
438
+ this.invalidateKeys();
439
+ // Case 1: Enum changed — rebuild enum member IDs + alias IDs, detect only the diff
440
+ if (oldObj?.type === 'enum' || obj?.type === 'enum' || obj?.type === 'folder' || oldObj?.type === 'folder') {
441
+ const oldIds = [...this.idsInEnums];
442
+ this.rebuildEnumMemberIds();
443
+ if (obj?.type === 'folder' || oldObj?.type === 'folder') {
444
+ this.rebuildCategories();
445
+ }
446
+ this.rebuildAliasIds();
447
+ const removed = oldIds.filter(x => !this.idsInEnums.includes(x));
448
+ const added = this.idsInEnums.filter(x => !oldIds.includes(x));
449
+ if (removed.length) {
450
+ this.removeDevicesForChannelIds(removed);
451
+ }
452
+ if (added.length) {
453
+ this.allDevices.push(...this.detectForIds(added));
454
+ }
455
+ this.rebuildEnabledDevices();
456
+ this.scheduleNotify();
457
+ return;
458
+ }
459
+ // Case 2: Object under alias.* or linkeddevices.* — only alias scan needed, enum members unchanged
460
+ if (id.startsWith(ALIAS) || id.startsWith(LINKEDDEVICES)) {
461
+ const oldIds = [...this.idsInEnums];
462
+ this.rebuildAliasIds();
463
+ const affected = this.getAffectedChannelIds(id);
464
+ const removedFromEnums = oldIds.filter(x => !this.idsInEnums.includes(x));
465
+ const addedToEnums = this.idsInEnums.filter(x => !oldIds.includes(x));
466
+ const toRemove = [...new Set([...affected, ...removedFromEnums])];
467
+ this.removeDevicesForChannelIds(toRemove);
468
+ const toDetect = [...new Set([...affected.filter(x => this.idsInEnums.includes(x)), ...addedToEnums])];
469
+ if (toDetect.length) {
470
+ this.allDevices.push(...this.detectForIds(toDetect));
471
+ }
472
+ this.rebuildEnabledDevices();
473
+ this.scheduleNotify();
474
+ return;
475
+ }
476
+ // Case 3: Only the enabled flag changed — just rebuild the filter (no detection)
477
+ const customKey = this.adapter.namespace;
478
+ const oldEnabled = oldObj?.common?.custom?.[customKey]?.enabled;
479
+ const newEnabled = obj?.common?.custom?.[customKey]?.enabled;
480
+ if (oldEnabled !== newEnabled) {
481
+ this.rebuildEnabledDevices();
482
+ this.scheduleNotify();
483
+ return;
484
+ }
485
+ // Case 4: Object referenced by idsInEnums or existing device changed
486
+ const affected = this.getAffectedChannelIds(id);
487
+ if (affected.length) {
488
+ this.removeDevicesForChannelIds(affected);
489
+ if (obj) {
490
+ this.allDevices.push(...this.detectForIds(affected));
491
+ }
492
+ this.rebuildEnabledDevices();
493
+ this.scheduleNotify();
494
+ }
495
+ }
496
+ // ── Initial full detection (called once) ──────────────────────────
497
+ async initialLoad() {
498
+ // Read all objects from DB — only done ONCE
499
+ const res = await this.adapter.getObjectListAsync({ include_docs: true });
500
+ const rows = res?.rows || [];
501
+ for (const row of rows) {
502
+ this.objects[row.doc._id] = row.doc;
503
+ }
504
+ this.invalidateKeys();
505
+ // Build idsInEnums
506
+ this.rebuildIdsInEnums();
507
+ // Detect ALL devices
508
+ this.allDevices = this.detectForIds(this.idsInEnums);
509
+ // Filter enabled
510
+ this.rebuildEnabledDevices();
511
+ // Subscribe to all object changes for incremental updates
512
+ await this.adapter.subscribeForeignObjectsAsync('*');
513
+ }
514
+ // ── loadDevices (called by dm-utils framework) ────────────────────
515
+ async loadItems() {
516
+ if (!this.loaded) {
517
+ this.loaded = this.initialLoad();
518
+ }
519
+ await this.loaded;
520
+ this.widgets = new Map();
521
+ for (const device of this.enabledDevices) {
522
+ const obj = this.objects[device.storeId];
523
+ if (!obj) {
524
+ continue;
525
+ }
526
+ const name = typeof obj.common.name === 'object'
527
+ ? obj.common.name[this.adapter.language || 'en'] || obj.common.name.en || device.storeId
528
+ : obj.common.name || device.storeId;
529
+ const icon = obj.common.icon || undefined;
530
+ const color = obj.common.color || undefined;
531
+ // delete all empty states
532
+ for (let i = device.states.length - 1; i >= 0; i--) {
533
+ // delete empty lines
534
+ if (!device.states[i].id) {
535
+ device.states.splice(i, 1);
536
+ continue;
537
+ }
538
+ // We must deliver role, as in some widgets it is used to determine the widget type
539
+ device.states[i].stateRole = this.objects[device.states[i].id]?.common?.role;
540
+ /** Remove useless for GUI information */
541
+ if (device.states[i].original) {
542
+ delete device.states[i].original;
543
+ }
544
+ if (device.states[i].role) {
545
+ delete device.states[i].role;
546
+ }
547
+ if (device.states[i].channelRole) {
548
+ delete device.states[i].channelRole;
549
+ }
550
+ if (device.states[i].ignoreRole) {
551
+ delete device.states[i].ignoreRole;
552
+ }
553
+ if (device.states[i].statesDefined) {
554
+ delete device.states[i].statesDefined;
555
+ }
556
+ if (device.states[i].searchInParent) {
557
+ delete device.states[i].searchInParent;
558
+ }
559
+ if (device.states[i].enums) {
560
+ delete device.states[i].enums;
561
+ }
562
+ if (device.states[i].noDeviceDetection) {
563
+ delete device.states[i].noDeviceDetection;
564
+ }
565
+ if (device.states[i].multiple) {
566
+ delete device.states[i].multiple;
567
+ }
568
+ if (device.states[i].stateName) {
569
+ delete device.states[i].stateName;
570
+ }
571
+ if (device.states[i].objectType) {
572
+ delete device.states[i].objectType;
573
+ }
574
+ if (device.states[i].state) {
575
+ delete device.states[i].state;
576
+ }
577
+ }
578
+ // Support of categories only in aliases.
579
+ const customData = obj.common.custom?.[this.adapter.namespace];
580
+ this.widgets.set(device.storeId, {
581
+ type: 'widget',
582
+ id: device.storeId,
583
+ name,
584
+ icon,
585
+ color,
586
+ parent: customData?.parent || device.parentId,
587
+ control: {
588
+ type: device.type,
589
+ states: device.states,
590
+ storeId: '',
591
+ parentId: '',
592
+ deviceId: '',
593
+ channelId: '',
594
+ },
595
+ custom: obj.common.custom?.[this.adapter.namespace],
596
+ });
597
+ }
598
+ let someDeleted = false;
599
+ do {
600
+ someDeleted = false;
601
+ // go through all categories and remove the empty one (except root)
602
+ this.categories?.forEach((category, id) => {
603
+ if (id === ROOT_CATEGORY) {
604
+ return;
605
+ }
606
+ let empty = true;
607
+ this.widgets?.forEach(widget => {
608
+ if (widget.parent === id) {
609
+ empty = false;
610
+ return;
611
+ }
612
+ });
613
+ this.categories?.forEach(c => {
614
+ if (c.parent === id) {
615
+ empty = false;
616
+ return;
617
+ }
618
+ });
619
+ if (empty) {
620
+ this.categories?.delete(id);
621
+ }
622
+ });
623
+ } while (someDeleted);
624
+ }
625
+ }
626
+ exports.default = DevicesWidgetsManagement;
627
+ //# sourceMappingURL=WidgetsManagement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WidgetsManagement.js","sourceRoot":"","sources":["../../src/lib/WidgetsManagement.ts"],"names":[],"mappings":"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"}