@iobroker/dm-gui-components 9.1.6 → 9.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/build/DeviceList.d.ts +7 -0
- package/build/DeviceList.js +31 -10
- package/build/DeviceList.js.map +1 -1
- package/build/DeviceStatus.js +18 -3
- package/build/DeviceStatus.js.map +1 -1
- package/build/i18n/de.json +1 -0
- package/build/i18n/en.json +1 -0
- package/build/i18n/es.json +1 -0
- package/build/i18n/fr.json +1 -0
- package/build/i18n/it.json +1 -0
- package/build/i18n/nl.json +1 -0
- package/build/i18n/pl.json +1 -0
- package/build/i18n/pt.json +1 -0
- package/build/i18n/ru.json +1 -0
- package/build/i18n/uk.json +1 -0
- package/build/i18n/zh-cn.json +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
package/build/DeviceList.d.ts
CHANGED
|
@@ -52,6 +52,13 @@ export default class DeviceList extends Communication<DeviceListProps, DeviceLis
|
|
|
52
52
|
static i18nInitialized: boolean;
|
|
53
53
|
private lastInstance;
|
|
54
54
|
private lastAliveSubscribe;
|
|
55
|
+
/**
|
|
56
|
+
* Synchronous mirror of `state.alive`. `setState` is asynchronous, so the guard in `aliveHandler`
|
|
57
|
+
* cannot rely on `state.alive` being committed yet when `subscribeState` replays the current value.
|
|
58
|
+
* This field is always updated synchronously together with `setState({ alive })` and is the source
|
|
59
|
+
* of truth for the "did alive actually change?" check, which prevents the double device load.
|
|
60
|
+
*/
|
|
61
|
+
private alive;
|
|
55
62
|
private lastTriggerLoad;
|
|
56
63
|
private filterTimeout;
|
|
57
64
|
/** Resolved model value per device (stringified id -> model), reported by the cards to build the model dropdown */
|
package/build/DeviceList.js
CHANGED
|
@@ -32,6 +32,13 @@ export default class DeviceList extends Communication {
|
|
|
32
32
|
static i18nInitialized = false;
|
|
33
33
|
lastInstance;
|
|
34
34
|
lastAliveSubscribe = '';
|
|
35
|
+
/**
|
|
36
|
+
* Synchronous mirror of `state.alive`. `setState` is asynchronous, so the guard in `aliveHandler`
|
|
37
|
+
* cannot rely on `state.alive` being committed yet when `subscribeState` replays the current value.
|
|
38
|
+
* This field is always updated synchronously together with `setState({ alive })` and is the source
|
|
39
|
+
* of truth for the "did alive actually change?" check, which prevents the double device load.
|
|
40
|
+
*/
|
|
41
|
+
alive = null;
|
|
35
42
|
lastTriggerLoad = 0;
|
|
36
43
|
filterTimeout = null;
|
|
37
44
|
/** Resolved model value per device (stringified id -> model), reported by the cards to build the model dropdown */
|
|
@@ -134,6 +141,7 @@ export default class DeviceList extends Communication {
|
|
|
134
141
|
backToInstancesList() {
|
|
135
142
|
window.localStorage.removeItem('dmSelectedInstance');
|
|
136
143
|
this.props.onInstanceChanged?.('');
|
|
144
|
+
this.alive = null;
|
|
137
145
|
this.setState({
|
|
138
146
|
selectedInstance: '',
|
|
139
147
|
devices: [],
|
|
@@ -156,7 +164,7 @@ export default class DeviceList extends Communication {
|
|
|
156
164
|
// show instance selector
|
|
157
165
|
await this.loadAdapters();
|
|
158
166
|
}
|
|
159
|
-
if (this.
|
|
167
|
+
if (this.alive === null && this.state.selectedInstance) {
|
|
160
168
|
try {
|
|
161
169
|
// check if the instance is alive
|
|
162
170
|
const stateAlive = await this.props.socket.getState(`system.adapter.${this.state.selectedInstance}.alive`);
|
|
@@ -167,11 +175,16 @@ export default class DeviceList extends Communication {
|
|
|
167
175
|
catch (error) {
|
|
168
176
|
console.error(error);
|
|
169
177
|
}
|
|
178
|
+
// Update the synchronous mirror BEFORE subscribing. `subscribeState` replays the current
|
|
179
|
+
// value to `aliveHandler`; with `this.alive` already set, that replay is recognized as
|
|
180
|
+
// "no change" and does not trigger a second `loadAllData()` in addition to the one below.
|
|
181
|
+
this.alive = alive;
|
|
170
182
|
this.lastAliveSubscribe = this.state.selectedInstance;
|
|
171
|
-
this.setState({ alive }
|
|
183
|
+
this.setState({ alive });
|
|
184
|
+
await this.props.socket.subscribeState(`system.adapter.${this.state.selectedInstance}.alive`, this.aliveHandler);
|
|
172
185
|
}
|
|
173
|
-
else if (this.
|
|
174
|
-
alive = this.
|
|
186
|
+
else if (this.alive !== null) {
|
|
187
|
+
alive = this.alive;
|
|
175
188
|
}
|
|
176
189
|
if (alive) {
|
|
177
190
|
try {
|
|
@@ -190,10 +203,15 @@ export default class DeviceList extends Communication {
|
|
|
190
203
|
aliveHandler = (id, state) => {
|
|
191
204
|
if (this.state.selectedInstance && id === `system.adapter.${this.state.selectedInstance}.alive`) {
|
|
192
205
|
const alive = !!state?.val;
|
|
193
|
-
|
|
206
|
+
// Compare against the synchronous mirror, not `state.alive` (which may not be committed yet
|
|
207
|
+
// when `subscribeState` replays the initial value). This is what stops the double load.
|
|
208
|
+
if (alive !== this.alive) {
|
|
209
|
+
this.alive = alive;
|
|
194
210
|
this.setState({ alive }, () => {
|
|
195
211
|
if (alive) {
|
|
196
|
-
|
|
212
|
+
// The instance just became alive: (re)load all data directly instead of
|
|
213
|
+
// re-running the whole mount logic.
|
|
214
|
+
this.loadAllData().catch(console.error);
|
|
197
215
|
}
|
|
198
216
|
});
|
|
199
217
|
}
|
|
@@ -213,7 +231,7 @@ export default class DeviceList extends Communication {
|
|
|
213
231
|
loadDeviceList() {
|
|
214
232
|
this.setState({ loading: true }, async () => {
|
|
215
233
|
console.log(`Loading devices for ${this.state.selectedInstance}...`);
|
|
216
|
-
let alive = this.
|
|
234
|
+
let alive = this.alive;
|
|
217
235
|
if (this.state.selectedInstance !== this.lastAliveSubscribe) {
|
|
218
236
|
if (this.lastAliveSubscribe) {
|
|
219
237
|
// unsubscribe from the old instance
|
|
@@ -224,13 +242,15 @@ export default class DeviceList extends Communication {
|
|
|
224
242
|
try {
|
|
225
243
|
// check if the instance is alive
|
|
226
244
|
const stateAlive = await this.props.socket.getState(`system.adapter.${this.state.selectedInstance}.alive`);
|
|
227
|
-
|
|
228
|
-
alive = true;
|
|
229
|
-
}
|
|
245
|
+
alive = !!stateAlive?.val;
|
|
230
246
|
}
|
|
231
247
|
catch (error) {
|
|
232
248
|
console.error(error);
|
|
249
|
+
alive = false;
|
|
233
250
|
}
|
|
251
|
+
// Set the synchronous mirror before subscribing so the replayed initial value
|
|
252
|
+
// does not trigger an extra load on top of the one performed right below.
|
|
253
|
+
this.alive = alive;
|
|
234
254
|
await this.props.socket.subscribeState(`system.adapter.${this.state.selectedInstance}.alive`, this.aliveHandler);
|
|
235
255
|
}
|
|
236
256
|
else {
|
|
@@ -239,6 +259,7 @@ export default class DeviceList extends Communication {
|
|
|
239
259
|
}
|
|
240
260
|
let devices = [];
|
|
241
261
|
try {
|
|
262
|
+
this.alive = alive;
|
|
242
263
|
this.setState({ devices, loading: !!alive, alive });
|
|
243
264
|
if (alive) {
|
|
244
265
|
await this.loadDevices((batch, total) => {
|
package/build/DeviceList.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceList.js","sourceRoot":"./src/","sources":["DeviceList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AACxC,OAAO,EACH,UAAU,EACV,cAAc,EACd,SAAS,EACT,OAAO,EACP,OAAO,EACP,cAAc,EACd,MAAM,EACN,QAAQ,EACR,GAAG,EACH,IAAI,EACJ,cAAc,EACd,WAAW,EACX,UAAU,GACb,MAAM,eAAe,CAAC;AAEvB,OAAO,EACH,SAAS,EACT,KAAK,EACL,YAAY,EACZ,OAAO,EACP,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,GACf,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAGjF,OAAO,UAAU,EAAE,EAAE,kBAAkB,EAA0B,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,aAAmE,MAAM,iBAAiB,CAAC;AAClG,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,IAAI,MAAM,mBAAmB,CAAC;AAErC,+EAA+E;AAC/E,SAAS,gBAAgB,CAAC,MAAsC;IAC5D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;AACxF,CAAC;AAyCD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,aAA+C;IACnF,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC;IAEvB,YAAY,CAAS;IAErB,kBAAkB,GAAG,EAAE,CAAC;IAExB,eAAe,GAAG,CAAC,CAAC;IAEpB,aAAa,GAAyC,IAAI,CAAC;IAEnE,mHAAmH;IAClG,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAExC,QAAQ,GAAuB,IAAI,CAAC,WAAW,EAAE,CAAC;IAEnE,YAAY,KAAsB;QAC9B,KAAK,CAAC,KAAK,CAAC,CAAC;QAEb,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;YAC9B,UAAU,CAAC,eAAe,GAAG,IAAI,CAAC;YAClC,IAAI,CAAC,kBAAkB,CAAC;gBACpB,EAAE;gBACF,EAAE;gBACF,EAAE;gBACF,EAAE;gBACF,EAAE;gBACF,EAAE;gBACF,EAAE;gBACF,EAAE;gBACF,EAAE;gBACF,EAAE;gBACF,OAAO,EAAE,IAAI;aAChB,CAAC,CAAC;QACP,CAAC;QAED,IAAI,CAAC,KAAK,GAAG;YACT,GAAG,IAAI,CAAC,KAAK;YACb,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,EAAE;YACV,UAAU,EAAE,EAAE;YACd,YAAY,EAAE,IAAI;YAClB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,EAAE;YACZ,WAAW,EAAE,IAAI;YACjB,eAAe,EAAE,KAAK;YACtB,aAAa,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,MAAM;YACzE,kBAAkB,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,uBAAuB,CAAC,KAAK,MAAM;YACnF,WAAW,EAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAuB,IAAI,MAAM;YAC3F,YAAY,EAAE,EAAE;SACnB,CAAC;QAEF,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YAC5C,6DAA6D;YAC7D,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QAChF,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;QAChD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,aAAa,CAAC,KAA+B;QACzC,OAAO,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAwB,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1F,CAAC;IAEO,KAAK,CAAC,YAAY;QACtB,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAEjD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,iBAAiB,EAAE,uBAAuB,CAAC,CAAC;QAChH,MAAM,WAAW,GAAkF,EAAE,CAAC;QACtG,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,CAAC;gBACnD,SAAS;YACb,CAAC;YAED,MAAM,YAAY,GAAG,EAAE,CAAC,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC5D,IAAI,CAAC;gBACD,4DAA4D;gBAC5D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,YAAY,QAAQ,CAAC,CAAC;gBACvF,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;oBACd,SAAS;gBACb,CAAC;gBAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;gBACrE,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;gBAC9B,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/C,WAAW,CAAC,YAAY,CAAC,GAAG;oBACxB,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,WAAW;oBACtF,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,WAAW,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;oBACpF,QAAQ;iBACX,CAAC;YACN,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;QACL,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,2EAA2E;YAC3E,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,IAAI,CAAC,aAAa,CAAC;gBACrB,WAAW;gBACX,gBAAgB;gBAChB,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,gBAAgB,EAAE,CAAC,IAAI,EAAE;aAC9E,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC;IAEO,cAAc,CAAC,UAAkB;QACrC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC;YACV,gBAAgB,EAAE,UAAU;YAC5B,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,UAAU,EAAE,CAAC,IAAI,EAAE;SACxE,CAAC,CAAC;IACP,CAAC;IAEO,mBAAmB;QACvB,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC;YACV,gBAAgB,EAAE,EAAE;YACpB,OAAO,EAAE,EAAE;YACX,YAAY,EAAE,SAAS;YACvB,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE;YACV,UAAU,EAAE,EAAE;YACd,eAAe,EAAE,KAAK;SACzB,CAAC,CAAC;IACP,CAAC;IAEO,mBAAmB;QACvB,IAAI,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,KAAK,CAAC,iBAAiB;QACnB,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,wCAAwC;QACxC,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YAC5C,yBAAyB;YACzB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC9B,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACD,iCAAiC;gBACjC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAC/C,kBAAkB,IAAI,CAAC,KAAK,CAAC,gBAAgB,QAAQ,CACxD,CAAC;gBACF,IAAI,UAAU,EAAE,GAAG,EAAE,CAAC;oBAClB,KAAK,GAAG,IAAI,CAAC;gBACjB,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;YACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;YACtD,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAC5B,kBAAkB,IAAI,CAAC,KAAK,CAAC,gBAAgB,QAAQ,EACrD,IAAI,CAAC,YAAY,CACpB,CACJ,CAAC;QACN,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACnC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7B,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACR,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAC7B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;QACL,CAAC;IACL,CAAC;IAED,oBAAoB;QAChB,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAC9B,kBAAkB,IAAI,CAAC,KAAK,CAAC,gBAAgB,QAAQ,EACrD,IAAI,CAAC,YAAY,CACpB,CAAC;QACN,CAAC;IACL,CAAC;IAED,YAAY,GAAgC,CAAC,EAAU,EAAE,KAAwC,EAAQ,EAAE;QACvG,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE,KAAK,kBAAkB,IAAI,CAAC,KAAK,CAAC,gBAAgB,QAAQ,EAAE,CAAC;YAC9F,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC;YAC3B,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC7B,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE;oBAC1B,IAAI,KAAK,EAAE,CAAC;wBACR,IAAI,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAClD,CAAC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IAEO,KAAK,CAAC,WAAW;QACtB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/B,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC;IAEQ,KAAK,CAAC,iBAAiB;QAC5B,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,iBAAiB,EAAE,CAAC;QACrD,OAAO,IAAI,OAAO,CAAkB,OAAO,CAAC,EAAE,CAC1C,IAAI,CAAC,QAAQ,CACT,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,EACxF,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAC9B,CACJ,CAAC;IACN,CAAC;IAED;;OAEG;IACM,cAAc;QACnB,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI,EAAE;YACxC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,CAAC;YACrE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YAE7B,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,KAAK,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC1D,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC1B,oCAAoC;oBACpC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAC9B,kBAAkB,IAAI,CAAC,kBAAkB,QAAQ,EACjD,IAAI,CAAC,YAAY,CACpB,CAAC;gBACN,CAAC;gBAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;gBAEtD,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;oBAC9B,IAAI,CAAC;wBACD,iCAAiC;wBACjC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAC/C,kBAAkB,IAAI,CAAC,KAAK,CAAC,gBAAgB,QAAQ,CACxD,CAAC;wBACF,IAAI,UAAU,EAAE,GAAG,EAAE,CAAC;4BAClB,KAAK,GAAG,IAAI,CAAC;wBACjB,CAAC;oBACL,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACzB,CAAC;oBACD,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAClC,kBAAkB,IAAI,CAAC,KAAK,CAAC,gBAAgB,QAAQ,EACrD,IAAI,CAAC,YAAY,CACpB,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACJ,KAAK,GAAG,KAAK,CAAC;gBAClB,CAAC;YACL,CAAC;YAED,IAAI,OAAO,GAAiB,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACD,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBACpD,IAAI,KAAK,EAAE,CAAC;oBACR,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;wBACpC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBAChC,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;wBAC/D,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,MAAM,OAAO,KAAK,aAAa,CAAC,CAAC;oBACnE,CAAC,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACrB,OAAO,GAAG,EAAE,CAAC;YACjB,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,MAAM,gBAAgB,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;IACP,CAAC;IAEQ,YAAY,CAAC,MAAkB;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9G,CAAC;IAEQ,YAAY,CAAC,QAAkB;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC;QAClF,MAAM,YAAY,GACd,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM;YACjE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC;YAC7B,CAAC,CAAC,SAAS,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,CAAC,IAAiC;QACrC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;QAC1C,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,kBAAkB,CAAC,MAAc;QAC7B,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9B,CAAC,EAAE,GAAG,CAAC,CAAC;IACZ,CAAC;IAED,YAAY,CACR,MAA8G;QAE9G,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,CACH,oBAAC,MAAM,IACH,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,EACvD,OAAO,EAAC,UAAU,EAClB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,GAAG,EACjC,WAAW,EAAE,KAAK,CAAC,EAAE;gBACjB,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;oBAChB,KAAK,GAAG,EAAE,CAAC;gBACf,CAAC;gBACD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;gBAC9C,OAAO,CACH,6BAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE;oBACxD,CAAC,EAAE,IAAI,IAAI,6BAAK,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAI;oBACxC,CAAC,EAAE,IAAI,IAAI,KAAK,CACf,CACT,CAAC;YACN,CAAC,EACD,QAAQ,EAAE,CAAC,CAAC,EAAE;gBACV,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC3F,CAAC;qBAAM,CAAC;oBACJ,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBAC9E,CAAC;gBACD,IAAI,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9E,CAAC,IAEA,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CACb,oBAAC,QAAQ,IACL,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,GAAG,EACrB,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI,GAAG,EACnB,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE;YAEvD,CAAC,CAAC,IAAI,IAAI,6BAAK,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAI;YACvC,CAAC,CAAC,IAAI,CACA,CACd,CAAC,CACG,CACZ,CAAC;IACN,CAAC;IAED,mBAAmB;QACf,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YAC1B,OAAO;gBACH,oBAAC,cAAc,IACX,GAAG,EAAC,kBAAkB,EACtB,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAC1B;aACL,CAAC;QACN,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO;gBACH,6BACI,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EACtB,GAAG,EAAC,aAAa;oBAEjB,kCAAO,cAAc,CAAC,sBAAsB,CAAC,CAAQ,CACnD;aACT,CAAC;QACN,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAEzF,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACxB,OAAO,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAY,CAAC,EAAE,CAAC,CAAC;gBACzC,OAAO,CACH,oBAAC,IAAI,IACD,GAAG,EAAE,EAAE,EACP,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE;oBAElD,oBAAC,cAAc,IACX,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,EACtC,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;wBAEzB,oBAAC,WAAW,IACR,KAAK,EAAE;gCACH,MAAM,EAAE,MAAM;gCACd,OAAO,EAAE,MAAM;gCACf,UAAU,EAAE,QAAQ;gCACpB,GAAG,EAAE,CAAC;gCACN,OAAO,EAAE,CAAC;6BACb;4BAEA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CACT,oBAAC,IAAI,IACD,GAAG,EAAE,IAAI,CAAC,IAAI,EACd,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,GACjD,CACL,CAAC,CAAC,CAAC,CACA,oBAAC,YAAY,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,GAAI,CACpE;4BACD,6BAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;gCAC9B,oBAAC,UAAU,IACP,OAAO,EAAC,OAAO,EACf,MAAM,QACN,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,IAE1C,EAAE,CACM;gCACZ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACV,oBAAC,UAAU,IACP,OAAO,EAAC,SAAS,EACjB,KAAK,EAAC,eAAe,EACrB,MAAM,QACN,SAAS,EAAC,KAAK,IAEd,IAAI,CAAC,KAAK,CACF,CAChB,CAAC,CAAC,CAAC,IAAI,CACN,CACI,CACD,CACd,CACV,CAAC;YACN,CAAC,CAAC,CAAC;QACP,CAAC;QAED,OAAO,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAY,CAAC,EAAE,CAAC,CAAC;YACzC,OAAO,CACH,oBAAC,IAAI,IACD,GAAG,EAAE,EAAE,EACP,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE;gBAEnD,oBAAC,cAAc,IACX,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,EACtC,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;oBAEzB,oBAAC,WAAW,IACR,KAAK,EAAE;4BACH,MAAM,EAAE,MAAM;4BACd,OAAO,EAAE,MAAM;4BACf,aAAa,EAAE,QAAQ;4BACvB,UAAU,EAAE,QAAQ;4BACpB,GAAG,EAAE,CAAC;yBACT;wBAEA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CACT,oBAAC,IAAI,IACD,GAAG,EAAE,IAAI,CAAC,IAAI,EACd,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAClC,CACL,CAAC,CAAC,CAAC,CACA,oBAAC,YAAY,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAI,CACrD;wBACD,oBAAC,UAAU,IACP,OAAO,EAAC,IAAI,EACZ,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,IAErD,EAAE,CACM;wBACZ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACV,oBAAC,UAAU,IACP,OAAO,EAAC,OAAO,EACf,KAAK,EAAC,eAAe,EACrB,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,IAE7B,IAAI,CAAC,KAAK,CACF,CAChB,CAAC,CAAC,CAAC,IAAI,CACE,CACD,CACd,CACV,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAED,4GAA4G;IACpG,WAAW,GAAG,CAAC,QAAkB,EAAE,KAAyB,EAAQ,EAAE;QAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC;YACR,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;gBACtC,OAAO;YACX,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACJ,OAAO;QACX,CAAC;QACD,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3E,IACI,YAAY,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM;YACtD,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EACvE,CAAC;YACC,IAAI,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;QACpC,CAAC;IACL,CAAC,CAAC;IAEF,oHAAoH;IAC5G,uBAAuB;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;QACrC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACnB,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,mFAAmF;QACnF,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7D,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3F,CAAC;IAED,kBAAkB;QACd,MAAM,MAAM,GAAkD;YAC1D,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE;SACnD,CAAC;QACF,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,EAAE,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC;gBACR,KAAK,EAAE,YAAY;gBACnB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,eAAe,IAAI,IAAI,CAAC;aACxE,CAAC,CAAC;QACP,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,EAAE,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,6EAA6E;QAC7E,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,oFAAoF;QACpF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE/C,OAAO,CACH,oBAAC,MAAM,IACH,OAAO,EAAC,UAAU,EAClB,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,EACpC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE;gBACV,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,KAA0B,CAAC;gBACxD,IAAI,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC/B,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;gBAC3D,0DAA0D;gBAC1D,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;YAChC,CAAC,IAEA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CACjB,oBAAC,QAAQ,IACL,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,GAAG,EAAE,KAAK,CAAC,KAAK,IAEf,KAAK,CAAC,KAAK,CACL,CACd,CAAC,CACG,CACZ,CAAC;IACN,CAAC;IAED,kGAAkG;IAClG,iBAAiB;QACb,IAAI,IAAI,CAAC,uBAAuB,EAAE,KAAK,OAAO,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACnG,OAAO,CACH,oBAAC,MAAM,IACH,OAAO,EAAC,UAAU,EAClB,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACrB,YAAY,QACZ,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAEtD,oBAAC,QAAQ,IAAC,KAAK,EAAC,EAAE;oBACd,gCAAK,cAAc,CAAC,WAAW,CAAC,CAAM,CAC/B;gBACV,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAClC,oBAAC,QAAQ,IACL,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,KAAK,IAET,KAAK,CACC,CACd,CAAC,CACG,CACZ,CAAC;QACN,CAAC;QAED,OAAO,CACH,oBAAC,SAAS,IACN,OAAO,EAAC,UAAU,EAClB,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACrB,IAAI,EAAC,OAAO,EACZ,WAAW,EAAE,cAAc,CAAC,iBAAiB,CAAC,EAC9C,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACtD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAC5B,YAAY,EAAC,KAAK,EAClB,SAAS,EAAE;gBACP,KAAK,EAAE;oBACH,YAAY,EAAE,cAAc;oBAC5B,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAClC,oBAAC,cAAc,IAAC,QAAQ,EAAC,KAAK;wBAC1B,oBAAC,UAAU,IACP,QAAQ,EAAE,CAAC,CAAC,EACZ,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAC1C,IAAI,EAAC,KAAK;4BAEV,oBAAC,KAAK,OAAG,CACA,CACA,CACpB,CAAC,CAAC,CAAC,IAAI;iBACX;gBACD,SAAS,EAAE;oBACP,YAAY,EAAE,KAAK;iBACtB;aACJ,GACH,CACL,CAAC;IACN,CAAC;IAED,cAAc;QACV,+GAA+G;QAC/G,6GAA6G;QAC7G,OAAO,CACH,oBAAC,OAAO,IACJ,GAAG,EAAC,UAAU,EACd,IAAI,EAAC,MAAM,EACX,SAAS,QACT,OAAO,EAAC,mBAAmB,EAC3B,KAAK,EAAE;gBACH,KAAK,EAAE,mBAAmB;gBAC1B,MAAM,EAAE,iBAAiB;gBACzB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO;aAC/C,IAEA,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CACjB,CACb,CAAC;IACN,CAAC;IAED,aAAa;QACT,MAAM,UAAU,GAAwB;YACpC,OAAO,EAAE,EAAE;SACd,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;YACzD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;YACnD,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;YACpD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAChD,UAAU,CAAC,KAAK,IAAmB,EAAE;gBACjC,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;oBAC9B,IAAI,CAAC;wBACD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;oBAC7B,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACzB,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC1B,CAAC;YACL,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,KAAK,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC7F,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAiB,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,YAAY,GACd,EAAE,CAAC;QACP,MAAM,YAAY,GACd,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;QAEtG,IAAI,IAAqC,CAAC;QAC1C,IAAI,YAAY,EAAE,CAAC;YACf,IAAI,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnD,IAAI,GAAG;gBACH,6BACI,KAAK,EAAE,UAAU,EACjB,GAAG,EAAC,UAAU;oBAEd,kCAAO,cAAc,CAAC,kBAAkB,CAAC,CAAQ,CAC/C;aACT,CAAC;QACN,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAC1F,IAAI,GAAG;gBACH,6BACI,KAAK,EAAE,UAAU,EACjB,GAAG,EAAC,UAAU;oBAEd,kCAAO,cAAc,CAAC,oBAAoB,CAAC,CAAQ,CACjD;aACT,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,4BAA4B;YAC5B,IAAI,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9F,YAAY,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;oBACnB,KAAK,EAAE,EAAE;oBACT,KAAK,EAAE,eAAe,CAAC,MAAM;oBAC7B,IAAI,EAAE,oBAAC,YAAY,OAAG;iBACzB,CAAC,CAAC;gBACH,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;oBAC7B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;wBACnE,IAAI,IAAI,EAAE,CAAC;4BACP,IAAI,CAAC,KAAK,EAAE,CAAC;wBACjB,CAAC;6BAAM,CAAC;4BACJ,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAC,cAAc,IAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,GAAI,CAAC,CAAC,CAAC,IAAI,CAAC;4BAEnF,YAAY,CAAC,IAAI,CAAC;gCACd,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;gCACzD,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG;gCACvB,KAAK,EAAE,CAAC;gCACR,IAAI;6BACP,CAAC,CAAC;wBACP,CAAC;oBACL,CAAC;gBACL,CAAC,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACjB,YAAY,CAAC,IAAI,CAAC;wBACd,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;wBACvB,KAAK,EAAE,GAAG;wBACV,KAAK,EAAE,OAAO,CAAC,MAAM;wBACrB,IAAI,EAAE,oBAAC,YAAY,OAAG;qBACzB,CAAC,CAAC;gBACP,CAAC;gBAED,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;oBACrD,iDAAiD;oBACjD,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;wBAC9B,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBAC3E,CAAC;yBAAM,CAAC;wBACJ,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAClG,CAAC;gBACL,CAAC;YACL,CAAC;YAED,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBAC9B,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CACjC,oBAAC,UAAU,IACP,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAC9B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,EACxE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EACnE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EACzB,EAAE,EAAE,MAAM,CAAC,EAAE,EACb,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,eAAe,IAAI,IAAI,EACjE,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,EACvC,sBAAsB,EAAE,IAAI,CAAC,KAAK,CAAC,sBAAsB,EACzD,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,cAAc,EAAE,IAAI,CAAC,cAAc,EACnC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,EAC7C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EACzB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAC/B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAC/B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EACvB,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EACrC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EACjC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,EACvC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB,EACjD,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAC7E,OAAO,EAAE,IAAI,CAAC,WAAW,GAC3B,CACL,CAAC,CAAC;gBACH,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;oBACrB,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;oBAC7E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;wBACjC,IAAI,CAAC,IAAI,CACL,oBAAC,kBAAkB,IACf,GAAG,EAAE,YAAY,CAAC,EAAE,EACpB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,EACxE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GACzB,CACL,CAAC;oBACN,CAAC;gBACL,CAAC;qBAAM,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvC,IAAI,CAAC,IAAI,CACL,oBAAC,GAAG,IACA,GAAG,EAAC,UAAU,EACd,EAAE,EAAE;4BACA,OAAO,EAAE,MAAM;4BACf,qBAAqB,EAAE;gCACnB,OAAO,EAAE,MAAM;6BAClB;yBACJ;wBAED,kCAAO,cAAc,CAAC,uBAAuB,CAAC,CAAQ,CACpD,CACT,CAAC;gBACN,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,IAAI,GAAG;oBACH,6BACI,KAAK,EAAE,UAAU,EACjB,GAAG,EAAC,gBAAgB;wBAEpB,kCAAO,cAAc,CAAC,oBAAoB,CAAC,CAAQ,CACjD;iBACT,CAAC;YACN,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACtB,OAAO,CACH;gBACK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAC,cAAc,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAI,CAAC,CAAC,CAAC,IAAI;gBACxE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,iCAAM,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAO,CAAC,CAAC,CAAC,IAAI,CAC5E,CACN,CAAC;QACN,CAAC;QAED,OAAO,CACH,6BACI,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE;YAEtG,oBAAC,OAAO,IACJ,OAAO,EAAC,OAAO,EACf,KAAK,EAAE;oBACH,eAAe,EAAE,MAAM;oBACvB,OAAO,EAAE,MAAM;oBACf,QAAQ,EAAE,MAAM;oBAChB,MAAM,EAAE,CAAC;oBACT,UAAU,EAAE,QAAQ;oBACpB,UAAU,EAAE,CAAC;iBAChB;gBAEA,IAAI,CAAC,KAAK,CAAC,KAAK;gBAChB,IAAI,CAAC,KAAK,CAAC,gBAAgB,KAAK,SAAS;oBAC1C,IAAI,CAAC,KAAK,CAAC,WAAW;oBACtB,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAC1B,6BAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE;oBACxD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC9C,oBAAC,OAAO,IACJ,KAAK,EAAE,cAAc,CAAC,qBAAqB,CAAC,EAC5C,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE;wBAExD,oBAAC,UAAU,IACP,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,EACzC,IAAI,EAAC,OAAO;4BAEZ,oBAAC,SAAS,OAAG,CACJ,CACP,CACb,CAAC,CAAC,CAAC,IAAI;oBACP,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CACzD,oBAAC,IAAI,IACD,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAC7D,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAClC,CACL,CAAC,CAAC,CAAC,IAAI;oBACR,8BAAM,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,IAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAQ,CACnE,CACT,CAAC,CAAC,CAAC,IAAI;gBACP,IAAI,CAAC,KAAK,CAAC,gBAAgB,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CACzE,oBAAC,OAAO,IACJ,KAAK,EAAE,cAAc,CAAC,qBAAqB,CAAC,EAC5C,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE;oBAExD;wBACI,oBAAC,UAAU,IACP,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,EACzC,QAAQ,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EACjC,IAAI,EAAC,OAAO;4BAEZ,oBAAC,OAAO,OAAG,CACF,CACV,CACD,CACb,CAAC,CAAC,CAAC,IAAI;gBACP,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAC3B,oBAAC,OAAO,IACJ,KAAK,EAAE,cAAc,CAAC,gBAAgB,CAAC,EACvC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE;oBAExD;wBACI,oBAAC,UAAU,IACP,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EACjC,QAAQ,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,EACzD,IAAI,EAAC,OAAO;4BAEZ,oBAAC,OAAO,OAAG,CACF,CACV,CACD,CACb,CAAC,CAAC,CAAC,IAAI;gBACP,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAC3F,6BAAK,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,IACzB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAC3C,oBAAC,oBAAoB,IACjB,GAAG,EAAE,MAAM,CAAC,EAAE,EACd,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,IAAI,CAAC,eAAe,GACvC,CACL,CAAC,CACA,CACT,CAAC,CAAC,CAAC,IAAI;gBAER,6BAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAI;gBAE9B,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;gBAC9D,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe;oBAC5B,IAAI,CAAC,KAAK,CAAC,KAAK;oBAChB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAC/C,oBAAC,OAAO,IACJ,KAAK,EAAE,cAAc,CAAC,sBAAsB,CAAC,EAC7C,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE;oBAExD,oBAAC,UAAU,IACP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EACvD,OAAO,EAAE,GAAG,EAAE;4BACV,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;4BAChD,IAAI,CAAC,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;4BACjC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;wBACtF,CAAC,EACD,IAAI,EAAC,OAAO;wBAEZ,oBAAC,eAAe,OAAG,CACV,CACP,CACb,CAAC,CAAC,CAAC,IAAI;gBACP,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe;oBAC5B,IAAI,CAAC,KAAK,CAAC,KAAK;oBAChB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CACjE,oBAAC,OAAO,IACJ,KAAK,EAAE,cAAc,CAAC,2BAA2B,CAAC,EAClD,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE;oBAExD,oBAAC,UAAU,IACP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAC5D,OAAO,EAAE,GAAG,EAAE;4BACV,MAAM,kBAAkB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;4BAC1D,IAAI,CAAC,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC;4BACtC,MAAM,CAAC,YAAY,CAAC,OAAO,CACvB,uBAAuB,EACvB,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CACxC,CAAC;wBACN,CAAC,EACD,IAAI,EAAC,OAAO;wBAEZ,oBAAC,YAAY,OAAG,CACP,CACP,CACb,CAAC,CAAC,CAAC,IAAI;gBACP,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAC/C,6BAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE;oBAC3E,oBAAC,SAAS,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAI;oBACtC,IAAI,CAAC,kBAAkB,EAAE;oBACzB,IAAI,CAAC,iBAAiB,EAAE,CACvB,CACT,CAAC,CAAC,CAAC,IAAI;gBACR,oBAAC,UAAU,IACP,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAC5C,KAAK,EAAE;wBACH,UAAU,EAAE,EAAE;wBACd,UAAU,EAAE,MAAM;wBAClB,UAAU,EAAE,QAAQ;wBACpB,KAAK,EAAE,MAAM;qBAChB,qBAGQ,CACP;YACV,6BACI,KAAK,EAAE;oBACH,KAAK,EAAE,MAAM;oBACb,IAAI,EAAE,CAAC;oBACP,SAAS,EAAE,CAAC;oBACZ,SAAS,EAAE,CAAC;oBACZ,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,MAAM;oBACf,QAAQ,EAAE,MAAM;oBAChB,UAAU,EAAE,SAAS;oBACrB,YAAY,EAAE,YAAY;oBAC1B,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;iBACtB;gBAEA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAC,cAAc,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAI,CAAC,CAAC,CAAC,IAAI;gBACxE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,iCAAM,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAO,CAAC,CAAC,CAAC,IAAI,CACzE,CACJ,CACT,CAAC;IACN,CAAC","sourcesContent":["import React, { type JSX } from 'react';\nimport {\n IconButton,\n InputAdornment,\n TextField,\n Toolbar,\n Tooltip,\n LinearProgress,\n Select,\n MenuItem,\n Box,\n Card,\n CardActionArea,\n CardContent,\n Typography,\n} from '@mui/material';\n\nimport {\n ArrowBack,\n Clear,\n QuestionMark,\n Refresh,\n FilterAlt,\n FilterAltOff,\n SystemUpdateAlt,\n BatteryAlert,\n} from '@mui/icons-material';\n\nimport { I18n, DeviceTypeIcon, Icon, InfoBox } from '@iobroker/adapter-react-v5';\nimport type { DeviceId, DeviceInfo, DeviceStatus, InstanceDetails } from './protocol/api';\n\nimport DeviceCard, { DeviceCardSkeleton, type DeviceFilterField } from './DeviceCard';\nimport { getTranslation } from './Utils';\nimport Communication, { type CommunicationProps, type CommunicationState } from './Communication';\nimport InstanceActionButton from './InstanceActionButton';\n\nimport de from './i18n/de.json';\nimport en from './i18n/en.json';\nimport ru from './i18n/ru.json';\nimport pt from './i18n/pt.json';\nimport nl from './i18n/nl.json';\nimport fr from './i18n/fr.json';\nimport it from './i18n/it.json';\nimport es from './i18n/es.json';\nimport pl from './i18n/pl.json';\nimport uk from './i18n/uk.json';\nimport zhCn from './i18n/zh-cn.json';\n\n/** Returns true if any of the device status objects carries a battery value */\nfunction hasBatteryStatus(status?: DeviceStatus | DeviceStatus[]): boolean {\n if (!status || typeof status === 'string') {\n return false;\n }\n const list = Array.isArray(status) ? status : [status];\n return list.some(entry => typeof entry !== 'string' && entry.battery !== undefined);\n}\n\ninterface DeviceListProps extends CommunicationProps {\n /** Instance to upload images to, like `adapterName.X` */\n uploadImagesToInstance?: string;\n /** Filter devices with this string */\n filter?: string;\n /** If this component is used in GUI with own toolbar. `false` if this list is used with multiple instances and true if only with one (in this case, it will monitor alive itself */\n embedded?: boolean;\n /** If embedded, this text is shown in the toolbar */\n title?: string;\n /** Style of a component that displays all devices */\n style?: React.CSSProperties;\n /** Use small cards for devices */\n smallCards?: boolean;\n /** To trigger the reload of devices, just change this variable */\n triggerLoad?: number;\n}\n\ninterface DeviceListState extends CommunicationState {\n devices: DeviceInfo[];\n totalDevices?: number;\n filter: string;\n filterText: string;\n instanceInfo: InstanceDetails | null;\n loading: boolean | null;\n alive: boolean | null;\n triggerLoad: number;\n groupKey: string;\n dmInstances: { [instanceName: string]: { title: string; icon: string; instance: number } } | null;\n apiVersionError: boolean;\n /** Show only devices that have an available update */\n onlyUpdatable: boolean;\n /** Show only devices that have a battery problem */\n onlyBatteryProblem: boolean;\n /** Device field the text filter applies to */\n filterField: DeviceFilterField;\n /** Distinct resolved model values across the loaded devices (for the model filter dropdown) */\n modelOptions: string[];\n}\n\n/**\n * Device List Component\n */\nexport default class DeviceList extends Communication<DeviceListProps, DeviceListState> {\n static i18nInitialized = false;\n\n private lastInstance: string;\n\n private lastAliveSubscribe = '';\n\n private lastTriggerLoad = 0;\n\n private filterTimeout: ReturnType<typeof setTimeout> | null = null;\n\n /** Resolved model value per device (stringified id -> model), reported by the cards to build the model dropdown */\n private readonly modelValues = new Map<string, string>();\n\n private readonly language: ioBroker.Languages = I18n.getLanguage();\n\n constructor(props: DeviceListProps) {\n super(props);\n\n if (!DeviceList.i18nInitialized) {\n DeviceList.i18nInitialized = true;\n I18n.extendTranslations({\n en,\n de,\n ru,\n pt,\n nl,\n fr,\n it,\n es,\n pl,\n uk,\n 'zh-cn': zhCn,\n });\n }\n\n this.state = {\n ...this.state,\n devices: [],\n filter: '',\n filterText: '',\n instanceInfo: null,\n loading: null,\n alive: null,\n groupKey: '',\n dmInstances: null,\n apiVersionError: false,\n onlyUpdatable: window.localStorage.getItem('dm_onlyUpdatable') === 'true',\n onlyBatteryProblem: window.localStorage.getItem('dm_onlyBatteryProblem') === 'true',\n filterField: (window.localStorage.getItem('dm_filterField') as DeviceFilterField) || 'name',\n modelOptions: [],\n };\n\n if (this.props.selectedInstance === undefined) {\n // Start with the root page that shows all instances as cards\n this.state = { ...this.state, selectedInstance: this.props.instance ?? '' };\n }\n\n this.lastInstance = this.state.selectedInstance;\n this.lastTriggerLoad = this.props.triggerLoad || 0;\n }\n\n setStateAsync(state: Partial<DeviceListState>): Promise<void> {\n return new Promise<void>(resolve => this.setState(state as DeviceListState, resolve));\n }\n\n private async loadAdapters(): Promise<void> {\n await this.props.socket.waitForFirstConnection();\n\n console.log('Loading adapters...');\n const res = await this.props.socket.getObjectViewSystem('instance', 'system.adapter.', 'system.adapter.\\u9999');\n const dmInstances: { [instanceName: string]: { title: string; icon: string; instance: number } } = {};\n for (const id in res) {\n if (!res[id].common.supportedMessages?.deviceManager) {\n continue;\n }\n\n const instanceName = id.substring('system.adapter.'.length);\n try {\n // Check if the instance is alive by getting the state alive\n const alive = await this.props.socket.getState(`system.adapter.${instanceName}.alive`);\n if (!alive?.val) {\n continue;\n }\n\n const instance = parseInt(instanceName.split('.').pop() || '0') || 0;\n const common = res[id].common;\n const adapterName = instanceName.split('.')[0];\n dmInstances[instanceName] = {\n title: common.titleLang ? this.getText(common.titleLang) : common.title || adapterName,\n icon: common.icon ? `./adapter/${adapterName}/${common.icon}` : common.extIcon || '',\n instance,\n };\n } catch (error) {\n console.error(error);\n }\n }\n\n if (Object.keys(dmInstances).length === 1) {\n // With only one instance, select it directly and do not show the root page\n const selectedInstance = Object.keys(dmInstances)[0];\n await this.setStateAsync({\n dmInstances,\n selectedInstance,\n groupKey: window.localStorage.getItem(`dm_group_${selectedInstance}`) || '',\n });\n } else {\n await this.setStateAsync({ dmInstances });\n }\n }\n\n private selectInstance(instanceId: string): void {\n window.localStorage.setItem('dmSelectedInstance', instanceId);\n this.props.onInstanceChanged?.(instanceId);\n this.setState({\n selectedInstance: instanceId,\n groupKey: window.localStorage.getItem(`dm_group_${instanceId}`) || '',\n });\n }\n\n private backToInstancesList(): void {\n window.localStorage.removeItem('dmSelectedInstance');\n this.props.onInstanceChanged?.('');\n this.setState({\n selectedInstance: '',\n devices: [],\n totalDevices: undefined,\n instanceInfo: null,\n alive: null,\n groupKey: '',\n filter: '',\n filterText: '',\n apiVersionError: false,\n });\n }\n\n private refreshInstanceList(): void {\n this.setState({ dmInstances: null }, () => this.loadAdapters().catch(console.error));\n }\n\n async componentDidMount(): Promise<void> {\n let alive = false;\n // If an instance selector must be shown\n if (this.props.selectedInstance === undefined) {\n // show instance selector\n await this.loadAdapters();\n }\n\n if (this.state.alive === null && this.state.selectedInstance) {\n try {\n // check if the instance is alive\n const stateAlive = await this.props.socket.getState(\n `system.adapter.${this.state.selectedInstance}.alive`,\n );\n if (stateAlive?.val) {\n alive = true;\n }\n } catch (error) {\n console.error(error);\n }\n this.lastAliveSubscribe = this.state.selectedInstance;\n this.setState({ alive }, () =>\n this.props.socket.subscribeState(\n `system.adapter.${this.state.selectedInstance}.alive`,\n this.aliveHandler,\n ),\n );\n } else if (this.state.alive !== null) {\n alive = this.state.alive;\n }\n\n if (alive) {\n try {\n await this.loadAllData();\n } catch (error) {\n console.error(error);\n }\n }\n }\n\n componentWillUnmount(): void {\n if (this.state.selectedInstance) {\n this.props.socket.unsubscribeState(\n `system.adapter.${this.state.selectedInstance}.alive`,\n this.aliveHandler,\n );\n }\n }\n\n aliveHandler: ioBroker.StateChangeHandler = (id: string, state: ioBroker.State | null | undefined): void => {\n if (this.state.selectedInstance && id === `system.adapter.${this.state.selectedInstance}.alive`) {\n const alive = !!state?.val;\n if (alive !== this.state.alive) {\n this.setState({ alive }, () => {\n if (alive) {\n this.componentDidMount().catch(console.error);\n }\n });\n }\n }\n };\n\n override async loadAllData(): Promise<void> {\n await this.loadInstanceInfos();\n this.loadDeviceList();\n }\n\n override async loadInstanceInfos(): Promise<InstanceDetails> {\n const instanceInfo = await super.loadInstanceInfos();\n return new Promise<InstanceDetails>(resolve =>\n this.setState(\n { instanceInfo, apiVersionError: !['v1', 'v2', 'v3'].includes(instanceInfo.apiVersion) },\n () => resolve(instanceInfo),\n ),\n );\n }\n\n /**\n * Load devices\n */\n override loadDeviceList(): void {\n this.setState({ loading: true }, async () => {\n console.log(`Loading devices for ${this.state.selectedInstance}...`);\n let alive = this.state.alive;\n\n if (this.state.selectedInstance !== this.lastAliveSubscribe) {\n if (this.lastAliveSubscribe) {\n // unsubscribe from the old instance\n this.props.socket.unsubscribeState(\n `system.adapter.${this.lastAliveSubscribe}.alive`,\n this.aliveHandler,\n );\n }\n\n this.lastAliveSubscribe = this.state.selectedInstance;\n\n if (this.state.selectedInstance) {\n try {\n // check if the instance is alive\n const stateAlive = await this.props.socket.getState(\n `system.adapter.${this.state.selectedInstance}.alive`,\n );\n if (stateAlive?.val) {\n alive = true;\n }\n } catch (error) {\n console.error(error);\n }\n await this.props.socket.subscribeState(\n `system.adapter.${this.state.selectedInstance}.alive`,\n this.aliveHandler,\n );\n } else {\n alive = false;\n }\n }\n\n let devices: DeviceInfo[] = [];\n try {\n this.setState({ devices, loading: !!alive, alive });\n if (alive) {\n await this.loadDevices((batch, total) => {\n devices = devices.concat(batch);\n this.setState({ devices, loading: true, totalDevices: total });\n console.log(`Loaded ${devices.length} of ${total} devices...`);\n });\n }\n } catch (error) {\n console.error(error);\n devices = [];\n }\n\n this.setState({ devices, loading: false, totalDevices: devices.length });\n console.log(`Loaded ${devices.length} devices for ${this.state.selectedInstance}`);\n });\n }\n\n override updateDevice(update: DeviceInfo): void {\n const updateId = JSON.stringify(update.id);\n this.setState({ devices: this.state.devices.map(d => (JSON.stringify(d.id) === updateId ? update : d)) });\n }\n\n override deleteDevice(deviceId: DeviceId): void {\n const deleteId = JSON.stringify(deviceId);\n const devices = this.state.devices.filter(d => JSON.stringify(d.id) !== deleteId);\n const totalDevices =\n this.state.totalDevices && devices.length < this.state.devices.length\n ? this.state.totalDevices - 1\n : undefined;\n this.setState({ devices, totalDevices });\n }\n\n getText(text: ioBroker.StringOrTranslated): string {\n if (typeof text === 'object') {\n return text[this.language] || text.en;\n }\n\n return text;\n }\n\n handleFilterChange(filter: string): void {\n this.setState({ filterText: filter });\n if (this.filterTimeout) {\n clearTimeout(this.filterTimeout);\n }\n this.filterTimeout = setTimeout(() => {\n this.filterTimeout = null;\n this.setState({ filter });\n }, 250);\n }\n\n renderGroups(\n groups: { name: string; value: string; count: number; icon?: React.JSX.Element | string | null }[] | undefined,\n ): React.JSX.Element | null {\n if (!groups?.length) {\n return null;\n }\n\n return (\n <Select\n style={{ minWidth: 120, marginRight: 8, flexShrink: 0 }}\n variant=\"standard\"\n value={this.state.groupKey || '_'}\n renderValue={value => {\n if (value === '_') {\n value = '';\n }\n const g = groups.find(g => g.value === value);\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {g?.icon || <div style={{ width: 24 }} />}\n {g?.name || value}\n </div>\n );\n }}\n onChange={e => {\n if (e.target.value) {\n window.localStorage.setItem(`dm_group_${this.state.selectedInstance}`, e.target.value);\n } else {\n window.localStorage.removeItem(`dm_group_${this.state.selectedInstance}`);\n }\n this.setState({ groupKey: e.target.value === '_' ? '' : e.target.value });\n }}\n >\n {groups.map(g => (\n <MenuItem\n value={g.value || '_'}\n key={g.value || '_'}\n style={{ display: 'flex', alignItems: 'center', gap: 8 }}\n >\n {g.icon || <div style={{ width: 24 }} />}\n {g.name}\n </MenuItem>\n ))}\n </Select>\n );\n }\n\n renderInstanceCards(): React.JSX.Element[] {\n if (!this.state.dmInstances) {\n return [\n <LinearProgress\n key=\"loadingInstances\"\n style={{ width: '100%' }}\n />,\n ];\n }\n\n const instanceIds = Object.keys(this.state.dmInstances);\n if (!instanceIds.length) {\n return [\n <div\n style={{ padding: 25 }}\n key=\"noInstances\"\n >\n <span>{getTranslation('noInstancesFoundText')}</span>\n </div>,\n ];\n }\n\n const backgroundColor = this.props.theme.palette.mode === 'dark' ? '#0b0b0b' : '#d5d5d5';\n\n if (this.props.smallCards) {\n return instanceIds.map(id => {\n const info = this.state.dmInstances![id];\n return (\n <Card\n key={id}\n sx={{ width: 200, margin: '5px', backgroundColor }}\n >\n <CardActionArea\n onClick={() => this.selectInstance(id)}\n style={{ height: '100%' }}\n >\n <CardContent\n style={{\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: 8,\n }}\n >\n {info.icon ? (\n <Icon\n src={info.icon}\n style={{ width: 32, height: 32, flexShrink: 0 }}\n />\n ) : (\n <QuestionMark style={{ width: 32, height: 32, flexShrink: 0 }} />\n )}\n <div style={{ overflow: 'hidden' }}>\n <Typography\n variant=\"body1\"\n noWrap\n style={{ fontSize: 14, fontWeight: 'bold' }}\n >\n {id}\n </Typography>\n {info.title ? (\n <Typography\n variant=\"caption\"\n color=\"textSecondary\"\n noWrap\n component=\"div\"\n >\n {info.title}\n </Typography>\n ) : null}\n </div>\n </CardContent>\n </CardActionArea>\n </Card>\n );\n });\n }\n\n return instanceIds.map(id => {\n const info = this.state.dmInstances![id];\n return (\n <Card\n key={id}\n sx={{ width: 240, margin: '10px', backgroundColor }}\n >\n <CardActionArea\n onClick={() => this.selectInstance(id)}\n style={{ height: '100%' }}\n >\n <CardContent\n style={{\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 8,\n }}\n >\n {info.icon ? (\n <Icon\n src={info.icon}\n style={{ width: 64, height: 64 }}\n />\n ) : (\n <QuestionMark style={{ width: 64, height: 64 }} />\n )}\n <Typography\n variant=\"h6\"\n style={{ textAlign: 'center', wordBreak: 'break-all' }}\n >\n {id}\n </Typography>\n {info.title ? (\n <Typography\n variant=\"body2\"\n color=\"textSecondary\"\n style={{ textAlign: 'center' }}\n >\n {info.title}\n </Typography>\n ) : null}\n </CardContent>\n </CardActionArea>\n </Card>\n );\n });\n }\n\n /** Collects the resolved model values reported by the cards and keeps the distinct, sorted list in state */\n private reportModel = (deviceId: DeviceId, model: string | undefined): void => {\n const key = JSON.stringify(deviceId);\n if (model) {\n if (this.modelValues.get(key) === model) {\n return;\n }\n this.modelValues.set(key, model);\n } else if (this.modelValues.has(key)) {\n this.modelValues.delete(key);\n } else {\n return;\n }\n const modelOptions = Array.from(new Set(this.modelValues.values())).sort();\n if (\n modelOptions.length !== this.state.modelOptions.length ||\n modelOptions.some((model, i) => model !== this.state.modelOptions[i])\n ) {\n this.setState({ modelOptions });\n }\n };\n\n /** The selected filter field, falling back to `name` if the stored field is not available (e.g. no models found) */\n private getEffectiveFilterField(): DeviceFilterField {\n const field = this.state.filterField;\n if (field === 'name') {\n return 'name';\n }\n // The model field is only available if at least one model value was actually found\n if (field === 'model') {\n return this.state.modelOptions.length ? 'model' : 'name';\n }\n return this.state.devices.some(device => device[field] !== undefined) ? field : 'name';\n }\n\n renderFilterFields(): React.JSX.Element | null {\n const fields: { value: DeviceFilterField; label: string }[] = [\n { value: 'name', label: getTranslation('name') },\n ];\n if (this.state.devices.some(device => device.identifier !== undefined)) {\n fields.push({\n value: 'identifier',\n label: this.getText(this.state.instanceInfo?.identifierLabel ?? 'ID'),\n });\n }\n if (this.state.devices.some(device => device.manufacturer !== undefined)) {\n fields.push({ value: 'manufacturer', label: getTranslation('manufacturer') });\n }\n // Only offer the model filter if at least one model value was actually found\n if (this.state.modelOptions.length) {\n fields.push({ value: 'model', label: getTranslation('model') });\n }\n\n // Only show the field selector when there is more than just the name to choose from\n if (fields.length < 2) {\n return null;\n }\n\n const current = this.getEffectiveFilterField();\n\n return (\n <Select\n variant=\"standard\"\n style={{ width: 130, flexShrink: 0 }}\n value={current}\n onChange={e => {\n const filterField = e.target.value as DeviceFilterField;\n this.setState({ filterField });\n window.localStorage.setItem('dm_filterField', filterField);\n // reset the current filter value when switching the field\n this.handleFilterChange('');\n }}\n >\n {fields.map(field => (\n <MenuItem\n value={field.value}\n key={field.value}\n >\n {field.label}\n </MenuItem>\n ))}\n </Select>\n );\n }\n\n /** The filter value input: a model dropdown for the `model` field, a free-text field otherwise */\n renderFilterValue(): React.JSX.Element {\n if (this.getEffectiveFilterField() === 'model') {\n const value = this.state.modelOptions.includes(this.state.filterText) ? this.state.filterText : '';\n return (\n <Select\n variant=\"standard\"\n style={{ width: 200 }}\n displayEmpty\n value={value}\n onChange={e => this.handleFilterChange(e.target.value)}\n >\n <MenuItem value=\"\">\n <em>{getTranslation('allModels')}</em>\n </MenuItem>\n {this.state.modelOptions.map(model => (\n <MenuItem\n value={model}\n key={model}\n >\n {model}\n </MenuItem>\n ))}\n </Select>\n );\n }\n\n return (\n <TextField\n variant=\"standard\"\n style={{ width: 200 }}\n size=\"small\"\n placeholder={getTranslation('filterLabelText')}\n onChange={e => this.handleFilterChange(e.target.value)}\n value={this.state.filterText}\n autoComplete=\"off\"\n slotProps={{\n input: {\n autoComplete: 'new-password',\n endAdornment: this.state.filterText ? (\n <InputAdornment position=\"end\">\n <IconButton\n tabIndex={-1}\n onClick={() => this.handleFilterChange('')}\n edge=\"end\"\n >\n <Clear />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n htmlInput: {\n autoComplete: 'off',\n },\n }}\n />\n );\n }\n\n renderRootInfo(): React.JSX.Element {\n // The root ThemeProvider (Communication.render) already supplies the correct theme context. The explicit color\n // is a safety net, so older InfoBox versions (whose Typography has no own color) stay readable in dark mode.\n return (\n <InfoBox\n key=\"rootInfo\"\n type=\"info\"\n closeable\n storeId=\"dm_rootInfoClosed\"\n style={{\n width: 'calc(100% - 20px)',\n margin: '0 10px 8px 10px',\n color: this.props.theme.palette.text.primary,\n }}\n >\n {I18n.t('rootInfoText')}\n </InfoBox>\n );\n }\n\n renderContent(): JSX.Element | JSX.Element[] | null {\n const emptyStyle: React.CSSProperties = {\n padding: 25,\n };\n\n if ((this.props.triggerLoad || 0) !== this.lastTriggerLoad) {\n this.lastTriggerLoad = this.props.triggerLoad || 0;\n setTimeout(() => this.loadDeviceList(), 50);\n }\n\n // if instance changed\n if (this.lastInstance !== this.state.selectedInstance) {\n this.lastInstance = this.state.selectedInstance;\n setTimeout(async (): Promise<void> => {\n if (this.state.selectedInstance) {\n try {\n await this.loadAllData();\n } catch (error) {\n console.error(error);\n }\n } else {\n this.loadDeviceList();\n }\n }, 50);\n }\n if (this.props.selectedInstance && this.props.selectedInstance !== this.state.selectedInstance) {\n setTimeout(() => this.setState({ selectedInstance: this.props.selectedInstance! }), 50);\n }\n const deviceGroups: { name: string; value: string; count: number; icon?: React.JSX.Element | string | null }[] =\n [];\n const showRootPage =\n !this.props.embedded && this.props.selectedInstance === undefined && !this.state.selectedInstance;\n\n let list: React.JSX.Element[] | undefined;\n if (showRootPage) {\n list = this.renderInstanceCards();\n list.unshift(this.renderRootInfo());\n } else if (!this.props.embedded && !this.state.alive) {\n list = [\n <div\n style={emptyStyle}\n key=\"notAlive\"\n >\n <span>{getTranslation('instanceNotAlive')}</span>\n </div>,\n ];\n } else if (!this.state.devices.length && this.state.selectedInstance && !this.state.loading) {\n list = [\n <div\n style={emptyStyle}\n key=\"notFound\"\n >\n <span>{getTranslation('noDevicesFoundText')}</span>\n </div>,\n ];\n } else {\n // build a device types list\n let filteredDevices = this.state.devices;\n if (!this.state.loading && !this.props.embedded && filteredDevices.find(device => device.group)) {\n deviceGroups.push({\n name: I18n.t('All'),\n value: '',\n count: filteredDevices.length,\n icon: <FilterAltOff />,\n });\n filteredDevices.forEach(device => {\n if (device.group) {\n const type = deviceGroups.find(t => t.value === device.group?.key);\n if (type) {\n type.count++;\n } else {\n const icon = device.group.icon ? <DeviceTypeIcon src={device.group.icon} /> : null;\n\n deviceGroups.push({\n name: this.getText(device.group.name || device.group.key),\n value: device.group.key,\n count: 1,\n icon,\n });\n }\n }\n });\n const unknown = filteredDevices.filter(device => !device.group);\n if (unknown.length) {\n deviceGroups.push({\n name: I18n.t('Unknown'),\n value: '?',\n count: unknown.length,\n icon: <QuestionMark />,\n });\n }\n\n if (this.state.groupKey && this.state.groupKey !== '_') {\n // filter out all devices belonging to this group\n if (this.state.groupKey === '?') {\n filteredDevices = filteredDevices.filter(device => !device.group?.key);\n } else {\n filteredDevices = filteredDevices.filter(device => device.group?.key === this.state.groupKey);\n }\n }\n }\n\n if (this.state.selectedInstance) {\n list = filteredDevices.map(device => (\n <DeviceCard\n key={JSON.stringify(device.id)}\n smallCards={this.props.smallCards ?? this.state.instanceInfo?.smallCards}\n filter={this.props.embedded ? this.props.filter : this.state.filter}\n alive={!!this.state.alive}\n id={device.id}\n identifierLabel={this.state.instanceInfo?.identifierLabel ?? 'ID'}\n device={device}\n instanceId={this.state.selectedInstance}\n uploadImagesToInstance={this.props.uploadImagesToInstance}\n deviceHandler={this.deviceHandler}\n controlHandler={this.controlHandler}\n controlStateHandler={this.controlStateHandler}\n socket={this.props.socket}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n theme={this.props.theme}\n isFloatComma={this.props.isFloatComma}\n dateFormat={this.props.dateFormat}\n onlyUpdatable={this.state.onlyUpdatable}\n onlyBatteryProblem={this.state.onlyBatteryProblem}\n filterField={this.props.embedded ? undefined : this.getEffectiveFilterField()}\n onModel={this.reportModel}\n />\n ));\n if (this.state.loading) {\n const skeletons = (this.state.totalDevices ?? list.length + 1) - list.length;\n for (let i = 0; i < skeletons; i++) {\n list.push(\n <DeviceCardSkeleton\n key={`skeleton-${i}`}\n smallCards={this.props.smallCards ?? this.state.instanceInfo?.smallCards}\n theme={this.props.theme}\n />,\n );\n }\n } else if (this.state.devices.length > 0) {\n list.push(\n <Box\n key=\"filtered\"\n sx={{\n padding: '25px',\n '&:not(:first-child)': {\n display: 'none',\n },\n }}\n >\n <span>{getTranslation('allDevicesFilteredOut')}</span>\n </Box>,\n );\n }\n } else {\n list = [\n <div\n style={emptyStyle}\n key=\"selectInstance\"\n >\n <span>{getTranslation('selectInstanceText')}</span>\n </div>,\n ];\n }\n }\n\n if (this.props.embedded) {\n return (\n <>\n {this.state.loading ? <LinearProgress style={{ width: '100%' }} /> : null}\n {this.state.apiVersionError ? <div>{I18n.t('apiVersionError')}</div> : list}\n </>\n );\n }\n\n return (\n <div\n style={{ width: '100%', height: '100%', overflow: 'hidden', display: 'flex', flexDirection: 'column' }}\n >\n <Toolbar\n variant=\"dense\"\n style={{\n backgroundColor: '#777',\n display: 'flex',\n flexWrap: 'wrap',\n rowGap: 4,\n alignItems: 'center',\n flexShrink: 0,\n }}\n >\n {this.props.title}\n {this.props.selectedInstance === undefined &&\n this.state.dmInstances &&\n this.state.selectedInstance ? (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {Object.keys(this.state.dmInstances).length > 1 ? (\n <Tooltip\n title={getTranslation('backToInstancesList')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <IconButton\n onClick={() => this.backToInstancesList()}\n size=\"small\"\n >\n <ArrowBack />\n </IconButton>\n </Tooltip>\n ) : null}\n {this.state.dmInstances[this.state.selectedInstance]?.icon ? (\n <Icon\n src={this.state.dmInstances[this.state.selectedInstance].icon}\n style={{ width: 24, height: 24 }}\n />\n ) : null}\n <span style={{ marginRight: 8 }}>{this.state.selectedInstance}</span>\n </div>\n ) : null}\n {this.props.selectedInstance === undefined && !this.state.selectedInstance ? (\n <Tooltip\n title={getTranslation('refreshInstanceList')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <span>\n <IconButton\n onClick={() => this.refreshInstanceList()}\n disabled={!this.state.dmInstances}\n size=\"small\"\n >\n <Refresh />\n </IconButton>\n </span>\n </Tooltip>\n ) : null}\n {this.state.selectedInstance ? (\n <Tooltip\n title={getTranslation('refreshTooltip')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <span>\n <IconButton\n onClick={() => this.loadAllData()}\n disabled={!this.state.alive || this.state.apiVersionError}\n size=\"small\"\n >\n <Refresh />\n </IconButton>\n </span>\n </Tooltip>\n ) : null}\n {!this.state.apiVersionError && this.state.alive && this.state.instanceInfo?.actions?.length ? (\n <div style={{ marginLeft: 20 }}>\n {this.state.instanceInfo.actions.map(action => (\n <InstanceActionButton\n key={action.id}\n action={action}\n instanceHandler={this.instanceHandler}\n />\n ))}\n </div>\n ) : null}\n\n <div style={{ flexGrow: 1 }} />\n\n {!this.state.apiVersionError && this.renderGroups(deviceGroups)}\n {!this.state.apiVersionError &&\n this.state.alive &&\n this.state.devices.some(device => device.update) ? (\n <Tooltip\n title={getTranslation('onlyUpdatableTooltip')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <IconButton\n color={this.state.onlyUpdatable ? 'primary' : 'default'}\n onClick={() => {\n const onlyUpdatable = !this.state.onlyUpdatable;\n this.setState({ onlyUpdatable });\n window.localStorage.setItem('dm_onlyUpdatable', onlyUpdatable ? 'true' : 'false');\n }}\n size=\"small\"\n >\n <SystemUpdateAlt />\n </IconButton>\n </Tooltip>\n ) : null}\n {!this.state.apiVersionError &&\n this.state.alive &&\n this.state.devices.some(device => hasBatteryStatus(device.status)) ? (\n <Tooltip\n title={getTranslation('onlyBatteryProblemTooltip')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <IconButton\n color={this.state.onlyBatteryProblem ? 'primary' : 'default'}\n onClick={() => {\n const onlyBatteryProblem = !this.state.onlyBatteryProblem;\n this.setState({ onlyBatteryProblem });\n window.localStorage.setItem(\n 'dm_onlyBatteryProblem',\n onlyBatteryProblem ? 'true' : 'false',\n );\n }}\n size=\"small\"\n >\n <BatteryAlert />\n </IconButton>\n </Tooltip>\n ) : null}\n {!this.state.apiVersionError && this.state.alive ? (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}>\n <FilterAlt style={{ color: '#fff' }} />\n {this.renderFilterFields()}\n {this.renderFilterValue()}\n </div>\n ) : null}\n <Typography\n sx={{ display: { xs: 'none', md: 'block' } }}\n style={{\n marginLeft: 16,\n fontWeight: 'bold',\n whiteSpace: 'nowrap',\n color: '#fff',\n }}\n >\n Config-Manager\n </Typography>\n </Toolbar>\n <div\n style={{\n width: '100%',\n flex: 1,\n minHeight: 0,\n marginTop: 8,\n overflow: 'auto',\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'stretch',\n alignContent: 'flex-start',\n ...this.props.style,\n }}\n >\n {this.state.loading ? <LinearProgress style={{ width: '100%' }} /> : null}\n {this.state.apiVersionError ? <div>{I18n.t('apiVersionError')}</div> : list}\n </div>\n </div>\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DeviceList.js","sourceRoot":"./src/","sources":["DeviceList.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { type JSX } from 'react';\nimport {\n IconButton,\n InputAdornment,\n TextField,\n Toolbar,\n Tooltip,\n LinearProgress,\n Select,\n MenuItem,\n Box,\n Card,\n CardActionArea,\n CardContent,\n Typography,\n} from '@mui/material';\n\nimport {\n ArrowBack,\n Clear,\n QuestionMark,\n Refresh,\n FilterAlt,\n FilterAltOff,\n SystemUpdateAlt,\n BatteryAlert,\n} from '@mui/icons-material';\n\nimport { I18n, DeviceTypeIcon, Icon, InfoBox } from '@iobroker/adapter-react-v5';\nimport type { DeviceId, DeviceInfo, DeviceStatus, InstanceDetails } from './protocol/api';\n\nimport DeviceCard, { DeviceCardSkeleton, type DeviceFilterField } from './DeviceCard';\nimport { getTranslation } from './Utils';\nimport Communication, { type CommunicationProps, type CommunicationState } from './Communication';\nimport InstanceActionButton from './InstanceActionButton';\n\nimport de from './i18n/de.json';\nimport en from './i18n/en.json';\nimport ru from './i18n/ru.json';\nimport pt from './i18n/pt.json';\nimport nl from './i18n/nl.json';\nimport fr from './i18n/fr.json';\nimport it from './i18n/it.json';\nimport es from './i18n/es.json';\nimport pl from './i18n/pl.json';\nimport uk from './i18n/uk.json';\nimport zhCn from './i18n/zh-cn.json';\n\n/** Returns true if any of the device status objects carries a battery value */\nfunction hasBatteryStatus(status?: DeviceStatus | DeviceStatus[]): boolean {\n if (!status || typeof status === 'string') {\n return false;\n }\n const list = Array.isArray(status) ? status : [status];\n return list.some(entry => typeof entry !== 'string' && entry.battery !== undefined);\n}\n\ninterface DeviceListProps extends CommunicationProps {\n /** Instance to upload images to, like `adapterName.X` */\n uploadImagesToInstance?: string;\n /** Filter devices with this string */\n filter?: string;\n /** If this component is used in GUI with own toolbar. `false` if this list is used with multiple instances and true if only with one (in this case, it will monitor alive itself */\n embedded?: boolean;\n /** If embedded, this text is shown in the toolbar */\n title?: string;\n /** Style of a component that displays all devices */\n style?: React.CSSProperties;\n /** Use small cards for devices */\n smallCards?: boolean;\n /** To trigger the reload of devices, just change this variable */\n triggerLoad?: number;\n}\n\ninterface DeviceListState extends CommunicationState {\n devices: DeviceInfo[];\n totalDevices?: number;\n filter: string;\n filterText: string;\n instanceInfo: InstanceDetails | null;\n loading: boolean | null;\n alive: boolean | null;\n triggerLoad: number;\n groupKey: string;\n dmInstances: { [instanceName: string]: { title: string; icon: string; instance: number } } | null;\n apiVersionError: boolean;\n /** Show only devices that have an available update */\n onlyUpdatable: boolean;\n /** Show only devices that have a battery problem */\n onlyBatteryProblem: boolean;\n /** Device field the text filter applies to */\n filterField: DeviceFilterField;\n /** Distinct resolved model values across the loaded devices (for the model filter dropdown) */\n modelOptions: string[];\n}\n\n/**\n * Device List Component\n */\nexport default class DeviceList extends Communication<DeviceListProps, DeviceListState> {\n static i18nInitialized = false;\n\n private lastInstance: string;\n\n private lastAliveSubscribe = '';\n\n /**\n * Synchronous mirror of `state.alive`. `setState` is asynchronous, so the guard in `aliveHandler`\n * cannot rely on `state.alive` being committed yet when `subscribeState` replays the current value.\n * This field is always updated synchronously together with `setState({ alive })` and is the source\n * of truth for the \"did alive actually change?\" check, which prevents the double device load.\n */\n private alive: boolean | null = null;\n\n private lastTriggerLoad = 0;\n\n private filterTimeout: ReturnType<typeof setTimeout> | null = null;\n\n /** Resolved model value per device (stringified id -> model), reported by the cards to build the model dropdown */\n private readonly modelValues = new Map<string, string>();\n\n private readonly language: ioBroker.Languages = I18n.getLanguage();\n\n constructor(props: DeviceListProps) {\n super(props);\n\n if (!DeviceList.i18nInitialized) {\n DeviceList.i18nInitialized = true;\n I18n.extendTranslations({\n en,\n de,\n ru,\n pt,\n nl,\n fr,\n it,\n es,\n pl,\n uk,\n 'zh-cn': zhCn,\n });\n }\n\n this.state = {\n ...this.state,\n devices: [],\n filter: '',\n filterText: '',\n instanceInfo: null,\n loading: null,\n alive: null,\n groupKey: '',\n dmInstances: null,\n apiVersionError: false,\n onlyUpdatable: window.localStorage.getItem('dm_onlyUpdatable') === 'true',\n onlyBatteryProblem: window.localStorage.getItem('dm_onlyBatteryProblem') === 'true',\n filterField: (window.localStorage.getItem('dm_filterField') as DeviceFilterField) || 'name',\n modelOptions: [],\n };\n\n if (this.props.selectedInstance === undefined) {\n // Start with the root page that shows all instances as cards\n this.state = { ...this.state, selectedInstance: this.props.instance ?? '' };\n }\n\n this.lastInstance = this.state.selectedInstance;\n this.lastTriggerLoad = this.props.triggerLoad || 0;\n }\n\n setStateAsync(state: Partial<DeviceListState>): Promise<void> {\n return new Promise<void>(resolve => this.setState(state as DeviceListState, resolve));\n }\n\n private async loadAdapters(): Promise<void> {\n await this.props.socket.waitForFirstConnection();\n\n console.log('Loading adapters...');\n const res = await this.props.socket.getObjectViewSystem('instance', 'system.adapter.', 'system.adapter.\\u9999');\n const dmInstances: { [instanceName: string]: { title: string; icon: string; instance: number } } = {};\n for (const id in res) {\n if (!res[id].common.supportedMessages?.deviceManager) {\n continue;\n }\n\n const instanceName = id.substring('system.adapter.'.length);\n try {\n // Check if the instance is alive by getting the state alive\n const alive = await this.props.socket.getState(`system.adapter.${instanceName}.alive`);\n if (!alive?.val) {\n continue;\n }\n\n const instance = parseInt(instanceName.split('.').pop() || '0') || 0;\n const common = res[id].common;\n const adapterName = instanceName.split('.')[0];\n dmInstances[instanceName] = {\n title: common.titleLang ? this.getText(common.titleLang) : common.title || adapterName,\n icon: common.icon ? `./adapter/${adapterName}/${common.icon}` : common.extIcon || '',\n instance,\n };\n } catch (error) {\n console.error(error);\n }\n }\n\n if (Object.keys(dmInstances).length === 1) {\n // With only one instance, select it directly and do not show the root page\n const selectedInstance = Object.keys(dmInstances)[0];\n await this.setStateAsync({\n dmInstances,\n selectedInstance,\n groupKey: window.localStorage.getItem(`dm_group_${selectedInstance}`) || '',\n });\n } else {\n await this.setStateAsync({ dmInstances });\n }\n }\n\n private selectInstance(instanceId: string): void {\n window.localStorage.setItem('dmSelectedInstance', instanceId);\n this.props.onInstanceChanged?.(instanceId);\n this.setState({\n selectedInstance: instanceId,\n groupKey: window.localStorage.getItem(`dm_group_${instanceId}`) || '',\n });\n }\n\n private backToInstancesList(): void {\n window.localStorage.removeItem('dmSelectedInstance');\n this.props.onInstanceChanged?.('');\n this.alive = null;\n this.setState({\n selectedInstance: '',\n devices: [],\n totalDevices: undefined,\n instanceInfo: null,\n alive: null,\n groupKey: '',\n filter: '',\n filterText: '',\n apiVersionError: false,\n });\n }\n\n private refreshInstanceList(): void {\n this.setState({ dmInstances: null }, () => this.loadAdapters().catch(console.error));\n }\n\n async componentDidMount(): Promise<void> {\n let alive = false;\n // If an instance selector must be shown\n if (this.props.selectedInstance === undefined) {\n // show instance selector\n await this.loadAdapters();\n }\n\n if (this.alive === null && this.state.selectedInstance) {\n try {\n // check if the instance is alive\n const stateAlive = await this.props.socket.getState(\n `system.adapter.${this.state.selectedInstance}.alive`,\n );\n if (stateAlive?.val) {\n alive = true;\n }\n } catch (error) {\n console.error(error);\n }\n // Update the synchronous mirror BEFORE subscribing. `subscribeState` replays the current\n // value to `aliveHandler`; with `this.alive` already set, that replay is recognized as\n // \"no change\" and does not trigger a second `loadAllData()` in addition to the one below.\n this.alive = alive;\n this.lastAliveSubscribe = this.state.selectedInstance;\n this.setState({ alive });\n await this.props.socket.subscribeState(\n `system.adapter.${this.state.selectedInstance}.alive`,\n this.aliveHandler,\n );\n } else if (this.alive !== null) {\n alive = this.alive;\n }\n\n if (alive) {\n try {\n await this.loadAllData();\n } catch (error) {\n console.error(error);\n }\n }\n }\n\n componentWillUnmount(): void {\n if (this.state.selectedInstance) {\n this.props.socket.unsubscribeState(\n `system.adapter.${this.state.selectedInstance}.alive`,\n this.aliveHandler,\n );\n }\n }\n\n aliveHandler: ioBroker.StateChangeHandler = (id: string, state: ioBroker.State | null | undefined): void => {\n if (this.state.selectedInstance && id === `system.adapter.${this.state.selectedInstance}.alive`) {\n const alive = !!state?.val;\n // Compare against the synchronous mirror, not `state.alive` (which may not be committed yet\n // when `subscribeState` replays the initial value). This is what stops the double load.\n if (alive !== this.alive) {\n this.alive = alive;\n this.setState({ alive }, () => {\n if (alive) {\n // The instance just became alive: (re)load all data directly instead of\n // re-running the whole mount logic.\n this.loadAllData().catch(console.error);\n }\n });\n }\n }\n };\n\n override async loadAllData(): Promise<void> {\n await this.loadInstanceInfos();\n this.loadDeviceList();\n }\n\n override async loadInstanceInfos(): Promise<InstanceDetails> {\n const instanceInfo = await super.loadInstanceInfos();\n return new Promise<InstanceDetails>(resolve =>\n this.setState(\n { instanceInfo, apiVersionError: !['v1', 'v2', 'v3'].includes(instanceInfo.apiVersion) },\n () => resolve(instanceInfo),\n ),\n );\n }\n\n /**\n * Load devices\n */\n override loadDeviceList(): void {\n this.setState({ loading: true }, async () => {\n console.log(`Loading devices for ${this.state.selectedInstance}...`);\n let alive = this.alive;\n\n if (this.state.selectedInstance !== this.lastAliveSubscribe) {\n if (this.lastAliveSubscribe) {\n // unsubscribe from the old instance\n this.props.socket.unsubscribeState(\n `system.adapter.${this.lastAliveSubscribe}.alive`,\n this.aliveHandler,\n );\n }\n\n this.lastAliveSubscribe = this.state.selectedInstance;\n\n if (this.state.selectedInstance) {\n try {\n // check if the instance is alive\n const stateAlive = await this.props.socket.getState(\n `system.adapter.${this.state.selectedInstance}.alive`,\n );\n alive = !!stateAlive?.val;\n } catch (error) {\n console.error(error);\n alive = false;\n }\n // Set the synchronous mirror before subscribing so the replayed initial value\n // does not trigger an extra load on top of the one performed right below.\n this.alive = alive;\n await this.props.socket.subscribeState(\n `system.adapter.${this.state.selectedInstance}.alive`,\n this.aliveHandler,\n );\n } else {\n alive = false;\n }\n }\n\n let devices: DeviceInfo[] = [];\n try {\n this.alive = alive;\n this.setState({ devices, loading: !!alive, alive });\n if (alive) {\n await this.loadDevices((batch, total) => {\n devices = devices.concat(batch);\n this.setState({ devices, loading: true, totalDevices: total });\n console.log(`Loaded ${devices.length} of ${total} devices...`);\n });\n }\n } catch (error) {\n console.error(error);\n devices = [];\n }\n\n this.setState({ devices, loading: false, totalDevices: devices.length });\n console.log(`Loaded ${devices.length} devices for ${this.state.selectedInstance}`);\n });\n }\n\n override updateDevice(update: DeviceInfo): void {\n const updateId = JSON.stringify(update.id);\n this.setState({ devices: this.state.devices.map(d => (JSON.stringify(d.id) === updateId ? update : d)) });\n }\n\n override deleteDevice(deviceId: DeviceId): void {\n const deleteId = JSON.stringify(deviceId);\n const devices = this.state.devices.filter(d => JSON.stringify(d.id) !== deleteId);\n const totalDevices =\n this.state.totalDevices && devices.length < this.state.devices.length\n ? this.state.totalDevices - 1\n : undefined;\n this.setState({ devices, totalDevices });\n }\n\n getText(text: ioBroker.StringOrTranslated): string {\n if (typeof text === 'object') {\n return text[this.language] || text.en;\n }\n\n return text;\n }\n\n handleFilterChange(filter: string): void {\n this.setState({ filterText: filter });\n if (this.filterTimeout) {\n clearTimeout(this.filterTimeout);\n }\n this.filterTimeout = setTimeout(() => {\n this.filterTimeout = null;\n this.setState({ filter });\n }, 250);\n }\n\n renderGroups(\n groups: { name: string; value: string; count: number; icon?: React.JSX.Element | string | null }[] | undefined,\n ): React.JSX.Element | null {\n if (!groups?.length) {\n return null;\n }\n\n return (\n <Select\n style={{ minWidth: 120, marginRight: 8, flexShrink: 0 }}\n variant=\"standard\"\n value={this.state.groupKey || '_'}\n renderValue={value => {\n if (value === '_') {\n value = '';\n }\n const g = groups.find(g => g.value === value);\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {g?.icon || <div style={{ width: 24 }} />}\n {g?.name || value}\n </div>\n );\n }}\n onChange={e => {\n if (e.target.value) {\n window.localStorage.setItem(`dm_group_${this.state.selectedInstance}`, e.target.value);\n } else {\n window.localStorage.removeItem(`dm_group_${this.state.selectedInstance}`);\n }\n this.setState({ groupKey: e.target.value === '_' ? '' : e.target.value });\n }}\n >\n {groups.map(g => (\n <MenuItem\n value={g.value || '_'}\n key={g.value || '_'}\n style={{ display: 'flex', alignItems: 'center', gap: 8 }}\n >\n {g.icon || <div style={{ width: 24 }} />}\n {g.name}\n </MenuItem>\n ))}\n </Select>\n );\n }\n\n renderInstanceCards(): React.JSX.Element[] {\n if (!this.state.dmInstances) {\n return [\n <LinearProgress\n key=\"loadingInstances\"\n style={{ width: '100%' }}\n />,\n ];\n }\n\n const instanceIds = Object.keys(this.state.dmInstances);\n if (!instanceIds.length) {\n return [\n <div\n style={{ padding: 25 }}\n key=\"noInstances\"\n >\n <span>{getTranslation('noInstancesFoundText')}</span>\n </div>,\n ];\n }\n\n const backgroundColor = this.props.theme.palette.mode === 'dark' ? '#0b0b0b' : '#d5d5d5';\n\n if (this.props.smallCards) {\n return instanceIds.map(id => {\n const info = this.state.dmInstances![id];\n return (\n <Card\n key={id}\n sx={{ width: 200, margin: '5px', backgroundColor }}\n >\n <CardActionArea\n onClick={() => this.selectInstance(id)}\n style={{ height: '100%' }}\n >\n <CardContent\n style={{\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: 8,\n }}\n >\n {info.icon ? (\n <Icon\n src={info.icon}\n style={{ width: 32, height: 32, flexShrink: 0 }}\n />\n ) : (\n <QuestionMark style={{ width: 32, height: 32, flexShrink: 0 }} />\n )}\n <div style={{ overflow: 'hidden' }}>\n <Typography\n variant=\"body1\"\n noWrap\n style={{ fontSize: 14, fontWeight: 'bold' }}\n >\n {id}\n </Typography>\n {info.title ? (\n <Typography\n variant=\"caption\"\n color=\"textSecondary\"\n noWrap\n component=\"div\"\n >\n {info.title}\n </Typography>\n ) : null}\n </div>\n </CardContent>\n </CardActionArea>\n </Card>\n );\n });\n }\n\n return instanceIds.map(id => {\n const info = this.state.dmInstances![id];\n return (\n <Card\n key={id}\n sx={{ width: 240, margin: '10px', backgroundColor }}\n >\n <CardActionArea\n onClick={() => this.selectInstance(id)}\n style={{ height: '100%' }}\n >\n <CardContent\n style={{\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 8,\n }}\n >\n {info.icon ? (\n <Icon\n src={info.icon}\n style={{ width: 64, height: 64 }}\n />\n ) : (\n <QuestionMark style={{ width: 64, height: 64 }} />\n )}\n <Typography\n variant=\"h6\"\n style={{ textAlign: 'center', wordBreak: 'break-all' }}\n >\n {id}\n </Typography>\n {info.title ? (\n <Typography\n variant=\"body2\"\n color=\"textSecondary\"\n style={{ textAlign: 'center' }}\n >\n {info.title}\n </Typography>\n ) : null}\n </CardContent>\n </CardActionArea>\n </Card>\n );\n });\n }\n\n /** Collects the resolved model values reported by the cards and keeps the distinct, sorted list in state */\n private reportModel = (deviceId: DeviceId, model: string | undefined): void => {\n const key = JSON.stringify(deviceId);\n if (model) {\n if (this.modelValues.get(key) === model) {\n return;\n }\n this.modelValues.set(key, model);\n } else if (this.modelValues.has(key)) {\n this.modelValues.delete(key);\n } else {\n return;\n }\n const modelOptions = Array.from(new Set(this.modelValues.values())).sort();\n if (\n modelOptions.length !== this.state.modelOptions.length ||\n modelOptions.some((model, i) => model !== this.state.modelOptions[i])\n ) {\n this.setState({ modelOptions });\n }\n };\n\n /** The selected filter field, falling back to `name` if the stored field is not available (e.g. no models found) */\n private getEffectiveFilterField(): DeviceFilterField {\n const field = this.state.filterField;\n if (field === 'name') {\n return 'name';\n }\n // The model field is only available if at least one model value was actually found\n if (field === 'model') {\n return this.state.modelOptions.length ? 'model' : 'name';\n }\n return this.state.devices.some(device => device[field] !== undefined) ? field : 'name';\n }\n\n renderFilterFields(): React.JSX.Element | null {\n const fields: { value: DeviceFilterField; label: string }[] = [\n { value: 'name', label: getTranslation('name') },\n ];\n if (this.state.devices.some(device => device.identifier !== undefined)) {\n fields.push({\n value: 'identifier',\n label: this.getText(this.state.instanceInfo?.identifierLabel ?? 'ID'),\n });\n }\n if (this.state.devices.some(device => device.manufacturer !== undefined)) {\n fields.push({ value: 'manufacturer', label: getTranslation('manufacturer') });\n }\n // Only offer the model filter if at least one model value was actually found\n if (this.state.modelOptions.length) {\n fields.push({ value: 'model', label: getTranslation('model') });\n }\n\n // Only show the field selector when there is more than just the name to choose from\n if (fields.length < 2) {\n return null;\n }\n\n const current = this.getEffectiveFilterField();\n\n return (\n <Select\n variant=\"standard\"\n style={{ width: 130, flexShrink: 0 }}\n value={current}\n onChange={e => {\n const filterField = e.target.value as DeviceFilterField;\n this.setState({ filterField });\n window.localStorage.setItem('dm_filterField', filterField);\n // reset the current filter value when switching the field\n this.handleFilterChange('');\n }}\n >\n {fields.map(field => (\n <MenuItem\n value={field.value}\n key={field.value}\n >\n {field.label}\n </MenuItem>\n ))}\n </Select>\n );\n }\n\n /** The filter value input: a model dropdown for the `model` field, a free-text field otherwise */\n renderFilterValue(): React.JSX.Element {\n if (this.getEffectiveFilterField() === 'model') {\n const value = this.state.modelOptions.includes(this.state.filterText) ? this.state.filterText : '';\n return (\n <Select\n variant=\"standard\"\n style={{ width: 200 }}\n displayEmpty\n value={value}\n onChange={e => this.handleFilterChange(e.target.value)}\n >\n <MenuItem value=\"\">\n <em>{getTranslation('allModels')}</em>\n </MenuItem>\n {this.state.modelOptions.map(model => (\n <MenuItem\n value={model}\n key={model}\n >\n {model}\n </MenuItem>\n ))}\n </Select>\n );\n }\n\n return (\n <TextField\n variant=\"standard\"\n style={{ width: 200 }}\n size=\"small\"\n placeholder={getTranslation('filterLabelText')}\n onChange={e => this.handleFilterChange(e.target.value)}\n value={this.state.filterText}\n autoComplete=\"off\"\n slotProps={{\n input: {\n autoComplete: 'new-password',\n endAdornment: this.state.filterText ? (\n <InputAdornment position=\"end\">\n <IconButton\n tabIndex={-1}\n onClick={() => this.handleFilterChange('')}\n edge=\"end\"\n >\n <Clear />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n htmlInput: {\n autoComplete: 'off',\n },\n }}\n />\n );\n }\n\n renderRootInfo(): React.JSX.Element {\n // The root ThemeProvider (Communication.render) already supplies the correct theme context. The explicit color\n // is a safety net, so older InfoBox versions (whose Typography has no own color) stay readable in dark mode.\n return (\n <InfoBox\n key=\"rootInfo\"\n type=\"info\"\n closeable\n storeId=\"dm_rootInfoClosed\"\n style={{\n width: 'calc(100% - 20px)',\n margin: '0 10px 8px 10px',\n color: this.props.theme.palette.text.primary,\n }}\n >\n {I18n.t('rootInfoText')}\n </InfoBox>\n );\n }\n\n renderContent(): JSX.Element | JSX.Element[] | null {\n const emptyStyle: React.CSSProperties = {\n padding: 25,\n };\n\n if ((this.props.triggerLoad || 0) !== this.lastTriggerLoad) {\n this.lastTriggerLoad = this.props.triggerLoad || 0;\n setTimeout(() => this.loadDeviceList(), 50);\n }\n\n // if instance changed\n if (this.lastInstance !== this.state.selectedInstance) {\n this.lastInstance = this.state.selectedInstance;\n setTimeout(async (): Promise<void> => {\n if (this.state.selectedInstance) {\n try {\n await this.loadAllData();\n } catch (error) {\n console.error(error);\n }\n } else {\n this.loadDeviceList();\n }\n }, 50);\n }\n if (this.props.selectedInstance && this.props.selectedInstance !== this.state.selectedInstance) {\n setTimeout(() => this.setState({ selectedInstance: this.props.selectedInstance! }), 50);\n }\n const deviceGroups: { name: string; value: string; count: number; icon?: React.JSX.Element | string | null }[] =\n [];\n const showRootPage =\n !this.props.embedded && this.props.selectedInstance === undefined && !this.state.selectedInstance;\n\n let list: React.JSX.Element[] | undefined;\n if (showRootPage) {\n list = this.renderInstanceCards();\n list.unshift(this.renderRootInfo());\n } else if (!this.props.embedded && !this.state.alive) {\n list = [\n <div\n style={emptyStyle}\n key=\"notAlive\"\n >\n <span>{getTranslation('instanceNotAlive')}</span>\n </div>,\n ];\n } else if (!this.state.devices.length && this.state.selectedInstance && !this.state.loading) {\n list = [\n <div\n style={emptyStyle}\n key=\"notFound\"\n >\n <span>{getTranslation('noDevicesFoundText')}</span>\n </div>,\n ];\n } else {\n // build a device types list\n let filteredDevices = this.state.devices;\n if (!this.state.loading && !this.props.embedded && filteredDevices.find(device => device.group)) {\n deviceGroups.push({\n name: I18n.t('All'),\n value: '',\n count: filteredDevices.length,\n icon: <FilterAltOff />,\n });\n filteredDevices.forEach(device => {\n if (device.group) {\n const type = deviceGroups.find(t => t.value === device.group?.key);\n if (type) {\n type.count++;\n } else {\n const icon = device.group.icon ? <DeviceTypeIcon src={device.group.icon} /> : null;\n\n deviceGroups.push({\n name: this.getText(device.group.name || device.group.key),\n value: device.group.key,\n count: 1,\n icon,\n });\n }\n }\n });\n const unknown = filteredDevices.filter(device => !device.group);\n if (unknown.length) {\n deviceGroups.push({\n name: I18n.t('Unknown'),\n value: '?',\n count: unknown.length,\n icon: <QuestionMark />,\n });\n }\n\n if (this.state.groupKey && this.state.groupKey !== '_') {\n // filter out all devices belonging to this group\n if (this.state.groupKey === '?') {\n filteredDevices = filteredDevices.filter(device => !device.group?.key);\n } else {\n filteredDevices = filteredDevices.filter(device => device.group?.key === this.state.groupKey);\n }\n }\n }\n\n if (this.state.selectedInstance) {\n list = filteredDevices.map(device => (\n <DeviceCard\n key={JSON.stringify(device.id)}\n smallCards={this.props.smallCards ?? this.state.instanceInfo?.smallCards}\n filter={this.props.embedded ? this.props.filter : this.state.filter}\n alive={!!this.state.alive}\n id={device.id}\n identifierLabel={this.state.instanceInfo?.identifierLabel ?? 'ID'}\n device={device}\n instanceId={this.state.selectedInstance}\n uploadImagesToInstance={this.props.uploadImagesToInstance}\n deviceHandler={this.deviceHandler}\n controlHandler={this.controlHandler}\n controlStateHandler={this.controlStateHandler}\n socket={this.props.socket}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n theme={this.props.theme}\n isFloatComma={this.props.isFloatComma}\n dateFormat={this.props.dateFormat}\n onlyUpdatable={this.state.onlyUpdatable}\n onlyBatteryProblem={this.state.onlyBatteryProblem}\n filterField={this.props.embedded ? undefined : this.getEffectiveFilterField()}\n onModel={this.reportModel}\n />\n ));\n if (this.state.loading) {\n const skeletons = (this.state.totalDevices ?? list.length + 1) - list.length;\n for (let i = 0; i < skeletons; i++) {\n list.push(\n <DeviceCardSkeleton\n key={`skeleton-${i}`}\n smallCards={this.props.smallCards ?? this.state.instanceInfo?.smallCards}\n theme={this.props.theme}\n />,\n );\n }\n } else if (this.state.devices.length > 0) {\n list.push(\n <Box\n key=\"filtered\"\n sx={{\n padding: '25px',\n '&:not(:first-child)': {\n display: 'none',\n },\n }}\n >\n <span>{getTranslation('allDevicesFilteredOut')}</span>\n </Box>,\n );\n }\n } else {\n list = [\n <div\n style={emptyStyle}\n key=\"selectInstance\"\n >\n <span>{getTranslation('selectInstanceText')}</span>\n </div>,\n ];\n }\n }\n\n if (this.props.embedded) {\n return (\n <>\n {this.state.loading ? <LinearProgress style={{ width: '100%' }} /> : null}\n {this.state.apiVersionError ? <div>{I18n.t('apiVersionError')}</div> : list}\n </>\n );\n }\n\n return (\n <div\n style={{ width: '100%', height: '100%', overflow: 'hidden', display: 'flex', flexDirection: 'column' }}\n >\n <Toolbar\n variant=\"dense\"\n style={{\n backgroundColor: '#777',\n display: 'flex',\n flexWrap: 'wrap',\n rowGap: 4,\n alignItems: 'center',\n flexShrink: 0,\n }}\n >\n {this.props.title}\n {this.props.selectedInstance === undefined &&\n this.state.dmInstances &&\n this.state.selectedInstance ? (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {Object.keys(this.state.dmInstances).length > 1 ? (\n <Tooltip\n title={getTranslation('backToInstancesList')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <IconButton\n onClick={() => this.backToInstancesList()}\n size=\"small\"\n >\n <ArrowBack />\n </IconButton>\n </Tooltip>\n ) : null}\n {this.state.dmInstances[this.state.selectedInstance]?.icon ? (\n <Icon\n src={this.state.dmInstances[this.state.selectedInstance].icon}\n style={{ width: 24, height: 24 }}\n />\n ) : null}\n <span style={{ marginRight: 8 }}>{this.state.selectedInstance}</span>\n </div>\n ) : null}\n {this.props.selectedInstance === undefined && !this.state.selectedInstance ? (\n <Tooltip\n title={getTranslation('refreshInstanceList')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <span>\n <IconButton\n onClick={() => this.refreshInstanceList()}\n disabled={!this.state.dmInstances}\n size=\"small\"\n >\n <Refresh />\n </IconButton>\n </span>\n </Tooltip>\n ) : null}\n {this.state.selectedInstance ? (\n <Tooltip\n title={getTranslation('refreshTooltip')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <span>\n <IconButton\n onClick={() => this.loadAllData()}\n disabled={!this.state.alive || this.state.apiVersionError}\n size=\"small\"\n >\n <Refresh />\n </IconButton>\n </span>\n </Tooltip>\n ) : null}\n {!this.state.apiVersionError && this.state.alive && this.state.instanceInfo?.actions?.length ? (\n <div style={{ marginLeft: 20 }}>\n {this.state.instanceInfo.actions.map(action => (\n <InstanceActionButton\n key={action.id}\n action={action}\n instanceHandler={this.instanceHandler}\n />\n ))}\n </div>\n ) : null}\n\n <div style={{ flexGrow: 1 }} />\n\n {!this.state.apiVersionError && this.renderGroups(deviceGroups)}\n {!this.state.apiVersionError &&\n this.state.alive &&\n this.state.devices.some(device => device.update) ? (\n <Tooltip\n title={getTranslation('onlyUpdatableTooltip')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <IconButton\n color={this.state.onlyUpdatable ? 'primary' : 'default'}\n onClick={() => {\n const onlyUpdatable = !this.state.onlyUpdatable;\n this.setState({ onlyUpdatable });\n window.localStorage.setItem('dm_onlyUpdatable', onlyUpdatable ? 'true' : 'false');\n }}\n size=\"small\"\n >\n <SystemUpdateAlt />\n </IconButton>\n </Tooltip>\n ) : null}\n {!this.state.apiVersionError &&\n this.state.alive &&\n this.state.devices.some(device => hasBatteryStatus(device.status)) ? (\n <Tooltip\n title={getTranslation('onlyBatteryProblemTooltip')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <IconButton\n color={this.state.onlyBatteryProblem ? 'primary' : 'default'}\n onClick={() => {\n const onlyBatteryProblem = !this.state.onlyBatteryProblem;\n this.setState({ onlyBatteryProblem });\n window.localStorage.setItem(\n 'dm_onlyBatteryProblem',\n onlyBatteryProblem ? 'true' : 'false',\n );\n }}\n size=\"small\"\n >\n <BatteryAlert />\n </IconButton>\n </Tooltip>\n ) : null}\n {!this.state.apiVersionError && this.state.alive ? (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}>\n <FilterAlt style={{ color: '#fff' }} />\n {this.renderFilterFields()}\n {this.renderFilterValue()}\n </div>\n ) : null}\n <Typography\n sx={{ display: { xs: 'none', md: 'block' } }}\n style={{\n marginLeft: 16,\n fontWeight: 'bold',\n whiteSpace: 'nowrap',\n color: '#fff',\n }}\n >\n Config-Manager\n </Typography>\n </Toolbar>\n <div\n style={{\n width: '100%',\n flex: 1,\n minHeight: 0,\n marginTop: 8,\n overflow: 'auto',\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'stretch',\n alignContent: 'flex-start',\n ...this.props.style,\n }}\n >\n {this.state.loading ? <LinearProgress style={{ width: '100%' }} /> : null}\n {this.state.apiVersionError ? <div>{I18n.t('apiVersionError')}</div> : list}\n </div>\n </div>\n );\n }\n}\n"]}
|
package/build/DeviceStatus.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { I18n } from '@iobroker/adapter-react-v5';
|
|
1
2
|
import { Battery20 as Battery20Icon, Battery30 as Battery30Icon, Battery50 as Battery50Icon, Battery60 as Battery60Icon, Battery80 as Battery80Icon, Battery90 as Battery90Icon, BatteryAlert as BatteryAlertIcon, BatteryCharging50 as BatteryCharging50Icon, BatteryFull as BatteryFullIcon, Bluetooth as IconConnectionBluetooth, Cable as IconConnectionLan, BluetoothDisabled as IconConnectionNoBluetooth, WifiOff as IconConnectionNoWifi, Wifi as IconConnectionWifi, Link as LinkIcon, LinkOff as LinkOffIcon, NetworkCheck as NetworkCheckIcon, SystemUpdateAlt as SystemUpdateAltIcon, Warning as WarningIcon, } from '@mui/icons-material';
|
|
2
3
|
import { IconButton, Tooltip } from '@mui/material';
|
|
3
4
|
import React, { useMemo } from 'react';
|
|
@@ -200,10 +201,24 @@ export default function DeviceStatus(props) {
|
|
|
200
201
|
React.createElement(WarningIcon, { style: iconStyleWarning })))) : null,
|
|
201
202
|
updateAvailable ? (React.createElement(Tooltip, { title: getTranslation('updateAvailable') +
|
|
202
203
|
(updateNewVersion ? `: ${updateVersion ? `${updateVersion} → ` : ''}${updateNewVersion}` : ''), slotProps: { popper: { sx: styles.tooltip } } }, props.updateAction ? (React.createElement(IconButton, { size: "small", onClick: e => {
|
|
203
|
-
if (props.updateAction) {
|
|
204
|
-
|
|
205
|
-
props.deviceHandler(props.deviceId, props.updateAction)();
|
|
204
|
+
if (!props.updateAction) {
|
|
205
|
+
return;
|
|
206
206
|
}
|
|
207
|
+
e.stopPropagation();
|
|
208
|
+
// An update is a significant operation, so always ask for confirmation
|
|
209
|
+
// before triggering it. Reuse the action's own confirmation message if the
|
|
210
|
+
// backend provided one; otherwise build a default one including the versions.
|
|
211
|
+
// The confirmation is then handled by the standard device action flow
|
|
212
|
+
// (deviceHandler -> showConfirmation -> renderConfirmationDialog).
|
|
213
|
+
let confirmation = props.updateAction.confirmation;
|
|
214
|
+
if (!confirmation) {
|
|
215
|
+
let message = getTranslation('updateConfirmation');
|
|
216
|
+
if (updateNewVersion) {
|
|
217
|
+
message += `: ${updateVersion ? `${updateVersion} → ` : ''}${updateNewVersion}`;
|
|
218
|
+
}
|
|
219
|
+
confirmation = { [I18n.getLanguage()]: message, en: message };
|
|
220
|
+
}
|
|
221
|
+
props.deviceHandler(props.deviceId, { ...props.updateAction, confirmation })();
|
|
207
222
|
} },
|
|
208
223
|
React.createElement(SystemUpdateAltIcon, { style: iconStyleUpdate }))) : (React.createElement("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'center' } },
|
|
209
224
|
React.createElement(SystemUpdateAltIcon, { style: iconStyleUpdate }))))) : null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceStatus.js","sourceRoot":"./src/","sources":["DeviceStatus.tsx"],"names":[],"mappings":"AACA,OAAO,EACH,SAAS,IAAI,aAAa,EAC1B,SAAS,IAAI,aAAa,EAC1B,SAAS,IAAI,aAAa,EAC1B,SAAS,IAAI,aAAa,EAC1B,SAAS,IAAI,aAAa,EAC1B,SAAS,IAAI,aAAa,EAC1B,YAAY,IAAI,gBAAgB,EAChC,iBAAiB,IAAI,qBAAqB,EAC1C,WAAW,IAAI,eAAe,EAC9B,SAAS,IAAI,uBAAuB,EACpC,KAAK,IAAI,iBAAiB,EAC1B,iBAAiB,IAAI,yBAAyB,EAC9C,OAAO,IAAI,oBAAoB,EAC/B,IAAI,IAAI,kBAAkB,EAC1B,IAAI,IAAI,QAAQ,EAChB,OAAO,IAAI,WAAW,EACtB,YAAY,IAAI,gBAAgB,EAChC,eAAe,IAAI,mBAAmB,EACtC,OAAO,IAAI,WAAW,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,EAAE,OAAO,EAAuC,MAAM,OAAO,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAS3C,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGzC,MAAM,CAAC,MAAM,OAAO,GAAG;IACnB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;CACnB,CAAC;AAEF,MAAM,MAAM,GAAwC;IAChD,OAAO,EAAE;QACL,aAAa,EAAE,MAAM;KACxB;CACJ,CAAC;AAiBF,SAAS,UAAU,CAAC,KAAgB;IAChC,OAAO,CACH,6BACI,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAC/C,OAAO,EAAC,aAAa,EACrB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC5D,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC7E,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;QAElB,8BACI,IAAI,EAAC,cAAc,EACnB,CAAC,EAAC,mdAAmd,GACvd;QACF,8BACI,IAAI,EAAC,cAAc,EACnB,CAAC,EAAC,iJAAiJ,GACrJ,CACA,CACT,CAAC;AACN,CAAC;AAED,SAAS,SAAS,CAAC,KAAgB;IAC/B,OAAO,CACH,6BACI,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAC/C,OAAO,EAAC,eAAe,EACvB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC5D,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC7E,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;QAElB,8BACI,IAAI,EAAC,cAAc,EACnB,CAAC,EAAC,oqCAAoqC,GACxqC,CACA,CACT,CAAC;AACN,CAAC;AAED,SAAS,UAAU,CAAC,KAAgB;IAChC,OAAO,CACH,6BACI,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAC/C,OAAO,EAAC,WAAW,EACnB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC5D,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC7E,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;QAElB,8BACI,IAAI,EAAC,cAAc,EACnB,CAAC,EAAC,qRAAqR,GACzR;QACF,8BACI,IAAI,EAAC,cAAc,EACnB,CAAC,EAAC,mQAAmQ,GACvQ,CACA,CACT,CAAC;AACN,CAAC;AAmBD,SAAS,SAAS,CAAC,MAAc,EAAE,SAAoB;IACnD,IAAI,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,CAAC;IAED,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC;AAED,MAAM,WAAW,GAAG;IAChB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;CACnB,CAAC;AACF,MAAM,cAAc,GAAG;IACnB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;CACnB,CAAC;AACF,MAAM,gBAAgB,GAAG;IACrB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;CACnB,CAAC;AACF,MAAM,gBAAgB,GAAG;IACrB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;CACnB,CAAC;AACF,MAAM,mBAAmB,GAAG;IACxB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;CACnB,CAAC;AACF,MAAM,eAAe,GAAG;IACpB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;CACnB,CAAC;AAEF,SAAS,cAAc,CAAC,OAAe;IACnC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACf,OAAO,oBAAC,eAAe,IAAC,KAAK,EAAE,WAAW,GAAI,CAAC;IACnD,CAAC;IACD,IAAI,OAAO,GAAG,EAAE,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QAChC,OAAO,oBAAC,aAAa,IAAC,KAAK,EAAE,WAAW,GAAI,CAAC;IACjD,CAAC;IACD,IAAI,OAAO,GAAG,EAAE,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QAChC,OAAO,oBAAC,aAAa,IAAC,KAAK,EAAE,WAAW,GAAI,CAAC;IACjD,CAAC;IACD,IAAI,OAAO,GAAG,EAAE,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QAChC,OAAO,oBAAC,aAAa,IAAC,KAAK,EAAE,WAAW,GAAI,CAAC;IACjD,CAAC;IACD,IAAI,OAAO,GAAG,EAAE,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QAChC,OAAO,oBAAC,aAAa,IAAC,KAAK,EAAE,mBAAmB,GAAI,CAAC;IACzD,CAAC;IACD,IAAI,OAAO,GAAG,EAAE,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QAChC,OAAO,oBAAC,aAAa,IAAC,KAAK,EAAE,mBAAmB,GAAI,CAAC;IACzD,CAAC;IACD,IAAI,OAAO,GAAG,EAAE,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QAChC,OAAO,oBAAC,aAAa,IAAC,KAAK,EAAE,gBAAgB,GAAI,CAAC;IACtD,CAAC;IAED,OAAO,oBAAC,gBAAgB,IAAC,KAAK,EAAE,cAAc,GAAI,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,KAAwB;IACzD,IAAI,MAAoB,CAAC;IACzB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,GAAG,EAAE,CAAC;IAChB,CAAC;SAAM,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,GAAG;YACL,UAAU,EAAE,KAAK,CAAC,MAAM;SAC3B,CAAC;IACN,CAAC;SAAM,CAAC;QACJ,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC7E,MAAM,eAAe,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC9F,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC1F,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAEhG,MAAM,kBAAkB,GAAG,OAAO,CAAkB,GAAG,EAAE;QACrD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,UAAU,GACZ,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CACjC;QACI,6BAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAI;QAE3B,oBAAC,OAAO,IACJ,KAAK,EACD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,mBAAmB,CAAC,EAE9F,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE;YAE7C,6BAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;gBAC1E,oBAAC,MAAM,IACH,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,QAAQ,EAAE,CAAC,KAAK,CAAC,mBAAmB,EACpC,QAAQ,EAAE,GAAG,EAAE,CACX,KAAK,CAAC,mBAAmB;wBACzB,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,mBAAmB,CAAC,EAAE,EAEpE,KAAK,EAAE,KAAK,CAAC,KAAK,GACpB,CACA,CACA,CAEf,CACN,CAAC,CAAC,CAAC,IAAI,CAAC;IACb,IAAI,gBAA0C,CAAC;IAC/C,IAAI,KAAK,CAAC,cAAc,KAAK,MAAM,EAAE,CAAC;QAClC,gBAAgB;YACZ,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,CACzB,oBAAC,kBAAkB,IAAC,KAAK,EAAE,WAAW,GAAI,CAC7C,CAAC,CAAC,CAAC,UAAU,KAAK,cAAc,CAAC,CAAC,CAAC,CAChC,oBAAC,oBAAoB,IAAC,KAAK,EAAE,cAAc,GAAI,CAClD,CAAC,CAAC,CAAC,CACA,oBAAC,kBAAkB,IAAC,KAAK,EAAE,gBAAgB,GAAI,CAClD,CAAC;IACV,CAAC;SAAM,IAAI,KAAK,CAAC,cAAc,KAAK,WAAW,EAAE,CAAC;QAC9C,gBAAgB;YACZ,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,CACzB,oBAAC,uBAAuB,IAAC,KAAK,EAAE,WAAW,GAAI,CAClD,CAAC,CAAC,CAAC,UAAU,KAAK,cAAc,CAAC,CAAC,CAAC,CAChC,oBAAC,yBAAyB,IAAC,KAAK,EAAE,cAAc,GAAI,CACvD,CAAC,CAAC,CAAC,CACA,oBAAC,uBAAuB,IAAC,KAAK,EAAE,gBAAgB,GAAI,CACvD,CAAC;IACV,CAAC;SAAM,IAAI,KAAK,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;QACxC,gBAAgB;YACZ,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,CACzB,oBAAC,iBAAiB,IAAC,KAAK,EAAE,WAAW,GAAI,CAC5C,CAAC,CAAC,CAAC,UAAU,KAAK,cAAc,CAAC,CAAC,CAAC,CAChC,oBAAC,iBAAiB,IAAC,KAAK,EAAE,cAAc,GAAI,CAC/C,CAAC,CAAC,CAAC,CACA,oBAAC,iBAAiB,IAAC,KAAK,EAAE,gBAAgB,GAAI,CACjD,CAAC;IACV,CAAC;SAAM,IAAI,KAAK,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;QAC3C,gBAAgB;YACZ,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,CACzB,oBAAC,UAAU,IAAC,KAAK,EAAE,WAAW,GAAI,CACrC,CAAC,CAAC,CAAC,UAAU,KAAK,cAAc,CAAC,CAAC,CAAC,CAChC,oBAAC,UAAU,IAAC,KAAK,EAAE,cAAc,GAAI,CACxC,CAAC,CAAC,CAAC,CACA,oBAAC,UAAU,IAAC,KAAK,EAAE,gBAAgB,GAAI,CAC1C,CAAC;IACV,CAAC;SAAM,IAAI,KAAK,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;QAC3C,gBAAgB;YACZ,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,CACzB,oBAAC,SAAS,IAAC,KAAK,EAAE,WAAW,GAAI,CACpC,CAAC,CAAC,CAAC,UAAU,KAAK,cAAc,CAAC,CAAC,CAAC,CAChC,oBAAC,SAAS,IAAC,KAAK,EAAE,cAAc,GAAI,CACvC,CAAC,CAAC,CAAC,CACA,oBAAC,SAAS,IAAC,KAAK,EAAE,gBAAgB,GAAI,CACzC,CAAC;IACV,CAAC;SAAM,IAAI,KAAK,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;QAC3C,gBAAgB;YACZ,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,CACzB,oBAAC,UAAU,IAAC,KAAK,EAAE,WAAW,GAAI,CACrC,CAAC,CAAC,CAAC,UAAU,KAAK,cAAc,CAAC,CAAC,CAAC,CAChC,oBAAC,UAAU,IAAC,KAAK,EAAE,cAAc,GAAI,CACxC,CAAC,CAAC,CAAC,CACA,oBAAC,UAAU,IAAC,KAAK,EAAE,gBAAgB,GAAI,CAC1C,CAAC;IACV,CAAC;SAAM,CAAC;QACJ,gBAAgB;YACZ,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,CACzB,oBAAC,QAAQ,IAAC,KAAK,EAAE,WAAW,GAAI,CACnC,CAAC,CAAC,CAAC,UAAU,KAAK,cAAc,CAAC,CAAC,CAAC,CAChC,oBAAC,WAAW,IAAC,KAAK,EAAE,cAAc,GAAI,CACzC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjB,CAAC;IAED,MAAM,cAAc,GAChB,UAAU,KAAK,WAAW,IAAI,UAAU,KAAK,cAAc,CAAC,CAAC,CAAC,CAC1D,oBAAC,OAAO,IACJ,KAAK,EACD,CAAC,UAAU,KAAK,WAAW;YACvB,CAAC,CAAC,cAAc,CAAC,sBAAsB,CAAC;YACxC,CAAC,CAAC,cAAc,CAAC,yBAAyB,CAAC,CAAC;YAChD,CAAC,KAAK,CAAC,YAAY;gBACf,CAAC,CAAC,KAAK,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,IAAI,iBAAiB,CAAC,EAAE;gBAC5E,CAAC,CAAC,EAAE,CAAC,EAEb,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,IAE5C,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAClB,oBAAC,UAAU,IACP,OAAO,EAAE,CAAC,CAAC,EAAE;YACT,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBACrB,CAAC,CAAC,eAAe,EAAE,CAAC;gBACpB,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9D,CAAC;QACL,CAAC;QAEA,gBAAgB;QACjB,6BAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAS,CACpE,CAChB,CAAC,CAAC,CAAC,CACA,6BAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,IACzE,gBAAgB,CACf,CACT,CACK,CACb,CAAC,CAAC,CAAC,CACA,gBAAgB,CACnB,CAAC;IAEN,OAAO,CACH,6BACI,KAAK,EAAE;YACH,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YAClD,KAAK,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACrD,GAAG,EAAE,CAAC;SACT;QAEA,cAAc;QAEd,IAAI,IAAI,CACL,oBAAC,OAAO,IACJ,KAAK,EAAC,MAAM,EACZ,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE;YAE7C,6BAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;gBAC1E,oBAAC,gBAAgB,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAI;gBACjF,2BAAG,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAG,IAAI,CAAK,CACpD,CACA,CACb;QAEA,OAAO,OAAO,KAAK,QAAQ,IAAI,CAC5B,oBAAC,OAAO,IACJ,KAAK,EAAE,cAAc,CAAC,gBAAgB,CAAC,EACvC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE;YAE7C,6BAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;gBACzE,kBAAkB;gBACnB,2BAAG,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE;oBAAG,OAAO;wBAAM,CACxD,CACA,CACb;QAEA,OAAO,OAAO,KAAK,QAAQ,IAAI,CAC5B,oBAAC,OAAO,IACJ,KAAK,EAAE,cAAc,CAAC,gBAAgB,CAAC,EACvC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE;YAE7C,6BAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;gBACzE,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,oBAAC,qBAAqB,OAAG,CAAC,CAAC,CAAC,oBAAC,eAAe,OAAG;gBACxE,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,CACtB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAC9C,2BAAG,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAG,OAAO,CAAK,CAC5D,CAAC,CAAC,CAAC,CACA,2BAAG,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE;oBACtC,8BAAM,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,IAAG,OAAO,CAAQ;yBAEjD,CACP,CACJ,CAAC,CAAC,CAAC,IAAI,CACN,CACA,CACb;QAEA,OAAO,OAAO,KAAK,SAAS,IAAI,CAC7B,oBAAC,OAAO,IACJ,KAAK,EAAE,cAAc,CAAC,gBAAgB,CAAC,EACvC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE;YAE7C,6BAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,IACzE,OAAO,CAAC,CAAC,CAAC,CACP,oBAAC,eAAe,IAAC,KAAK,EAAE,WAAW,GAAI,CAC1C,CAAC,CAAC,CAAC,CACA,oBAAC,gBAAgB,IAAC,KAAK,EAAE,cAAc,GAAI,CAC9C,CACC,CACA,CACb;QAEA,OAAO,CAAC,CAAC,CAAC,CACP,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CACzD,oBAAC,OAAO,IACJ,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,EAC9B,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE;YAE7C,6BAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;gBAC1E,oBAAC,WAAW,IAAC,KAAK,EAAE,gBAAgB,GAAI,CACtC,CACA,CACb,CAAC,CAAC,CAAC,CACA,6BAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;YAC1E,oBAAC,WAAW,IAAC,KAAK,EAAE,gBAAgB,GAAI,CACtC,CACT,CACJ,CAAC,CAAC,CAAC,IAAI;QAEP,eAAe,CAAC,CAAC,CAAC,CACf,oBAAC,OAAO,IACJ,KAAK,EACD,cAAc,CAAC,iBAAiB,CAAC;gBACjC,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAElG,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,IAE5C,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAClB,oBAAC,UAAU,IACP,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,CAAC,CAAC,EAAE;gBACT,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;oBACrB,CAAC,CAAC,eAAe,EAAE,CAAC;oBACpB,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC9D,CAAC;YACL,CAAC;YAED,oBAAC,mBAAmB,IAAC,KAAK,EAAE,eAAe,GAAI,CACtC,CAChB,CAAC,CAAC,CAAC,CACA,6BAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;YAC1E,oBAAC,mBAAmB,IAAC,KAAK,EAAE,eAAe,GAAI,CAC7C,CACT,CACK,CACb,CAAC,CAAC,CAAC,IAAI;QAEP,UAAU,CACT,CACT,CAAC;AACN,CAAC","sourcesContent":["import type { Connection, IobTheme, ThemeType } from '@iobroker/adapter-react-v5';\nimport {\n Battery20 as Battery20Icon,\n Battery30 as Battery30Icon,\n Battery50 as Battery50Icon,\n Battery60 as Battery60Icon,\n Battery80 as Battery80Icon,\n Battery90 as Battery90Icon,\n BatteryAlert as BatteryAlertIcon,\n BatteryCharging50 as BatteryCharging50Icon,\n BatteryFull as BatteryFullIcon,\n Bluetooth as IconConnectionBluetooth,\n Cable as IconConnectionLan,\n BluetoothDisabled as IconConnectionNoBluetooth,\n WifiOff as IconConnectionNoWifi,\n Wifi as IconConnectionWifi,\n Link as LinkIcon,\n LinkOff as LinkOffIcon,\n NetworkCheck as NetworkCheckIcon,\n SystemUpdateAlt as SystemUpdateAltIcon,\n Warning as WarningIcon,\n} from '@mui/icons-material';\nimport { IconButton, Tooltip } from '@mui/material';\nimport React, { useMemo, type CSSProperties, type MouseEvent } from 'react';\nimport { useStateOrObject } from './hooks';\nimport type {\n ActionBase,\n ConfigConnectionType,\n DeviceAction,\n DeviceId,\n DeviceInfo,\n DeviceStatus,\n} from './protocol/api';\nimport Switch from './Switch';\nimport { getTranslation } from './Utils';\nimport type { StateOrObjectHandler } from './StateOrObjectHandler';\n\nexport const ACTIONS = {\n STATUS: 'status',\n DISABLE: 'disable',\n ENABLE: 'enable',\n};\n\nconst styles: Record<string, React.CSSProperties> = {\n tooltip: {\n pointerEvents: 'none',\n },\n};\n\nexport interface IconProps {\n /** The width in pixels or percentage of the icon. */\n width?: number | string;\n /** The height in pixels or percentage of the icon. */\n height?: number | string;\n /** Click handler. */\n onClick?: (e: MouseEvent) => void;\n /** The class name for the SVG element. */\n className?: string;\n /** Styles for the SVG element. */\n style?: CSSProperties;\n /** The font size of the icon. */\n fontSize?: 'small';\n}\n\nfunction ThreadIcon(props: IconProps): React.JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 165 165\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M82.498,0C37.008,0,0,37.008,0,82.496c0,45.181,36.51,81.977,81.573,82.476V82.569l-27.002-0.002 c-8.023,0-14.554,6.53-14.554,14.561c0,8.023,6.531,14.551,14.554,14.551v17.98c-17.939,0-32.534-14.595-32.534-32.531 c0-17.944,14.595-32.543,32.534-32.543l27.002,0.004v-9.096c0-14.932,12.146-27.08,27.075-27.08 c14.932,0,27.082,12.148,27.082,27.08c0,14.931-12.15,27.08-27.082,27.08l-9.097-0.001v80.641 C136.889,155.333,165,122.14,165,82.496C165,37.008,127.99,0,82.498,0z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M117.748,55.493c0-5.016-4.082-9.098-9.1-9.098c-5.015,0-9.097,4.082-9.097,9.098v9.097l9.097,0.001 C113.666,64.591,117.748,60.51,117.748,55.493z\"\n />\n </svg>\n );\n}\n\nfunction ZWaveIcon(props: IconProps): React.JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 1073 1068\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M716 1.1C632.9 5.3 549.8 23.7 472 55c-66.4 26.7-132.6 65.5-188.5 110.4-43.8 35.1-85.2 76.7-120.1 120.6C72.4 400.4 16.7 539.8 3.5 686 1.8 705.1-.1 754.7.7 758c.5 2 1 2 49.7 1.8l49.1-.3.7-20c2.4-64.6 13.4-126 33.2-186 80.8-243.9 297-419.9 552.1-449.4 20.2-2.4 44.2-4.1 56.6-4.1h8.9V50 0l-9.7.1c-5.4.1-16.8.6-25.3 1zm-.8 208c-78.5 4.7-158 27.4-226.5 64.5-68.7 37.3-126.4 86.3-175.2 148.9-11 14-33.2 47.3-42.3 63.5-44 77.8-68.6 164.9-70.9 251.2l-.6 22.8h49.5 49.4l1.2-19c6.3-98.7 40-185.8 102.2-263.3 12.7-15.9 41.2-45.2 57-58.7 66.1-56.3 142.1-91.8 226-105.5 18.9-3 44.1-5.5 56.7-5.5h9.3v-50-50l-11.2.1c-6.2.1-17.3.6-24.6 1zm17.8 251c-104.5 9.2-195.2 69.7-243.6 162.4-43.9 84-45.5 184.2-4.5 270 60.3 125.9 198.1 194.2 334.9 166 46.6-9.7 89.5-29.7 127.2-59.6 13.5-10.7 37.3-34.5 48-47.9 34.2-43.1 55.2-92 63.7-148.6 2.2-15.1 2.5-62.7.5-77.4-3.6-25.2-10.1-51.4-17.8-71.2-10.1-26.2-29.4-59.7-47-81.8-9.7-12.1-35-37.2-47.4-47-47.8-37.9-104.5-60.1-165.4-65-14.7-1.1-34.7-1.1-48.6.1zm174.7 138.6c-.3.5-30.9 49.2-68.1 108.3L772 814.5l67.9.5 68 .5-30.1 48.8-30 48.7h-131c-104.4 0-130.9-.3-130.5-1.3.2-.6 32.7-51.1 72.1-112.1L730 687.9c0-.5-29.5-1-66.5-1.1l-66.6-.3 27.7-44.3 27.6-44.2h128l127.5.7z\"\n />\n </svg>\n );\n}\n\nfunction ZigBeeIcon(props: IconProps): React.JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 48 48\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M32.042,9.792c4.595,1.238,4.88,3.165,5.524,5.048C34.841,17.664,17.35,35.7,17.35,35.7 s10.901,1.177,23.487-1.003c-0.001,0.029-0.002,0.048-0.003,0.076C42.829,31.661,44,27.97,44,24c0-11.046-8.954-20-20-20 c-5.634,0-10.715,2.338-14.35,6.087C15.489,9.124,26.89,8.403,32.042,9.792z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M14.724,37.285c-1.982-0.347-4.212-2.131-4.707-5.302c1.437-1.239,19.994-20.507,19.994-20.507 c-7.008-0.424-14.569-0.465-22.237,0.864C5.408,15.625,4,19.644,4,24c0,11.046,8.954,20,20,20c6.173,0,11.689-2.8,15.358-7.195 C35.486,37.33,23.257,38.769,14.724,37.285z\"\n />\n </svg>\n );\n}\n\ninterface DeviceStatusProps {\n socket: Connection;\n status: DeviceStatus | null;\n deviceId: DeviceId;\n connectionType?: ConfigConnectionType;\n statusAction?: DeviceAction;\n enabled?: boolean;\n disableEnableAction?: DeviceAction;\n /** Update information of the device (firmware/software) */\n update?: DeviceInfo['update'];\n /** Reserved \"update\" action. If provided, the update indicator becomes a clickable button */\n updateAction?: DeviceAction;\n deviceHandler: (deviceId: DeviceId, action: ActionBase) => () => void;\n theme: IobTheme;\n stateOrObjectHandler: StateOrObjectHandler;\n}\n\nfunction rssiColor(signal: number, themeType: ThemeType): string {\n if (signal < -80) {\n return themeType === 'dark' ? '#ff5c5c' : '#aa0000';\n }\n if (signal < -60) {\n return themeType === 'dark' ? '#fa8547' : '#ae5c00';\n }\n if (signal < -50) {\n return themeType === 'dark' ? '#cdff4f' : '#7b9500';\n }\n\n return themeType === 'dark' ? '#5cff5c' : '#008500';\n}\n\nconst iconStyleOK = {\n fill: '#00ac00',\n color: '#00ac00',\n};\nconst iconStyleNotOK = {\n fill: '#ff0000',\n color: '#ff0000',\n};\nconst iconStyleWarning = {\n fill: '#da8200',\n color: '#da8200',\n};\nconst iconStyleUnknown = {\n fill: '#8a8a8a',\n color: '#8a8a8a',\n};\nconst iconStylePreWarning = {\n fill: '#ffcc00',\n color: '#ffcc00',\n};\nconst iconStyleUpdate = {\n fill: '#2196f3',\n color: '#2196f3',\n};\n\nfunction getBatteryIcon(battery: number): React.ReactNode {\n if (battery > 95) {\n return <BatteryFullIcon style={iconStyleOK} />;\n }\n if (battery > 85 && battery <= 95) {\n return <Battery90Icon style={iconStyleOK} />;\n }\n if (battery > 70 && battery <= 85) {\n return <Battery80Icon style={iconStyleOK} />;\n }\n if (battery > 55 && battery <= 70) {\n return <Battery60Icon style={iconStyleOK} />;\n }\n if (battery > 40 && battery <= 55) {\n return <Battery50Icon style={iconStylePreWarning} />;\n }\n if (battery > 25 && battery <= 40) {\n return <Battery30Icon style={iconStylePreWarning} />;\n }\n if (battery > 10 && battery <= 25) {\n return <Battery20Icon style={iconStyleWarning} />;\n }\n\n return <BatteryAlertIcon style={iconStyleNotOK} />;\n}\n\n/**\n * Device Status component\n *\n * @param props - Parameters\n * @param props.status - Status object, e.g. { connection: 'connected', battery: 100, rssi: -50 }\n */\nexport default function DeviceStatus(props: DeviceStatusProps): React.JSX.Element | null {\n let status: DeviceStatus;\n if (!props.status) {\n status = {};\n } else if (typeof props.status === 'string') {\n status = {\n connection: props.status,\n };\n } else {\n status = props.status;\n }\n\n const connection = useStateOrObject(status.connection, props.stateOrObjectHandler);\n const rssi = useStateOrObject(status.rssi, props.stateOrObjectHandler);\n const battery = useStateOrObject(status.battery, props.stateOrObjectHandler);\n const warning = useStateOrObject(status.warning, props.stateOrObjectHandler);\n const updateAvailable = useStateOrObject(props.update?.available, props.stateOrObjectHandler);\n const updateVersion = useStateOrObject(props.update?.version, props.stateOrObjectHandler);\n const updateNewVersion = useStateOrObject(props.update?.newVersion, props.stateOrObjectHandler);\n\n const batteryIconTooltip = useMemo<React.ReactNode>(() => {\n if (typeof battery === 'number') {\n return getBatteryIcon(battery);\n }\n return null;\n }, [battery]);\n\n const disability =\n typeof props.enabled === 'boolean' ? (\n <>\n <div style={{ flexGrow: 1 }} />\n {\n <Tooltip\n title={\n props.enabled ? getTranslation('disableIconTooltip') : getTranslation('enableIconTooltip')\n }\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <Switch\n size=\"small\"\n checked={props.enabled}\n disabled={!props.disableEnableAction}\n onChange={() =>\n props.disableEnableAction &&\n props.deviceHandler(props.deviceId, props.disableEnableAction)()\n }\n theme={props.theme}\n />\n </div>\n </Tooltip>\n }\n </>\n ) : null;\n let connectionSymbol: React.JSX.Element | null;\n if (props.connectionType === 'wifi') {\n connectionSymbol =\n connection === 'connected' ? (\n <IconConnectionWifi style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <IconConnectionNoWifi style={iconStyleNotOK} />\n ) : (\n <IconConnectionWifi style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'bluetooth') {\n connectionSymbol =\n connection === 'connected' ? (\n <IconConnectionBluetooth style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <IconConnectionNoBluetooth style={iconStyleNotOK} />\n ) : (\n <IconConnectionBluetooth style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'lan') {\n connectionSymbol =\n connection === 'connected' ? (\n <IconConnectionLan style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <IconConnectionLan style={iconStyleNotOK} />\n ) : (\n <IconConnectionLan style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'thread') {\n connectionSymbol =\n connection === 'connected' ? (\n <ThreadIcon style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <ThreadIcon style={iconStyleNotOK} />\n ) : (\n <ThreadIcon style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'z-wave') {\n connectionSymbol =\n connection === 'connected' ? (\n <ZWaveIcon style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <ZWaveIcon style={iconStyleNotOK} />\n ) : (\n <ZWaveIcon style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'zigbee') {\n connectionSymbol =\n connection === 'connected' ? (\n <ZigBeeIcon style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <ZigBeeIcon style={iconStyleNotOK} />\n ) : (\n <ZigBeeIcon style={iconStyleUnknown} />\n );\n } else {\n connectionSymbol =\n connection === 'connected' ? (\n <LinkIcon style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <LinkOffIcon style={iconStyleNotOK} />\n ) : null;\n }\n\n const connectionIcon =\n connection === 'connected' || connection === 'disconnected' ? (\n <Tooltip\n title={\n (connection === 'connected'\n ? getTranslation('connectedIconTooltip')\n : getTranslation('disconnectedIconTooltip')) +\n (props.statusAction\n ? `. ${getTranslation(props.statusAction.description || 'moreInformation')}`\n : '')\n }\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n {props.statusAction ? (\n <IconButton\n onClick={e => {\n if (props.statusAction) {\n e.stopPropagation();\n props.deviceHandler(props.deviceId, props.statusAction)();\n }\n }}\n >\n {connectionSymbol}\n <div style={{ position: 'absolute', top: 0, left: 0, color: 'grey' }}>*</div>\n </IconButton>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {connectionSymbol}\n </div>\n )}\n </Tooltip>\n ) : (\n connectionSymbol\n );\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n cursor: props.statusAction ? 'pointer' : undefined,\n width: props.disableEnableAction ? '100%' : undefined,\n gap: 8,\n }}\n >\n {connectionIcon}\n\n {rssi && (\n <Tooltip\n title=\"RSSI\"\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <NetworkCheckIcon style={{ color: rssiColor(rssi, props.theme.palette.mode) }} />\n <p style={{ fontSize: 'small', margin: 0 }}>{rssi}</p>\n </div>\n </Tooltip>\n )}\n\n {typeof battery === 'number' && (\n <Tooltip\n title={getTranslation('batteryTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {batteryIconTooltip}\n <p style={{ fontSize: 'small', margin: 0 }}>{battery}%</p>\n </div>\n </Tooltip>\n )}\n\n {typeof battery === 'string' && (\n <Tooltip\n title={getTranslation('batteryTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {battery === 'charging' ? <BatteryCharging50Icon /> : <BatteryFullIcon />}\n {battery !== 'charging' ? (\n battery.includes('V') || battery.includes('mV') ? (\n <p style={{ fontSize: 'small', margin: 0 }}>{battery}</p>\n ) : (\n <p style={{ fontSize: 'small', margin: 0 }}>\n <span style={{ marginRight: 4 }}>{battery}</span>\n mV\n </p>\n )\n ) : null}\n </div>\n </Tooltip>\n )}\n\n {typeof battery === 'boolean' && (\n <Tooltip\n title={getTranslation('batteryTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {battery ? (\n <BatteryFullIcon style={iconStyleOK} />\n ) : (\n <BatteryAlertIcon style={iconStyleNotOK} />\n )}\n </div>\n </Tooltip>\n )}\n\n {warning ? (\n typeof warning === 'string' || typeof warning === 'object' ? (\n <Tooltip\n title={getTranslation(warning)}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <WarningIcon style={iconStyleWarning} />\n </div>\n </Tooltip>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <WarningIcon style={iconStyleWarning} />\n </div>\n )\n ) : null}\n\n {updateAvailable ? (\n <Tooltip\n title={\n getTranslation('updateAvailable') +\n (updateNewVersion ? `: ${updateVersion ? `${updateVersion} → ` : ''}${updateNewVersion}` : '')\n }\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n {props.updateAction ? (\n <IconButton\n size=\"small\"\n onClick={e => {\n if (props.updateAction) {\n e.stopPropagation();\n props.deviceHandler(props.deviceId, props.updateAction)();\n }\n }}\n >\n <SystemUpdateAltIcon style={iconStyleUpdate} />\n </IconButton>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <SystemUpdateAltIcon style={iconStyleUpdate} />\n </div>\n )}\n </Tooltip>\n ) : null}\n\n {disability}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DeviceStatus.js","sourceRoot":"./src/","sources":["DeviceStatus.tsx"],"names":[],"mappings":"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","sourcesContent":["import { I18n } from '@iobroker/adapter-react-v5';\nimport type { Connection, IobTheme, ThemeType } from '@iobroker/adapter-react-v5';\nimport {\n Battery20 as Battery20Icon,\n Battery30 as Battery30Icon,\n Battery50 as Battery50Icon,\n Battery60 as Battery60Icon,\n Battery80 as Battery80Icon,\n Battery90 as Battery90Icon,\n BatteryAlert as BatteryAlertIcon,\n BatteryCharging50 as BatteryCharging50Icon,\n BatteryFull as BatteryFullIcon,\n Bluetooth as IconConnectionBluetooth,\n Cable as IconConnectionLan,\n BluetoothDisabled as IconConnectionNoBluetooth,\n WifiOff as IconConnectionNoWifi,\n Wifi as IconConnectionWifi,\n Link as LinkIcon,\n LinkOff as LinkOffIcon,\n NetworkCheck as NetworkCheckIcon,\n SystemUpdateAlt as SystemUpdateAltIcon,\n Warning as WarningIcon,\n} from '@mui/icons-material';\nimport { IconButton, Tooltip } from '@mui/material';\nimport React, { useMemo, type CSSProperties, type MouseEvent } from 'react';\nimport { useStateOrObject } from './hooks';\nimport type {\n ActionBase,\n ConfigConnectionType,\n DeviceAction,\n DeviceId,\n DeviceInfo,\n DeviceStatus,\n} from './protocol/api';\nimport Switch from './Switch';\nimport { getTranslation } from './Utils';\nimport type { StateOrObjectHandler } from './StateOrObjectHandler';\n\nexport const ACTIONS = {\n STATUS: 'status',\n DISABLE: 'disable',\n ENABLE: 'enable',\n};\n\nconst styles: Record<string, React.CSSProperties> = {\n tooltip: {\n pointerEvents: 'none',\n },\n};\n\nexport interface IconProps {\n /** The width in pixels or percentage of the icon. */\n width?: number | string;\n /** The height in pixels or percentage of the icon. */\n height?: number | string;\n /** Click handler. */\n onClick?: (e: MouseEvent) => void;\n /** The class name for the SVG element. */\n className?: string;\n /** Styles for the SVG element. */\n style?: CSSProperties;\n /** The font size of the icon. */\n fontSize?: 'small';\n}\n\nfunction ThreadIcon(props: IconProps): React.JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 165 165\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M82.498,0C37.008,0,0,37.008,0,82.496c0,45.181,36.51,81.977,81.573,82.476V82.569l-27.002-0.002 c-8.023,0-14.554,6.53-14.554,14.561c0,8.023,6.531,14.551,14.554,14.551v17.98c-17.939,0-32.534-14.595-32.534-32.531 c0-17.944,14.595-32.543,32.534-32.543l27.002,0.004v-9.096c0-14.932,12.146-27.08,27.075-27.08 c14.932,0,27.082,12.148,27.082,27.08c0,14.931-12.15,27.08-27.082,27.08l-9.097-0.001v80.641 C136.889,155.333,165,122.14,165,82.496C165,37.008,127.99,0,82.498,0z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M117.748,55.493c0-5.016-4.082-9.098-9.1-9.098c-5.015,0-9.097,4.082-9.097,9.098v9.097l9.097,0.001 C113.666,64.591,117.748,60.51,117.748,55.493z\"\n />\n </svg>\n );\n}\n\nfunction ZWaveIcon(props: IconProps): React.JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 1073 1068\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M716 1.1C632.9 5.3 549.8 23.7 472 55c-66.4 26.7-132.6 65.5-188.5 110.4-43.8 35.1-85.2 76.7-120.1 120.6C72.4 400.4 16.7 539.8 3.5 686 1.8 705.1-.1 754.7.7 758c.5 2 1 2 49.7 1.8l49.1-.3.7-20c2.4-64.6 13.4-126 33.2-186 80.8-243.9 297-419.9 552.1-449.4 20.2-2.4 44.2-4.1 56.6-4.1h8.9V50 0l-9.7.1c-5.4.1-16.8.6-25.3 1zm-.8 208c-78.5 4.7-158 27.4-226.5 64.5-68.7 37.3-126.4 86.3-175.2 148.9-11 14-33.2 47.3-42.3 63.5-44 77.8-68.6 164.9-70.9 251.2l-.6 22.8h49.5 49.4l1.2-19c6.3-98.7 40-185.8 102.2-263.3 12.7-15.9 41.2-45.2 57-58.7 66.1-56.3 142.1-91.8 226-105.5 18.9-3 44.1-5.5 56.7-5.5h9.3v-50-50l-11.2.1c-6.2.1-17.3.6-24.6 1zm17.8 251c-104.5 9.2-195.2 69.7-243.6 162.4-43.9 84-45.5 184.2-4.5 270 60.3 125.9 198.1 194.2 334.9 166 46.6-9.7 89.5-29.7 127.2-59.6 13.5-10.7 37.3-34.5 48-47.9 34.2-43.1 55.2-92 63.7-148.6 2.2-15.1 2.5-62.7.5-77.4-3.6-25.2-10.1-51.4-17.8-71.2-10.1-26.2-29.4-59.7-47-81.8-9.7-12.1-35-37.2-47.4-47-47.8-37.9-104.5-60.1-165.4-65-14.7-1.1-34.7-1.1-48.6.1zm174.7 138.6c-.3.5-30.9 49.2-68.1 108.3L772 814.5l67.9.5 68 .5-30.1 48.8-30 48.7h-131c-104.4 0-130.9-.3-130.5-1.3.2-.6 32.7-51.1 72.1-112.1L730 687.9c0-.5-29.5-1-66.5-1.1l-66.6-.3 27.7-44.3 27.6-44.2h128l127.5.7z\"\n />\n </svg>\n );\n}\n\nfunction ZigBeeIcon(props: IconProps): React.JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 48 48\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M32.042,9.792c4.595,1.238,4.88,3.165,5.524,5.048C34.841,17.664,17.35,35.7,17.35,35.7 s10.901,1.177,23.487-1.003c-0.001,0.029-0.002,0.048-0.003,0.076C42.829,31.661,44,27.97,44,24c0-11.046-8.954-20-20-20 c-5.634,0-10.715,2.338-14.35,6.087C15.489,9.124,26.89,8.403,32.042,9.792z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M14.724,37.285c-1.982-0.347-4.212-2.131-4.707-5.302c1.437-1.239,19.994-20.507,19.994-20.507 c-7.008-0.424-14.569-0.465-22.237,0.864C5.408,15.625,4,19.644,4,24c0,11.046,8.954,20,20,20c6.173,0,11.689-2.8,15.358-7.195 C35.486,37.33,23.257,38.769,14.724,37.285z\"\n />\n </svg>\n );\n}\n\ninterface DeviceStatusProps {\n socket: Connection;\n status: DeviceStatus | null;\n deviceId: DeviceId;\n connectionType?: ConfigConnectionType;\n statusAction?: DeviceAction;\n enabled?: boolean;\n disableEnableAction?: DeviceAction;\n /** Update information of the device (firmware/software) */\n update?: DeviceInfo['update'];\n /** Reserved \"update\" action. If provided, the update indicator becomes a clickable button */\n updateAction?: DeviceAction;\n deviceHandler: (deviceId: DeviceId, action: ActionBase) => () => void;\n theme: IobTheme;\n stateOrObjectHandler: StateOrObjectHandler;\n}\n\nfunction rssiColor(signal: number, themeType: ThemeType): string {\n if (signal < -80) {\n return themeType === 'dark' ? '#ff5c5c' : '#aa0000';\n }\n if (signal < -60) {\n return themeType === 'dark' ? '#fa8547' : '#ae5c00';\n }\n if (signal < -50) {\n return themeType === 'dark' ? '#cdff4f' : '#7b9500';\n }\n\n return themeType === 'dark' ? '#5cff5c' : '#008500';\n}\n\nconst iconStyleOK = {\n fill: '#00ac00',\n color: '#00ac00',\n};\nconst iconStyleNotOK = {\n fill: '#ff0000',\n color: '#ff0000',\n};\nconst iconStyleWarning = {\n fill: '#da8200',\n color: '#da8200',\n};\nconst iconStyleUnknown = {\n fill: '#8a8a8a',\n color: '#8a8a8a',\n};\nconst iconStylePreWarning = {\n fill: '#ffcc00',\n color: '#ffcc00',\n};\nconst iconStyleUpdate = {\n fill: '#2196f3',\n color: '#2196f3',\n};\n\nfunction getBatteryIcon(battery: number): React.ReactNode {\n if (battery > 95) {\n return <BatteryFullIcon style={iconStyleOK} />;\n }\n if (battery > 85 && battery <= 95) {\n return <Battery90Icon style={iconStyleOK} />;\n }\n if (battery > 70 && battery <= 85) {\n return <Battery80Icon style={iconStyleOK} />;\n }\n if (battery > 55 && battery <= 70) {\n return <Battery60Icon style={iconStyleOK} />;\n }\n if (battery > 40 && battery <= 55) {\n return <Battery50Icon style={iconStylePreWarning} />;\n }\n if (battery > 25 && battery <= 40) {\n return <Battery30Icon style={iconStylePreWarning} />;\n }\n if (battery > 10 && battery <= 25) {\n return <Battery20Icon style={iconStyleWarning} />;\n }\n\n return <BatteryAlertIcon style={iconStyleNotOK} />;\n}\n\n/**\n * Device Status component\n *\n * @param props - Parameters\n * @param props.status - Status object, e.g. { connection: 'connected', battery: 100, rssi: -50 }\n */\nexport default function DeviceStatus(props: DeviceStatusProps): React.JSX.Element | null {\n let status: DeviceStatus;\n if (!props.status) {\n status = {};\n } else if (typeof props.status === 'string') {\n status = {\n connection: props.status,\n };\n } else {\n status = props.status;\n }\n\n const connection = useStateOrObject(status.connection, props.stateOrObjectHandler);\n const rssi = useStateOrObject(status.rssi, props.stateOrObjectHandler);\n const battery = useStateOrObject(status.battery, props.stateOrObjectHandler);\n const warning = useStateOrObject(status.warning, props.stateOrObjectHandler);\n const updateAvailable = useStateOrObject(props.update?.available, props.stateOrObjectHandler);\n const updateVersion = useStateOrObject(props.update?.version, props.stateOrObjectHandler);\n const updateNewVersion = useStateOrObject(props.update?.newVersion, props.stateOrObjectHandler);\n\n const batteryIconTooltip = useMemo<React.ReactNode>(() => {\n if (typeof battery === 'number') {\n return getBatteryIcon(battery);\n }\n return null;\n }, [battery]);\n\n const disability =\n typeof props.enabled === 'boolean' ? (\n <>\n <div style={{ flexGrow: 1 }} />\n {\n <Tooltip\n title={\n props.enabled ? getTranslation('disableIconTooltip') : getTranslation('enableIconTooltip')\n }\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <Switch\n size=\"small\"\n checked={props.enabled}\n disabled={!props.disableEnableAction}\n onChange={() =>\n props.disableEnableAction &&\n props.deviceHandler(props.deviceId, props.disableEnableAction)()\n }\n theme={props.theme}\n />\n </div>\n </Tooltip>\n }\n </>\n ) : null;\n let connectionSymbol: React.JSX.Element | null;\n if (props.connectionType === 'wifi') {\n connectionSymbol =\n connection === 'connected' ? (\n <IconConnectionWifi style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <IconConnectionNoWifi style={iconStyleNotOK} />\n ) : (\n <IconConnectionWifi style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'bluetooth') {\n connectionSymbol =\n connection === 'connected' ? (\n <IconConnectionBluetooth style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <IconConnectionNoBluetooth style={iconStyleNotOK} />\n ) : (\n <IconConnectionBluetooth style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'lan') {\n connectionSymbol =\n connection === 'connected' ? (\n <IconConnectionLan style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <IconConnectionLan style={iconStyleNotOK} />\n ) : (\n <IconConnectionLan style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'thread') {\n connectionSymbol =\n connection === 'connected' ? (\n <ThreadIcon style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <ThreadIcon style={iconStyleNotOK} />\n ) : (\n <ThreadIcon style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'z-wave') {\n connectionSymbol =\n connection === 'connected' ? (\n <ZWaveIcon style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <ZWaveIcon style={iconStyleNotOK} />\n ) : (\n <ZWaveIcon style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'zigbee') {\n connectionSymbol =\n connection === 'connected' ? (\n <ZigBeeIcon style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <ZigBeeIcon style={iconStyleNotOK} />\n ) : (\n <ZigBeeIcon style={iconStyleUnknown} />\n );\n } else {\n connectionSymbol =\n connection === 'connected' ? (\n <LinkIcon style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <LinkOffIcon style={iconStyleNotOK} />\n ) : null;\n }\n\n const connectionIcon =\n connection === 'connected' || connection === 'disconnected' ? (\n <Tooltip\n title={\n (connection === 'connected'\n ? getTranslation('connectedIconTooltip')\n : getTranslation('disconnectedIconTooltip')) +\n (props.statusAction\n ? `. ${getTranslation(props.statusAction.description || 'moreInformation')}`\n : '')\n }\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n {props.statusAction ? (\n <IconButton\n onClick={e => {\n if (props.statusAction) {\n e.stopPropagation();\n props.deviceHandler(props.deviceId, props.statusAction)();\n }\n }}\n >\n {connectionSymbol}\n <div style={{ position: 'absolute', top: 0, left: 0, color: 'grey' }}>*</div>\n </IconButton>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {connectionSymbol}\n </div>\n )}\n </Tooltip>\n ) : (\n connectionSymbol\n );\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n cursor: props.statusAction ? 'pointer' : undefined,\n width: props.disableEnableAction ? '100%' : undefined,\n gap: 8,\n }}\n >\n {connectionIcon}\n\n {rssi && (\n <Tooltip\n title=\"RSSI\"\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <NetworkCheckIcon style={{ color: rssiColor(rssi, props.theme.palette.mode) }} />\n <p style={{ fontSize: 'small', margin: 0 }}>{rssi}</p>\n </div>\n </Tooltip>\n )}\n\n {typeof battery === 'number' && (\n <Tooltip\n title={getTranslation('batteryTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {batteryIconTooltip}\n <p style={{ fontSize: 'small', margin: 0 }}>{battery}%</p>\n </div>\n </Tooltip>\n )}\n\n {typeof battery === 'string' && (\n <Tooltip\n title={getTranslation('batteryTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {battery === 'charging' ? <BatteryCharging50Icon /> : <BatteryFullIcon />}\n {battery !== 'charging' ? (\n battery.includes('V') || battery.includes('mV') ? (\n <p style={{ fontSize: 'small', margin: 0 }}>{battery}</p>\n ) : (\n <p style={{ fontSize: 'small', margin: 0 }}>\n <span style={{ marginRight: 4 }}>{battery}</span>\n mV\n </p>\n )\n ) : null}\n </div>\n </Tooltip>\n )}\n\n {typeof battery === 'boolean' && (\n <Tooltip\n title={getTranslation('batteryTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {battery ? (\n <BatteryFullIcon style={iconStyleOK} />\n ) : (\n <BatteryAlertIcon style={iconStyleNotOK} />\n )}\n </div>\n </Tooltip>\n )}\n\n {warning ? (\n typeof warning === 'string' || typeof warning === 'object' ? (\n <Tooltip\n title={getTranslation(warning)}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <WarningIcon style={iconStyleWarning} />\n </div>\n </Tooltip>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <WarningIcon style={iconStyleWarning} />\n </div>\n )\n ) : null}\n\n {updateAvailable ? (\n <Tooltip\n title={\n getTranslation('updateAvailable') +\n (updateNewVersion ? `: ${updateVersion ? `${updateVersion} → ` : ''}${updateNewVersion}` : '')\n }\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n {props.updateAction ? (\n <IconButton\n size=\"small\"\n onClick={e => {\n if (!props.updateAction) {\n return;\n }\n e.stopPropagation();\n // An update is a significant operation, so always ask for confirmation\n // before triggering it. Reuse the action's own confirmation message if the\n // backend provided one; otherwise build a default one including the versions.\n // The confirmation is then handled by the standard device action flow\n // (deviceHandler -> showConfirmation -> renderConfirmationDialog).\n let confirmation: boolean | ioBroker.StringOrTranslated | undefined =\n props.updateAction.confirmation;\n if (!confirmation) {\n let message = getTranslation('updateConfirmation');\n if (updateNewVersion) {\n message += `: ${updateVersion ? `${updateVersion} → ` : ''}${updateNewVersion}`;\n }\n confirmation = { [I18n.getLanguage()]: message, en: message };\n }\n props.deviceHandler(props.deviceId, { ...props.updateAction, confirmation })();\n }}\n >\n <SystemUpdateAltIcon style={iconStyleUpdate} />\n </IconButton>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <SystemUpdateAltIcon style={iconStyleUpdate} />\n </div>\n )}\n </Tooltip>\n ) : null}\n\n {disability}\n </div>\n );\n}\n"]}
|
package/build/i18n/de.json
CHANGED
package/build/i18n/en.json
CHANGED
package/build/i18n/es.json
CHANGED
package/build/i18n/fr.json
CHANGED
package/build/i18n/it.json
CHANGED
package/build/i18n/nl.json
CHANGED
package/build/i18n/pl.json
CHANGED
package/build/i18n/pt.json
CHANGED
package/build/i18n/ru.json
CHANGED
package/build/i18n/uk.json
CHANGED
package/build/i18n/zh-cn.json
CHANGED