@node-projects/web-component-designer-visualization-addons 0.1.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 (78) hide show
  1. package/README.md +19 -0
  2. package/dist/blockly/BlocklyJavascriptHelper.d.ts +2 -0
  3. package/dist/blockly/BlocklyJavascriptHelper.js +35 -0
  4. package/dist/blockly/BlocklyScriptEditor.d.ts +16 -0
  5. package/dist/blockly/BlocklyScriptEditor.js +106 -0
  6. package/dist/blockly/BlocklyToolbox.d.ts +1117 -0
  7. package/dist/blockly/BlocklyToolbox.js +980 -0
  8. package/dist/blockly/components/Console.d.ts +0 -0
  9. package/dist/blockly/components/Console.js +26 -0
  10. package/dist/blockly/components/Debugger.d.ts +0 -0
  11. package/dist/blockly/components/Debugger.js +15 -0
  12. package/dist/blockly/components/GetState.d.ts +0 -0
  13. package/dist/blockly/components/GetState.js +21 -0
  14. package/dist/blockly/components/GetSubProperty.d.ts +0 -0
  15. package/dist/blockly/components/GetSubProperty.js +27 -0
  16. package/dist/blockly/components/OpenScreen.d.ts +0 -0
  17. package/dist/blockly/components/OpenScreen.js +31 -0
  18. package/dist/blockly/components/QuerySelector.d.ts +0 -0
  19. package/dist/blockly/components/QuerySelector.js +30 -0
  20. package/dist/blockly/components/QuerySelectorAll.d.ts +0 -0
  21. package/dist/blockly/components/QuerySelectorAll.js +30 -0
  22. package/dist/blockly/components/Return.d.ts +0 -0
  23. package/dist/blockly/components/Return.js +21 -0
  24. package/dist/blockly/components/SetElement.d.ts +0 -0
  25. package/dist/blockly/components/SetElement.js +44 -0
  26. package/dist/blockly/components/SetState.d.ts +0 -0
  27. package/dist/blockly/components/SetState.js +26 -0
  28. package/dist/blockly/components/StartEvent.d.ts +0 -0
  29. package/dist/blockly/components/StartEvent.js +23 -0
  30. package/dist/blockly/components/components.d.ts +11 -0
  31. package/dist/blockly/components/components.js +11 -0
  32. package/dist/blockly/components/fields/FieldObjectId.d.ts +1 -0
  33. package/dist/blockly/components/fields/FieldObjectId.js +6 -0
  34. package/dist/components/BindingsEditor.d.ts +49 -0
  35. package/dist/components/BindingsEditor.js +298 -0
  36. package/dist/components/BindingsEditorHistoric.d.ts +14 -0
  37. package/dist/components/BindingsEditorHistoric.js +97 -0
  38. package/dist/components/PropertyGridExt.d.ts +0 -0
  39. package/dist/components/PropertyGridExt.js +1 -0
  40. package/dist/components/ScriptEditor.d.ts +28 -0
  41. package/dist/components/ScriptEditor.js +254 -0
  42. package/dist/components/VisualizationPropertyGrid.d.ts +12 -0
  43. package/dist/components/VisualizationPropertyGrid.js +104 -0
  44. package/dist/helpers/BindingsHelper.d.ts +47 -0
  45. package/dist/helpers/BindingsHelper.js +642 -0
  46. package/dist/index.d.ts +21 -0
  47. package/dist/index.js +22 -0
  48. package/dist/interfaces/IScriptMultiplexValue.d.ts +15 -0
  49. package/dist/interfaces/IScriptMultiplexValue.js +15 -0
  50. package/dist/interfaces/VisualisationElementScript.d.ts +5 -0
  51. package/dist/interfaces/VisualisationElementScript.js +1 -0
  52. package/dist/interfaces/VisualizationBinding.d.ts +20 -0
  53. package/dist/interfaces/VisualizationBinding.js +4 -0
  54. package/dist/interfaces/VisualizationHandler.d.ts +24 -0
  55. package/dist/interfaces/VisualizationHandler.js +2 -0
  56. package/dist/interfaces/VisualizationShell.d.ts +13 -0
  57. package/dist/interfaces/VisualizationShell.js +1 -0
  58. package/dist/interfaces/VisualizationUiHandler.d.ts +5 -0
  59. package/dist/interfaces/VisualizationUiHandler.js +2 -0
  60. package/dist/scripting/Script.d.ts +6 -0
  61. package/dist/scripting/Script.js +5 -0
  62. package/dist/scripting/ScriptCommands.d.ts +192 -0
  63. package/dist/scripting/ScriptCommands.js +1 -0
  64. package/dist/scripting/ScriptSystem.d.ts +23 -0
  65. package/dist/scripting/ScriptSystem.js +224 -0
  66. package/dist/services/BindableObjectDragDropService.d.ts +16 -0
  67. package/dist/services/BindableObjectDragDropService.js +145 -0
  68. package/dist/services/BindingsService.d.ts +11 -0
  69. package/dist/services/BindingsService.js +46 -0
  70. package/dist/services/PropertyGridDragDropService.d.ts +7 -0
  71. package/dist/services/PropertyGridDragDropService.js +10 -0
  72. package/dist/services/ScriptRefactorService.d.ts +9 -0
  73. package/dist/services/ScriptRefactorService.js +79 -0
  74. package/dist/services/SignalPropertyEditor.d.ts +7 -0
  75. package/dist/services/SignalPropertyEditor.js +43 -0
  76. package/dist/setupVisuService.d.ts +0 -0
  77. package/dist/setupVisuService.js +1 -0
  78. package/package.json +29 -0
@@ -0,0 +1,642 @@
1
+ import { TypedEvent } from "@node-projects/base-custom-webcomponent";
2
+ import { PropertiesHelper } from "@node-projects/web-component-designer/dist/elements/services/propertiesService/services/PropertiesHelper.js";
3
+ import { BindingTarget } from "@node-projects/web-component-designer/dist/elements/item/BindingTarget.js";
4
+ //;,[ are not allowed in bindings, so they could be used for a short form...
5
+ export const bindingPrefixProperty = 'bind-prop:';
6
+ export const bindingPrefixAttribute = 'bind-attr:';
7
+ export const bindingPrefixClass = 'bind-class:';
8
+ export const bindingPrefixCss = 'bind-css:';
9
+ export const bindingPrefixCssVar = 'bind-cssvar:';
10
+ export const bindingPrefixContent = 'bind-content:';
11
+ export const bindingsInCssRegex = /{{(.*)}}/;
12
+ export function isLit(element) {
13
+ //@ts-ignore
14
+ return element.constructor?.elementProperties != null;
15
+ }
16
+ export function parseBindingString(id) {
17
+ let parts = [];
18
+ let signals = [];
19
+ let tx = '';
20
+ for (let n = 0; n < id.length; n++) {
21
+ if (id[n] == '{') {
22
+ parts.push(tx);
23
+ tx = '';
24
+ }
25
+ else if (id[n] == '}') {
26
+ signals.push(tx);
27
+ tx = '';
28
+ }
29
+ else {
30
+ tx += id[n];
31
+ }
32
+ }
33
+ parts.push(tx);
34
+ return { parts, signals };
35
+ }
36
+ export class IndirectSignal {
37
+ parts;
38
+ signals;
39
+ values;
40
+ unsubscribeList = [];
41
+ unsubscribeTargetValue;
42
+ combinedName;
43
+ disposed;
44
+ valueChangedCb;
45
+ visualizationHandler;
46
+ constructor(visualizationHandler, id, valueChangedCb) {
47
+ this.visualizationHandler = visualizationHandler;
48
+ this.valueChangedCb = valueChangedCb;
49
+ this.parseIndirectBinding(id);
50
+ this.values = new Array(this.signals.length);
51
+ for (let i = 0; i < this.signals.length; i++) {
52
+ let cb = (id, value) => this.handleValueChanged(value.val, i);
53
+ this.unsubscribeList.push(cb);
54
+ this.visualizationHandler.subscribeState(this.signals[i], cb);
55
+ }
56
+ }
57
+ parseIndirectBinding(id) {
58
+ let { parts, signals } = parseBindingString(id);
59
+ this.parts = parts;
60
+ this.signals = signals;
61
+ }
62
+ handleValueChanged(value, index) {
63
+ this.values[index] = value;
64
+ let nm = this.parts[0];
65
+ for (let i = 0; i < this.parts.length - 1; i++) {
66
+ let v = this.values[i];
67
+ if (v == null)
68
+ return;
69
+ nm += v + this.parts[i + 1];
70
+ }
71
+ if (this.combinedName != nm) {
72
+ if (this.unsubscribeTargetValue) {
73
+ this.visualizationHandler.unsubscribeState(this.combinedName, this.unsubscribeTargetValue);
74
+ }
75
+ if (!this.disposed) {
76
+ this.combinedName = nm;
77
+ let cb = (id, value) => this.valueChangedCb(value);
78
+ this.unsubscribeTargetValue = cb;
79
+ this.visualizationHandler.subscribeState(nm, cb);
80
+ }
81
+ }
82
+ }
83
+ dispose() {
84
+ this.disposed = true;
85
+ if (this.unsubscribeTargetValue) {
86
+ this.visualizationHandler.unsubscribeState(this.combinedName, this.unsubscribeTargetValue);
87
+ this.unsubscribeTargetValue = null;
88
+ }
89
+ for (let i = 0; i < this.signals.length; i++) {
90
+ this.visualizationHandler.unsubscribeState(this.signals[i], this.unsubscribeList[i]);
91
+ }
92
+ }
93
+ setState(value) {
94
+ if (!this.disposed) {
95
+ this.visualizationHandler.setState(this.combinedName, value);
96
+ }
97
+ }
98
+ }
99
+ export class BindingsHelper {
100
+ _visualizationHandler;
101
+ constructor(visualizationHandler) {
102
+ this._visualizationHandler = visualizationHandler;
103
+ }
104
+ //Not allowed chars in Var Names: |{}(),;:[]
105
+ parseBinding(element, name, value, bindingTarget, prefix) {
106
+ //Loooks like:
107
+ //a:var1;b:var2;expression
108
+ //=varname => two way
109
+ //!varname => inverted
110
+ //{...} => json
111
+ let propname = name.substring(prefix.length);
112
+ if (bindingTarget === BindingTarget.cssvar)
113
+ propname = '--' + propname;
114
+ if (!value.startsWith('{')) {
115
+ let binding = {
116
+ signal: value,
117
+ target: bindingTarget
118
+ };
119
+ if (value[0] === '=') {
120
+ value = value.substring(1);
121
+ binding.signal = value;
122
+ binding.twoWay = true;
123
+ if (element instanceof HTMLInputElement)
124
+ binding.events = ['change'];
125
+ else if (element instanceof HTMLSelectElement)
126
+ binding.events = ['change'];
127
+ else {
128
+ if (isLit(element)) {
129
+ binding.events = [propname];
130
+ }
131
+ else {
132
+ binding.events = [propname + '-changed'];
133
+ //Binding could be a lit elemnt but not yet loaded
134
+ binding.maybeLitElement = true;
135
+ binding.litEventNames = [propname];
136
+ }
137
+ }
138
+ }
139
+ if (value[0] === '!') {
140
+ binding.signal = value.substring(1);
141
+ binding.inverted = true;
142
+ }
143
+ if (binding.signal.includes(';')) {
144
+ const parts = binding.signal.split(';');
145
+ binding.expression = parts.pop();
146
+ binding.signal = parts.join(';');
147
+ }
148
+ if (bindingTarget === BindingTarget.cssvar || bindingTarget === BindingTarget.class)
149
+ return [BindingsHelper.dotToCamelCase(propname), binding];
150
+ return [PropertiesHelper.dashToCamelCase(propname), binding];
151
+ }
152
+ let binding = JSON.parse(value);
153
+ binding.target = bindingTarget;
154
+ if (binding.twoWay && (binding.events == null || binding.events.length == 0)) {
155
+ if (element instanceof HTMLInputElement)
156
+ binding.events = ['change'];
157
+ else if (element instanceof HTMLSelectElement)
158
+ binding.events = ['change'];
159
+ else {
160
+ if (isLit(element)) {
161
+ binding.events = [propname];
162
+ }
163
+ else {
164
+ binding.events = [propname + '-changed'];
165
+ }
166
+ }
167
+ }
168
+ if (bindingTarget === BindingTarget.cssvar || bindingTarget === BindingTarget.class)
169
+ return [BindingsHelper.dotToCamelCase(propname), binding];
170
+ return [PropertiesHelper.dashToCamelCase(propname), binding];
171
+ }
172
+ serializeBinding(element, targetName, binding) {
173
+ let bindingCopy = { ...binding };
174
+ if (!binding.twoWay) {
175
+ delete bindingCopy.events;
176
+ delete bindingCopy.expressionTwoWay;
177
+ }
178
+ else if ((binding.events != null && binding.events.length == 1)) {
179
+ if (element instanceof HTMLInputElement && binding.events?.[0] == "change")
180
+ delete bindingCopy.events;
181
+ else if (element instanceof HTMLSelectElement && binding.events?.[0] == "change")
182
+ delete bindingCopy.events;
183
+ else if (isLit(element) && binding.events?.[0] == targetName)
184
+ delete bindingCopy.events;
185
+ else if (!isLit(element) && binding.events?.[0] == targetName + '-changed')
186
+ delete bindingCopy.events;
187
+ }
188
+ if (binding.target == BindingTarget.property &&
189
+ !binding.expression && !binding.expressionTwoWay &&
190
+ binding.converter == null &&
191
+ !binding.type &&
192
+ !binding.historic &&
193
+ (bindingCopy.events == null || bindingCopy.events.length == 0)) {
194
+ if (targetName == 'textContent')
195
+ return [bindingPrefixContent + 'text', (binding.twoWay ? '=' : '') + (binding.inverted ? '!' : '') + binding.signal + (!binding.twoWay && binding.signal.includes(';') ? ';' : '')];
196
+ if (targetName == 'innerHTML')
197
+ return [bindingPrefixContent + 'html', (binding.twoWay ? '=' : '') + (binding.inverted ? '!' : '') + binding.signal + (!binding.twoWay && binding.signal.includes(';') ? ';' : '')];
198
+ return [bindingPrefixProperty + PropertiesHelper.camelToDashCase(targetName), (binding.twoWay ? '=' : '') + (binding.inverted ? '!' : '') + binding.signal + (!binding.twoWay && binding.signal.includes(';') ? ';' : '')];
199
+ }
200
+ //Multi Var Expressions
201
+ if (binding.target == BindingTarget.property &&
202
+ binding.expression && !binding.expression.includes("\n") && !binding.expression.includes(";") &&
203
+ !binding.expressionTwoWay &&
204
+ binding.converter == null &&
205
+ !binding.type &&
206
+ !binding.historic &&
207
+ (bindingCopy.events == null || bindingCopy.events.length == 0)) {
208
+ if (targetName == 'textContent')
209
+ return [bindingPrefixContent + 'text', (binding.inverted ? '!' : '') + binding.signal + ';' + binding.expression];
210
+ if (targetName == 'innerHTML')
211
+ return [bindingPrefixContent + 'html', (binding.inverted ? '!' : '') + binding.signal + ';' + binding.expression];
212
+ return [bindingPrefixProperty + PropertiesHelper.camelToDashCase(targetName), (binding.twoWay ? '=' : '') + (binding.inverted ? '!' : '') + binding.signal + ';' + binding.expression];
213
+ }
214
+ if (binding.target == BindingTarget.attribute &&
215
+ !binding.expression && !binding.expressionTwoWay &&
216
+ binding.converter == null &&
217
+ !binding.type &&
218
+ !binding.historic &&
219
+ (binding.events == null || binding.events.length == 0)) {
220
+ return [bindingPrefixAttribute + PropertiesHelper.camelToDashCase(targetName), (binding.twoWay ? '=' : '') + (binding.inverted ? '!' : '') + binding.signal + (!binding.twoWay && binding.signal.includes(';') ? ';' : '')];
221
+ }
222
+ //Multi Var Expressions
223
+ if (binding.target == BindingTarget.attribute &&
224
+ binding.expression && !binding.expression.includes("\n") && !binding.expression.includes(";") &&
225
+ !binding.expressionTwoWay &&
226
+ binding.converter == null &&
227
+ !binding.type &&
228
+ !binding.historic &&
229
+ (binding.events == null || binding.events.length == 0)) {
230
+ return [bindingPrefixAttribute + PropertiesHelper.camelToDashCase(targetName), (binding.twoWay ? '=' : '') + (binding.inverted ? '!' : '') + binding.signal + ';' + binding.expression];
231
+ }
232
+ if (binding.target == BindingTarget.class &&
233
+ !binding.expression && !binding.expressionTwoWay &&
234
+ binding.converter == null &&
235
+ !binding.type &&
236
+ !binding.historic &&
237
+ (binding.events == null || binding.events.length == 0)) {
238
+ return [bindingPrefixClass + PropertiesHelper.camelToDashCase(targetName), (binding.inverted ? '!' : '') + binding.signal + (!binding.twoWay && binding.signal.includes(';') ? ';' : '')];
239
+ }
240
+ //Multi Var Expressions
241
+ if (binding.target == BindingTarget.class &&
242
+ binding.expression && !binding.expression.includes("\n") && !binding.expression.includes(";") &&
243
+ !binding.expressionTwoWay &&
244
+ binding.converter == null &&
245
+ !binding.type &&
246
+ !binding.historic &&
247
+ (binding.events == null || binding.events.length == 0)) {
248
+ return [bindingPrefixClass + PropertiesHelper.camelToDashCase(targetName), (binding.inverted ? '!' : '') + binding.signal + ';' + binding.expression];
249
+ }
250
+ if (binding.target == BindingTarget.css &&
251
+ !binding.expression && !binding.expressionTwoWay &&
252
+ binding.converter == null &&
253
+ !binding.type &&
254
+ !binding.historic &&
255
+ (binding.events == null || binding.events.length == 0)) {
256
+ return [bindingPrefixCss + PropertiesHelper.camelToDashCase(targetName), (binding.inverted ? '!' : '') + binding.signal + (!binding.twoWay && binding.signal.includes(';') ? ';' : '')];
257
+ }
258
+ //Multi Var Expressions
259
+ if (binding.target == BindingTarget.css &&
260
+ binding.expression && !binding.expression.includes("\n") && !binding.expression.includes(";") &&
261
+ !binding.expressionTwoWay &&
262
+ binding.converter == null &&
263
+ !binding.type &&
264
+ !binding.historic &&
265
+ (binding.events == null || binding.events.length == 0)) {
266
+ return [bindingPrefixCss + PropertiesHelper.camelToDashCase(targetName), (binding.inverted ? '!' : '') + binding.signal + ';' + binding.expression];
267
+ }
268
+ if (binding.target == BindingTarget.cssvar &&
269
+ !binding.expression && !binding.expressionTwoWay &&
270
+ binding.converter == null &&
271
+ !binding.type &&
272
+ !binding.historic &&
273
+ (binding.events == null || binding.events.length == 0)) {
274
+ return [bindingPrefixCssVar + BindingsHelper.camelToDotCase(targetName.substring(2)), (binding.inverted ? '!' : '') + binding.signal + (!binding.twoWay && binding.signal.includes(';') ? ';' : '')];
275
+ }
276
+ //Multi Var Expressions
277
+ if (binding.target == BindingTarget.cssvar &&
278
+ binding.expression && !binding.expression.includes("\n") && !binding.expression.includes(";") &&
279
+ !binding.expressionTwoWay &&
280
+ binding.converter == null &&
281
+ !binding.type &&
282
+ !binding.historic &&
283
+ (binding.events == null || binding.events.length == 0)) {
284
+ return [bindingPrefixCssVar + PropertiesHelper.camelToDashCase(targetName), (binding.inverted ? '!' : '') + binding.signal + ';' + binding.expression];
285
+ }
286
+ if (binding.inverted === null || binding.inverted === false) {
287
+ delete bindingCopy.inverted;
288
+ }
289
+ if (binding.expression === null || binding.expression === '') {
290
+ delete bindingCopy.expression;
291
+ }
292
+ if (binding.expressionTwoWay === null || binding.expressionTwoWay === '') {
293
+ delete bindingCopy.expressionTwoWay;
294
+ }
295
+ if (binding.twoWay === null || binding.twoWay === false) {
296
+ delete bindingCopy.twoWay;
297
+ }
298
+ if (binding.type === null || binding.type === '') {
299
+ delete bindingCopy.type;
300
+ }
301
+ delete bindingCopy.target;
302
+ if (!binding.historic) {
303
+ delete bindingCopy.historic;
304
+ }
305
+ if (binding.target == BindingTarget.content)
306
+ return [bindingPrefixContent + 'html', JSON.stringify(bindingCopy)];
307
+ if (binding.target == BindingTarget.attribute)
308
+ return [bindingPrefixAttribute + PropertiesHelper.camelToDashCase(targetName), JSON.stringify(bindingCopy)];
309
+ if (binding.target == BindingTarget.class)
310
+ return [bindingPrefixClass + BindingsHelper.camelToDotCase(targetName), JSON.stringify(bindingCopy)];
311
+ if (binding.target == BindingTarget.css)
312
+ return [bindingPrefixCss + PropertiesHelper.camelToDashCase(targetName), JSON.stringify(bindingCopy)];
313
+ if (binding.target == BindingTarget.cssvar)
314
+ return [bindingPrefixCssVar + BindingsHelper.camelToDotCase(targetName.substring(2)), JSON.stringify(bindingCopy)];
315
+ if (binding.target == BindingTarget.property && targetName == 'innerHTML')
316
+ return [bindingPrefixContent + 'html', JSON.stringify(bindingCopy)];
317
+ if (binding.target == BindingTarget.property && targetName == 'textContent')
318
+ return [bindingPrefixContent + 'text', JSON.stringify(bindingCopy)];
319
+ return [bindingPrefixProperty + PropertiesHelper.camelToDashCase(targetName), JSON.stringify(bindingCopy)];
320
+ }
321
+ getBindingAttributeName(element, propertyName, propertyTarget) {
322
+ if (propertyTarget == BindingTarget.attribute) {
323
+ return bindingPrefixAttribute + PropertiesHelper.camelToDashCase(propertyName);
324
+ }
325
+ if (propertyTarget == BindingTarget.class) {
326
+ return bindingPrefixClass + BindingsHelper.camelToDotCase(propertyName);
327
+ }
328
+ if (propertyTarget == BindingTarget.css) {
329
+ return bindingPrefixCss + PropertiesHelper.camelToDashCase(propertyName);
330
+ }
331
+ if (propertyTarget == BindingTarget.cssvar) {
332
+ return bindingPrefixCssVar + BindingsHelper.camelToDotCase(propertyName);
333
+ }
334
+ if (propertyTarget == BindingTarget.property && propertyName == 'innerHTML') {
335
+ return bindingPrefixContent + 'html';
336
+ }
337
+ if (propertyTarget == BindingTarget.property && propertyName == 'textContent') {
338
+ return bindingPrefixContent + 'text';
339
+ }
340
+ return bindingPrefixProperty + PropertiesHelper.camelToDashCase(propertyName);
341
+ }
342
+ *getBindings(element) {
343
+ if (element.attributes) {
344
+ for (let a of element.attributes) {
345
+ if (a.name.startsWith(bindingPrefixProperty)) {
346
+ yield this.parseBinding(element, a.name, a.value, BindingTarget.property, bindingPrefixProperty);
347
+ }
348
+ else if (a.name.startsWith(bindingPrefixContent)) {
349
+ yield this.parseBinding(element, a.name === 'bind-content:html' ? 'bind-prop:inner-h-t-m-l' : 'bind-prop:text-content', a.value, BindingTarget.property, bindingPrefixProperty);
350
+ }
351
+ else if (a.name.startsWith(bindingPrefixAttribute)) {
352
+ yield this.parseBinding(element, a.name, a.value, BindingTarget.attribute, bindingPrefixAttribute);
353
+ }
354
+ else if (a.name.startsWith(bindingPrefixClass)) {
355
+ yield this.parseBinding(element, a.name, a.value, BindingTarget.class, bindingPrefixClass);
356
+ }
357
+ else if (a.name.startsWith(bindingPrefixCss)) {
358
+ yield this.parseBinding(element, a.name, a.value, BindingTarget.css, bindingPrefixCss);
359
+ }
360
+ else if (a.name.startsWith(bindingPrefixCssVar)) {
361
+ yield this.parseBinding(element, a.name, a.value, BindingTarget.cssvar, bindingPrefixCssVar);
362
+ }
363
+ }
364
+ }
365
+ }
366
+ applyAllBindings(rootElement, relativeSignalPath, root) {
367
+ let retVal = [];
368
+ const tw = document.createTreeWalker(rootElement, NodeFilter.SHOW_ELEMENT);
369
+ let e;
370
+ while (e = tw.nextNode()) {
371
+ const bindings = this.getBindings(e);
372
+ for (let b of bindings) {
373
+ try {
374
+ let applied = this.applyBinding(e, b, relativeSignalPath, root);
375
+ retVal.push(applied);
376
+ if (b[1].maybeLitElement && e.localName.includes('-') && !customElements.get(e.localName)) {
377
+ const el = e;
378
+ const bnd = b;
379
+ customElements.whenDefined(e.localName).then(() => {
380
+ if (isLit(el)) {
381
+ applied();
382
+ bnd[1].events = bnd[1].litEventNames;
383
+ retVal.push(this.applyBinding(el, bnd, relativeSignalPath, root));
384
+ }
385
+ });
386
+ }
387
+ }
388
+ catch (err) {
389
+ console.warn("error applying binding", e, b, err);
390
+ }
391
+ }
392
+ }
393
+ return retVal;
394
+ }
395
+ applyBinding(element, binding, relativeSignalPath, root) {
396
+ const signals = binding[1].signal.split(';');
397
+ const signalVars = new Array(signals.length);
398
+ for (let i = 0; i < signals.length; i++) {
399
+ let sng = signals[i];
400
+ signalVars[i] = '__' + i;
401
+ if (sng.includes(':')) {
402
+ const spl = sng.split(':');
403
+ signalVars[i] = spl[0];
404
+ sng = spl[1];
405
+ signals[i] = sng;
406
+ }
407
+ if (sng[0] === '?') { //access object path in property in custom control, todo: bind direct to property value in local property
408
+ if (root) { //root is null when opened in designer, then do not apply property bindings
409
+ let s = sng.substring(1);
410
+ if (s[0] == '?') {
411
+ signals[i] = s;
412
+ }
413
+ else {
414
+ signals[i] = root[s];
415
+ }
416
+ }
417
+ }
418
+ if (sng[0] === '.') {
419
+ signals[i] = relativeSignalPath + sng;
420
+ }
421
+ }
422
+ let unsubscribeList = [];
423
+ let cleanupCalls;
424
+ let valuesObject = new Array(signals.length);
425
+ for (let i = 0; i < signals.length; i++) {
426
+ const s = signals[i];
427
+ if (s[0] == '?') {
428
+ if (root) {
429
+ const nm = s.substring(1);
430
+ let evtCallback = () => this.handleValueChanged(element, binding, root[nm], valuesObject, i, signalVars, false);
431
+ root.addEventListener(PropertiesHelper.camelToDashCase(nm) + '-changed', evtCallback);
432
+ if (!cleanupCalls)
433
+ cleanupCalls = [];
434
+ cleanupCalls.push(() => root.removeEventListener(PropertiesHelper.camelToDashCase(nm) + '-changed', evtCallback));
435
+ this.handleValueChanged(element, binding, root[nm], valuesObject, i, signalVars, false);
436
+ if (binding[1].twoWay && i == 0) {
437
+ this.addTwoWayBinding(binding, element, v => root[nm] = v);
438
+ }
439
+ }
440
+ }
441
+ else if (s[0] == '$') {
442
+ let mS = s.substring(1);
443
+ if (mS[0] === '.') {
444
+ mS = relativeSignalPath + mS;
445
+ }
446
+ this._visualizationHandler.getObject(mS).then(x => {
447
+ this.handleValueChanged(element, binding, x, valuesObject, i, signalVars, true);
448
+ });
449
+ }
450
+ else {
451
+ if (s.includes('{')) {
452
+ let indirectSignal = new IndirectSignal(this._visualizationHandler, s, (value) => this.handleValueChanged(element, binding, value.value, valuesObject, i, signalVars, false));
453
+ if (!cleanupCalls)
454
+ cleanupCalls = [];
455
+ cleanupCalls.push(() => indirectSignal.dispose());
456
+ if (binding[1].twoWay && i == 0) {
457
+ this.addTwoWayBinding(binding, element, v => indirectSignal.setState(v));
458
+ }
459
+ }
460
+ else {
461
+ if (binding[1].historic) {
462
+ if (binding[1].historic.reloadInterval) {
463
+ let myTimer = { timerId: -1 };
464
+ const loadHistoric = async () => {
465
+ const res = await this._visualizationHandler.getHistoricData(s, binding[1].historic);
466
+ this.handleValueChanged(element, binding, res?.values, valuesObject, i, signalVars, true);
467
+ if (myTimer.timerId !== null)
468
+ myTimer.timerId = setTimeout(loadHistoric, binding[1].historic.reloadInterval);
469
+ };
470
+ loadHistoric();
471
+ if (!cleanupCalls)
472
+ cleanupCalls = [];
473
+ cleanupCalls.push(() => {
474
+ if (myTimer.timerId > 0)
475
+ clearTimeout(myTimer.timerId);
476
+ myTimer.timerId = null;
477
+ });
478
+ }
479
+ else
480
+ this._visualizationHandler.getHistoricData(s, binding[1].historic).then(x => this.handleValueChanged(element, binding, x?.values, valuesObject, i, signalVars, true));
481
+ }
482
+ else {
483
+ const cb = (id, value) => this.handleValueChanged(element, binding, value.value, valuesObject, i, signalVars, false);
484
+ unsubscribeList.push([s, cb]);
485
+ this._visualizationHandler.subscribeState(s, cb);
486
+ this._visualizationHandler.getState(s).then(x => this.handleValueChanged(element, binding, x?.value, valuesObject, i, signalVars, false));
487
+ if (binding[1].twoWay && i == 0) {
488
+ this.addTwoWayBinding(binding, element, v => this._visualizationHandler.setState(s, v));
489
+ }
490
+ }
491
+ }
492
+ }
493
+ }
494
+ return () => {
495
+ for (const u of unsubscribeList) {
496
+ this._visualizationHandler.unsubscribeState(u[0], u[1]);
497
+ }
498
+ if (cleanupCalls) {
499
+ for (let e of cleanupCalls) {
500
+ e();
501
+ }
502
+ }
503
+ };
504
+ }
505
+ addTwoWayBinding(binding, element, setter) {
506
+ if (binding[1].expressionTwoWay) {
507
+ if (!binding[1].compiledExpressionTwoWay) {
508
+ if (binding[1].expressionTwoWay.includes('return '))
509
+ binding[1].compiledExpressionTwoWay = new Function(['value'], binding[1].expressionTwoWay);
510
+ else
511
+ binding[1].compiledExpressionTwoWay = new Function(['value'], 'return ' + binding[1].expressionTwoWay);
512
+ }
513
+ }
514
+ for (let e of binding[1].events) {
515
+ const evt = element[e];
516
+ if (evt instanceof TypedEvent) {
517
+ evt.on(() => {
518
+ let v = element[binding[0]];
519
+ v = BindingsHelper.parseValueWithType(v, binding);
520
+ if (binding[1].compiledExpressionTwoWay)
521
+ v = binding[1].compiledExpressionTwoWay(v);
522
+ setter(v);
523
+ });
524
+ }
525
+ else {
526
+ element.addEventListener(e, (evt) => {
527
+ let v = element[binding[0]];
528
+ v = BindingsHelper.parseValueWithType(v, binding);
529
+ if (binding[1].compiledExpressionTwoWay)
530
+ v = binding[1].compiledExpressionTwoWay(v);
531
+ setter(v);
532
+ });
533
+ }
534
+ }
535
+ }
536
+ static parseValueWithType(value, binding) {
537
+ if (binding[1].type) {
538
+ switch (binding[1].type) {
539
+ case 'number':
540
+ return parseFloat(value);
541
+ case 'boolean':
542
+ return value === true || value === 'true' || !!parseInt(value);
543
+ case 'string':
544
+ return value?.toString();
545
+ case 'integer':
546
+ return parseInt(value);
547
+ case 'bitOfNumber':
548
+ return parseInt(value);
549
+ }
550
+ }
551
+ return value;
552
+ }
553
+ handleValueChanged(element, binding, value, valuesObject, index, signalVarNames, noParse) {
554
+ let v = value;
555
+ //should this be done??
556
+ if (!noParse && index == 0)
557
+ v = BindingsHelper.parseValueWithType(v, binding);
558
+ valuesObject[index] = v;
559
+ if (binding[1].expression) {
560
+ if (!binding[1].compiledExpression) {
561
+ signalVarNames.push('__res');
562
+ if (binding[1].expression.includes('return '))
563
+ binding[1].compiledExpression = new Function(signalVarNames, binding[1].expression);
564
+ else
565
+ binding[1].compiledExpression = new Function(signalVarNames, 'return ' + binding[1].expression);
566
+ }
567
+ v = binding[1].compiledExpression(...valuesObject);
568
+ valuesObject[signalVarNames.length - 1] = v;
569
+ }
570
+ if (binding[1].converter) {
571
+ const stringValue = (v != null ? v.toString() : v);
572
+ if (stringValue in binding[1].converter) {
573
+ v = new Function(signalVarNames, 'return `' + binding[1].converter[stringValue] + '`')(...valuesObject);
574
+ }
575
+ else {
576
+ //@ts-ignore
577
+ const nr = parseFloat(v);
578
+ for (let c in binding[1].converter) {
579
+ if (c.length > 2 && c[0] === '>' && c[1] === '=') {
580
+ const wr = parseFloat(c.substring(2));
581
+ if (nr >= wr) {
582
+ v = new Function(signalVarNames, 'return `' + binding[1].converter[c] + '`')(...valuesObject);
583
+ break;
584
+ }
585
+ }
586
+ else if (c.length > 2 && c[0] === '<' && c[1] === '=') {
587
+ const wr = parseFloat(c.substring(2));
588
+ if (nr <= wr) {
589
+ v = new Function(signalVarNames, 'return `' + binding[1].converter[c] + '`')(...valuesObject);
590
+ break;
591
+ }
592
+ }
593
+ else if (c.length > 1 && c[0] === '>') {
594
+ const wr = parseFloat(c.substring(1));
595
+ if (nr > wr) {
596
+ v = new Function(signalVarNames, 'return `' + binding[1].converter[c] + '`')(...valuesObject);
597
+ break;
598
+ }
599
+ }
600
+ else if (c.length > 1 && c[0] === '<') {
601
+ const wr = parseFloat(c.substring(1));
602
+ if (nr < wr) {
603
+ v = new Function(signalVarNames, 'return `' + binding[1].converter[c] + '`')(...valuesObject);
604
+ break;
605
+ }
606
+ }
607
+ else {
608
+ const sp = c.split('-');
609
+ if (sp.length > 1) {
610
+ if ((sp[0] === '' || nr >= parseFloat(sp[0])) && (sp[1] === '' || parseFloat(sp[1]) >= nr)) {
611
+ v = new Function(signalVarNames, 'return `' + binding[1].converter[c] + '`')(...valuesObject);
612
+ break;
613
+ }
614
+ }
615
+ }
616
+ }
617
+ }
618
+ }
619
+ if (binding[1].inverted)
620
+ v = !v;
621
+ if (binding[1].target == BindingTarget.property)
622
+ element[binding[0]] = v;
623
+ else if (binding[1].target == BindingTarget.attribute)
624
+ element.setAttribute(binding[0], v);
625
+ else if (binding[1].target == BindingTarget.css)
626
+ element.style[binding[0]] = v;
627
+ else if (binding[1].target == BindingTarget.cssvar)
628
+ element.style.setProperty(binding[0], v);
629
+ else if (binding[1].target == BindingTarget.class) {
630
+ if (v)
631
+ element.classList.add(binding[0]);
632
+ else
633
+ element.classList.remove(binding[0]);
634
+ }
635
+ }
636
+ static camelToDotCase(text) {
637
+ return text.replace(/([A-Z])/g, (g) => `.${g[0].toLowerCase()}`);
638
+ }
639
+ static dotToCamelCase(text) {
640
+ return text.replace(/\.([a-z])/g, (i) => i[1].toUpperCase());
641
+ }
642
+ }
@@ -0,0 +1,21 @@
1
+ export * from './blockly/BlocklyJavascriptHelper.js';
2
+ export * from './blockly/BlocklyScriptEditor.js';
3
+ export * from './blockly/BlocklyToolbox.js';
4
+ export * from './blockly/components/components.js';
5
+ export * from './components/BindingsEditor.js';
6
+ export * from './components/BindingsEditorHistoric.js';
7
+ export * from './helpers/BindingsHelper.js';
8
+ export * from './interfaces/IScriptMultiplexValue.js';
9
+ export * from './interfaces/VisualisationElementScript.js';
10
+ export * from './interfaces/VisualizationBinding.js';
11
+ export * from './interfaces/VisualizationHandler.js';
12
+ export * from './interfaces/VisualizationShell.js';
13
+ export * from './interfaces/VisualizationUiHandler.js';
14
+ export * from './scripting/Script.js';
15
+ export * from './scripting/ScriptCommands.js';
16
+ export * from './scripting/ScriptSystem.js';
17
+ export * from './services/BindableObjectDragDropService.js';
18
+ export * from './services/BindingsService.js';
19
+ export * from './services/PropertyGridDragDropService.js';
20
+ export * from './services/ScriptRefactorService.js';
21
+ export * from './services/SignalPropertyEditor.js';