iobroker.javascript 10.0.0 → 10.1.1

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 (180) hide show
  1. package/README.md +48 -12
  2. package/admin/assets/AiChatPanel-C_WbKMGX.js +242 -0
  3. package/admin/assets/AiDiffView-BtXbDWZ8.js +1 -0
  4. package/admin/assets/Debugger-DAdJnEhw.js +15 -0
  5. package/admin/assets/Error-DQ1pzKcf.js +1 -0
  6. package/admin/assets/Import-BjMtH6Gk.js +1 -0
  7. package/admin/assets/RulesEditor-dDRPHw4X.js +1 -0
  8. package/admin/assets/RulesEditor-k-DMHotH.css +1 -0
  9. package/admin/assets/{ScriptEditor-BGIuoNei.js → ScriptEditor-CZSc7rwE.js} +2 -2
  10. package/admin/assets/ScriptEditorVanillaMonaco-DEKg14_A.js +3 -0
  11. package/admin/assets/_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-DPmwd_G2.js +1 -0
  12. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-C8inUeKt.js +1243 -0
  13. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-VcQjt7_9.js +9 -0
  14. package/admin/assets/aiPromptBuilder-D5FDo74i.js +1 -0
  15. package/admin/assets/blockly-DBw-ytY1.js +1047 -0
  16. package/admin/assets/blocks_action-BqfWEwpf.js +1 -0
  17. package/admin/assets/blocks_convert-CX0i-JfS.js +3 -0
  18. package/admin/assets/blocks_logic-D-QSzw95.js +1 -0
  19. package/admin/assets/blocks_number-D7JuNYsw.js +1 -0
  20. package/admin/assets/blocks_object-C9DzAlc7.js +1 -0
  21. package/admin/assets/blocks_procedures-BJMz6HWW.js +3 -0
  22. package/admin/assets/blocks_sendto-DRh7lk9o.js +5 -0
  23. package/admin/assets/blocks_switch-BfmboMex.js +2 -0
  24. package/admin/assets/blocks_system-B-78JfAc.js +1 -0
  25. package/admin/assets/blocks_text-CGbR0Ozw.js +1 -0
  26. package/admin/assets/blocks_time-5vS2geJg.js +1 -0
  27. package/admin/assets/blocks_timeout-BdaTywfN.js +1 -0
  28. package/admin/assets/blocks_trigger-D8kgHKbg.js +2 -0
  29. package/admin/assets/blocks_words-BhHIf_1o.js +1 -0
  30. package/admin/assets/{cronHoverProvider-pKJkSevo.js → cronHoverProvider-DpgESCox.js} +1 -1
  31. package/admin/assets/dist-CaOsN0XW.js +4 -0
  32. package/admin/assets/field_cron-B40zwSfJ.js +1 -0
  33. package/admin/assets/field_oid-KfoBnEM9.js +1 -0
  34. package/admin/assets/field_script-yXhe1iCp.js +1 -0
  35. package/admin/assets/helpers-B0ByElPJ.js +1 -0
  36. package/admin/assets/hostInit-9REPDUe7.js +1 -0
  37. package/admin/assets/index-07o_WKsX.js +726 -0
  38. package/admin/assets/index-Z8Hkv58g.css +1 -0
  39. package/admin/assets/{inlineChatWidget-ZaisTOLh.js → inlineChatWidget-B9y_gQcH.js} +2 -2
  40. package/admin/assets/{inlineDiffController-hTwHHqcc.js → inlineDiffController-C07CdIFo.js} +2 -2
  41. package/admin/assets/{mf-entry-bootstrap-0-d6052b31.js → mf-entry-bootstrap-0-efcb49d3.js} +7 -2
  42. package/admin/assets/stateHoverProvider-CqeoOjXs.js +9 -0
  43. package/admin/assets/{virtualExposes-Ed0lGq7k.js → virtualExposes-DgGB-18P.js} +1 -1
  44. package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-BwSvIKEV.js +1 -0
  45. package/admin/assets/virtual_mf-exposes___mfe_internal__iobroker_javascript__remoteEntry_js-ChiJXsfH.js +1 -0
  46. package/admin/custom/assets/Components-BCQTjBgm.js +1 -0
  47. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-BuAc8OyX.js +1 -0
  48. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BGJv4zZP.js +1 -0
  49. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-CGb5Cofy.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-B4E6MFJ4.js} +1 -1
  50. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-BVCIAgbo.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-aRlxyEhq.js} +78 -78
  51. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DQwzYx75.js +1494 -0
  52. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__leaflet__loadShare__.js-h-rCw3iz.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__leaflet__loadShare__.js-n2zIPi0L.js} +1 -1
  53. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-xxszBNje.js +9 -0
  54. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__date_mf_2_fns__prebuild__-Cb5TR7FB.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__date_mf_2_fns__prebuild__-Tq7tesSS.js} +1 -1
  55. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__leaflet__prebuild__-DARUoA03.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__leaflet__prebuild__-BeF0jEWM.js} +1 -1
  56. package/admin/custom/assets/hostInit-CHwrowP4.js +1 -0
  57. package/admin/custom/assets/{index-uEKAoVT7.js → index-Cm6xl9K4.js} +1 -1
  58. package/admin/custom/assets/{lib-Yj8cfN0A.js → lib-bhrFL6jR.js} +1 -1
  59. package/admin/custom/assets/{mf-entry-bootstrap-0-77793feb.js → mf-entry-bootstrap-0-f08941e2.js} +7 -2
  60. package/admin/custom/assets/{setYear-DJ9FbdkO.js → setYear-DzTZ2h9A.js} +1 -1
  61. package/admin/custom/assets/virtualExposes-B5LJmnfO.js +1 -0
  62. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-ML-chjs6.js +1 -0
  63. package/admin/custom/assets/virtual_mf-exposes___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-C3ImybiM.js +2 -0
  64. package/admin/custom/customComponents.js +12 -1
  65. package/admin/custom/i18n/de.json +11 -1
  66. package/admin/custom/i18n/en.json +11 -1
  67. package/admin/custom/i18n/es.json +11 -1
  68. package/admin/custom/i18n/fr.json +11 -1
  69. package/admin/custom/i18n/it.json +11 -1
  70. package/admin/custom/i18n/nl.json +11 -1
  71. package/admin/custom/i18n/pl.json +11 -1
  72. package/admin/custom/i18n/pt.json +11 -1
  73. package/admin/custom/i18n/ru.json +11 -1
  74. package/admin/custom/i18n/uk.json +11 -1
  75. package/admin/custom/i18n/zh-cn.json +11 -1
  76. package/admin/google-blockly/VERSION +1 -0
  77. package/admin/google-blockly/media/drop.mp3 +0 -0
  78. package/admin/google-blockly/msg/js/de.js +332 -56
  79. package/admin/google-blockly/msg/js/en.js +319 -43
  80. package/admin/google-blockly/msg/js/es.js +319 -42
  81. package/admin/google-blockly/msg/js/fr.js +315 -39
  82. package/admin/google-blockly/msg/js/it.js +327 -51
  83. package/admin/google-blockly/msg/js/nl.js +376 -100
  84. package/admin/google-blockly/msg/js/pl.js +318 -42
  85. package/admin/google-blockly/msg/js/pt.js +318 -42
  86. package/admin/google-blockly/msg/js/ru.js +320 -44
  87. package/admin/google-blockly/msg/js/uk.js +326 -50
  88. package/admin/google-blockly/msg/js/zh-cn.js +322 -46
  89. package/admin/i18n/de.json +51 -26
  90. package/admin/i18n/en.json +50 -25
  91. package/admin/i18n/es.json +51 -18
  92. package/admin/i18n/fr.json +50 -17
  93. package/admin/i18n/it.json +50 -17
  94. package/admin/i18n/nl.json +50 -17
  95. package/admin/i18n/pl.json +51 -18
  96. package/admin/i18n/pt.json +50 -17
  97. package/admin/i18n/ru.json +50 -17
  98. package/admin/i18n/uk.json +50 -17
  99. package/admin/i18n/zh-cn.json +50 -17
  100. package/admin/jsonConfig.json +398 -0
  101. package/admin/mf-manifest.json +1 -1
  102. package/admin/mf-stats.json +1 -1
  103. package/admin/remoteEntry.js +12 -1
  104. package/admin/tab.html +6 -98
  105. package/build/lib/javascript.d.ts +48 -0
  106. package/build/lib/mirror.js +9 -0
  107. package/build/lib/mirror.js.map +1 -1
  108. package/build/lib/sandbox.js +37 -0
  109. package/build/lib/sandbox.js.map +1 -1
  110. package/build/lib/secrets.js +220 -0
  111. package/build/lib/secrets.js.map +1 -0
  112. package/build/lib/typescriptSettings.js +112 -2
  113. package/build/lib/typescriptSettings.js.map +1 -1
  114. package/build/lib/typescriptTools.js +168 -43
  115. package/build/lib/typescriptTools.js.map +1 -1
  116. package/build/main.js +61 -5
  117. package/build/main.js.map +1 -1
  118. package/build/types.d.ts +48 -0
  119. package/docs/en/blockly.md +29 -0
  120. package/docs/en/javascript.md +72 -0
  121. package/docs/en/upgrade-guide.md +3 -0
  122. package/io-package.json +59 -28
  123. package/package.json +8 -3
  124. package/admin/assets/AiChatPanel-p0KAg6Cs.js +0 -237
  125. package/admin/assets/AiDiffView-BPTLnNx1.js +0 -1
  126. package/admin/assets/AiScriptAnalyzer--BHML2rN.js +0 -9
  127. package/admin/assets/BlocklyEditor-CAjVMhYT.js +0 -81
  128. package/admin/assets/ContextWrapper-BVc8wTK_.css +0 -1
  129. package/admin/assets/ContextWrapper-D9CrnNKs.js +0 -127
  130. package/admin/assets/Debugger-SjROokFI.js +0 -15
  131. package/admin/assets/Error-DDfrxAt2.js +0 -1
  132. package/admin/assets/Import-DpTg1Jow.js +0 -1
  133. package/admin/assets/RulesEditor-BSRFWpEm.css +0 -1
  134. package/admin/assets/RulesEditor-D0hgrcBc.js +0 -1
  135. package/admin/assets/ScriptEditorVanillaMonaco-DyMQtoTQ.js +0 -3
  136. package/admin/assets/_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-DWJotR1B.js +0 -1
  137. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-CxICLr5Z.js +0 -1243
  138. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-BBAXJaqI.js +0 -9
  139. package/admin/assets/aiCodeLensProvider-hyAmut0e.js +0 -4
  140. package/admin/assets/aiPromptBuilder-Bs27qOHT.js +0 -7
  141. package/admin/assets/blocklyDarkTheme-DEiAX5DT.js +0 -1
  142. package/admin/assets/dist-uw5orDgd.js +0 -4
  143. package/admin/assets/hostInit-BFg5u9hY.js +0 -1
  144. package/admin/assets/index-B1gICjdq.js +0 -192
  145. package/admin/assets/index-BHhhebRG.css +0 -1
  146. package/admin/assets/mjs-DWqivHEk.js +0 -90
  147. package/admin/assets/stateHoverProvider-C7DawIs-.js +0 -9
  148. package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-BYs71IQF.js +0 -1
  149. package/admin/assets/virtual_mf-exposes___mfe_internal__iobroker_javascript__remoteEntry_js-DnnXQRkG.js +0 -1
  150. package/admin/custom/assets/Components-BrDyDHXh.js +0 -1
  151. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-CyYJM2-v.js +0 -1
  152. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BdzCssLn.js +0 -1
  153. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-BkB0anQX.js +0 -1494
  154. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-BotqDuw-.js +0 -9
  155. package/admin/custom/assets/hostInit-DJx2uXXy.js +0 -1
  156. package/admin/custom/assets/virtualExposes-CxDjLoYu.js +0 -1
  157. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-BU-ugy_7.js +0 -1
  158. package/admin/custom/assets/virtual_mf-exposes-ssr___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-BEfZbrf7.js +0 -2
  159. package/admin/custom/assets/virtual_mf-exposes___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-CTeZ0Jpm.js +0 -2
  160. package/admin/google-blockly/blockly_compressed.js +0 -1679
  161. package/admin/google-blockly/blocks_compressed.js +0 -193
  162. package/admin/google-blockly/javascript_compressed.js +0 -264
  163. package/admin/google-blockly/msg/messages.js +0 -1630
  164. package/admin/google-blockly/own/blocks_action.js +0 -765
  165. package/admin/google-blockly/own/blocks_convert.js +0 -480
  166. package/admin/google-blockly/own/blocks_logic.js +0 -459
  167. package/admin/google-blockly/own/blocks_number.js +0 -30
  168. package/admin/google-blockly/own/blocks_object.js +0 -402
  169. package/admin/google-blockly/own/blocks_procedures.js +0 -688
  170. package/admin/google-blockly/own/blocks_sendto.js +0 -702
  171. package/admin/google-blockly/own/blocks_switch.js +0 -257
  172. package/admin/google-blockly/own/blocks_system.js +0 -1409
  173. package/admin/google-blockly/own/blocks_text.js +0 -104
  174. package/admin/google-blockly/own/blocks_time.js +0 -639
  175. package/admin/google-blockly/own/blocks_timeout.js +0 -551
  176. package/admin/google-blockly/own/blocks_trigger.js +0 -1791
  177. package/admin/google-blockly/own/blocks_words.js +0 -708
  178. package/admin/google-blockly/own/field_cron.js +0 -158
  179. package/admin/google-blockly/own/field_oid.js +0 -642
  180. package/admin/google-blockly/own/field_script.js +0 -159
@@ -1,1409 +0,0 @@
1
- 'use strict';
2
-
3
- if (typeof goog !== 'undefined') {
4
- goog.provide('Blockly.JavaScript.System');
5
- goog.require('Blockly.JavaScript');
6
- }
7
-
8
- Blockly.CustomBlocks = Blockly.CustomBlocks || [];
9
- Blockly.CustomBlocks.push('System');
10
-
11
- Blockly.System = {
12
- HUE: 210,
13
- blocks: {},
14
- WARNING_PARENTS: [
15
- 'on_ext',
16
- ],
17
- };
18
-
19
- // --- global_var -----------------------------------------------------------
20
- Blockly.System.blocks['global_var'] =
21
- '<block type="global_var">' +
22
- ' <field name="VAR">scriptName</field>' +
23
- '</block>';
24
-
25
- Blockly.Blocks['global_var'] = {
26
- /**
27
- * Block for conditionally returning a value from a procedure.
28
- * @this Blockly.Block
29
- */
30
- init: function () {
31
- this.appendDummyInput('VAR')
32
- .appendField(new Blockly.FieldDropdown([
33
- [Blockly.Translate('global_var_scriptname'), 'scriptName'],
34
- [Blockly.Translate('global_var_defaultdatadir'), 'defaultDataDir'],
35
- [Blockly.Translate('global_var_verbose'), 'verbose'],
36
- ]), 'VAR');
37
-
38
- this.setInputsInline(true);
39
- this.setOutput(true);
40
-
41
- this.setColour(Blockly.System.HUE);
42
-
43
- this.setTooltip(Blockly.Translate('global_var_tooltip'));
44
- this.setHelpUrl(getHelp('global_var'));
45
- },
46
- };
47
- Blockly.JavaScript.forBlock['global_var'] = function (block) {
48
- const variable = block.getFieldValue('VAR');
49
-
50
- return [variable, Blockly.JavaScript.ORDER_ATOMIC];
51
- };
52
-
53
- // --- Debug output --------------------------------------------------
54
- Blockly.System.blocks['debug'] =
55
- '<block type="debug">' +
56
- ' <field name="Severity">info</field>' +
57
- ' <value name="TEXT">' +
58
- ' <shadow type="text">' +
59
- ' <field name="TEXT">test</field>' +
60
- ' </shadow>' +
61
- ' </value>' +
62
- '</block>';
63
-
64
- Blockly.Blocks['debug'] = {
65
- init: function () {
66
- this.appendValueInput('TEXT')
67
- .setCheck(null)
68
- .appendField(Blockly.Translate('debug'));
69
-
70
- this.appendDummyInput('Severity')
71
- .appendField(new Blockly.FieldDropdown([
72
- [Blockly.Translate('loglevel_debug'), 'debug'],
73
- [Blockly.Translate('loglevel_info'), 'info'],
74
- [Blockly.Translate('loglevel_warn'), 'warn'],
75
- [Blockly.Translate('loglevel_error'), 'error'],
76
- ]), 'Severity');
77
-
78
- this.setInputsInline(false);
79
- this.setPreviousStatement(true, null);
80
- this.setNextStatement(true, null);
81
-
82
- this.setColour(Blockly.System.HUE);
83
-
84
- this.setTooltip(Blockly.Translate('debug_tooltip'));
85
- this.setHelpUrl(getHelp('debug_help'));
86
- },
87
- };
88
-
89
- Blockly.JavaScript.forBlock['debug'] = function (block) {
90
- const vText = Blockly.JavaScript.valueToCode(block, 'TEXT', Blockly.JavaScript.ORDER_ATOMIC);
91
- const fSeverity = block.getFieldValue('Severity');
92
-
93
- return `console.${fSeverity}(${vText});\n`;
94
- };
95
-
96
- // --- comment --------------------------------------------------
97
- Blockly.System.blocks['comment'] =
98
- '<block type="comment">' +
99
- '</block>';
100
-
101
- Blockly.Blocks['comment'] = {
102
- init: function () {
103
- this.appendDummyInput('COMMENT')
104
- .appendField(new Blockly.FieldMultilineInput(Blockly.Translate('comment')), 'COMMENT');
105
-
106
- this.setInputsInline(false);
107
- this.setPreviousStatement(true, null);
108
- this.setNextStatement(true, null);
109
-
110
- this.setColour('#FFFF00');
111
-
112
- this.setTooltip(Blockly.Translate('comment_tooltip'));
113
- },
114
- };
115
-
116
- Blockly.JavaScript.forBlock['comment'] = function (block) {
117
- const fComment = block.getFieldValue('COMMENT');
118
-
119
- return Blockly.JavaScript.prefixLines(fComment, '// ') + '\n';
120
- };
121
-
122
- // --- control -----------------------------------------------------------
123
- Blockly.System.blocks['control'] =
124
- '<block type="control">' +
125
- ' <mutation delay_input="false"></mutation>' +
126
- ' <field name="WITH_DELAY">FALSE</field>' +
127
- '</block>';
128
-
129
- Blockly.Blocks['control'] = {
130
- init: function () {
131
- this.appendDummyInput()
132
- .appendField(Blockly.Translate('control'));
133
-
134
- this.appendDummyInput('OID')
135
- .appendField(new Blockly.FieldOID(Blockly.Translate('select_id'), 'state'), 'OID');
136
-
137
- this.appendValueInput('VALUE')
138
- .setCheck(null)
139
- .appendField(Blockly.Translate('control_with'));
140
-
141
- this.appendDummyInput('WITH_DELAY')
142
- .appendField(Blockly.Translate('control_delay'))
143
- .appendField(new Blockly.FieldCheckbox('FALSE', function(option) {
144
- this.sourceBlock_.updateShape_(option === true || option === 'true' || option === 'TRUE');
145
- }), 'WITH_DELAY');
146
-
147
- this.setInputsInline(true);
148
- this.setPreviousStatement(true, null);
149
- this.setNextStatement(true, null);
150
-
151
- this.setColour(Blockly.System.HUE);
152
-
153
- this.setTooltip(Blockly.Translate('control_tooltip'));
154
- this.setHelpUrl(getHelp('control_help'));
155
- },
156
- mutationToDom: function () {
157
- const container = document.createElement('mutation');
158
- const option = this.getFieldValue('WITH_DELAY');
159
-
160
- container.setAttribute('delay_input', option === true || option === 'true' || option === 'TRUE');
161
-
162
- return container;
163
- },
164
- domToMutation: function (xmlElement) {
165
- const option = xmlElement.getAttribute('delay_input');
166
- this.updateShape_(option === true || option === 'true' || option === 'TRUE');
167
- },
168
- updateShape_: function (delayInput) {
169
- // Add or remove a delay Input.
170
- let inputExists;
171
- try {
172
- inputExists = this.getInput('DELAY');
173
- } catch (e) {
174
- // ignore
175
- }
176
-
177
- if (delayInput) {
178
- if (!inputExists) {
179
- this.appendDummyInput('DELAY')
180
- .appendField(' ')
181
- .appendField(new Blockly.FieldTextInput('1000'), 'DELAY_MS')
182
- .appendField(new Blockly.FieldDropdown([
183
- [Blockly.Translate('control_ms'), 'ms'],
184
- [Blockly.Translate('control_sec'), 'sec'],
185
- [Blockly.Translate('control_min'), 'min'],
186
- ]), 'UNIT');
187
- }
188
- } else if (inputExists) {
189
- this.removeInput('DELAY');
190
- }
191
-
192
- try {
193
- inputExists = this.getInput('CLEAR_RUNNING_INPUT');
194
- } catch (e) {
195
- inputExists = null;
196
- }
197
-
198
- if (delayInput) {
199
- if (!inputExists) {
200
- this.appendDummyInput('CLEAR_RUNNING_INPUT')
201
- .appendField(Blockly.Translate('control_clear_running'))
202
- .appendField(new Blockly.FieldCheckbox(), 'CLEAR_RUNNING');
203
- }
204
- } else if (inputExists) {
205
- this.removeInput('CLEAR_RUNNING_INPUT');
206
- }
207
- },
208
- };
209
-
210
- Blockly.JavaScript.forBlock['control'] = function (block) {
211
- const fObjId = block.getFieldValue('OID');
212
-
213
- Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value';
214
-
215
- let fDelayMs = parseInt(block.getFieldValue('DELAY_MS'), 10);
216
- const fUnit = block.getFieldValue('UNIT');
217
- if (fUnit === 'min') {
218
- fDelayMs *= 60000;
219
- } else if (fUnit === 'sec') {
220
- fDelayMs *= 1000;
221
- }
222
-
223
- let fClearRunning = block.getFieldValue('CLEAR_RUNNING');
224
- fClearRunning = fClearRunning === 'TRUE' || fClearRunning === 'true' || fClearRunning === true;
225
-
226
- const vValue = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
227
- const fWithDelay = this.getFieldValue('WITH_DELAY');
228
-
229
- let objectName = main.objects[fObjId] && main.objects[fObjId].common && main.objects[fObjId].common.name ? main.objects[fObjId].common.name : '';
230
- if (typeof objectName === 'object') {
231
- objectName = objectName[systemLang] || objectName.en;
232
- }
233
-
234
- let code;
235
- if (fWithDelay === 'true' || fWithDelay === true || fWithDelay === 'TRUE') {
236
- code = `setStateDelayed('${fObjId}'${objectName ? ` /* ${objectName} */` : ''}, ${vValue}, ${fDelayMs}, ${fClearRunning});\n`;
237
- } else {
238
- code = `setState('${fObjId}'${objectName ? ` /* ${objectName} */` : ''}, ${vValue});\n`;
239
- }
240
-
241
- return code;
242
- };
243
-
244
- // --- toggle -----------------------------------------------------------
245
- Blockly.System.blocks['toggle'] =
246
- '<sep gap="5"></sep>' +
247
- '<block type="toggle">' +
248
- ' <mutation delay_input="false"></mutation>' +
249
- ' <field name="WITH_DELAY">FALSE</field>' +
250
- '</block>';
251
-
252
- Blockly.Blocks['toggle'] = {
253
- init: function () {
254
- this.appendDummyInput()
255
- .appendField(Blockly.Translate('toggle'));
256
-
257
- this.appendDummyInput('OID')
258
- .appendField(new Blockly.FieldOID(Blockly.Translate('select_id'), 'state'), 'OID');
259
-
260
- this.appendDummyInput('WITH_DELAY')
261
- .appendField(Blockly.Translate('toggle_delay'))
262
- .appendField(new Blockly.FieldCheckbox('FALSE', function(option) {
263
- this.sourceBlock_.updateShape_(option === true || option === 'true' || option === 'TRUE');
264
- }), 'WITH_DELAY');
265
-
266
- this.setInputsInline(true);
267
- this.setPreviousStatement(true, null);
268
- this.setNextStatement(true, null);
269
-
270
- this.setColour(Blockly.System.HUE);
271
-
272
- this.setTooltip(Blockly.Translate('toggle_tooltip'));
273
- this.setHelpUrl(getHelp('toggle_help'));
274
- },
275
- mutationToDom: function () {
276
- const container = document.createElement('mutation');
277
- const option = this.getFieldValue('WITH_DELAY');
278
-
279
- container.setAttribute('delay_input', option === true || option === 'true' || option === 'TRUE');
280
-
281
- return container;
282
- },
283
- domToMutation: function (xmlElement) {
284
- const option = xmlElement.getAttribute('delay_input');
285
- this.updateShape_(option === true || option === 'true' || option === 'TRUE');
286
- },
287
- updateShape_: function (delayInput) {
288
- // Add or remove a delay Input.
289
- let inputExists;
290
- try {
291
- inputExists = this.getInput('DELAY');
292
- } catch (e) {
293
- inputExists = null;
294
- }
295
-
296
- if (delayInput) {
297
- if (!inputExists) {
298
- this.appendDummyInput('DELAY')
299
- .appendField(' ')
300
- .appendField(new Blockly.FieldTextInput('1000'), 'DELAY_MS')
301
- .appendField(new Blockly.FieldDropdown([
302
- [Blockly.Translate('control_ms'), 'ms'],
303
- [Blockly.Translate('control_sec'), 'sec'],
304
- [Blockly.Translate('control_min'), 'min'],
305
- ]), 'UNIT');
306
- //.appendField(Blockly.Translate('toggle_ms'));
307
- }
308
- } else if (inputExists) {
309
- this.removeInput('DELAY');
310
- }
311
-
312
- try {
313
- inputExists = this.getInput('CLEAR_RUNNING_INPUT');
314
- } catch (e) {
315
- inputExists = null;
316
- }
317
-
318
- if (delayInput) {
319
- if (!inputExists) {
320
- this.appendDummyInput('CLEAR_RUNNING_INPUT')
321
- .appendField(Blockly.Translate('toggle_clear_running'))
322
- .appendField(new Blockly.FieldCheckbox(), 'CLEAR_RUNNING');
323
- }
324
- } else if (inputExists) {
325
- this.removeInput('CLEAR_RUNNING_INPUT');
326
- }
327
- },
328
- };
329
-
330
- Blockly.JavaScript.forBlock['toggle'] = function (block) {
331
- const fObjId = block.getFieldValue('OID');
332
- const fUnit = block.getFieldValue('UNIT');
333
-
334
- Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value';
335
-
336
- let fDelayMs = parseInt(block.getFieldValue('DELAY_MS'), 10);
337
- if (fUnit === 'min') {
338
- fDelayMs *= 60000;
339
- } else if (fUnit === 'sec') {
340
- fDelayMs *= 1000;
341
- }
342
-
343
- const objectType = main.objects[fObjId] && main.objects[fObjId].common && main.objects[fObjId].common.type ? main.objects[fObjId].common.type : 'boolean';
344
- let objectName = main.objects[fObjId] && main.objects[fObjId].common && main.objects[fObjId].common.name ? main.objects[fObjId].common.name : '';
345
- if (typeof objectName === 'object') {
346
- objectName = objectName[systemLang] || objectName.en;
347
- }
348
-
349
- let fClearRunning = block.getFieldValue('CLEAR_RUNNING');
350
- fClearRunning = fClearRunning === 'TRUE' || fClearRunning === 'true' || fClearRunning === true;
351
-
352
- let setCommand;
353
- if (objectType === 'number') {
354
- let max = 100;
355
- let min = 0;
356
-
357
- if (main.objects[fObjId].common.max !== undefined) {
358
- max = parseFloat(main.objects[fObjId].common.max);
359
- }
360
- if (main.objects[fObjId].common.min !== undefined) {
361
- min = parseFloat(main.objects[fObjId].common.min);
362
- }
363
-
364
- setCommand = `setState('${fObjId}'${objectName ? ` /* ${objectName} */` : ''}, state ? (state.val === ${min} ? ${max} : ${min}) : ${max});`;
365
- } else {
366
- setCommand = `setState('${fObjId}'${objectName ? ` /* ${objectName} */` : ''}, state ? !state.val : true);`;
367
- }
368
-
369
- const fWithDelay = block.getFieldValue('WITH_DELAY');
370
-
371
- let code;
372
- if (fWithDelay === 'TRUE' || fWithDelay === 'true' || fWithDelay === true) {
373
- code = `getState('${fObjId}', (err, state) => {\n` +
374
- Blockly.JavaScript.prefixLines(`setStateDelayed('${fObjId}'${objectName ? ` /* ${objectName} */` : ''}, state ? !state.val : true, ${fDelayMs}, ${fClearRunning});`, Blockly.JavaScript.INDENT) + '\n' +
375
- '});\n';
376
- } else {
377
- code = `getState('${fObjId}', (err, state) => {\n` +
378
- Blockly.JavaScript.prefixLines(setCommand, Blockly.JavaScript.INDENT) + '\n' +
379
- '});\n';
380
- }
381
-
382
- return code;
383
- };
384
-
385
- // --- update -----------------------------------------------------------
386
- Blockly.System.blocks['update'] =
387
- '<sep gap="5"></sep>' +
388
- '<block type="update">' +
389
- ' <mutation delay_input="false"></mutation>' +
390
- ' <field name="WITH_DELAY">FALSE</field>' +
391
- '</block>';
392
-
393
- Blockly.Blocks['update'] = {
394
- init: function () {
395
- this.appendDummyInput()
396
- .appendField(Blockly.Translate('update'));
397
-
398
- this.appendDummyInput('OID')
399
- .appendField(new Blockly.FieldOID(Blockly.Translate('select_id'), 'state'), 'OID');
400
-
401
- this.appendValueInput('VALUE')
402
- .setCheck(null)
403
- .appendField(Blockly.Translate('update_with'));
404
-
405
- this.appendDummyInput('WITH_DELAY')
406
- .appendField(Blockly.Translate('update_delay'))
407
- .appendField(new Blockly.FieldCheckbox('FALSE', function(option) {
408
- this.sourceBlock_.updateShape_(option === true || option === 'true' || option === 'TRUE');
409
- }), 'WITH_DELAY');
410
-
411
- this.setInputsInline(true);
412
- this.setPreviousStatement(true, null);
413
- this.setNextStatement(true, null);
414
-
415
- this.setColour(Blockly.System.HUE);
416
-
417
- this.setTooltip(Blockly.Translate('update_tooltip'));
418
- this.setHelpUrl(getHelp('update_help'));
419
- },
420
- mutationToDom: function () {
421
- const container = document.createElement('mutation');
422
- const option = this.getFieldValue('WITH_DELAY');
423
-
424
- container.setAttribute('delay_input', option === true || option === 'true' || option === 'TRUE');
425
-
426
- return container;
427
- },
428
- domToMutation: function (xmlElement) {
429
- const option = xmlElement.getAttribute('delay_input');
430
- this.updateShape_(option === true || option === 'true' || option === 'TRUE');
431
- },
432
- updateShape_: function (delayInput) {
433
- // Add or remove a delay Input.
434
- let inputExists;
435
- try {
436
- inputExists = this.getInput('DELAY');
437
- } catch (e){
438
- inputExists = null;
439
- }
440
-
441
- if (delayInput) {
442
- if (!inputExists) {
443
- this.appendDummyInput('DELAY')
444
- .appendField(' ')
445
- .appendField(new Blockly.FieldTextInput('1000'), 'DELAY_MS')
446
- .appendField(new Blockly.FieldDropdown([
447
- [Blockly.Translate('control_ms'), 'ms'],
448
- [Blockly.Translate('control_sec'), 'sec'],
449
- [Blockly.Translate('control_min'), 'min'],
450
- ]), 'UNIT');
451
- //.appendField(Blockly.Translate('update_ms'));
452
- }
453
- } else if (inputExists) {
454
- this.removeInput('DELAY');
455
- }
456
-
457
- try {
458
- inputExists = this.getInput('CLEAR_RUNNING_INPUT');
459
- } catch (e) {
460
- inputExists = null;
461
- }
462
-
463
- if (delayInput) {
464
- if (!inputExists) {
465
- this.appendDummyInput('CLEAR_RUNNING_INPUT')
466
- .appendField(Blockly.Translate('control_clear_running'))
467
- .appendField(new Blockly.FieldCheckbox(), 'CLEAR_RUNNING');
468
- }
469
- } else if (inputExists) {
470
- this.removeInput('CLEAR_RUNNING_INPUT');
471
- }
472
- },
473
- };
474
-
475
- Blockly.JavaScript.forBlock['update'] = function (block) {
476
- const fObjId = block.getFieldValue('OID');
477
-
478
- Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value';
479
-
480
- const vValue = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
481
- const fUnit = block.getFieldValue('UNIT');
482
-
483
- let fDelay = parseInt(block.getFieldValue('DELAY_MS'), 10);
484
- if (fUnit === 'min') {
485
- fDelay *= 60000;
486
- } else if (fUnit === 'sec') {
487
- fDelay *= 1000;
488
- }
489
-
490
- let fClearRunning = block.getFieldValue('CLEAR_RUNNING');
491
- fClearRunning = fClearRunning === 'TRUE' || fClearRunning === 'true' || fClearRunning === true;
492
-
493
- const fWithDelay = this.getFieldValue('WITH_DELAY');
494
-
495
- let objectName = main.objects[fObjId] && main.objects[fObjId].common && main.objects[fObjId].common.name ? main.objects[fObjId].common.name : '';
496
- if (typeof objectName === 'object') {
497
- objectName = objectName[systemLang] || objectName.en;
498
- }
499
-
500
- if (fWithDelay === true || fWithDelay === 'true' || fWithDelay === 'TRUE') {
501
- return `setStateDelayed('${fObjId}'${objectName ? ` /* ${objectName} */` : ''}, ${vValue}, true, ${fDelay}, ${fClearRunning});\n`;
502
- }
503
-
504
- return `setState('${fObjId}'${objectName ? ` /* ${objectName} */` : ''}, ${vValue}, true);\n`;
505
- };
506
-
507
- // --- control ex -----------------------------------------------------------
508
- Blockly.System.blocks['control_ex'] =
509
- '<sep gap="5"></sep>' +
510
- '<block type="control_ex">' +
511
- ' <field name="TYPE">false</field>' +
512
- ' <field name="CLEAR_RUNNING">FALSE</field>' +
513
- ' <value name="OID">' +
514
- ' <shadow type="field_oid">' +
515
- ' </shadow>' +
516
- ' </value>' +
517
- ' <value name="VALUE">' +
518
- ' <shadow type="logic_boolean">' +
519
- ' <field name="BOOL">TRUE</field>' +
520
- ' </shadow>' +
521
- ' </value>' +
522
- ' <value name="DELAY_MS">' +
523
- ' <shadow type="math_number">' +
524
- ' <field name="NUM">0</field>' +
525
- ' </shadow>' +
526
- ' </value>' +
527
- ' <value name="EXPIRE">' +
528
- ' <shadow type="math_number">' +
529
- ' <field name="NUM">0</field>' +
530
- ' </shadow>' +
531
- ' </value>' +
532
- '</block>';
533
-
534
- Blockly.Blocks['control_ex'] = {
535
- init: function () {
536
- this.appendDummyInput()
537
- .appendField(Blockly.Translate('control_ex'));
538
-
539
- this.appendValueInput('OID')
540
- .setCheck('String')
541
- .appendField(Blockly.Translate('field_oid_OID'));
542
-
543
- this.appendDummyInput('TYPE')
544
- .appendField(new Blockly.FieldDropdown([
545
- [Blockly.Translate('control_ex_control'), 'false'],
546
- [Blockly.Translate('control_ex_update'), 'true'],
547
- ]), 'TYPE');
548
-
549
- this.appendValueInput('VALUE')
550
- .setCheck(null)
551
- .appendField(Blockly.Translate('control_ex_value'));
552
-
553
- this.appendValueInput('DELAY_MS')
554
- .setCheck('Number')
555
- .appendField(Blockly.Translate('control_ex_delay'));
556
-
557
- this.appendValueInput('EXPIRE')
558
- .setCheck('Number')
559
- .appendField(Blockly.Translate('control_ex_expire'));
560
-
561
- this.appendDummyInput('CLEAR_RUNNING_INPUT')
562
- .appendField(Blockly.Translate('control_ex_clear_running'))
563
- .appendField(new Blockly.FieldCheckbox(), 'CLEAR_RUNNING');
564
-
565
- this.setInputsInline(false);
566
- this.setPreviousStatement(true, null);
567
- this.setNextStatement(true, null);
568
-
569
- this.setColour(Blockly.System.HUE);
570
-
571
- this.setTooltip(Blockly.Translate('control_tooltip'));
572
- this.setHelpUrl(getHelp('control_help'));
573
- },
574
- };
575
-
576
- Blockly.JavaScript.forBlock['control_ex'] = function (block) {
577
- const vObjId = Blockly.JavaScript.valueToCode(block, 'OID', Blockly.JavaScript.ORDER_ATOMIC);
578
- const vValue = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
579
- const vDelayMs = Blockly.JavaScript.valueToCode(block, 'DELAY_MS', Blockly.JavaScript.ORDER_ATOMIC);
580
- const vExpire = Blockly.JavaScript.valueToCode(block, 'EXPIRE', Blockly.JavaScript.ORDER_ATOMIC);
581
-
582
- let fClearRunning = block.getFieldValue('CLEAR_RUNNING');
583
- fClearRunning = fClearRunning === true || fClearRunning === 'true' || fClearRunning === 'TRUE';
584
-
585
- let fType = block.getFieldValue('TYPE');
586
- fType = fType === true || fType === 'true' || fType === 'TRUE';
587
-
588
- let expire = '';
589
- if (vExpire) {
590
- expire = `, expire: ${vExpire}`;
591
- }
592
-
593
- return `setStateDelayed(${vObjId}, { val: ${vValue}, ack: ${fType}${expire} }, parseInt(((${vDelayMs}) || '').toString(), 10), ${fClearRunning});\n`;
594
- };
595
-
596
- // --- create state --------------------------------------------------
597
- Blockly.System.blocks['create'] =
598
- '<block type="create">' +
599
- ' <field name="NAME">0_userdata.0.example</field>' +
600
- '</block>';
601
-
602
- Blockly.Blocks['create'] = {
603
- init: function () {
604
- this.appendDummyInput()
605
- .appendField(Blockly.Translate('create'));
606
-
607
- this.appendDummyInput('NAME')
608
- .appendField(Blockly.Translate('create_oid'))
609
- .appendField(new Blockly.FieldTextInput('0_userdata.0.example'), 'NAME');
610
-
611
- const inputValue = this.appendValueInput('VALUE')
612
- .setCheck(null)
613
- .appendField(Blockly.Translate('create_init'));
614
- if (inputValue.connection) {
615
- inputValue.connection._optional = true;
616
- }
617
-
618
- const inputCommon = this.appendValueInput('COMMON')
619
- .setCheck(null)
620
- .appendField(Blockly.Translate('create_common'));
621
- if (inputCommon.connection) {
622
- inputCommon.connection._optional = true;
623
- }
624
-
625
- this.appendStatementInput('STATEMENT')
626
- .setCheck(null);
627
-
628
- this.setInputsInline(false);
629
- this.setPreviousStatement(true, null);
630
- this.setNextStatement(true, null);
631
-
632
- this.setColour(Blockly.System.HUE);
633
-
634
- this.setTooltip(Blockly.Translate('create_tooltip'));
635
- this.setHelpUrl(getHelp('create_help'));
636
- },
637
- };
638
-
639
- Blockly.JavaScript.forBlock['create'] = function (block) {
640
- const fName = block.getFieldValue('NAME');
641
-
642
- const vValue = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
643
- let paraV = '';
644
- if (vValue !== null && vValue !== '') {
645
- paraV = `, ${vValue}`;
646
- }
647
-
648
- const vCommon = Blockly.JavaScript.valueToCode(block, 'COMMON', Blockly.JavaScript.ORDER_ATOMIC);
649
- let paraC = '';
650
- if (vCommon !== null && vCommon !== '') {
651
- paraC = `, ((common) => typeof common !== 'object' ? JSON.parse(common) : common)(${vCommon})`;
652
- }
653
-
654
- const statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
655
- return `createState(${Blockly.JavaScript.quote_(fName)}${paraV}${paraC}, async () => {\n` +
656
- statement +
657
- '});\n';
658
- };
659
-
660
- // --- create state ex --------------------------------------------------
661
- Blockly.System.blocks['create_ex'] =
662
- '<sep gap="5"></sep>' +
663
- '<block type="create_ex">' +
664
- ' <field name="NAME">0_userdata.0.example</field>' +
665
- ' <field name="TYPE">string</field>' +
666
- ' <field name="READABLE">FALSE</field>' +
667
- ' <field name="WRITEABLE">FALSE</field>' +
668
- '</block>';
669
-
670
- Blockly.Blocks['create_ex'] = {
671
- init: function () {
672
- this.appendDummyInput()
673
- .appendField(Blockly.Translate('create'));
674
-
675
- this.appendDummyInput('NAME')
676
- .appendField(Blockly.Translate('create_oid'))
677
- .appendField(new Blockly.FieldTextInput('0_userdata.0.example'), 'NAME');
678
-
679
- this.appendDummyInput('TYPE')
680
- .appendField(Blockly.Translate('create_type'))
681
- .appendField(new Blockly.FieldDropdown([
682
- [Blockly.Translate('create_type_string'), 'string'],
683
- [Blockly.Translate('create_type_number'), 'number'],
684
- [Blockly.Translate('create_type_boolean'), 'boolean'],
685
- [Blockly.Translate('create_type_json'), 'json'],
686
- [Blockly.Translate('create_type_object'), 'object'],
687
- [Blockly.Translate('create_type_array'), 'array'],
688
- ]), 'TYPE');
689
-
690
- const inputValue = this.appendValueInput('VALUE')
691
- .setCheck(null)
692
- .appendField(Blockly.Translate('create_init'));
693
- if (inputValue.connection) {
694
- inputValue.connection._optional = true;
695
- }
696
-
697
- this.appendDummyInput('READABLE_INPUT')
698
- .appendField(Blockly.Translate('create_readable'))
699
- .appendField(new Blockly.FieldCheckbox('FALSE'), 'READABLE');
700
-
701
- this.appendDummyInput('WRITEABLE_INPUT')
702
- .appendField(Blockly.Translate('create_writeable'))
703
- .appendField(new Blockly.FieldCheckbox('FALSE'), 'WRITEABLE');
704
-
705
- this.appendStatementInput('STATEMENT')
706
- .setCheck(null);
707
-
708
- this.setInputsInline(false);
709
- this.setPreviousStatement(true, null);
710
- this.setNextStatement(true, null);
711
-
712
- this.setColour(Blockly.System.HUE);
713
-
714
- this.setTooltip(Blockly.Translate('create_tooltip'));
715
- this.setHelpUrl(getHelp('create_help'));
716
- },
717
- };
718
-
719
- Blockly.JavaScript.forBlock['create_ex'] = function (block) {
720
- const fName = block.getFieldValue('NAME');
721
- const fType = block.getFieldValue('TYPE');
722
-
723
- let paraV = '';
724
- const vValue = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
725
- if (vValue !== null && vValue !== '') {
726
- if (fType === 'number') {
727
- paraV = `, parseFloat(${vValue})`;
728
- } else if (fType === 'boolean') {
729
- paraV = `, !!${vValue}`;
730
- } else if (fType === 'string') {
731
- paraV = `, String(${vValue})`;
732
- } else {
733
- paraV = `, ${vValue}`;
734
- }
735
- }
736
-
737
- let fReadable = block.getFieldValue('READABLE');
738
- fReadable = fReadable === 'TRUE' || fReadable === 'true' || fReadable === true;
739
-
740
- let fWriteable = block.getFieldValue('WRITEABLE');
741
- fWriteable = fWriteable === 'TRUE' || fWriteable === 'true' || fWriteable === true;
742
-
743
- const statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
744
-
745
- return `createState(${Blockly.JavaScript.quote_(fName)}${paraV}, { type: '${fType}', read: ${fReadable}, write: ${fWriteable} }, async () => {\n` +
746
- statement +
747
- '});\n';
748
- };
749
-
750
- // --- get value --------------------------------------------------
751
- Blockly.System.blocks['get_value'] =
752
- '<block type="get_value">' +
753
- ' <field name="ATTR">val</field>' +
754
- '</block>';
755
-
756
- Blockly.Blocks['get_value'] = {
757
- // Checkbox.
758
- init: function () {
759
- this.appendDummyInput('ATTR')
760
- .appendField(new Blockly.FieldDropdown([
761
- [Blockly.Translate('get_value_val'), 'val'],
762
- [Blockly.Translate('get_value_ack'), 'ack'],
763
- [Blockly.Translate('get_value_ts'), 'ts'],
764
- [Blockly.Translate('get_value_lc'), 'lc'],
765
- [Blockly.Translate('get_value_q') , 'q'],
766
- [Blockly.Translate('get_value_comment'), 'c'],
767
- [Blockly.Translate('get_value_from'), 'from'],
768
- [Blockly.Translate('get_value_user'), 'user'],
769
-
770
- [Blockly.Translate('get_common_name'), 'common.name'],
771
- [Blockly.Translate('get_common_desc'), 'common.desc'],
772
- [Blockly.Translate('get_common_unit'), 'common.unit'],
773
- [Blockly.Translate('get_common_role'), 'common.role'],
774
- [Blockly.Translate('get_common_state_type'), 'common.type'],
775
- [Blockly.Translate('get_common_read'), 'common.read'],
776
- [Blockly.Translate('get_common_write'), 'common.write'],
777
- ]), 'ATTR');
778
-
779
- this.appendDummyInput()
780
- .appendField(Blockly.Translate('get_value_OID'));
781
-
782
- this.appendDummyInput()
783
- .appendField(new Blockly.FieldOID(Blockly.Translate('select_id'), 'state'), 'OID');
784
-
785
- this.setInputsInline(true);
786
- this.setOutput(true);
787
-
788
- this.setColour(Blockly.System.HUE);
789
-
790
- this.setTooltip(Blockly.Translate('get_value_tooltip'));
791
- this.setHelpUrl(getHelp('get_value_help'));
792
- },
793
- /**
794
- * Called whenever anything on the workspace changes.
795
- * Add warning if this flow block is not nested inside a loop.
796
- * @param {!Blockly.Events.Abstract} e Change event.
797
- * @this Blockly.Block
798
- */
799
- onchange: function (e) {
800
- // Is the block connected to a trigger?
801
- const block = this.getParent();
802
- if (block && Blockly.System.WARNING_PARENTS.includes(block.type)) {
803
- this.setWarningText(Blockly.Translate('false_connection_trigger_warning'), this.id);
804
- } else {
805
- this.setWarningText(null, this.id);
806
- }
807
- },
808
- };
809
-
810
- Blockly.JavaScript.forBlock['get_value'] = function (block) {
811
- const fOid = block.getFieldValue('OID');
812
- const fAttr = block.getFieldValue('ATTR');
813
-
814
- if (fAttr === 'type' || fAttr.startsWith('common.')) {
815
- return [`(await getObjectAsync('${fOid}')).${fAttr}`, Blockly.JavaScript.ORDER_ATOMIC];
816
- }
817
-
818
- return [`getState(${Blockly.JavaScript.quote_(fOid)}).${fAttr}`, Blockly.JavaScript.ORDER_ATOMIC];
819
- };
820
-
821
- // --- get value var --------------------------------------------------
822
- Blockly.System.blocks['get_value_var'] =
823
- '<sep gap="5"></sep>' +
824
- '<block type="get_value_var">' +
825
- ' <field name="ATTR">val</field>' +
826
- ' <value name="OID">' +
827
- ' <shadow type="field_oid">' +
828
- ' </shadow>' +
829
- ' </value>' +
830
- '</block>';
831
-
832
- Blockly.Blocks['get_value_var'] = {
833
- init: function () {
834
- this.appendDummyInput('ATTR')
835
- .appendField(new Blockly.FieldDropdown([
836
- [Blockly.Translate('get_value_val'), 'val'],
837
- [Blockly.Translate('get_value_ack'), 'ack'],
838
- [Blockly.Translate('get_value_ts'), 'ts'],
839
- [Blockly.Translate('get_value_lc'), 'lc'],
840
- [Blockly.Translate('get_value_q'), 'q'],
841
- [Blockly.Translate('get_value_comment'), 'c'],
842
- [Blockly.Translate('get_value_from'), 'from'],
843
-
844
- [Blockly.Translate('get_common_name'), 'common.name'],
845
- [Blockly.Translate('get_common_desc'), 'common.desc'],
846
- [Blockly.Translate('get_common_unit'), 'common.unit'],
847
- [Blockly.Translate('get_common_role'), 'common.role'],
848
- [Blockly.Translate('get_common_state_type'), 'common.type'],
849
- [Blockly.Translate('get_common_read'), 'common.read'],
850
- [Blockly.Translate('get_common_write'), 'common.write'],
851
- ]), 'ATTR');
852
-
853
- this.appendDummyInput()
854
- .appendField(Blockly.Translate('get_value_OID'));
855
-
856
- this.appendValueInput('OID')
857
- .setCheck(null);
858
-
859
- this.setInputsInline(true);
860
- this.setOutput(true);
861
-
862
- this.setColour(Blockly.System.HUE);
863
-
864
- this.setTooltip(Blockly.Translate('get_value_tooltip'));
865
- this.setHelpUrl(getHelp('get_value_help'));
866
- },
867
- /**
868
- * Called whenever anything on the workspace changes.
869
- * Add warning if this flow block is not nested inside a loop.
870
- * @param {!Blockly.Events.Abstract} e Change event.
871
- * @this Blockly.Block
872
- */
873
- onchange: function (e) {
874
- // Is the block connected to a trigger?
875
- const block = this.getParent();
876
- if (block && Blockly.System.WARNING_PARENTS.includes(block.type)) {
877
- this.setWarningText(Blockly.Translate('false_connection_trigger_warning'), this.id);
878
- } else {
879
- this.setWarningText(null, this.id);
880
- }
881
- },
882
- };
883
-
884
- Blockly.JavaScript.forBlock['get_value_var'] = function (block) {
885
- const vOid = Blockly.JavaScript.valueToCode(block, 'OID', Blockly.JavaScript.ORDER_ATOMIC);
886
- const fAttr = block.getFieldValue('ATTR');
887
-
888
- if (fAttr === 'type' || fAttr.startsWith('common.')) {
889
- return [`(await getObjectAsync(${vOid})).${fAttr}`, Blockly.JavaScript.ORDER_ATOMIC];
890
- }
891
-
892
- return [`getState(${vOid}).${fAttr}`, Blockly.JavaScript.ORDER_ATOMIC];
893
- };
894
-
895
- // --- get value async--------------------------------------------------
896
- Blockly.System.blocks['get_value_async'] =
897
- '<sep gap="5"></sep>' +
898
- '<block type="get_value_async">' +
899
- ' <field name="ATTR">val</field>' +
900
- '</block>';
901
-
902
- Blockly.Blocks['get_value_async'] = {
903
- init: function () {
904
- this.appendDummyInput('ATTR')
905
- .appendField(new Blockly.FieldDropdown([
906
- [Blockly.Translate('get_value_val'), 'val'],
907
- [Blockly.Translate('get_value_ack'), 'ack'],
908
- [Blockly.Translate('get_value_ts'), 'ts'],
909
- [Blockly.Translate('get_value_lc'), 'lc'],
910
- [Blockly.Translate('get_value_q'), 'q'],
911
- [Blockly.Translate('get_value_comment'), 'c'],
912
- [Blockly.Translate('get_value_from'), 'from'],
913
-
914
- [Blockly.Translate('get_common_name'), 'common.name'],
915
- [Blockly.Translate('get_common_desc'), 'common.desc'],
916
- [Blockly.Translate('get_common_unit'), 'common.unit'],
917
- [Blockly.Translate('get_common_role'), 'common.role'],
918
- [Blockly.Translate('get_common_state_type'), 'common.type'],
919
- [Blockly.Translate('get_common_read'), 'common.read'],
920
- [Blockly.Translate('get_common_write'), 'common.write'],
921
- ]), 'ATTR');
922
-
923
- this.appendDummyInput()
924
- .appendField(Blockly.Translate('get_value_OID'));
925
-
926
- this.appendDummyInput()
927
- .appendField(new Blockly.FieldOID(Blockly.Translate('select_id'), 'state'), 'OID');
928
-
929
- this.appendStatementInput('STATEMENT')
930
- .setCheck(null);
931
-
932
- this.setInputsInline(true);
933
- this.setPreviousStatement(true, null);
934
- this.setNextStatement(true, null);
935
-
936
- this.setColour(Blockly.System.HUE);
937
-
938
- this.setTooltip(Blockly.Translate('get_value_tooltip'));
939
- this.setHelpUrl(getHelp('get_value_help'));
940
- },
941
- };
942
-
943
- Blockly.JavaScript.forBlock['get_value_async'] = function (block) {
944
- const fOid = block.getFieldValue('OID');
945
- const fAttr = block.getFieldValue('ATTR');
946
- const statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
947
-
948
- if (fAttr === 'type' || fAttr.startsWith('common.')) {
949
- return `getObjectAsync(${Blockly.JavaScript.quote_(fOid)}, async (err, obj) => {\n` +
950
- Blockly.JavaScript.prefixLines(`let value = obj.${fAttr};`, Blockly.JavaScript.INDENT) + '\n' +
951
- statement +
952
- '});\n';
953
- } else {
954
- return `getState(${Blockly.JavaScript.quote_(fOid)}, async (err, state) => {\n` +
955
- Blockly.JavaScript.prefixLines(`let value = state.${fAttr};`, Blockly.JavaScript.INDENT) + '\n' +
956
- statement +
957
- '});\n';
958
- }
959
- };
960
-
961
- // --- get object --------------------------------------------------
962
- Blockly.System.blocks['get_object'] =
963
- '<block type="get_object">' +
964
- '</block>';
965
-
966
- Blockly.Blocks['get_object'] = {
967
- // Checkbox.
968
- init: function () {
969
- this.appendDummyInput()
970
- .appendField(Blockly.Translate('get_object'));
971
-
972
- this.appendDummyInput()
973
- .appendField(new Blockly.FieldOID(Blockly.Translate('select_id'), 'all'), 'OID');
974
-
975
- this.setInputsInline(true);
976
- this.setOutput(true);
977
-
978
- this.setColour(Blockly.Object.HUE);
979
-
980
- this.setTooltip(Blockly.Translate('get_object_tooltip'));
981
- this.setHelpUrl(getHelp('get_object_help'));
982
- },
983
- /**
984
- * Called whenever anything on the workspace changes.
985
- * Add warning if this flow block is not nested inside a loop.
986
- * @param {!Blockly.Events.Abstract} e Change event.
987
- * @this Blockly.Block
988
- */
989
- onchange: function (e) {
990
- // Is the block connected to a trigger?
991
- const block = this.getParent();
992
- if (block && Blockly.System.WARNING_PARENTS.includes(block.type)) {
993
- this.setWarningText(Blockly.Translate('false_connection_trigger_warning'), this.id);
994
- } else if (block && ['direct', 'control_ex', 'get_value_var'].includes(block.type)) {
995
- this.setWarningText(Blockly.Translate('get_object_connection_warning'), this.id);
996
- } else {
997
- this.setWarningText(null, this.id);
998
- }
999
- },
1000
- };
1001
-
1002
- Blockly.JavaScript.forBlock['get_object'] = function (block) {
1003
- const fOid = block.getFieldValue('OID');
1004
-
1005
- return [`getObject(${Blockly.JavaScript.quote_(fOid)})`, Blockly.JavaScript.ORDER_ATOMIC];
1006
- };
1007
-
1008
- // --- get object async--------------------------------------------------
1009
- Blockly.System.blocks['get_object_async'] =
1010
- '<sep gap="5"></sep>' +
1011
- '<block type="get_object_async">' +
1012
- '</block>';
1013
-
1014
- Blockly.Blocks['get_object_async'] = {
1015
- init: function () {
1016
- this.appendDummyInput()
1017
- .appendField(Blockly.Translate('get_object'));
1018
-
1019
- this.appendDummyInput()
1020
- .appendField(new Blockly.FieldOID(Blockly.Translate('select_id'), 'all'), 'OID');
1021
-
1022
- this.appendStatementInput('STATEMENT')
1023
- .setCheck(null);
1024
-
1025
- this.setPreviousStatement(true, null);
1026
- this.setNextStatement(true, null);
1027
- this.setInputsInline(true);
1028
-
1029
- this.setColour(Blockly.Object.HUE);
1030
-
1031
- this.setTooltip(Blockly.Translate('get_object_tooltip'));
1032
- this.setHelpUrl(getHelp('get_object_help'));
1033
- },
1034
- };
1035
-
1036
- Blockly.JavaScript.forBlock['get_object_async'] = function (block) {
1037
- const fOid = block.getFieldValue('OID');
1038
- const statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
1039
-
1040
- return `getObjectAsync(${Blockly.JavaScript.quote_(fOid)}).then(async (obj) => {\n` +
1041
- statement +
1042
- '});\n';
1043
- };
1044
-
1045
- // --- state exists var --------------------------------------------------
1046
- Blockly.System.blocks['state_exists_var'] =
1047
- '<sep gap="5"></sep>' +
1048
- '<block type="state_exists_var">' +
1049
- ' <value name="OID">' +
1050
- ' <shadow type="field_oid">' +
1051
- ' </shadow>' +
1052
- ' </value>' +
1053
- '</block>';
1054
-
1055
- Blockly.Blocks['state_exists_var'] = {
1056
- init: function () {
1057
- this.appendDummyInput()
1058
- .appendField(Blockly.Translate('state_exists'));
1059
-
1060
- this.appendValueInput('OID')
1061
- .setCheck(null);
1062
-
1063
- this.setInputsInline(true);
1064
- this.setOutput(true, 'Boolean');
1065
-
1066
- this.setColour(Blockly.System.HUE);
1067
-
1068
- this.setTooltip(Blockly.Translate('state_exists_tooltip'));
1069
- this.setHelpUrl(getHelp('state_exists_help'));
1070
- },
1071
- };
1072
-
1073
- Blockly.JavaScript.forBlock['state_exists_var'] = function (block) {
1074
- const vOid = Blockly.JavaScript.valueToCode(block, 'OID', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
1075
-
1076
- return [`(await existsStateAsync(${vOid}))`, Blockly.JavaScript.ORDER_ATOMIC];
1077
- };
1078
-
1079
- // --- select OID --------------------------------------------------
1080
- Blockly.System.blocks['field_oid'] =
1081
- '<block type="field_oid">' +
1082
- '</block>';
1083
-
1084
- Blockly.Blocks['field_oid'] = {
1085
- init: function () {
1086
- this.appendDummyInput()
1087
- .appendField(Blockly.Translate('field_oid_OID'));
1088
-
1089
- this.appendDummyInput()
1090
- .appendField(new Blockly.FieldOID(Blockly.Translate('select_id'), 'state'), 'oid');
1091
-
1092
- this.setInputsInline(true);
1093
- this.setOutput(true, 'String');
1094
-
1095
- this.setColour('%{BKY_TEXTS_HUE}');
1096
-
1097
- this.setTooltip(Blockly.Translate('field_oid_tooltip'));
1098
- },
1099
- };
1100
-
1101
- Blockly.JavaScript.forBlock['field_oid'] = function (block) {
1102
- const fOid = block.getFieldValue('oid');
1103
-
1104
- return [Blockly.JavaScript.quote_(fOid), Blockly.JavaScript.ORDER_ATOMIC];
1105
- };
1106
-
1107
- // --- select OID meta--------------------------------------------------
1108
- Blockly.System.blocks['field_oid_meta'] =
1109
- '<sep gap="5"></sep>' +
1110
- '<block type="field_oid_meta">' +
1111
- '</block>';
1112
-
1113
- Blockly.Blocks['field_oid_meta'] = {
1114
- init: function () {
1115
- this.appendDummyInput()
1116
- .appendField(Blockly.Translate('field_oid_OID_meta'));
1117
-
1118
- this.appendDummyInput()
1119
- .appendField(new Blockly.FieldOID(Blockly.Translate('select_id'), 'meta'), 'oid');
1120
-
1121
- this.setInputsInline(true);
1122
- this.setOutput(true, 'String');
1123
-
1124
- this.setColour('%{BKY_TEXTS_HUE}');
1125
-
1126
- this.setTooltip(Blockly.Translate('field_oid_tooltip'));
1127
- },
1128
- };
1129
-
1130
- Blockly.JavaScript.forBlock['field_oid_meta'] = function (block) {
1131
- const fOid = block.getFieldValue('oid');
1132
-
1133
- return [Blockly.JavaScript.quote_(fOid), Blockly.JavaScript.ORDER_ATOMIC];
1134
- };
1135
-
1136
- // --- select OID script--------------------------------------------------
1137
- Blockly.System.blocks['field_oid_script'] =
1138
- '<sep gap="5"></sep>' +
1139
- '<block type="field_oid_script">' +
1140
- '</block>';
1141
-
1142
- Blockly.Blocks['field_oid_script'] = {
1143
- init: function () {
1144
- this.appendDummyInput()
1145
- .appendField(Blockly.Translate('field_oid_OID_script'));
1146
-
1147
- this.appendDummyInput()
1148
- .appendField(new Blockly.FieldOID(Blockly.Translate('select_id'), 'script'), 'oid');
1149
-
1150
- this.setInputsInline(true);
1151
- this.setOutput(true, 'String');
1152
-
1153
- this.setColour('%{BKY_TEXTS_HUE}');
1154
-
1155
- this.setTooltip(Blockly.Translate('field_oid_tooltip'));
1156
- },
1157
- };
1158
-
1159
- Blockly.JavaScript.forBlock['field_oid_script'] = function (block) {
1160
- const fOid = block.getFieldValue('oid');
1161
-
1162
- return [Blockly.JavaScript.quote_(fOid), Blockly.JavaScript.ORDER_ATOMIC];
1163
- };
1164
-
1165
- // --- get attribute --------------------------------------------------
1166
- Blockly.System.blocks['get_attr'] =
1167
- '<block type="get_attr">' +
1168
- ' <value name="PATH">' +
1169
- ' <shadow type="text">' +
1170
- ' <field name="TEXT">attribute1</field>' +
1171
- ' </shadow>' +
1172
- ' </value>' +
1173
- ' <value name="OBJECT">' +
1174
- ' <shadow type="get_object">' +
1175
- ' <field name="OID">Object ID</field>' +
1176
- ' </shadow>' +
1177
- ' </value>' +
1178
- '</block>';
1179
-
1180
- Blockly.Blocks['get_attr'] = {
1181
- init: function () {
1182
- this.appendValueInput('PATH')
1183
- .setCheck(null)
1184
- .appendField(Blockly.Translate('get_attr_path'));
1185
-
1186
- this.appendValueInput('OBJECT')
1187
- .appendField(Blockly.Translate('get_attr_by'));
1188
-
1189
- this.setInputsInline(true);
1190
- this.setOutput(true);
1191
-
1192
- this.setColour(Blockly.System.HUE);
1193
-
1194
- this.setTooltip(Blockly.Translate('get_attr_tooltip'));
1195
- this.setHelpUrl(getHelp('get_attr_help'));
1196
- },
1197
- };
1198
-
1199
- Blockly.JavaScript.forBlock['get_attr'] = function (block) {
1200
- const vObject = Blockly.JavaScript.valueToCode(block, 'OBJECT', Blockly.JavaScript.ORDER_ATOMIC);
1201
- const vPath = Blockly.JavaScript.valueToCode(block, 'PATH', Blockly.JavaScript.ORDER_ATOMIC);
1202
-
1203
- return [`getAttr(${vObject}, ${vPath})`, Blockly.JavaScript.ORDER_ATOMIC];
1204
- };
1205
-
1206
- // --- direct binding -----------------------------------------------------------
1207
- Blockly.System.blocks['direct'] =
1208
- '<block type="direct">' +
1209
- ' <field name="ONLY_CHANGES">TRUE</field>' +
1210
- ' <value name="OID_SRC">' +
1211
- ' <shadow type="field_oid">' +
1212
- ' <field name="oid">Object ID 1</field>' +
1213
- ' </shadow>' +
1214
- ' </value>' +
1215
- ' <value name="OID_DST">' +
1216
- ' <shadow type="field_oid">' +
1217
- ' <field name="oid">Object ID 2</field>' +
1218
- ' </shadow>' +
1219
- ' </value>' +
1220
- '</block>';
1221
-
1222
- Blockly.Blocks['direct'] = {
1223
- init: function () {
1224
- this.appendDummyInput()
1225
- .appendField(Blockly.Translate('direct'));
1226
-
1227
- this.appendValueInput('OID_SRC')
1228
- .setCheck('String')
1229
- .appendField(Blockly.Translate('direct_oid_src'));
1230
-
1231
- this.appendValueInput('OID_DST')
1232
- .setCheck('String')
1233
- .appendField(Blockly.Translate('direct_oid_dst'));
1234
-
1235
- this.appendDummyInput('ONLY_CHANGES')
1236
- .appendField(Blockly.Translate('direct_only_changes'))
1237
- .appendField(new Blockly.FieldCheckbox('TRUE'), 'ONLY_CHANGES');
1238
-
1239
- this.setPreviousStatement(true, null);
1240
- this.setNextStatement(true, null);
1241
-
1242
- this.setColour(Blockly.Trigger.HUE);
1243
-
1244
- this.setTooltip(Blockly.Translate('direct_tooltip'));
1245
- this.setHelpUrl(getHelp('direct_help'));
1246
- },
1247
- };
1248
-
1249
- Blockly.JavaScript.forBlock['direct'] = function (block) {
1250
- const vOidSrc = Blockly.JavaScript.valueToCode(block, 'OID_SRC', Blockly.JavaScript.ORDER_ATOMIC);
1251
- const vOidDst = Blockly.JavaScript.valueToCode(block, 'OID_DST', Blockly.JavaScript.ORDER_ATOMIC);
1252
-
1253
- let fOnlyChanges = block.getFieldValue('ONLY_CHANGES');
1254
- fOnlyChanges = fOnlyChanges === true || fOnlyChanges === 'true' || fOnlyChanges === 'TRUE';
1255
-
1256
- return `on({ id: ${vOidSrc}, change: '${fOnlyChanges ? 'ne' : 'any'}' }, (obj) => {\n` +
1257
- Blockly.JavaScript.prefixLines(`setState(${vOidDst}, obj.state.val);`, Blockly.JavaScript.INDENT) + '\n' +
1258
- '});\n';
1259
- };
1260
-
1261
- // --- control instance -----------------------------------------------------------
1262
- Blockly.System.blocks['control_instance'] =
1263
- '<block type="control_instance">' +
1264
- ' <field name="INSTANCE">admin.0</field>' +
1265
- ' <field name="ACTION">restartInstanceAsync</field>' +
1266
- '</block>';
1267
-
1268
- Blockly.Blocks['control_instance'] = {
1269
- init: function () {
1270
- const options = [];
1271
- if (typeof main !== 'undefined' && main.instances) {
1272
- for (let i = 0; i < main.instances.length; i++) {
1273
- const id = main.instances[i].substring('system.adapter.'.length);
1274
- options.push([id, id]);
1275
- }
1276
- if (!options.length) {
1277
- options.push([Blockly.Translate('control_instance_no_instances'), '']);
1278
- }
1279
-
1280
- this.appendDummyInput('INSTANCE')
1281
- .appendField(Blockly.Translate('control_instance'))
1282
- .appendField(new Blockly.FieldDropdown(options), 'INSTANCE');
1283
- } else {
1284
- this.appendDummyInput('INSTANCE')
1285
- .appendField(Blockly.Translate('control_instance'))
1286
- .appendField(new Blockly.FieldTextInput('adapter.0'), 'INSTANCE');
1287
- }
1288
-
1289
- this.appendDummyInput('ACTION')
1290
- .appendField(Blockly.Translate('control_instance_action'))
1291
- .appendField(new Blockly.FieldDropdown([
1292
- [Blockly.Translate('control_instance_start'), 'startInstanceAsync'],
1293
- [Blockly.Translate('control_instance_stop'), 'stopInstanceAsync'],
1294
- [Blockly.Translate('control_instance_restart'), 'restartInstanceAsync'],
1295
- ]), 'ACTION');
1296
-
1297
- this.setPreviousStatement(true, null);
1298
- this.setNextStatement(true, null);
1299
-
1300
- this.setColour(Blockly.System.HUE);
1301
-
1302
- this.setTooltip(Blockly.Translate('control_instance_tooltip'));
1303
- this.setHelpUrl(getHelp('control_instance_help'));
1304
- },
1305
- };
1306
-
1307
- Blockly.JavaScript.forBlock['control_instance'] = function (block) {
1308
- const fInstance = block.getFieldValue('INSTANCE');
1309
- const fAction = block.getFieldValue('ACTION');
1310
-
1311
- return `await ${fAction}(${Blockly.JavaScript.quote_(fInstance)});\n`;
1312
- };
1313
-
1314
- // --- control script -----------------------------------------------------------
1315
- Blockly.System.blocks['control_script'] =
1316
- '<block type="control_script">' +
1317
- ' <field name="ACTION">startScriptAsync</field>' +
1318
- '</block>';
1319
-
1320
- Blockly.Blocks['control_script'] = {
1321
- init: function () {
1322
- this.appendDummyInput('OID')
1323
- .appendField(Blockly.Translate('control_script'))
1324
- .appendField(new Blockly.FieldOID(Blockly.Translate('select_id'), 'script'), 'OID');
1325
-
1326
- this.appendDummyInput('ACTION')
1327
- .appendField(Blockly.Translate('control_instance_action'))
1328
- .appendField(new Blockly.FieldDropdown([
1329
- [Blockly.Translate('control_script_start'), 'startScriptAsync'],
1330
- [Blockly.Translate('control_script_stop'), 'stopScriptAsync'],
1331
- ]), 'ACTION');
1332
-
1333
- this.setPreviousStatement(true, null);
1334
- this.setNextStatement(true, null);
1335
-
1336
- this.setColour(Blockly.System.HUE);
1337
-
1338
- this.setTooltip(Blockly.Translate('control_script_tooltip'));
1339
- this.setHelpUrl(getHelp('control_script_help'));
1340
- },
1341
- };
1342
-
1343
- Blockly.JavaScript.forBlock['control_script'] = function (block) {
1344
- const fOid = block.getFieldValue('OID');
1345
- const fAction = block.getFieldValue('ACTION');
1346
-
1347
- return `await ${fAction}(${Blockly.JavaScript.quote_(fOid)});\n`;
1348
- };
1349
-
1350
- // --- regex --------------------------------------------------
1351
- Blockly.System.blocks['regex'] =
1352
- '<block type="regex">' +
1353
- ' <field name="TEXT">(.*)</field>' +
1354
- '</block>';
1355
-
1356
- Blockly.Blocks['regex'] = {
1357
- init: function () {
1358
- this.appendDummyInput()
1359
- .appendField('RegExp');
1360
-
1361
- this.appendDummyInput('TEXT')
1362
- .appendField(new Blockly.FieldTextInput('(.*)'), 'TEXT');
1363
-
1364
- this.setInputsInline(true);
1365
- this.setOutput(true, 'Array');
1366
-
1367
- this.setColour(Blockly.System.HUE);
1368
-
1369
- // this.setTooltip(Blockly.Translate('regex_tooltip'));
1370
- },
1371
- };
1372
-
1373
- Blockly.JavaScript.forBlock['regex'] = function (block) {
1374
- const fText = block.getFieldValue('TEXT');
1375
-
1376
- return [`new RegExp(${Blockly.JavaScript.quote_(fText)})`, Blockly.JavaScript.ORDER_ATOMIC];
1377
- };
1378
-
1379
- // --- selector --------------------------------------------------
1380
- Blockly.System.blocks['selector'] =
1381
- '<block type="selector">' +
1382
- ' <field name="TEXT">channel[state.id=*]</field>' +
1383
- '</block>';
1384
-
1385
- Blockly.Blocks['selector'] = {
1386
- init: function () {
1387
- this.appendDummyInput()
1388
- .appendField(Blockly.Translate('selector') + ' $(');
1389
-
1390
- this.appendDummyInput('TEXT')
1391
- .appendField(new Blockly.FieldTextInput('channel[state.id=*]'), 'TEXT');
1392
-
1393
- this.appendDummyInput()
1394
- .appendField(')');
1395
-
1396
- this.setInputsInline(true);
1397
- this.setOutput(true, 'Array');
1398
-
1399
- this.setColour(Blockly.System.HUE);
1400
-
1401
- // this.setTooltip(Blockly.Translate('selector_tooltip'));
1402
- },
1403
- };
1404
-
1405
- Blockly.JavaScript.forBlock['selector'] = function (block) {
1406
- const fText = block.getFieldValue('TEXT');
1407
-
1408
- return [`Array.prototype.slice.apply($(${Blockly.JavaScript.quote_(fText)}))`, Blockly.JavaScript.ORDER_ATOMIC];
1409
- };