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.VarDelete');
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 {VarBase} = goog.require('Blockly.Events.VarBase');
22
21
  /* eslint-disable-next-line no-unused-vars */
@@ -25,62 +24,65 @@ const {VariableModel} = goog.requireType('Blockly.VariableModel');
25
24
 
26
25
  /**
27
26
  * Class for a variable deletion event.
28
- * @param {!VariableModel=} opt_variable The deleted variable. Undefined
29
- * for a blank event.
30
27
  * @extends {VarBase}
31
- * @constructor
32
28
  * @alias Blockly.Events.VarDelete
33
29
  */
34
- const VarDelete = function(opt_variable) {
35
- VarDelete.superClass_.constructor.call(this, opt_variable);
36
- if (!opt_variable) {
37
- return; // Blank event to be populated by fromJson.
38
- }
30
+ class VarDelete extends VarBase {
31
+ /**
32
+ * @param {!VariableModel=} opt_variable The deleted variable. Undefined
33
+ * for a blank event.
34
+ */
35
+ constructor(opt_variable) {
36
+ super(opt_variable);
39
37
 
40
- this.varType = opt_variable.type;
41
- this.varName = opt_variable.name;
42
- };
43
- object.inherits(VarDelete, VarBase);
38
+ /**
39
+ * Type of this event.
40
+ * @type {string}
41
+ */
42
+ this.type = eventUtils.VAR_DELETE;
44
43
 
45
- /**
46
- * Type of this event.
47
- * @type {string}
48
- */
49
- VarDelete.prototype.type = eventUtils.VAR_DELETE;
44
+ if (!opt_variable) {
45
+ return; // Blank event to be populated by fromJson.
46
+ }
50
47
 
51
- /**
52
- * Encode the event as JSON.
53
- * @return {!Object} JSON representation.
54
- */
55
- VarDelete.prototype.toJson = function() {
56
- const json = VarDelete.superClass_.toJson.call(this);
57
- json['varType'] = this.varType;
58
- json['varName'] = this.varName;
59
- return json;
60
- };
48
+ this.varType = opt_variable.type;
49
+ this.varName = opt_variable.name;
50
+ }
61
51
 
62
- /**
63
- * Decode the JSON event.
64
- * @param {!Object} json JSON representation.
65
- */
66
- VarDelete.prototype.fromJson = function(json) {
67
- VarDelete.superClass_.fromJson.call(this, json);
68
- this.varType = json['varType'];
69
- this.varName = json['varName'];
70
- };
52
+ /**
53
+ * Encode the event as JSON.
54
+ * @return {!Object} JSON representation.
55
+ */
56
+ toJson() {
57
+ const json = super.toJson();
58
+ json['varType'] = this.varType;
59
+ json['varName'] = this.varName;
60
+ return json;
61
+ }
71
62
 
72
- /**
73
- * Run a variable deletion event.
74
- * @param {boolean} forward True if run forward, false if run backward (undo).
75
- */
76
- VarDelete.prototype.run = function(forward) {
77
- const workspace = this.getEventWorkspace_();
78
- if (forward) {
79
- workspace.deleteVariableById(this.varId);
80
- } else {
81
- workspace.createVariable(this.varName, this.varType, this.varId);
63
+ /**
64
+ * Decode the JSON event.
65
+ * @param {!Object} json JSON representation.
66
+ */
67
+ fromJson(json) {
68
+ super.fromJson(json);
69
+ this.varType = json['varType'];
70
+ this.varName = json['varName'];
71
+ }
72
+
73
+ /**
74
+ * Run a variable deletion event.
75
+ * @param {boolean} forward True if run forward, false if run backward (undo).
76
+ */
77
+ run(forward) {
78
+ const workspace = this.getEventWorkspace_();
79
+ if (forward) {
80
+ workspace.deleteVariableById(this.varId);
81
+ } else {
82
+ workspace.createVariable(this.varName, this.varType, this.varId);
83
+ }
82
84
  }
83
- };
85
+ }
84
86
 
85
87
  registry.register(registry.Type.EVENT, eventUtils.VAR_DELETE, VarDelete);
86
88
 
@@ -16,7 +16,6 @@
16
16
  goog.module('Blockly.Events.VarRename');
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 {VarBase} = goog.require('Blockly.Events.VarBase');
22
21
  /* eslint-disable-next-line no-unused-vars */
@@ -25,63 +24,66 @@ const {VariableModel} = goog.requireType('Blockly.VariableModel');
25
24
 
26
25
  /**
27
26
  * Class for a variable rename event.
28
- * @param {!VariableModel=} opt_variable The renamed variable. Undefined
29
- * for a blank event.
30
- * @param {string=} newName The new name the variable will be changed to.
31
27
  * @extends {VarBase}
32
- * @constructor
33
28
  * @alias Blockly.Events.VarRename
34
29
  */
35
- const VarRename = function(opt_variable, newName) {
36
- VarRename.superClass_.constructor.call(this, opt_variable);
37
- if (!opt_variable) {
38
- return; // Blank event to be populated by fromJson.
39
- }
30
+ class VarRename extends VarBase {
31
+ /**
32
+ * @param {!VariableModel=} opt_variable The renamed variable. Undefined
33
+ * for a blank event.
34
+ * @param {string=} newName The new name the variable will be changed to.
35
+ */
36
+ constructor(opt_variable, newName) {
37
+ super(opt_variable);
40
38
 
41
- this.oldName = opt_variable.name;
42
- this.newName = typeof newName === 'undefined' ? '' : newName;
43
- };
44
- object.inherits(VarRename, VarBase);
39
+ /**
40
+ * Type of this event.
41
+ * @type {string}
42
+ */
43
+ this.type = eventUtils.VAR_RENAME;
45
44
 
46
- /**
47
- * Type of this event.
48
- * @type {string}
49
- */
50
- VarRename.prototype.type = eventUtils.VAR_RENAME;
45
+ if (!opt_variable) {
46
+ return; // Blank event to be populated by fromJson.
47
+ }
51
48
 
52
- /**
53
- * Encode the event as JSON.
54
- * @return {!Object} JSON representation.
55
- */
56
- VarRename.prototype.toJson = function() {
57
- const json = VarRename.superClass_.toJson.call(this);
58
- json['oldName'] = this.oldName;
59
- json['newName'] = this.newName;
60
- return json;
61
- };
49
+ this.oldName = opt_variable.name;
50
+ this.newName = typeof newName === 'undefined' ? '' : newName;
51
+ }
62
52
 
63
- /**
64
- * Decode the JSON event.
65
- * @param {!Object} json JSON representation.
66
- */
67
- VarRename.prototype.fromJson = function(json) {
68
- VarRename.superClass_.fromJson.call(this, json);
69
- this.oldName = json['oldName'];
70
- this.newName = json['newName'];
71
- };
53
+ /**
54
+ * Encode the event as JSON.
55
+ * @return {!Object} JSON representation.
56
+ */
57
+ toJson() {
58
+ const json = super.toJson();
59
+ json['oldName'] = this.oldName;
60
+ json['newName'] = this.newName;
61
+ return json;
62
+ }
72
63
 
73
- /**
74
- * Run a variable rename event.
75
- * @param {boolean} forward True if run forward, false if run backward (undo).
76
- */
77
- VarRename.prototype.run = function(forward) {
78
- const workspace = this.getEventWorkspace_();
79
- if (forward) {
80
- workspace.renameVariableById(this.varId, this.newName);
81
- } else {
82
- workspace.renameVariableById(this.varId, this.oldName);
64
+ /**
65
+ * Decode the JSON event.
66
+ * @param {!Object} json JSON representation.
67
+ */
68
+ fromJson(json) {
69
+ super.fromJson(json);
70
+ this.oldName = json['oldName'];
71
+ this.newName = json['newName'];
72
+ }
73
+
74
+ /**
75
+ * Run a variable rename event.
76
+ * @param {boolean} forward True if run forward, false if run backward (undo).
77
+ */
78
+ run(forward) {
79
+ const workspace = this.getEventWorkspace_();
80
+ if (forward) {
81
+ workspace.renameVariableById(this.varId, this.newName);
82
+ } else {
83
+ workspace.renameVariableById(this.varId, this.oldName);
84
+ }
83
85
  }
84
- };
86
+ }
85
87
 
86
88
  registry.register(registry.Type.EVENT, eventUtils.VAR_RENAME, VarRename);
87
89
 
@@ -16,89 +16,90 @@
16
16
  goog.module('Blockly.Events.ViewportChange');
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 {UiBase} = goog.require('Blockly.Events.UiBase');
22
21
 
23
22
 
24
23
  /**
25
24
  * Class for a viewport change event.
26
- * @param {number=} opt_top Top-edge of the visible portion of the workspace,
27
- * relative to the workspace origin. Undefined for a blank event.
28
- * @param {number=} opt_left Left-edge of the visible portion of the workspace,
29
- * relative to the workspace origin. Undefined for a blank event.
30
- * @param {number=} opt_scale The scale of the workspace. Undefined for a blank
31
- * event.
32
- * @param {string=} opt_workspaceId The workspace identifier for this event.
33
- * Undefined for a blank event.
34
- * @param {number=} opt_oldScale The old scale of the workspace. Undefined for a
35
- * blank event.
36
25
  * @extends {UiBase}
37
- * @constructor
38
26
  * @alias Blockly.Events.ViewportChange
39
27
  */
40
- const ViewportChange = function(
41
- opt_top, opt_left, opt_scale, opt_workspaceId, opt_oldScale) {
42
- ViewportChange.superClass_.constructor.call(this, opt_workspaceId);
43
-
28
+ class ViewportChange extends UiBase {
44
29
  /**
45
- * Top-edge of the visible portion of the workspace, relative to the workspace
46
- * origin.
47
- * @type {number|undefined}
30
+ * @param {number=} opt_top Top-edge of the visible portion of the workspace,
31
+ * relative to the workspace origin. Undefined for a blank event.
32
+ * @param {number=} opt_left Left-edge of the visible portion of the
33
+ * workspace relative to the workspace origin. Undefined for a blank
34
+ * event.
35
+ * @param {number=} opt_scale The scale of the workspace. Undefined for a
36
+ * blank event.
37
+ * @param {string=} opt_workspaceId The workspace identifier for this event.
38
+ * Undefined for a blank event.
39
+ * @param {number=} opt_oldScale The old scale of the workspace. Undefined for
40
+ * a blank event.
48
41
  */
49
- this.viewTop = opt_top;
42
+ constructor(opt_top, opt_left, opt_scale, opt_workspaceId, opt_oldScale) {
43
+ super(opt_workspaceId);
50
44
 
51
- /**
52
- * Left-edge of the visible portion of the workspace, relative to the
53
- * workspace origin.
54
- * @type {number|undefined}
55
- */
56
- this.viewLeft = opt_left;
45
+ /**
46
+ * Top-edge of the visible portion of the workspace, relative to the
47
+ * workspace origin.
48
+ * @type {number|undefined}
49
+ */
50
+ this.viewTop = opt_top;
51
+
52
+ /**
53
+ * Left-edge of the visible portion of the workspace, relative to the
54
+ * workspace origin.
55
+ * @type {number|undefined}
56
+ */
57
+ this.viewLeft = opt_left;
58
+
59
+ /**
60
+ * The scale of the workspace.
61
+ * @type {number|undefined}
62
+ */
63
+ this.scale = opt_scale;
64
+
65
+ /**
66
+ * The old scale of the workspace.
67
+ * @type {number|undefined}
68
+ */
69
+ this.oldScale = opt_oldScale;
70
+
71
+ /**
72
+ * Type of this event.
73
+ * @type {string}
74
+ */
75
+ this.type = eventUtils.VIEWPORT_CHANGE;
76
+ }
57
77
 
58
78
  /**
59
- * The scale of the workspace.
60
- * @type {number|undefined}
79
+ * Encode the event as JSON.
80
+ * @return {!Object} JSON representation.
61
81
  */
62
- this.scale = opt_scale;
82
+ toJson() {
83
+ const json = super.toJson();
84
+ json['viewTop'] = this.viewTop;
85
+ json['viewLeft'] = this.viewLeft;
86
+ json['scale'] = this.scale;
87
+ json['oldScale'] = this.oldScale;
88
+ return json;
89
+ }
63
90
 
64
91
  /**
65
- * The old scale of the workspace.
66
- * @type {number|undefined}
92
+ * Decode the JSON event.
93
+ * @param {!Object} json JSON representation.
67
94
  */
68
- this.oldScale = opt_oldScale;
69
- };
70
- object.inherits(ViewportChange, UiBase);
71
-
72
- /**
73
- * Type of this event.
74
- * @type {string}
75
- */
76
- ViewportChange.prototype.type = eventUtils.VIEWPORT_CHANGE;
77
-
78
- /**
79
- * Encode the event as JSON.
80
- * @return {!Object} JSON representation.
81
- */
82
- ViewportChange.prototype.toJson = function() {
83
- const json = ViewportChange.superClass_.toJson.call(this);
84
- json['viewTop'] = this.viewTop;
85
- json['viewLeft'] = this.viewLeft;
86
- json['scale'] = this.scale;
87
- json['oldScale'] = this.oldScale;
88
- return json;
89
- };
90
-
91
- /**
92
- * Decode the JSON event.
93
- * @param {!Object} json JSON representation.
94
- */
95
- ViewportChange.prototype.fromJson = function(json) {
96
- ViewportChange.superClass_.fromJson.call(this, json);
97
- this.viewTop = json['viewTop'];
98
- this.viewLeft = json['viewLeft'];
99
- this.scale = json['scale'];
100
- this.oldScale = json['oldScale'];
101
- };
95
+ fromJson(json) {
96
+ super.fromJson(json);
97
+ this.viewTop = json['viewTop'];
98
+ this.viewLeft = json['viewLeft'];
99
+ this.scale = json['scale'];
100
+ this.oldScale = json['oldScale'];
101
+ }
102
+ }
102
103
 
103
104
  registry.register(
104
105
  registry.Type.EVENT, eventUtils.VIEWPORT_CHANGE, ViewportChange);
@@ -17,11 +17,13 @@
17
17
  */
18
18
  goog.module('Blockly.Events.utils');
19
19
 
20
- /* eslint-disable-next-line no-unused-vars */
21
- const Abstract = goog.requireType('Blockly.Events.Abstract');
22
20
  const idGenerator = goog.require('Blockly.utils.idGenerator');
23
21
  const registry = goog.require('Blockly.registry');
24
22
  /* eslint-disable-next-line no-unused-vars */
23
+ const {Abstract} = goog.requireType('Blockly.Events.Abstract');
24
+ /* eslint-disable-next-line no-unused-vars */
25
+ const {BlockChange} = goog.requireType('Blockly.Events.BlockChange');
26
+ /* eslint-disable-next-line no-unused-vars */
25
27
  const {BlockCreate} = goog.requireType('Blockly.Events.BlockCreate');
26
28
  /* eslint-disable-next-line no-unused-vars */
27
29
  const {BlockMove} = goog.requireType('Blockly.Events.BlockMove');
@@ -32,7 +34,11 @@ const {CommentCreate} = goog.requireType('Blockly.Events.CommentCreate');
32
34
  /* eslint-disable-next-line no-unused-vars */
33
35
  const {CommentMove} = goog.requireType('Blockly.Events.CommentMove');
34
36
  /* eslint-disable-next-line no-unused-vars */
37
+ const {ViewportChange} = goog.requireType('Blockly.Events.ViewportChange');
38
+ /* eslint-disable-next-line no-unused-vars */
35
39
  const {Workspace} = goog.requireType('Blockly.Workspace');
40
+ /* eslint-disable-next-line no-unused-vars */
41
+ const {WorkspaceSvg} = goog.requireType('Blockly.WorkspaceSvg');
36
42
 
37
43
 
38
44
  /**
@@ -307,6 +313,7 @@ exports.BUMP_EVENTS = BUMP_EVENTS;
307
313
 
308
314
  /**
309
315
  * List of events queued for firing.
316
+ * @type {!Array<!Abstract>}
310
317
  */
311
318
  const FIRE_QUEUE = [];
312
319
 
@@ -365,7 +372,9 @@ const filter = function(queueIn, forward) {
365
372
  if (!event.isNull()) {
366
373
  // Treat all UI events as the same type in hash table.
367
374
  const eventType = event.isUiEvent ? UI : event.type;
368
- const key = [eventType, event.blockId, event.workspaceId].join(' ');
375
+ // TODO(#5927): Ceck whether `blockId` exists before accessing it.
376
+ const blockId = /** @type {*} */ (event).blockId;
377
+ const key = [eventType, blockId, event.workspaceId].join(' ');
369
378
 
370
379
  const lastEntry = hash[key];
371
380
  const lastEvent = lastEntry ? lastEntry.event : null;
@@ -376,22 +385,25 @@ const filter = function(queueIn, forward) {
376
385
  hash[key] = {event: event, index: i};
377
386
  mergedQueue.push(event);
378
387
  } else if (event.type === MOVE && lastEntry.index === i - 1) {
388
+ const moveEvent = /** @type {!BlockMove} */ (event);
379
389
  // Merge move events.
380
- lastEvent.newParentId = event.newParentId;
381
- lastEvent.newInputName = event.newInputName;
382
- lastEvent.newCoordinate = event.newCoordinate;
390
+ lastEvent.newParentId = moveEvent.newParentId;
391
+ lastEvent.newInputName = moveEvent.newInputName;
392
+ lastEvent.newCoordinate = moveEvent.newCoordinate;
383
393
  lastEntry.index = i;
384
394
  } else if (
385
395
  event.type === CHANGE && event.element === lastEvent.element &&
386
396
  event.name === lastEvent.name) {
397
+ const changeEvent = /** @type {!BlockChange} */ (event);
387
398
  // Merge change events.
388
- lastEvent.newValue = event.newValue;
399
+ lastEvent.newValue = changeEvent.newValue;
389
400
  } else if (event.type === VIEWPORT_CHANGE) {
401
+ const viewportEvent = /** @type {!ViewportChange} */ (event);
390
402
  // Merge viewport change events.
391
- lastEvent.viewTop = event.viewTop;
392
- lastEvent.viewLeft = event.viewLeft;
393
- lastEvent.scale = event.scale;
394
- lastEvent.oldScale = event.oldScale;
403
+ lastEvent.viewTop = viewportEvent.viewTop;
404
+ lastEvent.viewLeft = viewportEvent.viewLeft;
405
+ lastEvent.scale = viewportEvent.scale;
406
+ lastEvent.oldScale = viewportEvent.oldScale;
395
407
  } else if (event.type === CLICK && lastEvent.type === BUBBLE_OPEN) {
396
408
  // Drop click events caused by opening/closing bubbles.
397
409
  } else {
@@ -546,12 +558,15 @@ exports.get = get;
546
558
  */
547
559
  const disableOrphans = function(event) {
548
560
  if (event.type === MOVE || event.type === CREATE) {
549
- if (!event.workspaceId) {
561
+ const blockEvent = /** @type {!BlockMove|!BlockCreate} */ (event);
562
+ if (!blockEvent.workspaceId) {
550
563
  return;
551
564
  }
552
565
  const {Workspace} = goog.module.get('Blockly.Workspace');
553
- const eventWorkspace = Workspace.getById(event.workspaceId);
554
- let block = eventWorkspace.getBlockById(event.blockId);
566
+ const eventWorkspace =
567
+ /** @type {!WorkspaceSvg} */ (
568
+ Workspace.getById(blockEvent.workspaceId));
569
+ let block = eventWorkspace.getBlockById(blockEvent.blockId);
555
570
  if (block) {
556
571
  // Changing blocks as part of this event shouldn't be undoable.
557
572
  const initialUndoFlag = recordUndo;
@@ -15,10 +15,9 @@
15
15
  */
16
16
  goog.module('Blockly.Events.FinishedLoading');
17
17
 
18
- const Abstract = goog.require('Blockly.Events.Abstract');
19
18
  const eventUtils = goog.require('Blockly.Events.utils');
20
- const object = goog.require('Blockly.utils.object');
21
19
  const registry = goog.require('Blockly.registry');
20
+ const {Abstract: AbstractEvent} = goog.require('Blockly.Events.Abstract');
22
21
  /* eslint-disable-next-line no-unused-vars */
23
22
  const {Workspace} = goog.requireType('Blockly.Workspace');
24
23
 
@@ -28,70 +27,65 @@ const {Workspace} = goog.requireType('Blockly.Workspace');
28
27
  * Used to notify the developer when the workspace has finished loading (i.e
29
28
  * domToWorkspace).
30
29
  * Finished loading events do not record undo or redo.
31
- * @param {!Workspace=} opt_workspace The workspace that has finished
32
- * loading. Undefined for a blank event.
33
- * @extends {Abstract}
34
- * @constructor
30
+ * @extends {AbstractEvent}
35
31
  * @alias Blockly.Events.FinishedLoading
36
32
  */
37
- const FinishedLoading = function(opt_workspace) {
33
+ class FinishedLoading extends AbstractEvent {
38
34
  /**
39
- * Whether or not the event is blank (to be populated by fromJson).
40
- * @type {boolean}
35
+ * @param {!Workspace=} opt_workspace The workspace that has finished
36
+ * loading. Undefined for a blank event.
41
37
  */
42
- this.isBlank = typeof opt_workspace === 'undefined';
38
+ constructor(opt_workspace) {
39
+ super();
40
+ /**
41
+ * Whether or not the event is blank (to be populated by fromJson).
42
+ * @type {boolean}
43
+ */
44
+ this.isBlank = typeof opt_workspace === 'undefined';
45
+
46
+ /**
47
+ * The workspace identifier for this event.
48
+ * @type {string}
49
+ */
50
+ this.workspaceId = opt_workspace ? opt_workspace.id : '';
51
+
52
+ // Workspace events do not undo or redo.
53
+ this.recordUndo = false;
54
+
55
+ /**
56
+ * Type of this event.
57
+ * @type {string}
58
+ */
59
+ this.type = eventUtils.FINISHED_LOADING;
60
+ }
43
61
 
44
62
  /**
45
- * The workspace identifier for this event.
46
- * @type {string}
63
+ * Encode the event as JSON.
64
+ * @return {!Object} JSON representation.
47
65
  */
48
- this.workspaceId = opt_workspace ? opt_workspace.id : '';
66
+ toJson() {
67
+ const json = {
68
+ 'type': this.type,
69
+ };
70
+ if (this.group) {
71
+ json['group'] = this.group;
72
+ }
73
+ if (this.workspaceId) {
74
+ json['workspaceId'] = this.workspaceId;
75
+ }
76
+ return json;
77
+ }
49
78
 
50
79
  /**
51
- * The event group ID for the group this event belongs to. Groups define
52
- * events that should be treated as an single action from the user's
53
- * perspective, and should be undone together.
54
- * @type {string}
80
+ * Decode the JSON event.
81
+ * @param {!Object} json JSON representation.
55
82
  */
56
- this.group = eventUtils.getGroup();
57
-
58
- // Workspace events do not undo or redo.
59
- this.recordUndo = false;
60
- };
61
- object.inherits(FinishedLoading, Abstract);
62
-
63
- /**
64
- * Type of this event.
65
- * @type {string}
66
- */
67
- FinishedLoading.prototype.type = eventUtils.FINISHED_LOADING;
68
-
69
- /**
70
- * Encode the event as JSON.
71
- * @return {!Object} JSON representation.
72
- */
73
- FinishedLoading.prototype.toJson = function() {
74
- const json = {
75
- 'type': this.type,
76
- };
77
- if (this.group) {
78
- json['group'] = this.group;
83
+ fromJson(json) {
84
+ this.isBlank = false;
85
+ this.workspaceId = json['workspaceId'];
86
+ this.group = json['group'];
79
87
  }
80
- if (this.workspaceId) {
81
- json['workspaceId'] = this.workspaceId;
82
- }
83
- return json;
84
- };
85
-
86
- /**
87
- * Decode the JSON event.
88
- * @param {!Object} json JSON representation.
89
- */
90
- FinishedLoading.prototype.fromJson = function(json) {
91
- this.isBlank = false;
92
- this.workspaceId = json['workspaceId'];
93
- this.group = json['group'];
94
- };
88
+ }
95
89
 
96
90
  registry.register(
97
91
  registry.Type.EVENT, eventUtils.FINISHED_LOADING, FinishedLoading);
@@ -24,6 +24,7 @@ goog.module('Blockly.Extensions');
24
24
  const parsing = goog.require('Blockly.utils.parsing');
25
25
  /* eslint-disable-next-line no-unused-vars */
26
26
  const {Block} = goog.requireType('Blockly.Block');
27
+ const {FieldDropdown} = goog.require('Blockly.FieldDropdown');
27
28
  goog.requireType('Blockly.Mutator');
28
29
 
29
30
 
@@ -454,7 +455,7 @@ exports.buildTooltipForDropdown = buildTooltipForDropdown;
454
455
  const checkDropdownOptionsInTable = function(block, dropdownName, lookupTable) {
455
456
  // Validate all dropdown options have values.
456
457
  const dropdown = block.getField(dropdownName);
457
- if (!dropdown.isOptionListDynamic()) {
458
+ if (dropdown instanceof FieldDropdown && !dropdown.isOptionListDynamic()) {
458
459
  const options = dropdown.getOptions();
459
460
  for (let i = 0; i < options.length; i++) {
460
461
  const optionKey = options[i][1]; // label, then value
@@ -512,11 +513,11 @@ exports.buildTooltipWithFieldText = buildTooltipWithFieldText;
512
513
  * @this {Block}
513
514
  */
514
515
  const extensionParentTooltip = function() {
515
- this.tooltipWhenNotConnected = this.tooltip;
516
+ const tooltipWhenNotConnected = this.tooltip;
516
517
  this.setTooltip(function() {
517
518
  const parent = this.getParent();
518
519
  return (parent && parent.getInputsInline() && parent.tooltip) ||
519
- this.tooltipWhenNotConnected;
520
+ tooltipWhenNotConnected;
520
521
  }.bind(this));
521
522
  };
522
523
  register('parent_tooltip_when_inline', extensionParentTooltip);