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.
@@ -3,7 +3,7 @@
3
3
  "i18n": true,
4
4
  "items": {
5
5
  "tab_license": {
6
- "type": "tab",
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": "tab",
90
+ "type": "panel",
91
91
  "label": "Grafana",
92
92
  "items": {
93
93
  "_grafanaHeader": {
package/io-package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "mywebui",
4
- "version": "1.37.38",
4
+ "version": "1.37.40",
5
5
  "titleLang": {
6
6
  "en": "mywebui",
7
7
  "de": "mywebui",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.mywebui",
3
- "version": "1.37.38",
3
+ "version": "1.37.40",
4
4
  "description": "ioBroker mywebui - Custom edited mywebui by gokturk413",
5
5
  "type": "module",
6
6
  "main": "dist/backend/main.js",
@@ -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
- existingBinding = { ...parsed, target: 'property' };
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 = { signal: existingSignalAttr, target: 'property' };
426
+ existingBinding = { bindableObjectNames: [existingSignalAttr], target: 'property' };
419
427
  }
420
428
  } else {
421
- existingBinding = { signal: existingSignalAttr, target: 'property' };
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.inverted) bnd.inverted = true;
456
- if (dynEdt.twoWay) bnd.twoWay = true;
457
- const attrValue = (bnd.expression || bnd.inverted || bnd.twoWay)
458
- ? JSON.stringify(bnd)
459
- : signal;
460
- designItem.setAttribute('data-visibility-signal', attrValue);
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:7px;height:7px;border:1px solid white;cursor:pointer;flex-shrink:0;box-sizing:border-box;'
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 (same pattern as bind-content:text)
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