iobroker.alias-workbench 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +516 -0
  3. package/admin/alias-workbench.png +0 -0
  4. package/admin/css/werkbank.css +916 -0
  5. package/admin/detector.js +1 -0
  6. package/admin/geraetewissen/tasmota-befehle.json +116 -0
  7. package/admin/i18n/de.json +552 -0
  8. package/admin/i18n/en.json +552 -0
  9. package/admin/js/aufzaehlungen.js +332 -0
  10. package/admin/js/basis.js +36 -0
  11. package/admin/js/baum.js +453 -0
  12. package/admin/js/detail.js +335 -0
  13. package/admin/js/einstellungen.js +40 -0
  14. package/admin/js/entwurf.js +908 -0
  15. package/admin/js/enums.js +23 -0
  16. package/admin/js/ergebnis.js +934 -0
  17. package/admin/js/erkennung.js +126 -0
  18. package/admin/js/katalog.js +313 -0
  19. package/admin/js/mqtt.js +885 -0
  20. package/admin/js/musternamen.js +94 -0
  21. package/admin/js/musterwahl.js +334 -0
  22. package/admin/js/objekte.js +243 -0
  23. package/admin/js/pruefungen.js +130 -0
  24. package/admin/js/quellentausch.js +570 -0
  25. package/admin/js/rollenwahl.js +199 -0
  26. package/admin/js/schreiben.js +1537 -0
  27. package/admin/js/sprache.js +137 -0
  28. package/admin/js/start.js +39 -0
  29. package/admin/js/verbindung.js +10 -0
  30. package/admin/js/vorlagen.js +572 -0
  31. package/admin/js/vorlagenblatt.js +1907 -0
  32. package/admin/js/vorschlagen.js +391 -0
  33. package/admin/js/werte.js +193 -0
  34. package/admin/js/zielleiste.js +339 -0
  35. package/admin/js/zuordnung.js +695 -0
  36. package/admin/js/zustand.js +47 -0
  37. package/admin/js/zustandsliste.js +515 -0
  38. package/admin/jsonConfig.json +249 -0
  39. package/admin/tab.html +148 -0
  40. package/admin/vorlagen/hm-dimmer.json +204 -0
  41. package/admin/vorlagen/hm-fensterkontakt-hm.json +176 -0
  42. package/admin/vorlagen/hm-fensterkontakt-hmip.json +191 -0
  43. package/admin/vorlagen/hm-heizgruppe.json +214 -0
  44. package/admin/vorlagen/hm-heizkoerper.json +236 -0
  45. package/admin/vorlagen/hm-rollladen.json +190 -0
  46. package/admin/vorlagen/hm-schaltaktor-lampe.json +197 -0
  47. package/admin/vorlagen/hm-schaltaktor-mehrfach.json +203 -0
  48. package/admin/vorlagen/hm-schaltaktor-steckdose.json +197 -0
  49. package/admin/vorlagen/hm-temperatur-feuchte.json +166 -0
  50. package/admin/vorlagen/hm-wandthermostat.json +228 -0
  51. package/admin/vorlagen/index.json +21 -0
  52. package/admin/vorlagen/messpunkt.json +225 -0
  53. package/admin/vorlagen/tasmota-lampe.json +263 -0
  54. package/admin/vorlagen/tasmota-mehrfach.json +203 -0
  55. package/admin/vorlagen/tasmota-rgb.json +239 -0
  56. package/admin/vorlagen/tasmota-steckdose.json +265 -0
  57. package/io-package.json +122 -0
  58. package/package.json +48 -0
@@ -0,0 +1,199 @@
1
+ /* Die Rollenwahl: ein durchsuchbares Feld mit eigener Liste, gebaut wie
2
+ Musterwahl und Ordnerfeld. Ein <select> mit 51 Rollen liess sich nicht
3
+ durchsuchen, und die Zeilenform „rolle → PLATZ" an jeder Zeile erklaerte
4
+ niemandem, was der Pfeil bedeutet (Ricardos Befundliste, 25.08.2026).
5
+
6
+ Ohne Suchtext stehen nur die Rollen, die im gewaehlten Muster einen
7
+ Platz finden - gruppiert nach Platz, mit dem Vermerk, ob der Platz
8
+ schon belegt ist und von wem. Die letzte Zeile schaltet auf alle
9
+ Rollen um (nach Familien geordnet). Tippen sucht immer ueber alles. */
10
+
11
+ import { el } from './basis.js';
12
+ import { tr } from './sprache.js';
13
+ import { ROLLEN, musterVon, plaetzeFuerRollen } from './erkennung.js';
14
+ import { musterName } from './musternamen.js';
15
+
16
+ /* einst: { wert, muster, belegtVon: {platz: zeilenname}, breite,
17
+ leerErlaubt, beiWahl(rolle) } — liefert den fertigen
18
+ Feld-Umschlag. `leerErlaubt` bietet „keine Rolle" als erste Zeile an
19
+ (Vorlagenblatt); `belegtVon` fehlt dort, dann traegt der Gruppenkopf
20
+ auch keinen frei/belegt-Vermerk. */
21
+ export function rollenFeld(einst) {
22
+ var wrap = el('div', 'feldwrap');
23
+ var feld = el('input', 'tx rollenwahl');
24
+ feld.type = 'text';
25
+ feld.setAttribute('autocomplete', 'off');
26
+ feld.placeholder = tr('roles.search');
27
+ if (einst.breite) { feld.style.width = einst.breite; }
28
+ var liste = el('div', 'vorschlaege rollenliste');
29
+ liste.hidden = true;
30
+ wrap.appendChild(feld);
31
+ wrap.appendChild(liste);
32
+ /* Klicks im Feld duerfen die Detailzeile nicht zuklappen. */
33
+ wrap.addEventListener('click', function (ev) { ev.stopPropagation(); });
34
+
35
+ var alle = ROLLEN.slice();
36
+ if (einst.wert && alle.indexOf(einst.wert) === -1) { alle.unshift(einst.wert); }
37
+ var passend = einst.muster ? plaetzeFuerRollen(einst.muster) : {};
38
+ var mu = einst.muster ? musterVon(einst.muster) : null;
39
+
40
+ var alleZeigen = false;
41
+ var markiert = -1;
42
+ var eintraege = [];
43
+
44
+ var beschrifte = function () { feld.value = einst.wert || ''; };
45
+ beschrifte();
46
+
47
+ var zu = function () { liste.hidden = true; markiert = -1; };
48
+ var waehle = function (rolle) {
49
+ zu();
50
+ einst.wert = rolle;
51
+ beschrifte();
52
+ einst.beiWahl(rolle);
53
+ };
54
+
55
+ /* Was gerade in der Liste steht: Koepfe, Rollen, der Umschalter. */
56
+ function baueZeilen() {
57
+ var such = String(feld.value || '').trim().toLowerCase();
58
+ var zeilen = [];
59
+ if (!such && einst.leerErlaubt) { zeilen.push({ typ: 'rolle', rolle: '' }); }
60
+ if (such) {
61
+ /* Mit Suchtext immer der ganze Bestand — sonst muesste man erst
62
+ umschalten, um ueberhaupt finden zu koennen. */
63
+ alle.forEach(function (r) {
64
+ if (r.toLowerCase().indexOf(such) > -1) {
65
+ zeilen.push({ typ: 'rolle', rolle: r, platz: passend[r] });
66
+ }
67
+ });
68
+ if (!zeilen.length) { zeilen.push({ typ: 'leer' }); }
69
+ return zeilen;
70
+ }
71
+ if (mu && !alleZeigen) {
72
+ /* Die Muster-Rollen, je Platz eine Gruppe, in Musterreihenfolge.
73
+ Der Kopf sagt, ob der Platz schon vergeben ist — damit ist der
74
+ fruehere Pfeil erklaert, ohne dass er an jeder Zeile klebt. */
75
+ var proPlatz = {};
76
+ alle.forEach(function (r) {
77
+ var p = passend[r];
78
+ if (p) { (proPlatz[p] = proPlatz[p] || []).push(r); }
79
+ });
80
+ var gesehen = {};
81
+ mu.states.forEach(function (pl) {
82
+ if (!pl.name || gesehen[pl.name] || !proPlatz[pl.name]) { return; }
83
+ gesehen[pl.name] = true;
84
+ zeilen.push({ typ: 'kopf', platz: pl.name,
85
+ belegt: einst.belegtVon ? einst.belegtVon[pl.name] : null });
86
+ proPlatz[pl.name].forEach(function (r) { zeilen.push({ typ: 'rolle', rolle: r }); });
87
+ });
88
+ zeilen.push({ typ: 'schalter' });
89
+ return zeilen;
90
+ }
91
+ /* Alle Rollen, nach Familie geordnet. */
92
+ var fam = {};
93
+ alle.forEach(function (r) {
94
+ var f = r.split('.')[0];
95
+ (fam[f] = fam[f] || []).push(r);
96
+ });
97
+ Object.keys(fam).sort().forEach(function (f) {
98
+ zeilen.push({ typ: 'kopf', familie: f, anzahl: fam[f].length });
99
+ fam[f].forEach(function (r) {
100
+ zeilen.push({ typ: 'rolle', rolle: r, platz: passend[r] });
101
+ });
102
+ });
103
+ if (mu) { zeilen.push({ typ: 'schalter' }); }
104
+ return zeilen;
105
+ }
106
+
107
+ function malen() {
108
+ var zeilen = baueZeilen();
109
+ eintraege = [];
110
+ liste.textContent = '';
111
+ zeilen.forEach(function (z) {
112
+ if (z.typ === 'kopf') {
113
+ var k = el('div', 'vz gruppe');
114
+ if (z.platz) {
115
+ k.appendChild(el('span', null, tr('roles.slot', z.platz, musterName(einst.muster) || einst.muster)));
116
+ /* Belegt rot, frei gruen - der Zustand soll ins Auge fallen
117
+ (Ricardo, 25.08.2026). */
118
+ if (einst.belegtVon) {
119
+ k.appendChild(el('span', 'tiefer ' + (z.belegt ? 'rbelegt' : 'rfrei'),
120
+ z.belegt ? tr('roles.slotTaken', z.belegt) : tr('roles.slotFree')));
121
+ }
122
+ } else {
123
+ k.appendChild(el('span', null, z.familie));
124
+ k.appendChild(el('span', 'tiefer', String(z.anzahl)));
125
+ }
126
+ liste.appendChild(k);
127
+ return;
128
+ }
129
+ if (z.typ === 'schalter') {
130
+ /* Als Aufklapper kenntlich - Akzentfarbe und Pfeil, sonst las
131
+ sich die Zeile wie ein weiterer Eintrag (Ricardo, 25.08.). */
132
+ var um = el('div', 'vz mehr');
133
+ um.appendChild(el('span', null, (alleZeigen ? '▴ ' : '▾ ')
134
+ + (alleZeigen ? tr('roles.patternOnly') : tr('roles.showAll', alle.length))));
135
+ um.addEventListener('mousedown', function (ev) {
136
+ ev.preventDefault();
137
+ alleZeigen = !alleZeigen;
138
+ markiert = -1;
139
+ malen();
140
+ feld.focus();
141
+ });
142
+ liste.appendChild(um);
143
+ return;
144
+ }
145
+ if (z.typ === 'leer') {
146
+ var lz = el('div', 'vz zurueck');
147
+ lz.appendChild(el('span', null, tr('roles.noMatch', feld.value)));
148
+ liste.appendChild(lz);
149
+ return;
150
+ }
151
+ var n = eintraege.length;
152
+ var r = el('div', 'vz' + (n === markiert ? ' an' : '')
153
+ + (z.rolle === (einst.wert || '') ? ' gewaehlt' : ''));
154
+ r.appendChild(el('span', null, z.rolle || tr('list.noRole')));
155
+ /* Nur ausserhalb der Platzgruppen: dort steht der Platz im Kopf. */
156
+ if (z.platz) { r.appendChild(el('span', 'tiefer', tr('roles.leadsTo', z.platz))); }
157
+ r.addEventListener('mousedown', function (ev) {
158
+ ev.preventDefault();
159
+ waehle(z.rolle);
160
+ });
161
+ eintraege.push({ rolle: z.rolle, el: r });
162
+ liste.appendChild(r);
163
+ });
164
+ liste.hidden = false;
165
+ }
166
+
167
+ feld.addEventListener('focus', function () {
168
+ feld.value = '';
169
+ markiert = -1;
170
+ malen();
171
+ });
172
+ feld.addEventListener('input', function () { markiert = -1; malen(); });
173
+ feld.addEventListener('blur', function () {
174
+ setTimeout(function () { zu(); beschrifte(); }, 120);
175
+ });
176
+ feld.addEventListener('keydown', function (ev) {
177
+ if (ev.key === 'Escape') { zu(); beschrifte(); feld.blur(); return; }
178
+ if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {
179
+ if (liste.hidden) { malen(); return; }
180
+ ev.preventDefault();
181
+ if (!eintraege.length) { return; }
182
+ markiert += (ev.key === 'ArrowDown' ? 1 : -1);
183
+ if (markiert < 0) { markiert = eintraege.length - 1; }
184
+ if (markiert >= eintraege.length) { markiert = 0; }
185
+ malen();
186
+ var akt = eintraege[markiert] && eintraege[markiert].el;
187
+ if (akt && akt.scrollIntoView) { akt.scrollIntoView({ block: 'nearest' }); }
188
+ return;
189
+ }
190
+ if (ev.key === 'Enter') {
191
+ ev.preventDefault();
192
+ if (!liste.hidden && eintraege.length) {
193
+ waehle(eintraege[markiert >= 0 ? markiert : 0].rolle);
194
+ }
195
+ }
196
+ });
197
+
198
+ return wrap;
199
+ }