blockly 7.20211209.2 → 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
@@ -18,7 +18,6 @@ goog.module('Blockly.Events.BlockCreate');
18
18
  const Xml = goog.require('Blockly.Xml');
19
19
  const blocks = goog.require('Blockly.serialization.blocks');
20
20
  const eventUtils = goog.require('Blockly.Events.utils');
21
- const object = goog.require('Blockly.utils.object');
22
21
  const registry = goog.require('Blockly.registry');
23
22
  const {BlockBase} = goog.require('Blockly.Events.BlockBase');
24
23
  /* eslint-disable-next-line no-unused-vars */
@@ -27,90 +26,93 @@ const {Block} = goog.requireType('Blockly.Block');
27
26
 
28
27
  /**
29
28
  * Class for a block creation event.
30
- * @param {!Block=} opt_block The created block. Undefined for a blank
31
- * event.
32
29
  * @extends {BlockBase}
33
- * @constructor
34
30
  * @alias Blockly.Events.BlockCreate
35
31
  */
36
- const BlockCreate = function(opt_block) {
37
- BlockCreate.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
- }
45
-
46
- this.xml = Xml.blockToDomWithXY(opt_block);
47
- this.ids = eventUtils.getDescendantIds(opt_block);
48
-
32
+ class BlockCreate extends BlockBase {
49
33
  /**
50
- * JSON representation of the block that was just created.
51
- * @type {!blocks.State}
34
+ * @param {!Block=} opt_block The created block. Undefined for a blank
35
+ * event.
52
36
  */
53
- this.json = /** @type {!blocks.State} */ (
54
- blocks.save(opt_block, {addCoordinates: true}));
55
- };
56
- object.inherits(BlockCreate, BlockBase);
37
+ constructor(opt_block) {
38
+ super(opt_block);
57
39
 
58
- /**
59
- * Type of this event.
60
- * @type {string}
61
- */
62
- BlockCreate.prototype.type = eventUtils.BLOCK_CREATE;
40
+ /**
41
+ * Type of this event.
42
+ * @type {string}
43
+ */
44
+ this.type = eventUtils.BLOCK_CREATE;
63
45
 
64
- /**
65
- * Encode the event as JSON.
66
- * @return {!Object} JSON representation.
67
- */
68
- BlockCreate.prototype.toJson = function() {
69
- const json = BlockCreate.superClass_.toJson.call(this);
70
- json['xml'] = Xml.domToText(this.xml);
71
- json['ids'] = this.ids;
72
- json['json'] = this.json;
73
- if (!this.recordUndo) {
74
- json['recordUndo'] = this.recordUndo;
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
+ }
53
+
54
+ this.xml = Xml.blockToDomWithXY(opt_block);
55
+ this.ids = eventUtils.getDescendantIds(opt_block);
56
+
57
+ /**
58
+ * JSON representation of the block that was just created.
59
+ * @type {!blocks.State}
60
+ */
61
+ this.json = /** @type {!blocks.State} */ (
62
+ blocks.save(opt_block, {addCoordinates: true}));
75
63
  }
76
- return json;
77
- };
78
64
 
79
- /**
80
- * Decode the JSON event.
81
- * @param {!Object} json JSON representation.
82
- */
83
- BlockCreate.prototype.fromJson = function(json) {
84
- BlockCreate.superClass_.fromJson.call(this, json);
85
- this.xml = Xml.textToDom(json['xml']);
86
- this.ids = json['ids'];
87
- this.json = /** @type {!blocks.State} */ (json['json']);
88
- if (json['recordUndo'] !== undefined) {
89
- this.recordUndo = json['recordUndo'];
65
+ /**
66
+ * Encode the event as JSON.
67
+ * @return {!Object} JSON representation.
68
+ */
69
+ toJson() {
70
+ const json = super.toJson();
71
+ json['xml'] = Xml.domToText(this.xml);
72
+ json['ids'] = this.ids;
73
+ json['json'] = this.json;
74
+ if (!this.recordUndo) {
75
+ json['recordUndo'] = this.recordUndo;
76
+ }
77
+ return json;
90
78
  }
91
- };
92
79
 
93
- /**
94
- * Run a creation event.
95
- * @param {boolean} forward True if run forward, false if run backward (undo).
96
- */
97
- BlockCreate.prototype.run = function(forward) {
98
- const workspace = this.getEventWorkspace_();
99
- if (forward) {
100
- blocks.append(this.json, workspace);
101
- } else {
102
- for (let i = 0; i < this.ids.length; i++) {
103
- const id = this.ids[i];
104
- const block = workspace.getBlockById(id);
105
- if (block) {
106
- block.dispose(false);
107
- } else if (id === this.blockId) {
108
- // Only complain about root-level block.
109
- console.warn('Can\'t uncreate non-existent block: ' + id);
80
+ /**
81
+ * Decode the JSON event.
82
+ * @param {!Object} json JSON representation.
83
+ */
84
+ fromJson(json) {
85
+ super.fromJson(json);
86
+ this.xml = Xml.textToDom(json['xml']);
87
+ this.ids = json['ids'];
88
+ this.json = /** @type {!blocks.State} */ (json['json']);
89
+ if (json['recordUndo'] !== undefined) {
90
+ this.recordUndo = json['recordUndo'];
91
+ }
92
+ }
93
+
94
+ /**
95
+ * Run a creation event.
96
+ * @param {boolean} forward True if run forward, false if run backward (undo).
97
+ */
98
+ run(forward) {
99
+ const workspace = this.getEventWorkspace_();
100
+ if (forward) {
101
+ blocks.append(this.json, workspace);
102
+ } else {
103
+ for (let i = 0; i < this.ids.length; i++) {
104
+ const id = this.ids[i];
105
+ const block = workspace.getBlockById(id);
106
+ if (block) {
107
+ block.dispose(false);
108
+ } else if (id === this.blockId) {
109
+ // Only complain about root-level block.
110
+ console.warn('Can\'t uncreate non-existent block: ' + id);
111
+ }
110
112
  }
111
113
  }
112
114
  }
113
- };
115
+ }
114
116
 
115
117
  registry.register(registry.Type.EVENT, eventUtils.CREATE, BlockCreate);
116
118
 
@@ -18,7 +18,6 @@ goog.module('Blockly.Events.BlockDelete');
18
18
  const Xml = goog.require('Blockly.Xml');
19
19
  const blocks = goog.require('Blockly.serialization.blocks');
20
20
  const eventUtils = goog.require('Blockly.Events.utils');
21
- const object = goog.require('Blockly.utils.object');
22
21
  const registry = goog.require('Blockly.registry');
23
22
  const {BlockBase} = goog.require('Blockly.Events.BlockBase');
24
23
  /* eslint-disable-next-line no-unused-vars */
@@ -27,102 +26,105 @@ const {Block} = goog.requireType('Blockly.Block');
27
26
 
28
27
  /**
29
28
  * Class for a block deletion event.
30
- * @param {!Block=} opt_block The deleted block. Undefined for a blank
31
- * event.
32
29
  * @extends {BlockBase}
33
- * @constructor
34
30
  * @alias Blockly.Events.BlockDelete
35
31
  */
36
- const BlockDelete = function(opt_block) {
37
- BlockDelete.superClass_.constructor.call(this, opt_block);
38
- if (!opt_block) {
39
- return; // Blank event to be populated by fromJson.
40
- }
41
- if (opt_block.getParent()) {
42
- throw Error('Connected blocks cannot be deleted.');
43
- }
44
- if (opt_block.isShadow()) {
45
- // Respawning shadow blocks is handled via disconnection.
46
- this.recordUndo = false;
47
- }
48
-
49
- this.oldXml = Xml.blockToDomWithXY(opt_block);
50
- this.ids = eventUtils.getDescendantIds(opt_block);
51
-
32
+ class BlockDelete extends BlockBase {
52
33
  /**
53
- * Was the block that was just deleted a shadow?
54
- * @type {boolean}
34
+ * @param {!Block=} opt_block The deleted block. Undefined for a blank
35
+ * event.
55
36
  */
56
- this.wasShadow = opt_block.isShadow();
37
+ constructor(opt_block) {
38
+ super(opt_block);
57
39
 
58
- /**
59
- * JSON representation of the block that was just deleted.
60
- * @type {!blocks.State}
61
- */
62
- this.oldJson = /** @type {!blocks.State} */ (
63
- blocks.save(opt_block, {addCoordinates: true}));
64
- };
65
- object.inherits(BlockDelete, BlockBase);
40
+ /**
41
+ * Type of this event.
42
+ * @type {string}
43
+ */
44
+ this.type = eventUtils.BLOCK_DELETE;
66
45
 
67
- /**
68
- * Type of this event.
69
- * @type {string}
70
- */
71
- BlockDelete.prototype.type = eventUtils.BLOCK_DELETE;
46
+ if (!opt_block) {
47
+ return; // Blank event to be populated by fromJson.
48
+ }
49
+ if (opt_block.getParent()) {
50
+ throw Error('Connected blocks cannot be deleted.');
51
+ }
52
+ if (opt_block.isShadow()) {
53
+ // Respawning shadow blocks is handled via disconnection.
54
+ this.recordUndo = false;
55
+ }
72
56
 
73
- /**
74
- * Encode the event as JSON.
75
- * @return {!Object} JSON representation.
76
- */
77
- BlockDelete.prototype.toJson = function() {
78
- const json = BlockDelete.superClass_.toJson.call(this);
79
- json['oldXml'] = Xml.domToText(this.oldXml);
80
- json['ids'] = this.ids;
81
- json['wasShadow'] = this.wasShadow;
82
- json['oldJson'] = this.oldJson;
83
- if (!this.recordUndo) {
84
- json['recordUndo'] = this.recordUndo;
57
+ this.oldXml = Xml.blockToDomWithXY(opt_block);
58
+ this.ids = eventUtils.getDescendantIds(opt_block);
59
+
60
+ /**
61
+ * Was the block that was just deleted a shadow?
62
+ * @type {boolean}
63
+ */
64
+ this.wasShadow = opt_block.isShadow();
65
+
66
+ /**
67
+ * JSON representation of the block that was just deleted.
68
+ * @type {!blocks.State}
69
+ */
70
+ this.oldJson = /** @type {!blocks.State} */ (
71
+ blocks.save(opt_block, {addCoordinates: true}));
85
72
  }
86
- return json;
87
- };
88
73
 
89
- /**
90
- * Decode the JSON event.
91
- * @param {!Object} json JSON representation.
92
- */
93
- BlockDelete.prototype.fromJson = function(json) {
94
- BlockDelete.superClass_.fromJson.call(this, json);
95
- this.oldXml = Xml.textToDom(json['oldXml']);
96
- this.ids = json['ids'];
97
- this.wasShadow =
98
- json['wasShadow'] || this.oldXml.tagName.toLowerCase() === 'shadow';
99
- this.oldJson = /** @type {!blocks.State} */ (json['oldJson']);
100
- if (json['recordUndo'] !== undefined) {
101
- this.recordUndo = json['recordUndo'];
74
+ /**
75
+ * Encode the event as JSON.
76
+ * @return {!Object} JSON representation.
77
+ */
78
+ toJson() {
79
+ const json = super.toJson();
80
+ json['oldXml'] = Xml.domToText(this.oldXml);
81
+ json['ids'] = this.ids;
82
+ json['wasShadow'] = this.wasShadow;
83
+ json['oldJson'] = this.oldJson;
84
+ if (!this.recordUndo) {
85
+ json['recordUndo'] = this.recordUndo;
86
+ }
87
+ return json;
102
88
  }
103
- };
104
89
 
105
- /**
106
- * Run a deletion event.
107
- * @param {boolean} forward True if run forward, false if run backward (undo).
108
- */
109
- BlockDelete.prototype.run = function(forward) {
110
- const workspace = this.getEventWorkspace_();
111
- if (forward) {
112
- for (let i = 0; i < this.ids.length; i++) {
113
- const id = this.ids[i];
114
- const block = workspace.getBlockById(id);
115
- if (block) {
116
- block.dispose(false);
117
- } else if (id === this.blockId) {
118
- // Only complain about root-level block.
119
- console.warn('Can\'t delete non-existent block: ' + id);
90
+ /**
91
+ * Decode the JSON event.
92
+ * @param {!Object} json JSON representation.
93
+ */
94
+ fromJson(json) {
95
+ super.fromJson(json);
96
+ this.oldXml = Xml.textToDom(json['oldXml']);
97
+ this.ids = json['ids'];
98
+ this.wasShadow =
99
+ json['wasShadow'] || this.oldXml.tagName.toLowerCase() === 'shadow';
100
+ this.oldJson = /** @type {!blocks.State} */ (json['oldJson']);
101
+ if (json['recordUndo'] !== undefined) {
102
+ this.recordUndo = json['recordUndo'];
103
+ }
104
+ }
105
+
106
+ /**
107
+ * Run a deletion event.
108
+ * @param {boolean} forward True if run forward, false if run backward (undo).
109
+ */
110
+ run(forward) {
111
+ const workspace = this.getEventWorkspace_();
112
+ if (forward) {
113
+ for (let i = 0; i < this.ids.length; i++) {
114
+ const id = this.ids[i];
115
+ const block = workspace.getBlockById(id);
116
+ if (block) {
117
+ block.dispose(false);
118
+ } else if (id === this.blockId) {
119
+ // Only complain about root-level block.
120
+ console.warn('Can\'t delete non-existent block: ' + id);
121
+ }
120
122
  }
123
+ } else {
124
+ blocks.append(this.oldJson, workspace);
121
125
  }
122
- } else {
123
- blocks.append(this.oldJson, workspace);
124
126
  }
125
- };
127
+ }
126
128
 
127
129
  registry.register(registry.Type.EVENT, eventUtils.DELETE, BlockDelete);
128
130
 
@@ -16,7 +16,6 @@
16
16
  goog.module('Blockly.Events.BlockDrag');
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,63 +24,65 @@ const {UiBase} = goog.require('Blockly.Events.UiBase');
25
24
 
26
25
  /**
27
26
  * Class for a block drag event.
28
- * @param {!Block=} opt_block The top block in the stack that is being
29
- * dragged. Undefined for a blank event.
30
- * @param {boolean=} opt_isStart Whether this is the start of a block drag.
31
- * Undefined for a blank event.
32
- * @param {!Array<!Block>=} opt_blocks The blocks affected by this
33
- * drag. Undefined for a blank event.
34
27
  * @extends {UiBase}
35
- * @constructor
36
28
  * @alias Blockly.Events.BlockDrag
37
29
  */
38
- const BlockDrag = function(opt_block, opt_isStart, opt_blocks) {
39
- const workspaceId = opt_block ? opt_block.workspace.id : undefined;
40
- BlockDrag.superClass_.constructor.call(this, workspaceId);
41
- this.blockId = opt_block ? opt_block.id : null;
42
-
30
+ class BlockDrag extends UiBase {
43
31
  /**
44
- * Whether this is the start of a block drag.
45
- * @type {boolean|undefined}
32
+ * @param {!Block=} opt_block The top block in the stack that is being
33
+ * dragged. Undefined for a blank event.
34
+ * @param {boolean=} opt_isStart Whether this is the start of a block drag.
35
+ * Undefined for a blank event.
36
+ * @param {!Array<!Block>=} opt_blocks The blocks affected by this
37
+ * drag. Undefined for a blank event.
46
38
  */
47
- this.isStart = opt_isStart;
39
+ constructor(opt_block, opt_isStart, opt_blocks) {
40
+ const workspaceId = opt_block ? opt_block.workspace.id : undefined;
41
+ super(workspaceId);
42
+ this.blockId = opt_block ? opt_block.id : null;
48
43
 
49
- /**
50
- * The blocks affected by this drag event.
51
- * @type {!Array<!Block>|undefined}
52
- */
53
- this.blocks = opt_blocks;
54
- };
55
- object.inherits(BlockDrag, UiBase);
44
+ /**
45
+ * Whether this is the start of a block drag.
46
+ * @type {boolean|undefined}
47
+ */
48
+ this.isStart = opt_isStart;
56
49
 
57
- /**
58
- * Type of this event.
59
- * @type {string}
60
- */
61
- BlockDrag.prototype.type = eventUtils.BLOCK_DRAG;
50
+ /**
51
+ * The blocks affected by this drag event.
52
+ * @type {!Array<!Block>|undefined}
53
+ */
54
+ this.blocks = opt_blocks;
62
55
 
63
- /**
64
- * Encode the event as JSON.
65
- * @return {!Object} JSON representation.
66
- */
67
- BlockDrag.prototype.toJson = function() {
68
- const json = BlockDrag.superClass_.toJson.call(this);
69
- json['isStart'] = this.isStart;
70
- json['blockId'] = this.blockId;
71
- json['blocks'] = this.blocks;
72
- return json;
73
- };
56
+ /**
57
+ * Type of this event.
58
+ * @type {string}
59
+ */
60
+ this.type = eventUtils.BLOCK_DRAG;
61
+ }
74
62
 
75
- /**
76
- * Decode the JSON event.
77
- * @param {!Object} json JSON representation.
78
- */
79
- BlockDrag.prototype.fromJson = function(json) {
80
- BlockDrag.superClass_.fromJson.call(this, json);
81
- this.isStart = json['isStart'];
82
- this.blockId = json['blockId'];
83
- this.blocks = json['blocks'];
84
- };
63
+ /**
64
+ * Encode the event as JSON.
65
+ * @return {!Object} JSON representation.
66
+ */
67
+ toJson() {
68
+ const json = super.toJson();
69
+ json['isStart'] = this.isStart;
70
+ json['blockId'] = this.blockId;
71
+ json['blocks'] = this.blocks;
72
+ return json;
73
+ }
74
+
75
+ /**
76
+ * Decode the JSON event.
77
+ * @param {!Object} json JSON representation.
78
+ */
79
+ fromJson(json) {
80
+ super.fromJson(json);
81
+ this.isStart = json['isStart'];
82
+ this.blockId = json['blockId'];
83
+ this.blocks = json['blocks'];
84
+ }
85
+ }
85
86
 
86
87
  registry.register(registry.Type.EVENT, eventUtils.BLOCK_DRAG, BlockDrag);
87
88