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,639 +0,0 @@
1
- 'use strict';
2
-
3
- if (typeof goog !== 'undefined') {
4
- goog.provide('Blockly.JavaScript.Time');
5
- goog.require('Blockly.JavaScript');
6
- }
7
-
8
- Blockly.CustomBlocks = Blockly.CustomBlocks || [];
9
- Blockly.CustomBlocks.push('Time');
10
-
11
- Blockly.Time = {
12
- HUE: 270,
13
- blocks: {}
14
- };
15
-
16
-
17
- // if time greater, less, between
18
- // --- time compare --------------------------------------------------
19
- Blockly.Time.blocks['time_compare_ex'] =
20
- '<block type="time_compare_ex">' +
21
- ' <mutation end_time="false" actual_time="true"></mutation>' +
22
- ' <field name="USE_ACTUAL_TIME">TRUE</field>' +
23
- ' <field name="OPTION">&lt;</field>' +
24
- ' <value name="START_TIME">' +
25
- ' <shadow type="text">' +
26
- ' <field name="TEXT">12:00</field>' +
27
- ' </shadow>' +
28
- ' </value>' +
29
- '</block>';
30
-
31
- Blockly.Blocks['time_compare_ex'] = {
32
- init: function () {
33
- this.appendDummyInput('TIME_TEXT')
34
- .appendField(Blockly.Translate('time_compare_ex'));
35
-
36
- this.appendDummyInput('USE_ACTUAL_TIME')
37
- .appendField(new Blockly.FieldCheckbox('TRUE', function (option) {
38
- this.sourceBlock_.updateShape_(undefined, option);
39
- }), 'USE_ACTUAL_TIME');
40
-
41
- this.appendDummyInput()
42
- .appendField(Blockly.Translate('time_compare_is_ex'));
43
-
44
- this.appendDummyInput('OPTION')
45
- .appendField(new Blockly.FieldDropdown([
46
- [Blockly.Translate('time_compare_lt'), '<'],
47
- [Blockly.Translate('time_compare_le'), '<='],
48
- [Blockly.Translate('time_compare_gt'), '>'],
49
- [Blockly.Translate('time_compare_ge'), '>='],
50
- [Blockly.Translate('time_compare_eq'), '=='],
51
- [Blockly.Translate('time_compare_bw'), 'between'],
52
- [Blockly.Translate('time_compare_nb'), 'not between'],
53
- ], function (option) {
54
- this.sourceBlock_.updateShape_((option === 'between' || option === 'not between'));
55
- }), 'OPTION');
56
-
57
- this.appendDummyInput()
58
- .appendField(' ');
59
-
60
- this.appendValueInput('START_TIME');
61
-
62
- this.setInputsInline(true);
63
- this.setOutput(true, 'Boolean');
64
-
65
- this.setColour(Blockly.Time.HUE);
66
-
67
- this.setTooltip(Blockly.Translate('time_compare_ex_tooltip'));
68
- this.setHelpUrl(getHelp('time_compare_ex_help'));
69
- },
70
- mutationToDom: function () {
71
- const container = document.createElement('mutation');
72
- const option = this.getFieldValue('OPTION');
73
- const use_actual_time = this.getFieldValue('USE_ACTUAL_TIME');
74
- container.setAttribute('end_time', option === 'between' || option === 'not between' ? 'true' : 'false');
75
- container.setAttribute('actual_time', use_actual_time === 'TRUE' || use_actual_time === 'true' || use_actual_time === true ? 'true' : 'false');
76
- return container;
77
- },
78
- domToMutation: function (xmlElement) {
79
- const end_time = xmlElement.getAttribute('end_time');
80
- const actual_time = xmlElement.getAttribute('actual_time');
81
- this.updateShape_(end_time === true || end_time === 'true' || end_time === 'TRUE', actual_time === true || actual_time === 'true' || actual_time === 'TRUE');
82
- },
83
- updateShape_: function (isBetween, useActualTime) {
84
- if (isBetween === undefined) {
85
- isBetween = this.getFieldValue('OPTION') === 'between' || this.getFieldValue('OPTION') === 'not between';
86
- }
87
- // Add or remove a delay Input.
88
- let inputExists;
89
- try {
90
- inputExists = this.getInput('END_TIME');
91
- } catch (e) {
92
- inputExists = null;
93
- }
94
-
95
- if (isBetween) {
96
- if (!inputExists) {
97
- try {
98
- inputExists = this.getInput('CUSTOM_TIME');
99
- } catch (e) {
100
- inputExists = null;
101
- }
102
-
103
- if (inputExists) {
104
- this.removeInput('CUSTOM_TIME');
105
- this.removeInput('CUSTOM_TEXT');
106
- }
107
-
108
- this.appendDummyInput('AND')
109
- .appendField(Blockly.Translate('time_compare_and'));
110
-
111
- this.appendValueInput('END_TIME');
112
-
113
- if (!window.scripts.loading) {
114
- const wp = this.workspace;
115
-
116
- setTimeout(() => {
117
- const existingInput = this.getInput('END_TIME');
118
- if (!existingInput.connection.isConnected()) {
119
- const shadow = wp.newBlock('text');
120
- shadow.setShadow(true);
121
- shadow.setFieldValue('18:00', 'TEXT');
122
-
123
- shadow.outputConnection.connect(existingInput.connection);
124
- // existingInput.connection.connect(shadow.outputConnection);
125
-
126
- shadow.initSvg();
127
- shadow.render();
128
- }
129
- }, 100);
130
- }
131
- }
132
- } else if (inputExists) {
133
- this.removeInput('END_TIME');
134
- this.removeInput('AND');
135
- }
136
-
137
- if (useActualTime === undefined) {
138
- useActualTime = this.getFieldValue('USE_ACTUAL_TIME');
139
- }
140
-
141
- useActualTime = useActualTime === 'true' || useActualTime === 'TRUE' || useActualTime === true;
142
- try {
143
- inputExists = this.getInput('CUSTOM_TIME');
144
- } catch (e) {
145
- inputExists = null;
146
- }
147
-
148
- if (!useActualTime) {
149
- this.getInput('TIME_TEXT').fieldRow[0].setValue(Blockly.Translate('time_compare_custom_ex'));
150
-
151
- if (!inputExists) {
152
- this.appendDummyInput('CUSTOM_TEXT')
153
- .appendField(Blockly.Translate('time_compare_ex_custom'));
154
-
155
- this.appendValueInput('CUSTOM_TIME');
156
- }
157
- } else if (inputExists) {
158
- this.getInput('TIME_TEXT').fieldRow[0].setValue(Blockly.Translate('time_compare_ex'));
159
- this.removeInput('CUSTOM_TIME');
160
- this.removeInput('CUSTOM_TEXT');
161
- }
162
- },
163
- };
164
-
165
- Blockly.JavaScript.forBlock['time_compare_ex'] = function (block) {
166
- const fOption = block.getFieldValue('OPTION');
167
- const vStartTime = Blockly.JavaScript.valueToCode(block, 'START_TIME', Blockly.JavaScript.ORDER_ATOMIC);
168
- let vEndTime = null;
169
- try {
170
- vEndTime = Blockly.JavaScript.valueToCode(block, 'END_TIME', Blockly.JavaScript.ORDER_ATOMIC);
171
- vEndTime = vEndTime || null;
172
- } catch (e) {
173
- // Ignore
174
- }
175
- let vCustomTime = null;
176
- try {
177
- vCustomTime = Blockly.JavaScript.valueToCode(block, 'CUSTOM_TIME', Blockly.JavaScript.ORDER_ATOMIC);
178
- vCustomTime = vCustomTime || null;
179
- } catch (e) {
180
- // Ignore
181
- }
182
-
183
- return [`compareTime(${vStartTime}, ${vEndTime}, '${fOption}', ${vCustomTime})`, Blockly.JavaScript.ORDER_ATOMIC];
184
- };
185
-
186
- // if time greater, less, between
187
- // --- time compare --------------------------------------------------
188
- Blockly.Time.blocks['time_compare'] =
189
- '<block type="time_compare">' +
190
- ' <mutation end_time="false"></mutation>' +
191
- ' <field name="OPTION">&lt;</field>' +
192
- ' <field name="START_TIME">12:00</field>' +
193
- '</block>';
194
-
195
- Blockly.Blocks['time_compare'] = {
196
- init: function () {
197
- this.appendDummyInput()
198
- .appendField(Blockly.Translate('time_compare'));
199
-
200
- this.appendDummyInput('OPTION')
201
- .appendField(new Blockly.FieldDropdown([
202
- [Blockly.Translate('time_compare_lt'), '<'],
203
- [Blockly.Translate('time_compare_le'), '<='],
204
- [Blockly.Translate('time_compare_gt'), '>'],
205
- [Blockly.Translate('time_compare_ge'), '>='],
206
- [Blockly.Translate('time_compare_eq'), '=='],
207
- [Blockly.Translate('time_compare_bw'), 'between'],
208
- [Blockly.Translate('time_compare_nb'), 'not between'],
209
- ], function (option) {
210
- this.sourceBlock_.updateShape_((option === 'between' || option === 'not between'));
211
- }), 'OPTION');
212
-
213
- this.appendDummyInput()
214
- .appendField(' ');
215
-
216
- this.appendDummyInput('START_TIME')
217
- .appendField(new Blockly.FieldTextInput('12:00'), 'START_TIME');
218
-
219
- this.setInputsInline(true);
220
- this.setOutput(true, 'Boolean');
221
-
222
- this.setColour(Blockly.Time.HUE);
223
-
224
- this.setTooltip(Blockly.Translate('time_compare_tooltip'));
225
- this.setHelpUrl(getHelp('time_compare_help'));
226
- },
227
-
228
- mutationToDom: function () {
229
- const container = document.createElement('mutation');
230
- const option = this.getFieldValue('OPTION');
231
- container.setAttribute('end_time', (option === 'between' || option === 'not between') ? 'true' : 'false');
232
- return container;
233
- },
234
- domToMutation: function (xmlElement) {
235
- const option = xmlElement.getAttribute('end_time');
236
- this.updateShape_(option === true || option === 'true' || option === 'TRUE');
237
- },
238
- updateShape_: function (isBetween) {
239
- // Add or remove a delay Input.
240
- let inputExists;
241
- try {
242
- inputExists = this.getInput('END_TIME');
243
- } catch (e) {
244
- inputExists = null;
245
- }
246
-
247
- if (isBetween) {
248
- if (!inputExists) {
249
- this.appendDummyInput('AND')
250
- .appendField(Blockly.Translate('time_compare_and'));
251
-
252
- this.appendDummyInput('END_TIME')
253
- .appendField(new Blockly.FieldTextInput('18:00'), 'END_TIME');
254
- }
255
- } else if (inputExists) {
256
- this.removeInput('END_TIME');
257
- this.removeInput('AND');
258
- }
259
- },
260
- };
261
-
262
- Blockly.JavaScript.forBlock['time_compare'] = function (block) {
263
- const fOption = block.getFieldValue('OPTION');
264
- const fStartTime = block.getFieldValue('START_TIME');
265
- let fEndTime = null;
266
- try {
267
- fEndTime = block.getFieldValue('END_TIME');
268
- } catch (e) {
269
-
270
- }
271
-
272
- return [`compareTime(${Blockly.JavaScript.quote_(fStartTime)}, ${fEndTime ? Blockly.JavaScript.quote_(fEndTime) : 'null'}, ${Blockly.JavaScript.quote_(fOption)})`, Blockly.JavaScript.ORDER_ATOMIC];
273
- };
274
-
275
- // --- get time --------------------------------------------------
276
- Blockly.Words['time_get_yyyy.mm.dd'] .format = 'YYYY.MM.DD';
277
- Blockly.Words['time_get_yyyy/mm/dd'] .format = 'YYYY/MM/DD';
278
- Blockly.Words['time_get_yy.mm.dd'] .format = 'YY.MM.DD';
279
- Blockly.Words['time_get_yy/mm/dd'] .format = 'YY/MM/DD';
280
- Blockly.Words['time_get_dd.mm.yyyy'] .format = 'DD.MM.YYYY';
281
- Blockly.Words['time_get_dd/mm/yyyy'] .format = 'DD/MM/YYYY';
282
- Blockly.Words['time_get_dd.mm.yy'] .format = 'DD.MM.YY';
283
- Blockly.Words['time_get_dd/mm/yy'] .format = 'DD/MM/YY';
284
- Blockly.Words['time_get_mm/dd/yyyy'] .format = 'MM/DD/YYYY';
285
- Blockly.Words['time_get_mm/dd/yy'] .format = 'MM/DD/YY';
286
- Blockly.Words['time_get_dd.mm'] .format = 'DD.MM.';
287
- Blockly.Words['time_get_dd/mm'] .format = 'DD/MM';
288
- Blockly.Words['time_get_mm.dd'] .format = 'MM.DD';
289
- Blockly.Words['time_get_mm/dd'] .format = 'MM/DD';
290
- Blockly.Words['time_get_hh_mm'] .format = 'hh:mm';
291
- Blockly.Words['time_get_hh_mm_ss'] .format = 'hh:mm:ss';
292
- Blockly.Words['time_get_hh_mm_ss.sss'].format = 'hh:mm:ss.sss';
293
-
294
- Blockly.Time.blocks['time_get'] =
295
- '<block type="time_get">' +
296
- ' <mutation format="false" language="false"></mutation>' +
297
- ' <field name="OPTION">object</field>' +
298
- '</block>';
299
-
300
- Blockly.Blocks['time_get'] = {
301
- init: function () {
302
- this.appendDummyInput()
303
- .appendField(Blockly.Translate('time_get'));
304
-
305
- this.appendDummyInput('OPTION')
306
- .appendField(new Blockly.FieldDropdown([
307
- [Blockly.Translate('time_get_object') , 'object'],
308
- [Blockly.Translate('time_get_ms') , 'ms'],
309
- [Blockly.Translate('time_get_s') , 's'],
310
- [Blockly.Translate('time_get_sid') , 'sid'],
311
- [Blockly.Translate('time_get_m') , 'm'],
312
- [Blockly.Translate('time_get_mid') , 'mid'],
313
- [Blockly.Translate('time_get_h') , 'h'],
314
- [Blockly.Translate('time_get_d') , 'd'],
315
- [Blockly.Translate('time_get_M') , 'M'],
316
- [Blockly.Translate('time_get_Mt') , 'Mt'],
317
- [Blockly.Translate('time_get_Mts') , 'Mts'],
318
- [Blockly.Translate('time_get_y') , 'y'],
319
- [Blockly.Translate('time_get_fy') , 'fy'],
320
- [Blockly.Translate('time_get_wdt') , 'wdt'],
321
- [Blockly.Translate('time_get_wdts') , 'wdts'],
322
- [Blockly.Translate('time_get_wd') , 'wd'],
323
- [Blockly.Translate('time_get_cw') , 'cw'],
324
- [Blockly.Translate('time_get_custom') , 'custom'],
325
- [Blockly.Translate('time_get_yyyy.mm.dd') , Blockly.Words['time_get_yyyy.mm.dd'] .format],
326
- [Blockly.Translate('time_get_yyyy/mm/dd') , Blockly.Words['time_get_yyyy/mm/dd'] .format],
327
- [Blockly.Translate('time_get_yy.mm.dd') , Blockly.Words['time_get_yy.mm.dd'] .format],
328
- [Blockly.Translate('time_get_yy/mm/dd') , Blockly.Words['time_get_yy/mm/dd'] .format],
329
- [Blockly.Translate('time_get_dd.mm.yyyy') , Blockly.Words['time_get_dd.mm.yyyy'] .format],
330
- [Blockly.Translate('time_get_dd/mm/yyyy') , Blockly.Words['time_get_dd/mm/yyyy'] .format],
331
- [Blockly.Translate('time_get_dd.mm.yy') , Blockly.Words['time_get_dd.mm.yy'] .format],
332
- [Blockly.Translate('time_get_dd/mm/yy') , Blockly.Words['time_get_dd/mm/yy'] .format],
333
- [Blockly.Translate('time_get_mm/dd/yyyy') , Blockly.Words['time_get_mm/dd/yyyy'] .format],
334
- [Blockly.Translate('time_get_mm/dd/yy') , Blockly.Words['time_get_mm/dd/yy'] .format],
335
- [Blockly.Translate('time_get_dd.mm') , Blockly.Words['time_get_dd.mm'] .format],
336
- [Blockly.Translate('time_get_dd/mm') , Blockly.Words['time_get_dd/mm'] .format],
337
- [Blockly.Translate('time_get_mm.dd') , Blockly.Words['time_get_mm.dd'] .format],
338
- [Blockly.Translate('time_get_mm/dd') , Blockly.Words['time_get_mm/dd'] .format],
339
- [Blockly.Translate('time_get_hh_mm') , Blockly.Words['time_get_hh_mm'] .format],
340
- [Blockly.Translate('time_get_hh_mm_ss') , Blockly.Words['time_get_hh_mm_ss'] .format],
341
- [Blockly.Translate('time_get_hh_mm_ss.sss') , Blockly.Words['time_get_hh_mm_ss.sss'].format],
342
- ], function (option) {
343
- this.sourceBlock_.updateShape_(option === 'custom', option === 'wdt' || option === 'wdts' || option === 'Mt' || option === 'Mts');
344
- }), 'OPTION');
345
-
346
- this.setInputsInline(true);
347
- this.setOutput(true);
348
-
349
- this.setColour(Blockly.Time.HUE);
350
-
351
- this.setTooltip(Blockly.Translate('time_get_tooltip'));
352
- //this.setHelpUrl(getHelp('time_get_help'));
353
- },
354
- mutationToDom: function () {
355
- const container = document.createElement('mutation');
356
- const option = this.getFieldValue('OPTION');
357
- container.setAttribute('format', option === 'custom' ? 'true' : 'false');
358
- container.setAttribute('language', option === 'wdt' || option === 'wdts' || option === 'Mt' || option === 'Mts' ? 'true' : 'false');
359
- return container;
360
- },
361
- domToMutation: function (xmlElement) {
362
- const format = xmlElement.getAttribute('format');
363
- const language = xmlElement.getAttribute('language');
364
- this.updateShape_(format === true || format === 'true' || format === 'TRUE', language === true || language === 'true' || language === 'TRUE');
365
- },
366
- updateShape_: function (isFormat, isLanguage) {
367
- // Add or remove a delay Input.
368
- let inputExists;
369
- try {
370
- inputExists = this.getInput('FORMAT');
371
- } catch (e) {
372
- inputExists = null;
373
- }
374
-
375
- if (isFormat) {
376
- if (!inputExists) {
377
- this.appendDummyInput('FORMAT')
378
- .appendField(' ')
379
- .appendField(new Blockly.FieldTextInput(Blockly.Translate('time_get_default_format')), 'FORMAT');
380
- }
381
- } else if (inputExists) {
382
- this.removeInput('FORMAT');
383
- }
384
-
385
- try {
386
- inputExists = this.getInput('LANGUAGE');
387
- } catch (e) {
388
- inputExists = null;
389
- }
390
-
391
- if (isLanguage) {
392
- if (!inputExists) {
393
- let languages;
394
- if (systemLang === 'en') {
395
- languages = [['in english', 'en'], ['auf deutsch', 'de'], ['на русском', 'ru']];
396
- } else if (systemLang === 'de') {
397
- languages = [['auf deutsch', 'de'], ['in english', 'en'], ['на русском', 'ru']];
398
- } else if (systemLang === 'ru') {
399
- languages = [['на русском', 'ru'], ['in english', 'en'], ['auf deutsch', 'de']];
400
- } else {
401
- languages = [['in english', 'en'], ['auf deutsch', 'de'], ['на русском', 'ru']];
402
- }
403
- this.appendDummyInput('LANGUAGE')
404
- .appendField(new Blockly.FieldDropdown(languages), 'LANGUAGE');
405
- }
406
- } else if (inputExists) {
407
- this.removeInput('LANGUAGE');
408
- }
409
- },
410
- };
411
-
412
- Blockly.JavaScript.forBlock['time_get'] = function (block) {
413
- const fOption = block.getFieldValue('OPTION');
414
- const fFormat = block.getFieldValue('FORMAT');
415
- const fLanguage = block.getFieldValue('LANGUAGE');
416
-
417
- let code;
418
- if (fOption === 'object') {
419
- code = '(new Date().getTime())';
420
- } else if (fOption === 'ms') {
421
- code = '(new Date().getMilliseconds())';
422
- } else if (fOption === 's') {
423
- code = '(new Date().getSeconds())';
424
- } else if (fOption === 'sid') {
425
- code = '(() => { const v = new Date(); return v.getHours() * 3600 + v.getMinutes() * 60 + v.getSeconds(); })()';
426
- } else if (fOption === 'm') {
427
- code = '(new Date().getMinutes())';
428
- } else if (fOption === 'mid') {
429
- code = '(() => { const v = new Date(); return v.getHours() * 60 + v.getMinutes(); })()';
430
- } else if (fOption === 'h') {
431
- code = '(new Date().getHours())';
432
- } else if (fOption === 'd') {
433
- code = '(new Date().getDate())';
434
- } else if (fOption === 'M') {
435
- code = '(new Date().getMonth() + 1)';
436
- } else if (fOption === 'Mt') {
437
- code = `formatDate(new Date(), 'OO', '${fLanguage}')`;
438
- } else if (fOption === 'Mts') {
439
- code = `formatDate(new Date(), 'O', '${fLanguage}')`;
440
- } else if (fOption === 'y') {
441
- code = '(new Date().getYear())';
442
- } else if (fOption === 'fy') {
443
- code = '(new Date().getFullYear())';
444
- } else if (fOption === 'wdt') {
445
- code = `formatDate(new Date(), 'WW', '${fLanguage}')`;
446
- } else if (fOption === 'wdts') {
447
- code = `formatDate(new Date(), 'W', '${fLanguage}')`;
448
- } else if (fOption === 'wd') {
449
- code = '(() => { const d = new Date().getDay(); return d === 0 ? 7 : d; })()';
450
- } else if (fOption === 'cw') {
451
- code = '((date) => { const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); const dayNum = d.getUTCDay() || 7; d.setUTCDate(d.getUTCDate() + 4 - dayNum); const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)); return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7); })(new Date())';
452
- } else if (fOption === 'custom') {
453
- code = `formatDate(new Date(), ${Blockly.JavaScript.quote_(fFormat)})`;
454
- } else {
455
- code = `formatDate(new Date(), ${Blockly.JavaScript.quote_(fOption)})`;
456
- }
457
-
458
- return [code, Blockly.JavaScript.ORDER_ATOMIC];
459
- };
460
-
461
- // --- get time special --------------------------------------------------
462
- Blockly.Time.blocks['time_get_special'] =
463
- '<block type="time_get_special">' +
464
- ' <field name="TYPE">dayStart</field>' +
465
- '</block>';
466
-
467
- Blockly.Blocks['time_get_special'] = {
468
- init: function () {
469
- this.appendDummyInput()
470
- .appendField(Blockly.Translate('time_get_special'));
471
-
472
- this.appendDummyInput('TYPE')
473
- .appendField(new Blockly.FieldDropdown([
474
- [Blockly.Translate('time_get_special_day_start'), 'dayStart'],
475
- [Blockly.Translate('time_get_special_day_end'), 'dayEnd'],
476
- [Blockly.Translate('time_get_special_week_start'), 'weekStart'],
477
- [Blockly.Translate('time_get_special_week_end'), 'weekEnd'],
478
- [Blockly.Translate('time_get_special_month_start'), 'monthStart'],
479
- [Blockly.Translate('time_get_special_month_end'), 'monthEnd'],
480
- ]), 'TYPE');
481
-
482
- this.setInputsInline(true);
483
- this.setOutput(true, 'Number');
484
-
485
- this.setColour(Blockly.Time.HUE);
486
-
487
- this.setTooltip(Blockly.Translate('time_get_special_tooltip'));
488
- //this.setHelpUrl(getHelp('time_get_special_help'));
489
- },
490
- };
491
-
492
- Blockly.JavaScript.forBlock['time_get_special'] = function (block) {
493
- const fType = block.getFieldValue('TYPE');
494
-
495
- let code;
496
- if (fType === 'dayStart') {
497
- code = '/* start of day */ (() => { const d = new Date(); d.setHours(0, 0, 0, 0); return d.getTime(); })()';
498
- } else if (fType === 'dayEnd') {
499
- code = '/* end of day */ (() => { const d = new Date(); d.setHours(23, 59, 59, 999); return d.getTime(); })()';
500
- } else if (fType === 'weekStart') {
501
- code = '/* start of week */ (() => { const d = new Date(); d.setHours(0, 0, 0, 0); return new Date(d.getFullYear(), d.getMonth(), d.getDate() - d.getDay() + (d.getDay() == 0 ? -6 : 1)).getTime(); })()';
502
- } else if (fType === 'weekEnd') {
503
- code = '/* end of week */ (() => { const d = new Date(); d.setHours(0, 0, 0, 0); return new Date(d.getFullYear(), d.getMonth(), d.getDate() + (8 - d.getDay())).getTime() - 1; })()';
504
- } else if (fType === 'monthStart') {
505
- code = '/* start of month */ (() => { const d = new Date(); d.setHours(0, 0, 0, 0); d.setDate(1); return d.getTime(); })()';
506
- } else if (fType === 'monthEnd') {
507
- code = '/* end of month */ (() => { const d = new Date(); d.setHours(0, 0, 0, 0); return new Date(d.getFullYear(), d.getMonth() + 1, 1).getTime() - 1; })()';
508
- }
509
-
510
- return [code, Blockly.JavaScript.ORDER_ATOMIC];
511
- };
512
-
513
- // --- get astro time --------------------------------------------------
514
- Blockly.Time.blocks['time_astro'] =
515
- '<block type="time_astro">' +
516
- ' <field name="TYPE">sunrise</field>' +
517
- ' <field name="OFFSET">0</field>' +
518
- '</block>';
519
-
520
- Blockly.Blocks['time_astro'] = {
521
- init: function () {
522
- this.appendDummyInput()
523
- .appendField(Blockly.Translate('time_astro'));
524
-
525
- this.appendDummyInput('TYPE')
526
- .appendField(new Blockly.FieldDropdown([
527
- [Blockly.Translate('astro_sunriseText'), 'sunrise'],
528
- [Blockly.Translate('astro_sunriseEndText'), 'sunriseEnd'],
529
- [Blockly.Translate('astro_goldenHourEndText'), 'goldenHourEnd'],
530
- [Blockly.Translate('astro_solarNoonText'), 'solarNoon'],
531
- [Blockly.Translate('astro_goldenHourText'), 'goldenHour'],
532
- [Blockly.Translate('astro_sunsetStartText'), 'sunsetStart'],
533
- [Blockly.Translate('astro_sunsetText'), 'sunset'],
534
- [Blockly.Translate('astro_duskText'), 'dusk'],
535
- [Blockly.Translate('astro_nauticalDuskText'), 'nauticalDusk'],
536
- [Blockly.Translate('astro_nightText'), 'night'],
537
- [Blockly.Translate('astro_nightEndText'), 'nightEnd'],
538
- [Blockly.Translate('astro_nauticalDawnText'), 'nauticalDawn'],
539
- [Blockly.Translate('astro_dawnText'), 'dawn'],
540
- [Blockly.Translate('astro_nadirText'), 'nadir'],
541
- ]), 'TYPE');
542
-
543
- this.appendDummyInput('OFFSET')
544
- .appendField(Blockly.Translate('time_astro_offset'))
545
- .appendField(new Blockly.FieldTextInput('0'), 'OFFSET');
546
-
547
- this.setInputsInline(true);
548
- this.setOutput(true);
549
-
550
- this.setColour(Blockly.Time.HUE);
551
-
552
- this.setTooltip(Blockly.Translate('time_astro_tooltip'));
553
- this.setHelpUrl(getHelp('time_astro_help'));
554
- },
555
- };
556
-
557
- Blockly.JavaScript.forBlock['time_astro'] = function (block) {
558
- const fType = block.getFieldValue('TYPE');
559
- const fOffset = parseFloat(block.getFieldValue('OFFSET'));
560
-
561
- return [`getAstroDate('${fType}', undefined, ${fOffset})`, Blockly.JavaScript.ORDER_ATOMIC];
562
- };
563
-
564
- // --- time calculation --------------------------------------------------
565
- Blockly.Time.blocks['time_calculation'] =
566
- '<block type="time_calculation">' +
567
- ' <field name="OPERATION">+</field>' +
568
- ' <field name="UNIT">ms</field>' +
569
- ' <value name="DATE_TIME">' +
570
- ' <shadow type="time_get">' +
571
- ' <mutation format="false" language="false"></mutation>' +
572
- ' <field name="OPTION">object</field>' +
573
- ' </shadow>' +
574
- ' </value>' +
575
- ' <value name="VALUE">' +
576
- ' <shadow type="math_number">' +
577
- ' <field name="NUM">1</field>' +
578
- ' </shadow>' +
579
- ' </value>' +
580
- '</block>';
581
-
582
- Blockly.Blocks['time_calculation'] = {
583
- init: function () {
584
- this.appendDummyInput('NAME')
585
- .appendField(Blockly.Translate('time_calculation'));
586
-
587
- this.appendValueInput('DATE_TIME')
588
- .appendField(Blockly.Translate('time_calculation_on'))
589
- .setCheck(null);
590
-
591
- this.appendDummyInput('OPERATION')
592
- .appendField(new Blockly.FieldDropdown([
593
- ['+', '+'],
594
- ['-', '-'],
595
- ]), 'OPERATION');
596
-
597
- this.appendValueInput('VALUE');
598
-
599
- this.appendDummyInput('UNIT')
600
- .appendField(new Blockly.FieldDropdown([
601
- [Blockly.Translate('time_calculation_ms'), 'ms'],
602
- [Blockly.Translate('time_calculation_sec'), 'sec'],
603
- [Blockly.Translate('time_calculation_min'), 'min'],
604
- [Blockly.Translate('time_calculation_hour'), 'hour'],
605
- [Blockly.Translate('time_calculation_day'), 'day'],
606
- [Blockly.Translate('time_calculation_week'), 'week'],
607
- ]), 'UNIT');
608
-
609
- this.setInputsInline(true);
610
- this.setOutput(true, 'Number');
611
-
612
- this.setColour(Blockly.Time.HUE);
613
-
614
- this.setTooltip(Blockly.Translate('time_calculation_tooltip'));
615
- //this.setHelpUrl(getHelp('time_calculation_help'));
616
- },
617
- };
618
-
619
- Blockly.JavaScript.forBlock['time_calculation'] = function (block) {
620
- const vDateTime = Blockly.JavaScript.valueToCode(block, 'DATE_TIME', Blockly.JavaScript.ORDER_ATOMIC);
621
- const fOperation = block.getFieldValue('OPERATION');
622
- const vValue = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
623
- const fUnit = block.getFieldValue('UNIT');
624
-
625
- let step = 1;
626
- if (fUnit === 'sec') {
627
- step = 1000;
628
- } else if (fUnit === 'min') {
629
- step = 60 * 1000;
630
- } else if (fUnit === 'hour') {
631
- step = 60 * 60 * 1000;
632
- } else if (fUnit === 'day') {
633
- step = 24 * 60 * 60 * 1000;
634
- } else if (fUnit === 'week') {
635
- step = 7 * 24 * 60 * 60 * 1000;
636
- }
637
-
638
- return [`/* time calculation */ ((dateTime) => { const ts = (typeof dateTime === 'object' ? dateTime.getTime() : dateTime); return ts ${fOperation} ((${vValue}) * ${step}); })(${vDateTime})`, Blockly.JavaScript.ORDER_ATOMIC];
639
- };