iobroker.javascript 7.0.7 → 7.0.10

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 (42) hide show
  1. package/README.md +6 -12
  2. package/admin/asset-manifest.json +7 -7
  3. package/admin/google-blockly/blockly_compressed.js +1469 -1704
  4. package/admin/google-blockly/blocks_compressed.js +164 -218
  5. package/admin/google-blockly/javascript_compressed.js +100 -328
  6. package/admin/google-blockly/msg/js/de.js +64 -70
  7. package/admin/google-blockly/msg/js/en.js +14 -20
  8. package/admin/google-blockly/msg/js/es.js +39 -45
  9. package/admin/google-blockly/msg/js/fr.js +59 -65
  10. package/admin/google-blockly/msg/js/it.js +19 -25
  11. package/admin/google-blockly/msg/js/nl.js +55 -61
  12. package/admin/google-blockly/msg/js/pl.js +46 -52
  13. package/admin/google-blockly/msg/js/pt.js +30 -36
  14. package/admin/google-blockly/msg/js/ru.js +41 -47
  15. package/admin/google-blockly/msg/js/uk.js +13 -17
  16. package/admin/google-blockly/msg/js/zh-cn.js +86 -92
  17. package/admin/google-blockly/own/blocks_action.js +4 -4
  18. package/admin/google-blockly/own/blocks_logic.js +2 -2
  19. package/admin/google-blockly/own/blocks_procedures.js +63 -62
  20. package/admin/google-blockly/own/blocks_sendto.js +62 -60
  21. package/admin/google-blockly/own/blocks_switch.js +40 -29
  22. package/admin/google-blockly/own/blocks_system.js +109 -170
  23. package/admin/google-blockly/own/blocks_time.js +35 -35
  24. package/admin/google-blockly/own/blocks_timeout.js +42 -42
  25. package/admin/google-blockly/own/blocks_trigger.js +51 -68
  26. package/admin/google-blockly/own/blocks_words.js +12 -8
  27. package/admin/google-blockly/own/field_cron.js +189 -139
  28. package/admin/google-blockly/own/field_oid.js +250 -170
  29. package/admin/google-blockly/own/field_script.js +168 -122
  30. package/admin/static/js/{565.643198c0.chunk.js → 569.e2b427a7.chunk.js} +2 -2
  31. package/admin/static/js/569.e2b427a7.chunk.js.map +1 -0
  32. package/admin/static/js/759.7f25ba6c.chunk.js.map +1 -1
  33. package/admin/static/js/98.eee0c52f.chunk.js +2 -0
  34. package/admin/static/js/98.eee0c52f.chunk.js.map +1 -0
  35. package/admin/static/js/{main.d86fb9de.js → main.d5dc2784.js} +2 -2
  36. package/admin/static/js/{main.d86fb9de.js.map → main.d5dc2784.js.map} +1 -1
  37. package/admin/tab.html +1 -1
  38. package/io-package.json +27 -27
  39. package/package.json +1 -1
  40. package/admin/static/js/565.643198c0.chunk.js.map +0 -1
  41. package/admin/static/js/98.f78be4fc.chunk.js +0 -2
  42. package/admin/static/js/98.f78be4fc.chunk.js.map +0 -1
@@ -45,8 +45,7 @@ Blockly.Blocks['debug'] = {
45
45
  Blockly.JavaScript['debug'] = function(block) {
46
46
  const value_text = Blockly.JavaScript.valueToCode(block, 'TEXT', Blockly.JavaScript.ORDER_ATOMIC);
47
47
  const dropdown_severity = block.getFieldValue('Severity');
48
-
49
- return `console.${dropdown_severity}(${value_text});\n`;
48
+ return 'console.' + dropdown_severity + '(' + value_text + ');\n';
50
49
  };
51
50
 
52
51
  // --- comment --------------------------------------------------
@@ -71,8 +70,7 @@ Blockly.Blocks['comment'] = {
71
70
 
72
71
  Blockly.JavaScript['comment'] = function(block) {
73
72
  const comment = block.getFieldValue('COMMENT');
74
-
75
- return `// ${comment}\n`;
73
+ return '// ' + comment + '\n';
76
74
  };
77
75
 
78
76
  // --- control -----------------------------------------------------------
@@ -111,6 +109,7 @@ Blockly.Blocks['control'] = {
111
109
  this.sourceBlock_.updateShape_(option === true || option === 'true' || option === 'TRUE');
112
110
  }), 'WITH_DELAY');
113
111
 
112
+
114
113
  this.setInputsInline(true);
115
114
  this.setPreviousStatement(true, null);
116
115
  this.setNextStatement(true, null);
@@ -121,9 +120,7 @@ Blockly.Blocks['control'] = {
121
120
  mutationToDom: function() {
122
121
  const container = document.createElement('mutation');
123
122
  const option = this.getFieldValue('WITH_DELAY');
124
-
125
123
  container.setAttribute('delay_input', option === true || option === 'true' || option === 'TRUE');
126
-
127
124
  return container;
128
125
  },
129
126
  domToMutation: function(xmlElement) {
@@ -144,6 +141,7 @@ Blockly.Blocks['control'] = {
144
141
  [Blockly.Translate('control_sec'), 'sec'],
145
142
  [Blockly.Translate('control_min'), 'min']
146
143
  ]), 'UNIT');
144
+ //.appendField(Blockly.Translate('control_ms'));
147
145
  }
148
146
  } else if (inputExists) {
149
147
  this.removeInput('DELAY');
@@ -168,26 +166,25 @@ Blockly.JavaScript['control'] = function(block) {
168
166
 
169
167
  Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value';
170
168
 
171
- let valueDelay = parseInt(block.getFieldValue('DELAY_MS'), 10);
172
- const unit = block.getFieldValue('UNIT');
169
+ let valueDelay = parseInt(block.getFieldValue('DELAY_MS'), 10);
170
+ const unit = block.getFieldValue('UNIT');
173
171
  if (unit === 'min') {
174
172
  valueDelay *= 60000;
175
173
  } else if (unit === 'sec') {
176
174
  valueDelay *= 1000;
177
175
  }
178
-
179
176
  let clearRunning = block.getFieldValue('CLEAR_RUNNING');
180
- clearRunning = clearRunning === 'TRUE' || clearRunning === 'true' || clearRunning === true;
177
+ const valueValue = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
178
+ const objectName = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.name ? main.objects[valueObjectID].common.name : '';
179
+ let code;
181
180
 
182
- const valueValue = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
183
- const objectName = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.name ? main.objects[valueObjectID].common.name : '';
181
+ clearRunning = clearRunning === 'TRUE' || clearRunning === 'true' || clearRunning === true;
184
182
  const withDelay = this.getFieldValue('WITH_DELAY');
185
183
 
186
- let code;
187
184
  if (withDelay === 'true' || withDelay === true || withDelay === 'TRUE') {
188
- code = `setStateDelayed('${valueObjectID}'${objectName ? ` /* ${objectName} */` : ''}, ${valueValue}, ${valueDelay}, ${clearRunning});\n`;
185
+ code = 'setStateDelayed("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', ' + valueValue + ', ' + valueDelay + ', ' + clearRunning + ');\n';
189
186
  } else {
190
- code = `setState('${valueObjectID}'${objectName ? ` /* ${objectName} */` : ''}, ${valueValue});\n`;
187
+ code = 'setState("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', ' + valueValue + ');\n';
191
188
  }
192
189
 
193
190
  return code;
@@ -233,9 +230,7 @@ Blockly.Blocks['toggle'] = {
233
230
  mutationToDom: function() {
234
231
  const container = document.createElement('mutation');
235
232
  const option = this.getFieldValue('WITH_DELAY');
236
-
237
233
  container.setAttribute('delay_input', option === true || option === 'true' || option === 'TRUE');
238
-
239
234
  return container;
240
235
  },
241
236
  domToMutation: function(xmlElement) {
@@ -278,49 +273,46 @@ Blockly.Blocks['toggle'] = {
278
273
 
279
274
  Blockly.JavaScript['toggle'] = function(block) {
280
275
  const valueObjectID = block.getFieldValue('OID');
281
- const unit = block.getFieldValue('UNIT');
282
276
 
283
277
  Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value';
284
278
 
285
279
  let valueDelay = parseInt(block.getFieldValue('DELAY_MS'), 10);
280
+ const unit = block.getFieldValue('UNIT');
286
281
  if (unit === 'min') {
287
282
  valueDelay *= 60000;
288
283
  } else if (unit === 'sec') {
289
284
  valueDelay *= 1000;
290
285
  }
291
-
292
- const objectName = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.name ? main.objects[valueObjectID].common.name : '';
293
- const objectType = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.type ? main.objects[valueObjectID].common.type : 'boolean';
294
-
295
286
  let clearRunning = block.getFieldValue('CLEAR_RUNNING');
287
+ const objectName = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.name ? main.objects[valueObjectID].common.name : '';
288
+ const objectType = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.type ? main.objects[valueObjectID].common.type : 'boolean';
289
+ let code;
290
+ let setCommand;
291
+
296
292
  clearRunning = clearRunning === 'TRUE' || clearRunning === 'true' || clearRunning === true;
297
293
 
298
- let setCommand;
299
294
  if (objectType === 'number') {
300
295
  let max = 100;
301
296
  let min = 0;
302
-
303
297
  if (main.objects[valueObjectID].common.max !== undefined) {
304
298
  max = parseFloat(main.objects[valueObjectID].common.max);
305
299
  }
306
300
  if (main.objects[valueObjectID].common.min !== undefined) {
307
301
  min = parseFloat(main.objects[valueObjectID].common.min);
308
302
  }
309
-
310
- setCommand = `setState('${valueObjectID}'${objectName ? ` /* ${objectName} */` : ''}, state ? (state.val === ${min} ? ${max} : ${min}) : ${max});`;
303
+ setCommand = 'setState("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', state ? (state.val == ' + min + ' ? ' + max + ' : ' + min + ') : ' + max + ');';
311
304
  } else {
312
- setCommand = `setState('${valueObjectID}'${objectName ? ` /* ${objectName} */` : ''}, state ? !state.val : true);`;
305
+ setCommand = 'setState("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', state ? !state.val : true);';
313
306
  }
314
307
 
315
308
  const withDelay = block.getFieldValue('WITH_DELAY');
316
309
 
317
- let code;
318
310
  if (withDelay === 'TRUE' || withDelay === 'true' || withDelay === true) {
319
- code = `getState('${valueObjectID}', (err, state) => {\n` +
320
- Blockly.JavaScript.prefixLines(`setStateDelayed('${valueObjectID}'${objectName ? ` /* ${objectName} */` : ''}, state ? !state.val : true, ${valueDelay}, ${clearRunning});`, Blockly.JavaScript.INDENT) + '\n' +
311
+ code = 'getState("' + valueObjectID + '", (err, state) => {\n' +
312
+ Blockly.JavaScript.prefixLines('setStateDelayed("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', state ? !state.val : true, ' + valueDelay + ', ' + clearRunning + ');', Blockly.JavaScript.INDENT) + '\n' +
321
313
  '});\n';
322
314
  } else {
323
- code = `getState('${valueObjectID}', (err, state) => {\n` +
315
+ code = 'getState("' + valueObjectID + '", (err, state) => {\n' +
324
316
  Blockly.JavaScript.prefixLines(setCommand, Blockly.JavaScript.INDENT) + '\n' +
325
317
  '});\n';
326
318
  }
@@ -374,9 +366,7 @@ Blockly.Blocks['update'] = {
374
366
  mutationToDom: function() {
375
367
  const container = document.createElement('mutation');
376
368
  const option = this.getFieldValue('WITH_DELAY');
377
-
378
369
  container.setAttribute('delay_input', option === true || option === 'true' || option === 'TRUE');
379
-
380
370
  return container;
381
371
  },
382
372
  domToMutation: function(xmlElement) {
@@ -423,26 +413,25 @@ Blockly.JavaScript['update'] = function(block) {
423
413
  Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value';
424
414
 
425
415
  const value_value = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
426
- const unit = block.getFieldValue('UNIT');
427
-
428
416
  let value_delay = parseInt(block.getFieldValue('DELAY_MS'), 10);
417
+ let clearRunning = block.getFieldValue('CLEAR_RUNNING');
418
+ const unit = block.getFieldValue('UNIT');
429
419
  if (unit === 'min') {
430
420
  value_delay *= 60000;
431
421
  } else if (unit === 'sec') {
432
422
  value_delay *= 1000;
433
423
  }
434
424
 
435
- let clearRunning = block.getFieldValue('CLEAR_RUNNING');
436
425
  clearRunning = clearRunning === 'TRUE' || clearRunning === 'true' || clearRunning === true;
437
426
 
438
- const objectName = main.objects[value_objectid] && main.objects[value_objectid].common && main.objects[value_objectid].common.name ? main.objects[value_objectid].common.name : '';
427
+ const objectname = main.objects[value_objectid] && main.objects[value_objectid].common && main.objects[value_objectid].common.name ? main.objects[value_objectid].common.name : '';
428
+ let code;
439
429
  const withDelay = this.getFieldValue('WITH_DELAY');
440
430
 
441
- let code;
442
431
  if (withDelay === true || withDelay === 'true' || withDelay === 'TRUE') {
443
- code = `setStateDelayed('${value_objectid}'${objectName ? ` /* ${objectName} */` : ''}, ${value_value}, true, ${value_delay}, ${clearRunning});\n`;
432
+ code = 'setStateDelayed("' + value_objectid + '"' + (objectname ? '/*' + objectname + '*/' : '') + ', ' + value_value + ', true, ' + value_delay + ', ' + clearRunning + ');\n';
444
433
  } else {
445
- code = `setState('${value_objectid}'${objectName ? ` /* ${objectName} */` : ''}, ${value_value}, true);\n`;
434
+ code = 'setState("' + value_objectid + '"' + (objectname ? '/*' + objectname + '*/' : '') + ', ' + value_value + ', true);\n';
446
435
  }
447
436
 
448
437
  return code;
@@ -492,13 +481,11 @@ Blockly.Blocks['direct'] = {
492
481
 
493
482
  Blockly.JavaScript['direct'] = function(block) {
494
483
  const oidSrc = Blockly.JavaScript.valueToCode(block, 'OID_SRC', Blockly.JavaScript.ORDER_ATOMIC);
495
- const oidDest = Blockly.JavaScript.valueToCode(block, 'OID_DST', Blockly.JavaScript.ORDER_ATOMIC);
496
-
497
484
  let onlyChanges = block.getFieldValue('ONLY_CHANGES');
485
+ const oidDest = Blockly.JavaScript.valueToCode(block, 'OID_DST', Blockly.JavaScript.ORDER_ATOMIC);
498
486
  onlyChanges = onlyChanges === true || onlyChanges === 'true' || onlyChanges === 'TRUE';
499
-
500
- return `on({ id: ${oidSrc}, change: '${onlyChanges ? 'ne' : 'any'}' }, (obj) => {\n` +
501
- Blockly.JavaScript.prefixLines(`setState(${oidDest}, obj.state.val);`, Blockly.JavaScript.INDENT) + '\n' +
487
+ return 'on({ id: ' + oidSrc + ', change: "' + (onlyChanges ? 'ne' : 'any') + '" }, (obj) => {\n' +
488
+ Blockly.JavaScript.prefixLines('setState(' + oidDest + ', obj.state.val);', Blockly.JavaScript.INDENT) + '\n' +
502
489
  '});\n';
503
490
  };
504
491
 
@@ -564,16 +551,13 @@ Blockly.Blocks['control_ex'] = {
564
551
 
565
552
  Blockly.JavaScript['control_ex'] = function(block) {
566
553
  const valueObjectID = Blockly.JavaScript.valueToCode(block, 'OID', Blockly.JavaScript.ORDER_ATOMIC);
567
- const value = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
568
- const valueDelay = Blockly.JavaScript.valueToCode(block, 'DELAY_MS', Blockly.JavaScript.ORDER_ATOMIC);
569
-
570
- let clearRunning = block.getFieldValue('CLEAR_RUNNING');
571
- clearRunning = clearRunning === true || clearRunning === 'true' || clearRunning === 'TRUE';
572
-
573
- let type = block.getFieldValue('TYPE');
554
+ const value = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
555
+ const valueDelay = Blockly.JavaScript.valueToCode(block, 'DELAY_MS', Blockly.JavaScript.ORDER_ATOMIC);
556
+ let clearRunning = block.getFieldValue('CLEAR_RUNNING');
557
+ let type = block.getFieldValue('TYPE');
574
558
  type = type === true || type === 'true' || type === 'TRUE';
575
-
576
- return `setStateDelayed(${valueObjectID}, ${value}, ${type}, parseInt(((${valueDelay}) || '').toString(), 10), ${clearRunning});\n`;
559
+ clearRunning = clearRunning === true || clearRunning === 'true' || clearRunning === 'TRUE';
560
+ return 'setStateDelayed(' + valueObjectID + ', ' + value + ', ' + type + ', parseInt(((' + valueDelay + ') || "").toString(), 10), ' + clearRunning + ');\n';
577
561
  };
578
562
 
579
563
  // --- create state --------------------------------------------------
@@ -629,109 +613,23 @@ Blockly.JavaScript['create'] = function(block) {
629
613
  let paraC = '';
630
614
 
631
615
  if (value !== null && value !== '') {
632
- paraV = ', ' + value;
633
- }
634
-
635
- if (common !== null && common !== '') {
636
- if (typeof common === 'object') {
637
- paraC = `, JSON.parse(${JSON.stringify(common)})`;
616
+ if (isNaN(value)) {
617
+ paraV = ', ' + value;
638
618
  } else {
639
- paraC = `, JSON.parse(${common})`;
619
+ paraV = ', ' + value;
640
620
  }
641
621
  }
642
622
 
643
- return `createState('${name}'${paraV}${paraC}, async () => {\n` +
644
- statement +
645
- '});\n';
646
- };
647
-
648
- // --- create state ex --------------------------------------------------
649
- Blockly.System.blocks['create_ex'] =
650
- '<block type="create_ex">'
651
- + ' <value name="NAME">'
652
- + ' </value>'
653
- + ' <value name="TYPE">'
654
- + ' </value>'
655
- + ' <value name="VALUE">'
656
- + ' </value>'
657
- + ' <value name="READABLE">'
658
- + ' </value>'
659
- + ' <value name="WRITEABLE">'
660
- + ' </value>'
661
- + ' <value name="STATEMENT">'
662
- + ' </value>'
663
- + '</block>';
664
-
665
- Blockly.Blocks['create_ex'] = {
666
- init: function() {
667
- this.appendDummyInput()
668
- .appendField(Blockly.Translate('create'));
669
-
670
- this.appendDummyInput('NAME')
671
- .appendField(Blockly.Translate('create_oid'))
672
- .appendField(new Blockly.FieldTextInput(Blockly.Translate('create_jsState')), 'NAME');
673
-
674
- this.appendDummyInput('TYPE')
675
- .appendField(Blockly.Translate('create_type'))
676
- .appendField(new Blockly.FieldDropdown([
677
- [Blockly.Translate('create_type_string'), 'string'],
678
- [Blockly.Translate('create_type_number'), 'number'],
679
- [Blockly.Translate('create_type_boolean'), 'boolean'],
680
- [Blockly.Translate('create_type_json'), 'json'],
681
- //[Blockly.Translate('create_type_object'), 'object'],
682
- //[Blockly.Translate('create_type_array'), 'array'],
683
- //[Blockly.Translate('create_type_file'), 'file'],
684
- ]), 'TYPE');
685
-
686
- this.appendValueInput('VALUE')
687
- .setCheck(null)
688
- .appendField(Blockly.Translate('create_init'));
689
-
690
- this.appendDummyInput('READABLE_INPUT')
691
- .appendField(Blockly.Translate('create_readable'))
692
- .appendField(new Blockly.FieldCheckbox('FALSE'), 'READABLE');
693
-
694
- this.appendDummyInput('WRITEABLE_INPUT')
695
- .appendField(Blockly.Translate('create_writeable'))
696
- .appendField(new Blockly.FieldCheckbox('FALSE'), 'WRITEABLE');
697
-
698
- this.appendStatementInput('STATEMENT')
699
- .setCheck(null);
700
-
701
- this.setPreviousStatement(true, null);
702
- this.setNextStatement(true, null);
703
-
704
- this.setInputsInline(false);
705
- this.setColour(Blockly.System.HUE);
706
- this.setTooltip(Blockly.Translate('create_tooltip'));
707
- this.setHelpUrl(getHelp('create_help'));
708
- }
709
- };
710
-
711
- Blockly.JavaScript['create_ex'] = function(block) {
712
- const name = block.getFieldValue('NAME');
713
- const type = block.getFieldValue('TYPE');
714
- const value = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
715
- const statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
716
-
717
- let paraV = '';
718
-
719
- if (value !== null && value !== '') {
720
- if (type === 'number') {
721
- paraV = `, parseFloat(${value})`;
623
+ if (common !== null && common !== '') {
624
+ if (typeof common === 'object') {
625
+ paraC = ', JSON.parse(' + JSON.stringify(common) + ')';
722
626
  } else {
723
- paraV = ', ' + value;
627
+ paraC = ', JSON.parse(' + common + ')';
724
628
  }
725
629
  }
726
630
 
727
- let readable = block.getFieldValue('READABLE');
728
- readable = readable === 'TRUE' || readable === 'true' || readable === true;
729
-
730
- let writeable = block.getFieldValue('WRITEABLE');
731
- writeable = writeable === 'TRUE' || writeable === 'true' || writeable === true;
732
-
733
- return `createState('${name}'${paraV}, { type: "${type}", read: ${readable}, write: ${writeable} }, async () => {\n` +
734
- statement +
631
+ return 'createState("' + name + '"' + paraV + paraC + ', async () => {\n' +
632
+ Blockly.JavaScript.prefixLines(statement, Blockly.JavaScript.INDENT) + '\n' +
735
633
  '});\n';
736
634
  };
737
635
 
@@ -785,11 +683,10 @@ Blockly.Blocks['get_value'] = {
785
683
  Blockly.JavaScript['get_value'] = function(block) {
786
684
  const oid = block.getFieldValue('OID');
787
685
  const attr = block.getFieldValue('ATTR');
788
-
789
- if (attr === 'type' || attr.startsWith('common.')) {
790
- return [`(await getObjectAsync('${oid}')).${attr}`, Blockly.JavaScript.ORDER_ATOMIC];
686
+ if (attr === 'type' || attr.indexOf('.') !== -1) {
687
+ return ['(await getObjectAsync("' + oid + '")).' + attr, Blockly.JavaScript.ORDER_ATOMIC];
791
688
  } else {
792
- return [`getState('${oid}').${attr}`, Blockly.JavaScript.ORDER_ATOMIC];
689
+ return ['getState("' + oid + '").' + attr, Blockly.JavaScript.ORDER_ATOMIC];
793
690
  }
794
691
  };
795
692
 
@@ -806,6 +703,7 @@ Blockly.System.blocks['get_value_var'] =
806
703
  + '</block>';
807
704
 
808
705
  Blockly.Blocks['get_value_var'] = {
706
+ // Checkbox.
809
707
  init: function() {
810
708
 
811
709
  this.appendDummyInput('ATTR')
@@ -845,11 +743,10 @@ Blockly.Blocks['get_value_var'] = {
845
743
  Blockly.JavaScript['get_value_var'] = function(block) {
846
744
  const oid = Blockly.JavaScript.valueToCode(block, 'OID', Blockly.JavaScript.ORDER_ATOMIC);
847
745
  const attr = block.getFieldValue('ATTR');
848
-
849
- if (attr === 'type' || attr.startsWith('common.')) {
850
- return [`(await getObjectAsync(${oid})).${attr}`, Blockly.JavaScript.ORDER_ATOMIC];
746
+ if (attr === 'type' || attr.startsWith('common.') || attr.startsWith('native.')) {
747
+ return ['(await getObjectAsync("' + oid + '")).' + attr, Blockly.JavaScript.ORDER_ATOMIC];
851
748
  } else {
852
- return [`getState(${oid}).${attr}`, Blockly.JavaScript.ORDER_ATOMIC];
749
+ return ['getState(' + oid + ').' + attr, Blockly.JavaScript.ORDER_ATOMIC];
853
750
  }
854
751
  };
855
752
 
@@ -865,6 +762,7 @@ Blockly.System.blocks['get_value_async'] =
865
762
  + '</block>';
866
763
 
867
764
  Blockly.Blocks['get_value_async'] = {
765
+ // Checkbox.
868
766
  init: function() {
869
767
 
870
768
  this.appendDummyInput('ATTR')
@@ -910,9 +808,8 @@ Blockly.JavaScript['get_value_async'] = function(block) {
910
808
  const oid = block.getFieldValue('OID');
911
809
  const attr = block.getFieldValue('ATTR');
912
810
  const statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
913
-
914
- if (attr === 'type' || attr.startsWith('common.')) {
915
- return `getObjectAsync('${oid}', async (err, obj) => {\n` +
811
+ if (attr === 'type' || attr.startsWith('common.') || attr.startsWith('native.')) {
812
+ return 'getObjectAsync("' + oid + '", async (err, obj) => {\n' +
916
813
  Blockly.JavaScript.prefixLines('let value = obj.' + attr + ';', Blockly.JavaScript.INDENT) + '\n' +
917
814
  statement + '\n' +
918
815
  '});\n';
@@ -948,8 +845,7 @@ Blockly.Blocks['field_oid'] = {
948
845
 
949
846
  Blockly.JavaScript['field_oid'] = function(block) {
950
847
  const oid = block.getFieldValue('oid');
951
-
952
- return [`'${oid}'`, Blockly.JavaScript.ORDER_ATOMIC];
848
+ return ['\'' + oid + '\'', Blockly.JavaScript.ORDER_ATOMIC];
953
849
  };
954
850
 
955
851
  // --- select OID meta--------------------------------------------------
@@ -976,8 +872,7 @@ Blockly.Blocks['field_oid_meta'] = {
976
872
 
977
873
  Blockly.JavaScript['field_oid_meta'] = function(block) {
978
874
  const oid = block.getFieldValue('oid');
979
-
980
- return [`'${oid}'`, Blockly.JavaScript.ORDER_ATOMIC];
875
+ return ['\'' + oid + '\'', Blockly.JavaScript.ORDER_ATOMIC];
981
876
  };
982
877
 
983
878
  // --- select OID script--------------------------------------------------
@@ -1004,8 +899,7 @@ Blockly.Blocks['field_oid_script'] = {
1004
899
 
1005
900
  Blockly.JavaScript['field_oid_script'] = function(block) {
1006
901
  const oid = block.getFieldValue('oid');
1007
-
1008
- return [`'${oid}'`, Blockly.JavaScript.ORDER_ATOMIC];
902
+ return ['\'' + oid + '\'', Blockly.JavaScript.ORDER_ATOMIC];
1009
903
  };
1010
904
 
1011
905
  // --- get attribute --------------------------------------------------
@@ -1026,6 +920,8 @@ Blockly.Blocks['get_attr'] = {
1026
920
  .setCheck(null)
1027
921
  .appendField(Blockly.Translate('get_attr_path'));
1028
922
 
923
+ // this.appendDummyInput()
924
+
1029
925
  this.appendValueInput('OBJECT')
1030
926
  .appendField(Blockly.Translate('get_attr_by'));
1031
927
 
@@ -1040,7 +936,6 @@ Blockly.Blocks['get_attr'] = {
1040
936
  Blockly.JavaScript['get_attr'] = function(block) {
1041
937
  const path = Blockly.JavaScript.valueToCode(block, 'PATH', Blockly.JavaScript.ORDER_ATOMIC);
1042
938
  const obj = Blockly.JavaScript.valueToCode(block, 'OBJECT', Blockly.JavaScript.ORDER_ATOMIC);
1043
-
1044
939
  return ['getAttr(' + obj + ', ' + path + ')', Blockly.JavaScript.ORDER_ATOMIC];
1045
940
  };
1046
941
 
@@ -1052,6 +947,7 @@ Blockly.System.blocks['regex'] =
1052
947
  + '</block>';
1053
948
 
1054
949
  Blockly.Blocks['regex'] = {
950
+ // Checkbox.
1055
951
  init: function() {
1056
952
  this.appendDummyInput()
1057
953
  .appendField('RegExp');
@@ -1068,8 +964,7 @@ Blockly.Blocks['regex'] = {
1068
964
 
1069
965
  Blockly.JavaScript['regex'] = function(block) {
1070
966
  const oid = block.getFieldValue('TEXT');
1071
-
1072
- return [`new RegExp('${oid}')`, Blockly.JavaScript.ORDER_ATOMIC];
967
+ return ['new RegExp("' + oid + '")', Blockly.JavaScript.ORDER_ATOMIC];
1073
968
  };
1074
969
 
1075
970
  // --- selector --------------------------------------------------
@@ -1080,6 +975,7 @@ Blockly.System.blocks['selector'] =
1080
975
  + '</block>';
1081
976
 
1082
977
  Blockly.Blocks['selector'] = {
978
+ // Checkbox.
1083
979
  init: function() {
1084
980
 
1085
981
  this.appendDummyInput()
@@ -1100,6 +996,49 @@ Blockly.Blocks['selector'] = {
1100
996
 
1101
997
  Blockly.JavaScript['selector'] = function(block) {
1102
998
  const oid = block.getFieldValue('TEXT');
999
+ return ['Array.prototype.slice.apply($("' + oid + '"))', Blockly.JavaScript.ORDER_ATOMIC];
1000
+ };
1001
+
1002
+ // --- Text new line --------------------------------------------------
1003
+ Blockly.Blocks['text_newline'] = {
1004
+ // Checkbox.
1005
+ init: function() {
1006
+ this.appendDummyInput()
1007
+ .appendField(Blockly.Translate('text_newline'));
1008
+
1009
+ this.appendDummyInput()
1010
+ .appendField(new Blockly.FieldDropdown([['\\n', '\\n'], ['\\r\\n', '\\r\\n'], ['\\r', '\\r']]), 'Type');
1011
+ this.setInputsInline(true);
1012
+ this.setColour(Blockly.Msg['TEXTS_HUE']);
1013
+ this.setOutput(true, 'String');
1014
+ this.setTooltip(Blockly.Translate('text_newline_tooltip'));
1015
+ }
1016
+ };
1017
+
1018
+ Blockly.JavaScript['text_newline'] = function(block) {
1019
+ const dropdown_type = block.getFieldValue('Type');
1020
+ return ['\'' + dropdown_type + '\'', Blockly.JavaScript.ORDER_ATOMIC];
1021
+ };
1022
+
1023
+ // --- Round Number to n decimal places -------------------------------
1024
+ Blockly.Blocks['math_rndfixed'] = {
1025
+ init: function() {
1026
+ this.appendValueInput('x')
1027
+ .setCheck('Number')
1028
+ .appendField(Blockly.Translate('math_rndfixed_round'));
1029
+ this.appendDummyInput()
1030
+ .appendField(Blockly.Translate('math_rndfixed_to'))
1031
+ .appendField(new Blockly.FieldNumber(0, 1, 25), 'n')
1032
+ .appendField(Blockly.Translate('math_rndfixed_decplcs'));
1033
+ this.setInputsInline(true);
1034
+ this.setColour(Blockly.Msg['MATH_HUE']);
1035
+ this.setOutput(true, 'Number');
1036
+ this.setTooltip(Blockly.Translate('math_rndfixed_tooltip'));
1037
+ }
1038
+ };
1103
1039
 
1104
- return [`Array.prototype.slice.apply($('${oid}'))`, Blockly.JavaScript.ORDER_ATOMIC];
1040
+ Blockly.JavaScript['math_rndfixed'] = function(block) {
1041
+ const x = Blockly.JavaScript.valueToCode(block, 'x', Blockly.JavaScript.ORDER_ATOMIC);
1042
+ const exp = Math.pow(10, block.getFieldValue('n'));
1043
+ return ['Math.round(' + x + '*' + exp + ')/' + exp, Blockly.JavaScript.ORDER_ATOMIC];
1105
1044
  };