iobroker.mywebui 1.37.38 → 1.37.40
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/admin/jsonConfig.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"i18n": true,
|
|
4
4
|
"items": {
|
|
5
5
|
"tab_license": {
|
|
6
|
-
"type": "
|
|
6
|
+
"type": "panel",
|
|
7
7
|
"label": "License",
|
|
8
8
|
"items": {
|
|
9
9
|
"_info": {
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
}
|
|
88
88
|
},
|
|
89
89
|
"tab_grafana": {
|
|
90
|
-
"type": "
|
|
90
|
+
"type": "panel",
|
|
91
91
|
"label": "Grafana",
|
|
92
92
|
"items": {
|
|
93
93
|
"_grafanaHeader": {
|
package/io-package.json
CHANGED
package/package.json
CHANGED
|
@@ -404,7 +404,7 @@ export class IobrokerWebuiAppShell extends BaseCustomWebComponentConstructorAppe
|
|
|
404
404
|
const designItem = selectedItems[0];
|
|
405
405
|
const element = designItem.element;
|
|
406
406
|
|
|
407
|
-
// Read existing signal from data-visibility-signal (may be plain signal string or JSON with signal+expression)
|
|
407
|
+
// Read existing signal from data-visibility-signal (may be plain signal string or JSON with signal+expression+historic+converter)
|
|
408
408
|
const existingSignalAttr = element.getAttribute('data-visibility-signal') || null;
|
|
409
409
|
let existingSignal = existingSignalAttr;
|
|
410
410
|
let existingBinding = null;
|
|
@@ -413,12 +413,20 @@ export class IobrokerWebuiAppShell extends BaseCustomWebComponentConstructorAppe
|
|
|
413
413
|
try {
|
|
414
414
|
const parsed = JSON.parse(existingSignalAttr);
|
|
415
415
|
existingSignal = parsed.signal || existingSignalAttr;
|
|
416
|
-
|
|
416
|
+
// BindingsEditor expects bindableObjectNames array, not signal string
|
|
417
|
+
existingBinding = {
|
|
418
|
+
bindableObjectNames: parsed.signal ? [parsed.signal] : [],
|
|
419
|
+
expression: parsed.expression || '',
|
|
420
|
+
historic: parsed.historic || null,
|
|
421
|
+
converter: parsed.converter || null,
|
|
422
|
+
invert: parsed.invert || false,
|
|
423
|
+
target: 'property'
|
|
424
|
+
};
|
|
417
425
|
} catch (e) {
|
|
418
|
-
existingBinding = {
|
|
426
|
+
existingBinding = { bindableObjectNames: [existingSignalAttr], target: 'property' };
|
|
419
427
|
}
|
|
420
428
|
} else {
|
|
421
|
-
existingBinding = {
|
|
429
|
+
existingBinding = { bindableObjectNames: [existingSignalAttr], target: 'property' };
|
|
422
430
|
}
|
|
423
431
|
}
|
|
424
432
|
|
|
@@ -452,12 +460,17 @@ export class IobrokerWebuiAppShell extends BaseCustomWebComponentConstructorAppe
|
|
|
452
460
|
if (signal) {
|
|
453
461
|
const bnd = { signal };
|
|
454
462
|
if (dynEdt.expression) bnd.expression = dynEdt.expression;
|
|
455
|
-
if (dynEdt.
|
|
456
|
-
if (dynEdt.
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
463
|
+
if (dynEdt.historic) bnd.historic = dynEdt.historic;
|
|
464
|
+
if (dynEdt.invert) bnd.invert = true;
|
|
465
|
+
// converters: array of {key,value} objects → plain object, or named converter string
|
|
466
|
+
if (dynEdt.converters && dynEdt.converters.length > 0) {
|
|
467
|
+
bnd.converter = {};
|
|
468
|
+
for (const c of dynEdt.converters) bnd.converter[c.key] = c.value;
|
|
469
|
+
} else if (dynEdt.convertersString) {
|
|
470
|
+
bnd.converter = dynEdt.convertersString;
|
|
471
|
+
}
|
|
472
|
+
const needsJson = bnd.expression || bnd.historic || bnd.converter || bnd.invert;
|
|
473
|
+
designItem.setAttribute('data-visibility-signal', needsJson ? JSON.stringify(bnd) : signal);
|
|
461
474
|
} else {
|
|
462
475
|
designItem.removeAttribute('data-visibility-signal');
|
|
463
476
|
}
|
|
@@ -473,7 +486,7 @@ export class IobrokerWebuiAppShell extends BaseCustomWebComponentConstructorAppe
|
|
|
473
486
|
// Bind indicator — styled exactly like PropertyGridPropertyList's isSetElement
|
|
474
487
|
const bindBtn = document.createElement('div');
|
|
475
488
|
bindBtn.title = existingSignal ? 'Visibility: ' + existingSignal + ' (click / right-click)' : 'Click to bind visibility signal';
|
|
476
|
-
bindBtn.style.cssText = 'width:
|
|
489
|
+
bindBtn.style.cssText = 'width:11px;height:11px;border:1px solid #596c7a;cursor:pointer;flex-shrink:0;box-sizing:border-box;'
|
|
477
490
|
+ (existingSignal ? 'background:orange;' : 'background:transparent;');
|
|
478
491
|
|
|
479
492
|
bindBtn.onclick = openVisibilityBindingEditor;
|
|
@@ -44,14 +44,16 @@ class VisibilityService {
|
|
|
44
44
|
|
|
45
45
|
// Step 2: Signal/state check (if objectId configured)
|
|
46
46
|
if (visibilityConfig.objectId) {
|
|
47
|
-
// objectId may be a plain signal string or JSON like {"signal":"...","expression":"..."}
|
|
47
|
+
// objectId may be a plain signal string or JSON like {"signal":"...","expression":"...","converter":{...},"historic":{...}}
|
|
48
48
|
let signalId = visibilityConfig.objectId;
|
|
49
49
|
let expression = null;
|
|
50
|
+
let converter = null;
|
|
50
51
|
if (typeof signalId === 'string' && signalId.startsWith('{')) {
|
|
51
52
|
try {
|
|
52
53
|
const parsed = JSON.parse(signalId);
|
|
53
54
|
signalId = parsed.signal || signalId;
|
|
54
55
|
expression = parsed.expression || null;
|
|
56
|
+
converter = parsed.converter || null;
|
|
55
57
|
} catch (e) { /* keep raw */ }
|
|
56
58
|
}
|
|
57
59
|
|
|
@@ -61,11 +63,17 @@ class VisibilityService {
|
|
|
61
63
|
stateVal = state?.val;
|
|
62
64
|
}
|
|
63
65
|
|
|
64
|
-
// Evaluate expression if present
|
|
66
|
+
// Evaluate expression if present
|
|
65
67
|
if (expression) {
|
|
66
68
|
try { stateVal = new Function('__0', expression)(stateVal); } catch (e) { console.warn('[Visibility] Expression error:', e); }
|
|
67
69
|
}
|
|
68
70
|
|
|
71
|
+
// Apply converter if present (object map like {"true":"1","false":"0"} or inverse)
|
|
72
|
+
if (converter && typeof converter === 'object') {
|
|
73
|
+
const key = String(stateVal);
|
|
74
|
+
if (key in converter) stateVal = converter[key];
|
|
75
|
+
}
|
|
76
|
+
|
|
69
77
|
// Truthy state value → apply action
|
|
70
78
|
const isActive = stateVal !== null && stateVal !== undefined && stateVal !== false && stateVal !== 0 && stateVal !== '';
|
|
71
79
|
this.#applyResult(element, isActive
|