iobroker.javascript 7.0.7 → 7.0.8

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 (41) hide show
  1. package/README.md +2 -1
  2. package/admin/asset-manifest.json +5 -5
  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_other.js +103 -0
  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 +113 -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 +8 -9
  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/98.bf3dfa2b.chunk.js +2 -0
  31. package/admin/static/js/98.bf3dfa2b.chunk.js.map +1 -0
  32. package/admin/static/js/{main.d86fb9de.js → main.d9e7d255.js} +2 -2
  33. package/admin/static/js/{main.d86fb9de.js.map → main.d9e7d255.js.map} +1 -1
  34. package/admin/tab.html +1 -1
  35. package/io-package.json +14 -14
  36. package/package.json +1 -1
  37. package/admin/google-blockly/own/blocks_logic.js +0 -64
  38. package/admin/google-blockly/own/blocks_number.js +0 -25
  39. package/admin/google-blockly/own/blocks_text.js +0 -23
  40. package/admin/static/js/98.f78be4fc.chunk.js +0 -2
  41. package/admin/static/js/98.f78be4fc.chunk.js.map +0 -1
@@ -9,6 +9,10 @@ if (typeof goog !== 'undefined') {
9
9
  Blockly.CustomBlocks = Blockly.CustomBlocks || [];
10
10
  Blockly.CustomBlocks.push('System');
11
11
 
12
+ function getHelp(word) {
13
+ return 'https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#' + Blockly.Words[word][systemLang];
14
+ }
15
+
12
16
  Blockly.System = {
13
17
  HUE: 210,
14
18
  blocks: {}
@@ -45,8 +49,7 @@ Blockly.Blocks['debug'] = {
45
49
  Blockly.JavaScript['debug'] = function(block) {
46
50
  const value_text = Blockly.JavaScript.valueToCode(block, 'TEXT', Blockly.JavaScript.ORDER_ATOMIC);
47
51
  const dropdown_severity = block.getFieldValue('Severity');
48
-
49
- return `console.${dropdown_severity}(${value_text});\n`;
52
+ return 'console.' + dropdown_severity + '(' + value_text + ');\n';
50
53
  };
51
54
 
52
55
  // --- comment --------------------------------------------------
@@ -71,8 +74,7 @@ Blockly.Blocks['comment'] = {
71
74
 
72
75
  Blockly.JavaScript['comment'] = function(block) {
73
76
  const comment = block.getFieldValue('COMMENT');
74
-
75
- return `// ${comment}\n`;
77
+ return '// ' + comment + '\n';
76
78
  };
77
79
 
78
80
  // --- control -----------------------------------------------------------
@@ -111,6 +113,7 @@ Blockly.Blocks['control'] = {
111
113
  this.sourceBlock_.updateShape_(option === true || option === 'true' || option === 'TRUE');
112
114
  }), 'WITH_DELAY');
113
115
 
116
+
114
117
  this.setInputsInline(true);
115
118
  this.setPreviousStatement(true, null);
116
119
  this.setNextStatement(true, null);
@@ -121,9 +124,7 @@ Blockly.Blocks['control'] = {
121
124
  mutationToDom: function() {
122
125
  const container = document.createElement('mutation');
123
126
  const option = this.getFieldValue('WITH_DELAY');
124
-
125
127
  container.setAttribute('delay_input', option === true || option === 'true' || option === 'TRUE');
126
-
127
128
  return container;
128
129
  },
129
130
  domToMutation: function(xmlElement) {
@@ -144,6 +145,7 @@ Blockly.Blocks['control'] = {
144
145
  [Blockly.Translate('control_sec'), 'sec'],
145
146
  [Blockly.Translate('control_min'), 'min']
146
147
  ]), 'UNIT');
148
+ //.appendField(Blockly.Translate('control_ms'));
147
149
  }
148
150
  } else if (inputExists) {
149
151
  this.removeInput('DELAY');
@@ -168,26 +170,25 @@ Blockly.JavaScript['control'] = function(block) {
168
170
 
169
171
  Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value';
170
172
 
171
- let valueDelay = parseInt(block.getFieldValue('DELAY_MS'), 10);
172
- const unit = block.getFieldValue('UNIT');
173
+ let valueDelay = parseInt(block.getFieldValue('DELAY_MS'), 10);
174
+ const unit = block.getFieldValue('UNIT');
173
175
  if (unit === 'min') {
174
176
  valueDelay *= 60000;
175
177
  } else if (unit === 'sec') {
176
178
  valueDelay *= 1000;
177
179
  }
178
-
179
180
  let clearRunning = block.getFieldValue('CLEAR_RUNNING');
180
- clearRunning = clearRunning === 'TRUE' || clearRunning === 'true' || clearRunning === true;
181
+ const valueValue = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
182
+ const objectName = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.name ? main.objects[valueObjectID].common.name : '';
183
+ let code;
181
184
 
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 : '';
185
+ clearRunning = clearRunning === 'TRUE' || clearRunning === 'true' || clearRunning === true;
184
186
  const withDelay = this.getFieldValue('WITH_DELAY');
185
187
 
186
- let code;
187
188
  if (withDelay === 'true' || withDelay === true || withDelay === 'TRUE') {
188
- code = `setStateDelayed('${valueObjectID}'${objectName ? ` /* ${objectName} */` : ''}, ${valueValue}, ${valueDelay}, ${clearRunning});\n`;
189
+ code = 'setStateDelayed("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', ' + valueValue + ', ' + valueDelay + ', ' + clearRunning + ');\n';
189
190
  } else {
190
- code = `setState('${valueObjectID}'${objectName ? ` /* ${objectName} */` : ''}, ${valueValue});\n`;
191
+ code = 'setState("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', ' + valueValue + ');\n';
191
192
  }
192
193
 
193
194
  return code;
@@ -233,9 +234,7 @@ Blockly.Blocks['toggle'] = {
233
234
  mutationToDom: function() {
234
235
  const container = document.createElement('mutation');
235
236
  const option = this.getFieldValue('WITH_DELAY');
236
-
237
237
  container.setAttribute('delay_input', option === true || option === 'true' || option === 'TRUE');
238
-
239
238
  return container;
240
239
  },
241
240
  domToMutation: function(xmlElement) {
@@ -278,49 +277,46 @@ Blockly.Blocks['toggle'] = {
278
277
 
279
278
  Blockly.JavaScript['toggle'] = function(block) {
280
279
  const valueObjectID = block.getFieldValue('OID');
281
- const unit = block.getFieldValue('UNIT');
282
280
 
283
281
  Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value';
284
282
 
285
283
  let valueDelay = parseInt(block.getFieldValue('DELAY_MS'), 10);
284
+ const unit = block.getFieldValue('UNIT');
286
285
  if (unit === 'min') {
287
286
  valueDelay *= 60000;
288
287
  } else if (unit === 'sec') {
289
288
  valueDelay *= 1000;
290
289
  }
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
290
  let clearRunning = block.getFieldValue('CLEAR_RUNNING');
291
+ const objectName = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.name ? main.objects[valueObjectID].common.name : '';
292
+ const objectType = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.type ? main.objects[valueObjectID].common.type : 'boolean';
293
+ let code;
294
+ let setCommand;
295
+
296
296
  clearRunning = clearRunning === 'TRUE' || clearRunning === 'true' || clearRunning === true;
297
297
 
298
- let setCommand;
299
298
  if (objectType === 'number') {
300
299
  let max = 100;
301
300
  let min = 0;
302
-
303
301
  if (main.objects[valueObjectID].common.max !== undefined) {
304
302
  max = parseFloat(main.objects[valueObjectID].common.max);
305
303
  }
306
304
  if (main.objects[valueObjectID].common.min !== undefined) {
307
305
  min = parseFloat(main.objects[valueObjectID].common.min);
308
306
  }
309
-
310
- setCommand = `setState('${valueObjectID}'${objectName ? ` /* ${objectName} */` : ''}, state ? (state.val === ${min} ? ${max} : ${min}) : ${max});`;
307
+ setCommand = 'setState("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', state ? (state.val == ' + min + ' ? ' + max + ' : ' + min + ') : ' + max + ');';
311
308
  } else {
312
- setCommand = `setState('${valueObjectID}'${objectName ? ` /* ${objectName} */` : ''}, state ? !state.val : true);`;
309
+ setCommand = 'setState("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', state ? !state.val : true);';
313
310
  }
314
311
 
315
312
  const withDelay = block.getFieldValue('WITH_DELAY');
316
313
 
317
- let code;
318
314
  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' +
315
+ code = 'getState("' + valueObjectID + '", (err, state) => {\n' +
316
+ Blockly.JavaScript.prefixLines('setStateDelayed("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', state ? !state.val : true, ' + valueDelay + ', ' + clearRunning + ');', Blockly.JavaScript.INDENT) + '\n' +
321
317
  '});\n';
322
318
  } else {
323
- code = `getState('${valueObjectID}', (err, state) => {\n` +
319
+ code = 'getState("' + valueObjectID + '", (err, state) => {\n' +
324
320
  Blockly.JavaScript.prefixLines(setCommand, Blockly.JavaScript.INDENT) + '\n' +
325
321
  '});\n';
326
322
  }
@@ -374,9 +370,7 @@ Blockly.Blocks['update'] = {
374
370
  mutationToDom: function() {
375
371
  const container = document.createElement('mutation');
376
372
  const option = this.getFieldValue('WITH_DELAY');
377
-
378
373
  container.setAttribute('delay_input', option === true || option === 'true' || option === 'TRUE');
379
-
380
374
  return container;
381
375
  },
382
376
  domToMutation: function(xmlElement) {
@@ -423,26 +417,25 @@ Blockly.JavaScript['update'] = function(block) {
423
417
  Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value';
424
418
 
425
419
  const value_value = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
426
- const unit = block.getFieldValue('UNIT');
427
-
428
420
  let value_delay = parseInt(block.getFieldValue('DELAY_MS'), 10);
421
+ let clearRunning = block.getFieldValue('CLEAR_RUNNING');
422
+ const unit = block.getFieldValue('UNIT');
429
423
  if (unit === 'min') {
430
424
  value_delay *= 60000;
431
425
  } else if (unit === 'sec') {
432
426
  value_delay *= 1000;
433
427
  }
434
428
 
435
- let clearRunning = block.getFieldValue('CLEAR_RUNNING');
436
429
  clearRunning = clearRunning === 'TRUE' || clearRunning === 'true' || clearRunning === true;
437
430
 
438
- const objectName = main.objects[value_objectid] && main.objects[value_objectid].common && main.objects[value_objectid].common.name ? main.objects[value_objectid].common.name : '';
431
+ const objectname = main.objects[value_objectid] && main.objects[value_objectid].common && main.objects[value_objectid].common.name ? main.objects[value_objectid].common.name : '';
432
+ let code;
439
433
  const withDelay = this.getFieldValue('WITH_DELAY');
440
434
 
441
- let code;
442
435
  if (withDelay === true || withDelay === 'true' || withDelay === 'TRUE') {
443
- code = `setStateDelayed('${value_objectid}'${objectName ? ` /* ${objectName} */` : ''}, ${value_value}, true, ${value_delay}, ${clearRunning});\n`;
436
+ code = 'setStateDelayed("' + value_objectid + '"' + (objectname ? '/*' + objectname + '*/' : '') + ', ' + value_value + ', true, ' + value_delay + ', ' + clearRunning + ');\n';
444
437
  } else {
445
- code = `setState('${value_objectid}'${objectName ? ` /* ${objectName} */` : ''}, ${value_value}, true);\n`;
438
+ code = 'setState("' + value_objectid + '"' + (objectname ? '/*' + objectname + '*/' : '') + ', ' + value_value + ', true);\n';
446
439
  }
447
440
 
448
441
  return code;
@@ -492,13 +485,11 @@ Blockly.Blocks['direct'] = {
492
485
 
493
486
  Blockly.JavaScript['direct'] = function(block) {
494
487
  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
488
  let onlyChanges = block.getFieldValue('ONLY_CHANGES');
489
+ const oidDest = Blockly.JavaScript.valueToCode(block, 'OID_DST', Blockly.JavaScript.ORDER_ATOMIC);
498
490
  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' +
491
+ return 'on({ id: ' + oidSrc + ', change: "' + (onlyChanges ? 'ne' : 'any') + '" }, (obj) => {\n' +
492
+ Blockly.JavaScript.prefixLines('setState(' + oidDest + ', obj.state.val);', Blockly.JavaScript.INDENT) + '\n' +
502
493
  '});\n';
503
494
  };
504
495
 
@@ -564,16 +555,13 @@ Blockly.Blocks['control_ex'] = {
564
555
 
565
556
  Blockly.JavaScript['control_ex'] = function(block) {
566
557
  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');
558
+ const value = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
559
+ const valueDelay = Blockly.JavaScript.valueToCode(block, 'DELAY_MS', Blockly.JavaScript.ORDER_ATOMIC);
560
+ let clearRunning = block.getFieldValue('CLEAR_RUNNING');
561
+ let type = block.getFieldValue('TYPE');
574
562
  type = type === true || type === 'true' || type === 'TRUE';
575
-
576
- return `setStateDelayed(${valueObjectID}, ${value}, ${type}, parseInt(((${valueDelay}) || '').toString(), 10), ${clearRunning});\n`;
563
+ clearRunning = clearRunning === true || clearRunning === 'true' || clearRunning === 'TRUE';
564
+ return 'setStateDelayed(' + valueObjectID + ', ' + value + ', ' + type + ', parseInt(((' + valueDelay + ') || "").toString(), 10), ' + clearRunning + ');\n';
577
565
  };
578
566
 
579
567
  // --- create state --------------------------------------------------
@@ -629,109 +617,23 @@ Blockly.JavaScript['create'] = function(block) {
629
617
  let paraC = '';
630
618
 
631
619
  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)})`;
620
+ if (isNaN(value)) {
621
+ paraV = ', ' + value;
638
622
  } else {
639
- paraC = `, JSON.parse(${common})`;
623
+ paraV = ', ' + value;
640
624
  }
641
625
  }
642
626
 
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})`;
627
+ if (common !== null && common !== '') {
628
+ if (typeof common === 'object') {
629
+ paraC = ', JSON.parse(' + JSON.stringify(common) + ')';
722
630
  } else {
723
- paraV = ', ' + value;
631
+ paraC = ', JSON.parse(' + common + ')';
724
632
  }
725
633
  }
726
634
 
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 +
635
+ return 'createState("' + name + '"' + paraV + paraC + ', async () => {\n' +
636
+ Blockly.JavaScript.prefixLines(statement, Blockly.JavaScript.INDENT) + '\n' +
735
637
  '});\n';
736
638
  };
737
639
 
@@ -785,11 +687,10 @@ Blockly.Blocks['get_value'] = {
785
687
  Blockly.JavaScript['get_value'] = function(block) {
786
688
  const oid = block.getFieldValue('OID');
787
689
  const attr = block.getFieldValue('ATTR');
788
-
789
- if (attr === 'type' || attr.startsWith('common.')) {
790
- return [`(await getObjectAsync('${oid}')).${attr}`, Blockly.JavaScript.ORDER_ATOMIC];
690
+ if (attr === 'type' || attr.indexOf('.') !== -1) {
691
+ return ['(await getObjectAsync("' + oid + '")).' + attr, Blockly.JavaScript.ORDER_ATOMIC];
791
692
  } else {
792
- return [`getState('${oid}').${attr}`, Blockly.JavaScript.ORDER_ATOMIC];
693
+ return ['getState("' + oid + '").' + attr, Blockly.JavaScript.ORDER_ATOMIC];
793
694
  }
794
695
  };
795
696
 
@@ -806,6 +707,7 @@ Blockly.System.blocks['get_value_var'] =
806
707
  + '</block>';
807
708
 
808
709
  Blockly.Blocks['get_value_var'] = {
710
+ // Checkbox.
809
711
  init: function() {
810
712
 
811
713
  this.appendDummyInput('ATTR')
@@ -845,11 +747,10 @@ Blockly.Blocks['get_value_var'] = {
845
747
  Blockly.JavaScript['get_value_var'] = function(block) {
846
748
  const oid = Blockly.JavaScript.valueToCode(block, 'OID', Blockly.JavaScript.ORDER_ATOMIC);
847
749
  const attr = block.getFieldValue('ATTR');
848
-
849
- if (attr === 'type' || attr.startsWith('common.')) {
850
- return [`(await getObjectAsync(${oid})).${attr}`, Blockly.JavaScript.ORDER_ATOMIC];
750
+ if (attr === 'type' || attr.startsWith('common.') || attr.startsWith('native.')) {
751
+ return ['(await getObjectAsync("' + oid + '")).' + attr, Blockly.JavaScript.ORDER_ATOMIC];
851
752
  } else {
852
- return [`getState(${oid}).${attr}`, Blockly.JavaScript.ORDER_ATOMIC];
753
+ return ['getState(' + oid + ').' + attr, Blockly.JavaScript.ORDER_ATOMIC];
853
754
  }
854
755
  };
855
756
 
@@ -865,6 +766,7 @@ Blockly.System.blocks['get_value_async'] =
865
766
  + '</block>';
866
767
 
867
768
  Blockly.Blocks['get_value_async'] = {
769
+ // Checkbox.
868
770
  init: function() {
869
771
 
870
772
  this.appendDummyInput('ATTR')
@@ -910,9 +812,8 @@ Blockly.JavaScript['get_value_async'] = function(block) {
910
812
  const oid = block.getFieldValue('OID');
911
813
  const attr = block.getFieldValue('ATTR');
912
814
  const statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
913
-
914
- if (attr === 'type' || attr.startsWith('common.')) {
915
- return `getObjectAsync('${oid}', async (err, obj) => {\n` +
815
+ if (attr === 'type' || attr.startsWith('common.') || attr.startsWith('native.')) {
816
+ return 'getObjectAsync("' + oid + '", async (err, obj) => {\n' +
916
817
  Blockly.JavaScript.prefixLines('let value = obj.' + attr + ';', Blockly.JavaScript.INDENT) + '\n' +
917
818
  statement + '\n' +
918
819
  '});\n';
@@ -948,8 +849,7 @@ Blockly.Blocks['field_oid'] = {
948
849
 
949
850
  Blockly.JavaScript['field_oid'] = function(block) {
950
851
  const oid = block.getFieldValue('oid');
951
-
952
- return [`'${oid}'`, Blockly.JavaScript.ORDER_ATOMIC];
852
+ return ['\'' + oid + '\'', Blockly.JavaScript.ORDER_ATOMIC];
953
853
  };
954
854
 
955
855
  // --- select OID meta--------------------------------------------------
@@ -976,8 +876,7 @@ Blockly.Blocks['field_oid_meta'] = {
976
876
 
977
877
  Blockly.JavaScript['field_oid_meta'] = function(block) {
978
878
  const oid = block.getFieldValue('oid');
979
-
980
- return [`'${oid}'`, Blockly.JavaScript.ORDER_ATOMIC];
879
+ return ['\'' + oid + '\'', Blockly.JavaScript.ORDER_ATOMIC];
981
880
  };
982
881
 
983
882
  // --- select OID script--------------------------------------------------
@@ -1004,8 +903,7 @@ Blockly.Blocks['field_oid_script'] = {
1004
903
 
1005
904
  Blockly.JavaScript['field_oid_script'] = function(block) {
1006
905
  const oid = block.getFieldValue('oid');
1007
-
1008
- return [`'${oid}'`, Blockly.JavaScript.ORDER_ATOMIC];
906
+ return ['\'' + oid + '\'', Blockly.JavaScript.ORDER_ATOMIC];
1009
907
  };
1010
908
 
1011
909
  // --- get attribute --------------------------------------------------
@@ -1026,6 +924,8 @@ Blockly.Blocks['get_attr'] = {
1026
924
  .setCheck(null)
1027
925
  .appendField(Blockly.Translate('get_attr_path'));
1028
926
 
927
+ // this.appendDummyInput()
928
+
1029
929
  this.appendValueInput('OBJECT')
1030
930
  .appendField(Blockly.Translate('get_attr_by'));
1031
931
 
@@ -1040,7 +940,6 @@ Blockly.Blocks['get_attr'] = {
1040
940
  Blockly.JavaScript['get_attr'] = function(block) {
1041
941
  const path = Blockly.JavaScript.valueToCode(block, 'PATH', Blockly.JavaScript.ORDER_ATOMIC);
1042
942
  const obj = Blockly.JavaScript.valueToCode(block, 'OBJECT', Blockly.JavaScript.ORDER_ATOMIC);
1043
-
1044
943
  return ['getAttr(' + obj + ', ' + path + ')', Blockly.JavaScript.ORDER_ATOMIC];
1045
944
  };
1046
945
 
@@ -1052,6 +951,7 @@ Blockly.System.blocks['regex'] =
1052
951
  + '</block>';
1053
952
 
1054
953
  Blockly.Blocks['regex'] = {
954
+ // Checkbox.
1055
955
  init: function() {
1056
956
  this.appendDummyInput()
1057
957
  .appendField('RegExp');
@@ -1068,8 +968,7 @@ Blockly.Blocks['regex'] = {
1068
968
 
1069
969
  Blockly.JavaScript['regex'] = function(block) {
1070
970
  const oid = block.getFieldValue('TEXT');
1071
-
1072
- return [`new RegExp('${oid}')`, Blockly.JavaScript.ORDER_ATOMIC];
971
+ return ['new RegExp("' + oid + '")', Blockly.JavaScript.ORDER_ATOMIC];
1073
972
  };
1074
973
 
1075
974
  // --- selector --------------------------------------------------
@@ -1080,6 +979,7 @@ Blockly.System.blocks['selector'] =
1080
979
  + '</block>';
1081
980
 
1082
981
  Blockly.Blocks['selector'] = {
982
+ // Checkbox.
1083
983
  init: function() {
1084
984
 
1085
985
  this.appendDummyInput()
@@ -1100,6 +1000,49 @@ Blockly.Blocks['selector'] = {
1100
1000
 
1101
1001
  Blockly.JavaScript['selector'] = function(block) {
1102
1002
  const oid = block.getFieldValue('TEXT');
1003
+ return ['Array.prototype.slice.apply($("' + oid + '"))', Blockly.JavaScript.ORDER_ATOMIC];
1004
+ };
1005
+
1006
+ // --- Text new line --------------------------------------------------
1007
+ Blockly.Blocks['text_newline'] = {
1008
+ // Checkbox.
1009
+ init: function() {
1010
+ this.appendDummyInput()
1011
+ .appendField(Blockly.Translate('text_newline'));
1012
+
1013
+ this.appendDummyInput()
1014
+ .appendField(new Blockly.FieldDropdown([['\\n', '\\n'], ['\\r\\n', '\\r\\n'], ['\\r', '\\r']]), 'Type');
1015
+ this.setInputsInline(true);
1016
+ this.setColour(Blockly.Msg['TEXTS_HUE']);
1017
+ this.setOutput(true, 'String');
1018
+ this.setTooltip(Blockly.Translate('text_newline_tooltip'));
1019
+ }
1020
+ };
1021
+
1022
+ Blockly.JavaScript['text_newline'] = function(block) {
1023
+ const dropdown_type = block.getFieldValue('Type');
1024
+ return ['\'' + dropdown_type + '\'', Blockly.JavaScript.ORDER_ATOMIC];
1025
+ };
1026
+
1027
+ // --- Round Number to n decimal places -------------------------------
1028
+ Blockly.Blocks['math_rndfixed'] = {
1029
+ init: function() {
1030
+ this.appendValueInput('x')
1031
+ .setCheck('Number')
1032
+ .appendField(Blockly.Translate('math_rndfixed_round'));
1033
+ this.appendDummyInput()
1034
+ .appendField(Blockly.Translate('math_rndfixed_to'))
1035
+ .appendField(new Blockly.FieldNumber(0, 1, 25), 'n')
1036
+ .appendField(Blockly.Translate('math_rndfixed_decplcs'));
1037
+ this.setInputsInline(true);
1038
+ this.setColour(Blockly.Msg['MATH_HUE']);
1039
+ this.setOutput(true, 'Number');
1040
+ this.setTooltip(Blockly.Translate('math_rndfixed_tooltip'));
1041
+ }
1042
+ };
1103
1043
 
1104
- return [`Array.prototype.slice.apply($('${oid}'))`, Blockly.JavaScript.ORDER_ATOMIC];
1044
+ Blockly.JavaScript['math_rndfixed'] = function(block) {
1045
+ const x = Blockly.JavaScript.valueToCode(block, 'x', Blockly.JavaScript.ORDER_ATOMIC);
1046
+ const exp = Math.pow(10, block.getFieldValue('n'));
1047
+ return ['Math.round(' + x + '*' + exp + ')/' + exp, Blockly.JavaScript.ORDER_ATOMIC];
1105
1048
  };