blockly 7.20211209.4 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/blockly.d.ts +18963 -18432
  2. package/blockly.min.js +852 -844
  3. package/blockly_compressed.js +669 -664
  4. package/blockly_compressed.js.map +1 -1
  5. package/blocks/blocks.js +47 -0
  6. package/blocks/colour.js +13 -3
  7. package/blocks/lists.js +22 -13
  8. package/blocks/logic.js +13 -3
  9. package/blocks/loops.js +24 -11
  10. package/blocks/math.js +12 -3
  11. package/blocks/procedures.js +41 -27
  12. package/blocks/text.js +22 -13
  13. package/blocks/variables.js +14 -3
  14. package/blocks/variables_dynamic.js +13 -3
  15. package/blocks_compressed.js +146 -141
  16. package/blocks_compressed.js.map +1 -1
  17. package/core/block.js +1869 -1814
  18. package/core/block_drag_surface.js +201 -200
  19. package/core/block_dragger.js +377 -373
  20. package/core/block_svg.js +1593 -1479
  21. package/core/blockly.js +8 -22
  22. package/core/blocks.js +9 -2
  23. package/core/browser_events.js +22 -5
  24. package/core/bubble.js +841 -797
  25. package/core/bubble_dragger.js +213 -206
  26. package/core/bump_objects.js +2 -2
  27. package/core/clipboard.js +9 -9
  28. package/core/comment.js +353 -332
  29. package/core/common.js +46 -17
  30. package/core/component_manager.js +181 -174
  31. package/core/config.js +87 -0
  32. package/core/connection.js +595 -584
  33. package/core/connection_checker.js +242 -244
  34. package/core/connection_db.js +235 -230
  35. package/core/contextmenu.js +9 -6
  36. package/core/contextmenu_items.js +1 -2
  37. package/core/contextmenu_registry.js +93 -89
  38. package/core/css.js +474 -474
  39. package/core/delete_area.js +45 -42
  40. package/core/drag_target.js +57 -56
  41. package/core/dropdowndiv.js +153 -163
  42. package/core/events/events.js +2 -2
  43. package/core/events/events_abstract.js +89 -77
  44. package/core/events/events_block_base.js +37 -36
  45. package/core/events/events_block_change.js +130 -124
  46. package/core/events/events_block_create.js +73 -71
  47. package/core/events/events_block_delete.js +84 -82
  48. package/core/events/events_block_drag.js +50 -49
  49. package/core/events/events_block_move.js +147 -140
  50. package/core/events/events_bubble_open.js +51 -50
  51. package/core/events/events_click.js +48 -44
  52. package/core/events/events_comment_base.js +72 -69
  53. package/core/events/events_comment_change.js +63 -61
  54. package/core/events/events_comment_create.js +44 -42
  55. package/core/events/events_comment_delete.js +42 -40
  56. package/core/events/events_comment_move.js +106 -104
  57. package/core/events/events_marker_move.js +65 -64
  58. package/core/events/events_selected.js +46 -45
  59. package/core/events/events_theme_change.js +36 -35
  60. package/core/events/events_toolbox_item_select.js +46 -45
  61. package/core/events/events_trashcan_open.js +37 -36
  62. package/core/events/events_ui.js +47 -46
  63. package/core/events/events_ui_base.js +30 -29
  64. package/core/events/events_var_base.js +37 -36
  65. package/core/events/events_var_create.js +50 -48
  66. package/core/events/events_var_delete.js +50 -48
  67. package/core/events/events_var_rename.js +51 -49
  68. package/core/events/events_viewport.js +66 -65
  69. package/core/events/utils.js +29 -14
  70. package/core/events/workspace_events.js +49 -55
  71. package/core/extensions.js +4 -3
  72. package/core/field.js +1061 -997
  73. package/core/field_angle.js +462 -442
  74. package/core/field_checkbox.js +194 -182
  75. package/core/field_colour.js +519 -505
  76. package/core/field_dropdown.js +617 -598
  77. package/core/field_image.js +229 -220
  78. package/core/field_label.js +102 -91
  79. package/core/field_label_serializable.js +42 -41
  80. package/core/field_multilineinput.js +372 -358
  81. package/core/field_number.js +272 -253
  82. package/core/field_textinput.js +499 -467
  83. package/core/field_variable.js +458 -420
  84. package/core/flyout_base.js +1005 -952
  85. package/core/flyout_button.js +277 -260
  86. package/core/flyout_horizontal.js +304 -302
  87. package/core/flyout_metrics_manager.js +64 -64
  88. package/core/flyout_vertical.js +306 -300
  89. package/core/generator.js +459 -446
  90. package/core/gesture.js +829 -813
  91. package/core/grid.js +166 -163
  92. package/core/icon.js +168 -159
  93. package/core/inject.js +7 -5
  94. package/core/input.js +257 -248
  95. package/core/insertion_marker_manager.js +655 -624
  96. package/core/internal_constants.js +0 -129
  97. package/core/keyboard_nav/ast_node.js +605 -596
  98. package/core/keyboard_nav/basic_cursor.js +166 -165
  99. package/core/keyboard_nav/cursor.js +99 -97
  100. package/core/keyboard_nav/marker.js +83 -79
  101. package/core/keyboard_nav/tab_navigate_cursor.js +18 -23
  102. package/core/marker_manager.js +153 -141
  103. package/core/menu.js +377 -372
  104. package/core/menuitem.js +223 -217
  105. package/core/metrics_manager.js +403 -390
  106. package/core/mutator.js +468 -437
  107. package/core/names.js +229 -188
  108. package/core/options.js +290 -284
  109. package/core/procedures.js +29 -17
  110. package/core/registry.js +19 -16
  111. package/core/rendered_connection.js +482 -463
  112. package/core/renderers/common/block_rendering.js +9 -3
  113. package/core/renderers/common/constants.js +1119 -1112
  114. package/core/renderers/common/debug.js +14 -0
  115. package/core/renderers/common/debugger.js +338 -316
  116. package/core/renderers/common/drawer.js +380 -370
  117. package/core/renderers/common/i_path_object.js +2 -2
  118. package/core/renderers/common/info.js +626 -618
  119. package/core/renderers/common/marker_svg.js +579 -541
  120. package/core/renderers/common/path_object.js +203 -200
  121. package/core/renderers/common/renderer.js +220 -218
  122. package/core/renderers/geras/constants.js +36 -36
  123. package/core/renderers/geras/drawer.js +155 -147
  124. package/core/renderers/geras/highlight_constants.js +244 -238
  125. package/core/renderers/geras/highlighter.js +231 -179
  126. package/core/renderers/geras/info.js +392 -369
  127. package/core/renderers/geras/measurables/inline_input.js +25 -19
  128. package/core/renderers/geras/measurables/statement_input.js +23 -17
  129. package/core/renderers/geras/path_object.js +106 -121
  130. package/core/renderers/geras/renderer.js +96 -98
  131. package/core/renderers/measurables/base.js +30 -18
  132. package/core/renderers/measurables/bottom_row.js +83 -80
  133. package/core/renderers/measurables/connection.js +22 -15
  134. package/core/renderers/measurables/external_value_input.js +35 -22
  135. package/core/renderers/measurables/field.js +35 -20
  136. package/core/renderers/measurables/hat.js +18 -13
  137. package/core/renderers/measurables/icon.js +24 -17
  138. package/core/renderers/measurables/in_row_spacer.js +15 -13
  139. package/core/renderers/measurables/inline_input.js +43 -33
  140. package/core/renderers/measurables/input_connection.js +41 -28
  141. package/core/renderers/measurables/input_row.js +50 -44
  142. package/core/renderers/measurables/jagged_edge.js +14 -12
  143. package/core/renderers/measurables/next_connection.js +16 -14
  144. package/core/renderers/measurables/output_connection.js +26 -20
  145. package/core/renderers/measurables/previous_connection.js +16 -15
  146. package/core/renderers/measurables/round_corner.js +20 -18
  147. package/core/renderers/measurables/row.js +184 -168
  148. package/core/renderers/measurables/spacer_row.js +38 -23
  149. package/core/renderers/measurables/square_corner.js +18 -16
  150. package/core/renderers/measurables/statement_input.js +23 -20
  151. package/core/renderers/measurables/top_row.js +88 -85
  152. package/core/renderers/minimalist/constants.js +8 -7
  153. package/core/renderers/minimalist/drawer.js +11 -10
  154. package/core/renderers/minimalist/info.js +18 -18
  155. package/core/renderers/minimalist/renderer.js +40 -39
  156. package/core/renderers/thrasos/info.js +258 -248
  157. package/core/renderers/thrasos/renderer.js +20 -20
  158. package/core/renderers/zelos/constants.js +898 -873
  159. package/core/renderers/zelos/drawer.js +186 -169
  160. package/core/renderers/zelos/info.js +502 -479
  161. package/core/renderers/zelos/marker_svg.js +129 -115
  162. package/core/renderers/zelos/measurables/bottom_row.js +31 -30
  163. package/core/renderers/zelos/measurables/inputs.js +22 -21
  164. package/core/renderers/zelos/measurables/row_elements.js +14 -13
  165. package/core/renderers/zelos/measurables/top_row.js +34 -33
  166. package/core/renderers/zelos/path_object.js +181 -180
  167. package/core/renderers/zelos/renderer.js +91 -92
  168. package/core/scrollbar.js +759 -713
  169. package/core/scrollbar_pair.js +250 -245
  170. package/core/serialization/blocks.js +19 -9
  171. package/core/serialization/workspaces.js +3 -2
  172. package/core/shortcut_registry.js +286 -277
  173. package/core/sprites.js +31 -0
  174. package/core/theme.js +135 -141
  175. package/core/theme_manager.js +147 -143
  176. package/core/toolbox/category.js +602 -576
  177. package/core/toolbox/collapsible_category.js +226 -227
  178. package/core/toolbox/separator.js +70 -61
  179. package/core/toolbox/toolbox.js +934 -927
  180. package/core/toolbox/toolbox_item.js +115 -99
  181. package/core/tooltip.js +108 -35
  182. package/core/touch.js +8 -3
  183. package/core/touch_gesture.js +254 -251
  184. package/core/trashcan.js +606 -595
  185. package/core/utils/coordinate.js +97 -95
  186. package/core/utils/dom.js +2 -2
  187. package/core/utils/global.js +2 -0
  188. package/core/utils/rect.js +41 -37
  189. package/core/utils/sentinel.js +25 -0
  190. package/core/utils/size.js +30 -27
  191. package/core/utils/svg.js +18 -16
  192. package/core/variable_map.js +325 -341
  193. package/core/variable_model.js +55 -54
  194. package/core/variables.js +9 -2
  195. package/core/variables_dynamic.js +3 -1
  196. package/core/warning.js +126 -120
  197. package/core/widgetdiv.js +4 -4
  198. package/core/workspace.js +685 -664
  199. package/core/workspace_audio.js +124 -118
  200. package/core/workspace_comment.js +308 -298
  201. package/core/workspace_comment_svg.js +1029 -951
  202. package/core/workspace_drag_surface_svg.js +147 -140
  203. package/core/workspace_dragger.js +70 -71
  204. package/core/workspace_svg.js +2322 -2297
  205. package/core/xml.js +30 -20
  206. package/core/zoom_controls.js +431 -439
  207. package/dart_compressed.js +40 -43
  208. package/dart_compressed.js.map +1 -1
  209. package/generators/dart/colour.js +56 -64
  210. package/generators/dart/lists.js +61 -50
  211. package/generators/dart/math.js +160 -148
  212. package/generators/dart/text.js +83 -61
  213. package/generators/javascript/colour.js +37 -34
  214. package/generators/javascript/lists.js +50 -43
  215. package/generators/javascript/math.js +123 -139
  216. package/generators/javascript/text.js +67 -81
  217. package/generators/lua/colour.js +25 -23
  218. package/generators/lua/lists.js +97 -69
  219. package/generators/lua/logic.js +1 -2
  220. package/generators/lua/math.js +182 -144
  221. package/generators/lua/text.js +116 -99
  222. package/generators/php/colour.js +38 -32
  223. package/generators/php/lists.js +109 -89
  224. package/generators/php/math.js +90 -81
  225. package/generators/php/text.js +63 -61
  226. package/generators/python/colour.js +18 -18
  227. package/generators/python/lists.js +38 -30
  228. package/generators/python/loops.js +12 -8
  229. package/generators/python/math.js +104 -106
  230. package/generators/python/text.js +34 -30
  231. package/javascript_compressed.js +37 -39
  232. package/javascript_compressed.js.map +1 -1
  233. package/lua_compressed.js +39 -42
  234. package/lua_compressed.js.map +1 -1
  235. package/msg/az.js +2 -2
  236. package/msg/be.js +4 -4
  237. package/msg/cs.js +15 -15
  238. package/msg/de.js +1 -1
  239. package/msg/diq.js +1 -1
  240. package/msg/eo.js +1 -1
  241. package/msg/es.js +1 -1
  242. package/msg/fa.js +1 -1
  243. package/msg/fr.js +4 -4
  244. package/msg/he.js +1 -1
  245. package/msg/hr.js +2 -2
  246. package/msg/hy.js +2 -2
  247. package/msg/id.js +12 -12
  248. package/msg/inh.js +14 -14
  249. package/msg/ja.js +7 -7
  250. package/msg/lv.js +29 -29
  251. package/msg/pa.js +3 -3
  252. package/msg/smn.js +436 -0
  253. package/msg/te.js +1 -1
  254. package/msg/yue.js +1 -1
  255. package/msg/zh-hans.js +3 -3
  256. package/msg/zh-hant.js +3 -3
  257. package/package.json +7 -6
  258. package/php_compressed.js +38 -42
  259. package/php_compressed.js.map +1 -1
  260. package/python_compressed.js +26 -25
  261. package/python_compressed.js.map +1 -1
  262. package/blocks/all.js +0 -23
@@ -16,7 +16,6 @@
16
16
  goog.module('Blockly.Events.BlockMove');
17
17
 
18
18
  const eventUtils = goog.require('Blockly.Events.utils');
19
- const object = goog.require('Blockly.utils.object');
20
19
  const registry = goog.require('Blockly.registry');
21
20
  const {BlockBase} = goog.require('Blockly.Events.BlockBase');
22
21
  /* eslint-disable-next-line no-unused-vars */
@@ -27,168 +26,176 @@ const {Coordinate} = goog.require('Blockly.utils.Coordinate');
27
26
 
28
27
  /**
29
28
  * Class for a block move event. Created before the move.
30
- * @param {!Block=} opt_block The moved block. Undefined for a blank
31
- * event.
32
29
  * @extends {BlockBase}
33
- * @constructor
34
30
  * @alias Blockly.Events.BlockMove
35
31
  */
36
- const BlockMove = function(opt_block) {
37
- BlockMove.superClass_.constructor.call(this, opt_block);
38
- if (!opt_block) {
39
- return; // Blank event to be populated by fromJson.
40
- }
41
- if (opt_block.isShadow()) {
42
- // Moving shadow blocks is handled via disconnection.
43
- this.recordUndo = false;
44
- }
32
+ class BlockMove extends BlockBase {
33
+ /**
34
+ * @param {!Block=} opt_block The moved block. Undefined for a blank
35
+ * event.
36
+ */
37
+ constructor(opt_block) {
38
+ super(opt_block);
45
39
 
46
- const location = this.currentLocation_();
47
- this.oldParentId = location.parentId;
48
- this.oldInputName = location.inputName;
49
- this.oldCoordinate = location.coordinate;
50
- };
51
- object.inherits(BlockMove, BlockBase);
40
+ /**
41
+ * Type of this event.
42
+ * @type {string}
43
+ */
44
+ this.type = eventUtils.BLOCK_MOVE;
52
45
 
53
- /**
54
- * Type of this event.
55
- * @type {string}
56
- */
57
- BlockMove.prototype.type = eventUtils.BLOCK_MOVE;
46
+ if (!opt_block) {
47
+ return; // Blank event to be populated by fromJson.
48
+ }
49
+ if (opt_block.isShadow()) {
50
+ // Moving shadow blocks is handled via disconnection.
51
+ this.recordUndo = false;
52
+ }
58
53
 
59
- /**
60
- * Encode the event as JSON.
61
- * @return {!Object} JSON representation.
62
- */
63
- BlockMove.prototype.toJson = function() {
64
- const json = BlockMove.superClass_.toJson.call(this);
65
- if (this.newParentId) {
66
- json['newParentId'] = this.newParentId;
67
- }
68
- if (this.newInputName) {
69
- json['newInputName'] = this.newInputName;
70
- }
71
- if (this.newCoordinate) {
72
- json['newCoordinate'] = Math.round(this.newCoordinate.x) + ',' +
73
- Math.round(this.newCoordinate.y);
74
- }
75
- if (!this.recordUndo) {
76
- json['recordUndo'] = this.recordUndo;
77
- }
78
- return json;
79
- };
54
+ const location = this.currentLocation_();
55
+ this.oldParentId = location.parentId;
56
+ this.oldInputName = location.inputName;
57
+ this.oldCoordinate = location.coordinate;
80
58
 
81
- /**
82
- * Decode the JSON event.
83
- * @param {!Object} json JSON representation.
84
- */
85
- BlockMove.prototype.fromJson = function(json) {
86
- BlockMove.superClass_.fromJson.call(this, json);
87
- this.newParentId = json['newParentId'];
88
- this.newInputName = json['newInputName'];
89
- if (json['newCoordinate']) {
90
- const xy = json['newCoordinate'].split(',');
91
- this.newCoordinate = new Coordinate(Number(xy[0]), Number(xy[1]));
59
+ this.newParentId = null;
60
+ this.newInputName = null;
61
+ this.newCoordinate = null;
92
62
  }
93
- if (json['recordUndo'] !== undefined) {
94
- this.recordUndo = json['recordUndo'];
95
- }
96
- };
97
63
 
98
- /**
99
- * Record the block's new location. Called after the move.
100
- */
101
- BlockMove.prototype.recordNew = function() {
102
- const location = this.currentLocation_();
103
- this.newParentId = location.parentId;
104
- this.newInputName = location.inputName;
105
- this.newCoordinate = location.coordinate;
106
- };
107
-
108
- /**
109
- * Returns the parentId and input if the block is connected,
110
- * or the XY location if disconnected.
111
- * @return {!Object} Collection of location info.
112
- * @private
113
- */
114
- BlockMove.prototype.currentLocation_ = function() {
115
- const workspace = this.getEventWorkspace_();
116
- const block = workspace.getBlockById(this.blockId);
117
- const location = {};
118
- const parent = block.getParent();
119
- if (parent) {
120
- location.parentId = parent.id;
121
- const input = parent.getInputWithBlock(block);
122
- if (input) {
123
- location.inputName = input.name;
64
+ /**
65
+ * Encode the event as JSON.
66
+ * @return {!Object} JSON representation.
67
+ */
68
+ toJson() {
69
+ const json = super.toJson();
70
+ if (this.newParentId) {
71
+ json['newParentId'] = this.newParentId;
72
+ }
73
+ if (this.newInputName) {
74
+ json['newInputName'] = this.newInputName;
75
+ }
76
+ if (this.newCoordinate) {
77
+ json['newCoordinate'] = Math.round(this.newCoordinate.x) + ',' +
78
+ Math.round(this.newCoordinate.y);
124
79
  }
125
- } else {
126
- location.coordinate = block.getRelativeToSurfaceXY();
80
+ if (!this.recordUndo) {
81
+ json['recordUndo'] = this.recordUndo;
82
+ }
83
+ return json;
127
84
  }
128
- return location;
129
- };
130
85
 
131
- /**
132
- * Does this event record any change of state?
133
- * @return {boolean} False if something changed.
134
- */
135
- BlockMove.prototype.isNull = function() {
136
- return this.oldParentId === this.newParentId &&
137
- this.oldInputName === this.newInputName &&
138
- Coordinate.equals(this.oldCoordinate, this.newCoordinate);
139
- };
86
+ /**
87
+ * Decode the JSON event.
88
+ * @param {!Object} json JSON representation.
89
+ */
90
+ fromJson(json) {
91
+ super.fromJson(json);
92
+ this.newParentId = json['newParentId'];
93
+ this.newInputName = json['newInputName'];
94
+ if (json['newCoordinate']) {
95
+ const xy = json['newCoordinate'].split(',');
96
+ this.newCoordinate = new Coordinate(Number(xy[0]), Number(xy[1]));
97
+ }
98
+ if (json['recordUndo'] !== undefined) {
99
+ this.recordUndo = json['recordUndo'];
100
+ }
101
+ }
140
102
 
141
- /**
142
- * Run a move event.
143
- * @param {boolean} forward True if run forward, false if run backward (undo).
144
- */
145
- BlockMove.prototype.run = function(forward) {
146
- const workspace = this.getEventWorkspace_();
147
- const block = workspace.getBlockById(this.blockId);
148
- if (!block) {
149
- console.warn('Can\'t move non-existent block: ' + this.blockId);
150
- return;
103
+ /**
104
+ * Record the block's new location. Called after the move.
105
+ */
106
+ recordNew() {
107
+ const location = this.currentLocation_();
108
+ this.newParentId = location.parentId;
109
+ this.newInputName = location.inputName;
110
+ this.newCoordinate = location.coordinate;
151
111
  }
152
- const parentId = forward ? this.newParentId : this.oldParentId;
153
- const inputName = forward ? this.newInputName : this.oldInputName;
154
- const coordinate = forward ? this.newCoordinate : this.oldCoordinate;
155
- let parentBlock;
156
- if (parentId) {
157
- parentBlock = workspace.getBlockById(parentId);
158
- if (!parentBlock) {
159
- console.warn('Can\'t connect to non-existent block: ' + parentId);
160
- return;
112
+
113
+ /**
114
+ * Returns the parentId and input if the block is connected,
115
+ * or the XY location if disconnected.
116
+ * @return {!Object} Collection of location info.
117
+ * @private
118
+ */
119
+ currentLocation_() {
120
+ const workspace = this.getEventWorkspace_();
121
+ const block = workspace.getBlockById(this.blockId);
122
+ const location = {};
123
+ const parent = block.getParent();
124
+ if (parent) {
125
+ location.parentId = parent.id;
126
+ const input = parent.getInputWithBlock(block);
127
+ if (input) {
128
+ location.inputName = input.name;
129
+ }
130
+ } else {
131
+ location.coordinate = block.getRelativeToSurfaceXY();
161
132
  }
133
+ return location;
162
134
  }
163
- if (block.getParent()) {
164
- block.unplug();
135
+
136
+ /**
137
+ * Does this event record any change of state?
138
+ * @return {boolean} False if something changed.
139
+ */
140
+ isNull() {
141
+ return this.oldParentId === this.newParentId &&
142
+ this.oldInputName === this.newInputName &&
143
+ Coordinate.equals(this.oldCoordinate, this.newCoordinate);
165
144
  }
166
- if (coordinate) {
167
- const xy = block.getRelativeToSurfaceXY();
168
- block.moveBy(coordinate.x - xy.x, coordinate.y - xy.y);
169
- } else {
170
- let blockConnection = block.outputConnection;
171
- if (!blockConnection ||
172
- (block.previousConnection && block.previousConnection.isConnected())) {
173
- blockConnection = block.previousConnection;
145
+
146
+ /**
147
+ * Run a move event.
148
+ * @param {boolean} forward True if run forward, false if run backward (undo).
149
+ */
150
+ run(forward) {
151
+ const workspace = this.getEventWorkspace_();
152
+ const block = workspace.getBlockById(this.blockId);
153
+ if (!block) {
154
+ console.warn('Can\'t move non-existent block: ' + this.blockId);
155
+ return;
174
156
  }
175
- let parentConnection;
176
- const connectionType = blockConnection.type;
177
- if (inputName) {
178
- const input = parentBlock.getInput(inputName);
179
- if (input) {
180
- parentConnection = input.connection;
157
+ const parentId = forward ? this.newParentId : this.oldParentId;
158
+ const inputName = forward ? this.newInputName : this.oldInputName;
159
+ const coordinate = forward ? this.newCoordinate : this.oldCoordinate;
160
+ let parentBlock;
161
+ if (parentId) {
162
+ parentBlock = workspace.getBlockById(parentId);
163
+ if (!parentBlock) {
164
+ console.warn('Can\'t connect to non-existent block: ' + parentId);
165
+ return;
181
166
  }
182
- } else if (connectionType === ConnectionType.PREVIOUS_STATEMENT) {
183
- parentConnection = parentBlock.nextConnection;
184
167
  }
185
- if (parentConnection) {
186
- blockConnection.connect(parentConnection);
168
+ if (block.getParent()) {
169
+ block.unplug();
170
+ }
171
+ if (coordinate) {
172
+ const xy = block.getRelativeToSurfaceXY();
173
+ block.moveBy(coordinate.x - xy.x, coordinate.y - xy.y);
187
174
  } else {
188
- console.warn('Can\'t connect to non-existent input: ' + inputName);
175
+ let blockConnection = block.outputConnection;
176
+ if (!blockConnection ||
177
+ (block.previousConnection &&
178
+ block.previousConnection.isConnected())) {
179
+ blockConnection = block.previousConnection;
180
+ }
181
+ let parentConnection;
182
+ const connectionType = blockConnection.type;
183
+ if (inputName) {
184
+ const input = parentBlock.getInput(inputName);
185
+ if (input) {
186
+ parentConnection = input.connection;
187
+ }
188
+ } else if (connectionType === ConnectionType.PREVIOUS_STATEMENT) {
189
+ parentConnection = parentBlock.nextConnection;
190
+ }
191
+ if (parentConnection) {
192
+ blockConnection.connect(parentConnection);
193
+ } else {
194
+ console.warn('Can\'t connect to non-existent input: ' + inputName);
195
+ }
189
196
  }
190
197
  }
191
- };
198
+ }
192
199
 
193
200
  registry.register(registry.Type.EVENT, eventUtils.MOVE, BlockMove);
194
201
 
@@ -16,7 +16,6 @@
16
16
  goog.module('Blockly.Events.BubbleOpen');
17
17
 
18
18
  const eventUtils = goog.require('Blockly.Events.utils');
19
- const object = goog.require('Blockly.utils.object');
20
19
  const registry = goog.require('Blockly.registry');
21
20
  /* eslint-disable-next-line no-unused-vars */
22
21
  const {BlockSvg} = goog.requireType('Blockly.BlockSvg');
@@ -25,64 +24,66 @@ const {UiBase} = goog.require('Blockly.Events.UiBase');
25
24
 
26
25
  /**
27
26
  * Class for a bubble open event.
28
- * @param {BlockSvg} opt_block The associated block. Undefined for a
29
- * blank event.
30
- * @param {boolean=} opt_isOpen Whether the bubble is opening (false if
31
- * closing). Undefined for a blank event.
32
- * @param {string=} opt_bubbleType The type of bubble. One of 'mutator',
33
- * 'comment'
34
- * or 'warning'. Undefined for a blank event.
35
27
  * @extends {UiBase}
36
- * @constructor
37
28
  * @alias Blockly.Events.BubbleOpen
38
29
  */
39
- const BubbleOpen = function(opt_block, opt_isOpen, opt_bubbleType) {
40
- const workspaceId = opt_block ? opt_block.workspace.id : undefined;
41
- BubbleOpen.superClass_.constructor.call(this, workspaceId);
42
- this.blockId = opt_block ? opt_block.id : null;
43
-
30
+ class BubbleOpen extends UiBase {
44
31
  /**
45
- * Whether the bubble is opening (false if closing).
46
- * @type {boolean|undefined}
32
+ * @param {BlockSvg} opt_block The associated block. Undefined for a
33
+ * blank event.
34
+ * @param {boolean=} opt_isOpen Whether the bubble is opening (false if
35
+ * closing). Undefined for a blank event.
36
+ * @param {string=} opt_bubbleType The type of bubble. One of 'mutator',
37
+ * 'comment'
38
+ * or 'warning'. Undefined for a blank event.
47
39
  */
48
- this.isOpen = opt_isOpen;
40
+ constructor(opt_block, opt_isOpen, opt_bubbleType) {
41
+ const workspaceId = opt_block ? opt_block.workspace.id : undefined;
42
+ super(workspaceId);
43
+ this.blockId = opt_block ? opt_block.id : null;
49
44
 
50
- /**
51
- * The type of bubble. One of 'mutator', 'comment', or 'warning'.
52
- * @type {string|undefined}
53
- */
54
- this.bubbleType = opt_bubbleType;
55
- };
56
- object.inherits(BubbleOpen, UiBase);
45
+ /**
46
+ * Whether the bubble is opening (false if closing).
47
+ * @type {boolean|undefined}
48
+ */
49
+ this.isOpen = opt_isOpen;
57
50
 
58
- /**
59
- * Type of this event.
60
- * @type {string}
61
- */
62
- BubbleOpen.prototype.type = eventUtils.BUBBLE_OPEN;
51
+ /**
52
+ * The type of bubble. One of 'mutator', 'comment', or 'warning'.
53
+ * @type {string|undefined}
54
+ */
55
+ this.bubbleType = opt_bubbleType;
63
56
 
64
- /**
65
- * Encode the event as JSON.
66
- * @return {!Object} JSON representation.
67
- */
68
- BubbleOpen.prototype.toJson = function() {
69
- const json = BubbleOpen.superClass_.toJson.call(this);
70
- json['isOpen'] = this.isOpen;
71
- json['bubbleType'] = this.bubbleType;
72
- json['blockId'] = this.blockId;
73
- return json;
74
- };
57
+ /**
58
+ * Type of this event.
59
+ * @type {string}
60
+ */
61
+ this.type = eventUtils.BUBBLE_OPEN;
62
+ }
75
63
 
76
- /**
77
- * Decode the JSON event.
78
- * @param {!Object} json JSON representation.
79
- */
80
- BubbleOpen.prototype.fromJson = function(json) {
81
- BubbleOpen.superClass_.fromJson.call(this, json);
82
- this.isOpen = json['isOpen'];
83
- this.bubbleType = json['bubbleType'];
84
- this.blockId = json['blockId'];
85
- };
64
+ /**
65
+ * Encode the event as JSON.
66
+ * @return {!Object} JSON representation.
67
+ */
68
+ toJson() {
69
+ const json = super.toJson();
70
+ json['isOpen'] = this.isOpen;
71
+ json['bubbleType'] = this.bubbleType;
72
+ json['blockId'] = this.blockId;
73
+ return json;
74
+ }
75
+
76
+ /**
77
+ * Decode the JSON event.
78
+ * @param {!Object} json JSON representation.
79
+ */
80
+ fromJson(json) {
81
+ super.fromJson(json);
82
+ this.isOpen = json['isOpen'];
83
+ this.bubbleType = json['bubbleType'];
84
+ this.blockId = json['blockId'];
85
+ }
86
+ }
86
87
 
87
88
  registry.register(registry.Type.EVENT, eventUtils.BUBBLE_OPEN, BubbleOpen);
88
89
 
@@ -16,7 +16,6 @@
16
16
  goog.module('Blockly.Events.Click');
17
17
 
18
18
  const eventUtils = goog.require('Blockly.Events.utils');
19
- const object = goog.require('Blockly.utils.object');
20
19
  const registry = goog.require('Blockly.registry');
21
20
  /* eslint-disable-next-line no-unused-vars */
22
21
  const {Block} = goog.requireType('Blockly.Block');
@@ -25,58 +24,63 @@ const {UiBase} = goog.require('Blockly.Events.UiBase');
25
24
 
26
25
  /**
27
26
  * Class for a click event.
28
- * @param {?Block=} opt_block The affected block. Null for click events
29
- * that do not have an associated block (i.e. workspace click). Undefined
30
- * for a blank event.
31
- * @param {?string=} opt_workspaceId The workspace identifier for this event.
32
- * Not used if block is passed. Undefined for a blank event.
33
- * @param {string=} opt_targetType The type of element targeted by this click
34
- * event. Undefined for a blank event.
35
27
  * @extends {UiBase}
36
- * @constructor
37
28
  * @alias Blockly.Events.Click
38
29
  */
39
- const Click = function(opt_block, opt_workspaceId, opt_targetType) {
40
- const workspaceId = opt_block ? opt_block.workspace.id : opt_workspaceId;
41
- Click.superClass_.constructor.call(this, workspaceId);
42
- this.blockId = opt_block ? opt_block.id : null;
43
-
30
+ class Click extends UiBase {
44
31
  /**
45
- * The type of element targeted by this click event.
46
- * @type {string|undefined}
32
+ * @param {?Block=} opt_block The affected block. Null for click events
33
+ * that do not have an associated block (i.e. workspace click). Undefined
34
+ * for a blank event.
35
+ * @param {?string=} opt_workspaceId The workspace identifier for this event.
36
+ * Not used if block is passed. Undefined for a blank event.
37
+ * @param {string=} opt_targetType The type of element targeted by this click
38
+ * event. Undefined for a blank event.
47
39
  */
48
- this.targetType = opt_targetType;
49
- };
50
- object.inherits(Click, UiBase);
40
+ constructor(opt_block, opt_workspaceId, opt_targetType) {
41
+ let workspaceId = opt_block ? opt_block.workspace.id : opt_workspaceId;
42
+ if (workspaceId === null) {
43
+ workspaceId = undefined;
44
+ }
45
+ super(workspaceId);
46
+ this.blockId = opt_block ? opt_block.id : null;
51
47
 
52
- /**
53
- * Type of this event.
54
- * @type {string}
55
- */
56
- Click.prototype.type = eventUtils.CLICK;
48
+ /**
49
+ * The type of element targeted by this click event.
50
+ * @type {string|undefined}
51
+ */
52
+ this.targetType = opt_targetType;
57
53
 
58
- /**
59
- * Encode the event as JSON.
60
- * @return {!Object} JSON representation.
61
- */
62
- Click.prototype.toJson = function() {
63
- const json = Click.superClass_.toJson.call(this);
64
- json['targetType'] = this.targetType;
65
- if (this.blockId) {
66
- json['blockId'] = this.blockId;
54
+ /**
55
+ * Type of this event.
56
+ * @type {string}
57
+ */
58
+ this.type = eventUtils.CLICK;
67
59
  }
68
- return json;
69
- };
70
60
 
71
- /**
72
- * Decode the JSON event.
73
- * @param {!Object} json JSON representation.
74
- */
75
- Click.prototype.fromJson = function(json) {
76
- Click.superClass_.fromJson.call(this, json);
77
- this.targetType = json['targetType'];
78
- this.blockId = json['blockId'];
79
- };
61
+ /**
62
+ * Encode the event as JSON.
63
+ * @return {!Object} JSON representation.
64
+ */
65
+ toJson() {
66
+ const json = super.toJson();
67
+ json['targetType'] = this.targetType;
68
+ if (this.blockId) {
69
+ json['blockId'] = this.blockId;
70
+ }
71
+ return json;
72
+ }
73
+
74
+ /**
75
+ * Decode the JSON event.
76
+ * @param {!Object} json JSON representation.
77
+ */
78
+ fromJson(json) {
79
+ super.fromJson(json);
80
+ this.targetType = json['targetType'];
81
+ this.blockId = json['blockId'];
82
+ }
83
+ }
80
84
 
81
85
  registry.register(registry.Type.EVENT, eventUtils.CLICK, Click);
82
86