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.
- package/LICENSE +21 -0
- package/README.md +516 -0
- package/admin/alias-workbench.png +0 -0
- package/admin/css/werkbank.css +916 -0
- package/admin/detector.js +1 -0
- package/admin/geraetewissen/tasmota-befehle.json +116 -0
- package/admin/i18n/de.json +552 -0
- package/admin/i18n/en.json +552 -0
- package/admin/js/aufzaehlungen.js +332 -0
- package/admin/js/basis.js +36 -0
- package/admin/js/baum.js +453 -0
- package/admin/js/detail.js +335 -0
- package/admin/js/einstellungen.js +40 -0
- package/admin/js/entwurf.js +908 -0
- package/admin/js/enums.js +23 -0
- package/admin/js/ergebnis.js +934 -0
- package/admin/js/erkennung.js +126 -0
- package/admin/js/katalog.js +313 -0
- package/admin/js/mqtt.js +885 -0
- package/admin/js/musternamen.js +94 -0
- package/admin/js/musterwahl.js +334 -0
- package/admin/js/objekte.js +243 -0
- package/admin/js/pruefungen.js +130 -0
- package/admin/js/quellentausch.js +570 -0
- package/admin/js/rollenwahl.js +199 -0
- package/admin/js/schreiben.js +1537 -0
- package/admin/js/sprache.js +137 -0
- package/admin/js/start.js +39 -0
- package/admin/js/verbindung.js +10 -0
- package/admin/js/vorlagen.js +572 -0
- package/admin/js/vorlagenblatt.js +1907 -0
- package/admin/js/vorschlagen.js +391 -0
- package/admin/js/werte.js +193 -0
- package/admin/js/zielleiste.js +339 -0
- package/admin/js/zuordnung.js +695 -0
- package/admin/js/zustand.js +47 -0
- package/admin/js/zustandsliste.js +515 -0
- package/admin/jsonConfig.json +249 -0
- package/admin/tab.html +148 -0
- package/admin/vorlagen/hm-dimmer.json +204 -0
- package/admin/vorlagen/hm-fensterkontakt-hm.json +176 -0
- package/admin/vorlagen/hm-fensterkontakt-hmip.json +191 -0
- package/admin/vorlagen/hm-heizgruppe.json +214 -0
- package/admin/vorlagen/hm-heizkoerper.json +236 -0
- package/admin/vorlagen/hm-rollladen.json +190 -0
- package/admin/vorlagen/hm-schaltaktor-lampe.json +197 -0
- package/admin/vorlagen/hm-schaltaktor-mehrfach.json +203 -0
- package/admin/vorlagen/hm-schaltaktor-steckdose.json +197 -0
- package/admin/vorlagen/hm-temperatur-feuchte.json +166 -0
- package/admin/vorlagen/hm-wandthermostat.json +228 -0
- package/admin/vorlagen/index.json +21 -0
- package/admin/vorlagen/messpunkt.json +225 -0
- package/admin/vorlagen/tasmota-lampe.json +263 -0
- package/admin/vorlagen/tasmota-mehrfach.json +203 -0
- package/admin/vorlagen/tasmota-rgb.json +239 -0
- package/admin/vorlagen/tasmota-steckdose.json +265 -0
- package/io-package.json +122 -0
- 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
|
+
}
|