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
@@ -15,9 +15,9 @@
15
15
  */
16
16
  goog.module('Blockly.Events');
17
17
 
18
- const Abstract = goog.require('Blockly.Events.Abstract');
19
18
  const deprecation = goog.require('Blockly.utils.deprecation');
20
19
  const eventUtils = goog.require('Blockly.Events.utils');
20
+ const {Abstract: AbstractEvent} = goog.require('Blockly.Events.Abstract');
21
21
  const {BlockBase} = goog.require('Blockly.Events.BlockBase');
22
22
  const {BlockChange} = goog.require('Blockly.Events.BlockChange');
23
23
  const {BlockCreate} = goog.require('Blockly.Events.BlockCreate');
@@ -47,7 +47,7 @@ const {ViewportChange} = goog.require('Blockly.Events.ViewportChange');
47
47
 
48
48
 
49
49
  // Events.
50
- exports.Abstract = Abstract;
50
+ exports.Abstract = AbstractEvent;
51
51
  exports.BubbleOpen = BubbleOpen;
52
52
  exports.BlockBase = BlockBase;
53
53
  exports.BlockChange = BlockChange;
@@ -24,98 +24,110 @@ const {Workspace} = goog.requireType('Blockly.Workspace');
24
24
 
25
25
  /**
26
26
  * Abstract class for an event.
27
- * @constructor
27
+ * @abstract
28
28
  * @alias Blockly.Events.Abstract
29
29
  */
30
- const Abstract = function() {
30
+ class Abstract {
31
31
  /**
32
- * Whether or not the event is blank (to be populated by fromJson).
33
- * @type {?boolean}
32
+ * @alias Blockly.Events.Abstract
34
33
  */
35
- this.isBlank = null;
34
+ constructor() {
35
+ /**
36
+ * Whether or not the event is blank (to be populated by fromJson).
37
+ * @type {?boolean}
38
+ */
39
+ this.isBlank = null;
40
+
41
+ /**
42
+ * The workspace identifier for this event.
43
+ * @type {string|undefined}
44
+ */
45
+ this.workspaceId = undefined;
46
+
47
+ /**
48
+ * The event group id for the group this event belongs to. Groups define
49
+ * events that should be treated as an single action from the user's
50
+ * perspective, and should be undone together.
51
+ * @type {string}
52
+ */
53
+ this.group = eventUtils.getGroup();
54
+
55
+ /**
56
+ * Sets whether the event should be added to the undo stack.
57
+ * @type {boolean}
58
+ */
59
+ this.recordUndo = eventUtils.getRecordUndo();
60
+
61
+ /**
62
+ * Whether or not the event is a UI event.
63
+ * @type {boolean}
64
+ */
65
+ this.isUiEvent = false;
66
+
67
+ /**
68
+ * Type of this event.
69
+ * @type {string|undefined}
70
+ */
71
+ this.type = undefined;
72
+ }
36
73
 
37
74
  /**
38
- * The workspace identifier for this event.
39
- * @type {string|undefined}
75
+ * Encode the event as JSON.
76
+ * @return {!Object} JSON representation.
40
77
  */
41
- this.workspaceId = undefined;
78
+ toJson() {
79
+ const json = {'type': this.type};
80
+ if (this.group) {
81
+ json['group'] = this.group;
82
+ }
83
+ return json;
84
+ }
42
85
 
43
86
  /**
44
- * The event group id for the group this event belongs to. Groups define
45
- * events that should be treated as an single action from the user's
46
- * perspective, and should be undone together.
47
- * @type {string}
87
+ * Decode the JSON event.
88
+ * @param {!Object} json JSON representation.
48
89
  */
49
- this.group = eventUtils.getGroup();
90
+ fromJson(json) {
91
+ this.isBlank = false;
92
+ this.group = json['group'];
93
+ }
50
94
 
51
95
  /**
52
- * Sets whether the event should be added to the undo stack.
53
- * @type {boolean}
96
+ * Does this event record any change of state?
97
+ * @return {boolean} True if null, false if something changed.
54
98
  */
55
- this.recordUndo = eventUtils.getRecordUndo();
56
- };
57
-
58
- /**
59
- * Whether or not the event is a UI event.
60
- * @type {boolean}
61
- */
62
- Abstract.prototype.isUiEvent = false;
63
-
64
- /**
65
- * Encode the event as JSON.
66
- * @return {!Object} JSON representation.
67
- */
68
- Abstract.prototype.toJson = function() {
69
- const json = {'type': this.type};
70
- if (this.group) {
71
- json['group'] = this.group;
99
+ isNull() {
100
+ return false;
72
101
  }
73
- return json;
74
- };
75
-
76
- /**
77
- * Decode the JSON event.
78
- * @param {!Object} json JSON representation.
79
- */
80
- Abstract.prototype.fromJson = function(json) {
81
- this.isBlank = false;
82
- this.group = json['group'];
83
- };
84
-
85
- /**
86
- * Does this event record any change of state?
87
- * @return {boolean} True if null, false if something changed.
88
- */
89
- Abstract.prototype.isNull = function() {
90
- return false;
91
- };
92
-
93
- /**
94
- * Run an event.
95
- * @param {boolean} _forward True if run forward, false if run backward (undo).
96
- */
97
- Abstract.prototype.run = function(_forward) {
98
- // Defined by subclasses.
99
- };
100
102
 
101
- /**
102
- * Get workspace the event belongs to.
103
- * @return {!Workspace} The workspace the event belongs to.
104
- * @throws {Error} if workspace is null.
105
- * @protected
106
- */
107
- Abstract.prototype.getEventWorkspace_ = function() {
108
- let workspace;
109
- if (this.workspaceId) {
110
- const {Workspace} = goog.module.get('Blockly.Workspace');
111
- workspace = Workspace.getById(this.workspaceId);
103
+ /**
104
+ * Run an event.
105
+ * @param {boolean} _forward True if run forward, false if run backward
106
+ * (undo).
107
+ */
108
+ run(_forward) {
109
+ // Defined by subclasses.
112
110
  }
113
- if (!workspace) {
114
- throw Error(
115
- 'Workspace is null. Event must have been generated from real' +
116
- ' Blockly events.');
111
+
112
+ /**
113
+ * Get workspace the event belongs to.
114
+ * @return {!Workspace} The workspace the event belongs to.
115
+ * @throws {Error} if workspace is null.
116
+ * @protected
117
+ */
118
+ getEventWorkspace_() {
119
+ let workspace;
120
+ if (this.workspaceId) {
121
+ const {Workspace} = goog.module.get('Blockly.Workspace');
122
+ workspace = Workspace.getById(this.workspaceId);
123
+ }
124
+ if (!workspace) {
125
+ throw Error(
126
+ 'Workspace is null. Event must have been generated from real' +
127
+ ' Blockly events.');
128
+ }
129
+ return workspace;
117
130
  }
118
- return workspace;
119
- };
131
+ }
120
132
 
121
- exports = Abstract;
133
+ exports.Abstract = Abstract;
@@ -15,55 +15,56 @@
15
15
  */
16
16
  goog.module('Blockly.Events.BlockBase');
17
17
 
18
- const Abstract = goog.require('Blockly.Events.Abstract');
19
- const object = goog.require('Blockly.utils.object');
18
+ const {Abstract: AbstractEvent} = goog.require('Blockly.Events.Abstract');
20
19
  /* eslint-disable-next-line no-unused-vars */
21
20
  const {Block} = goog.requireType('Blockly.Block');
22
21
 
23
22
 
24
23
  /**
25
24
  * Abstract class for a block event.
26
- * @param {!Block=} opt_block The block this event corresponds to.
27
- * Undefined for a blank event.
28
- * @extends {Abstract}
29
- * @constructor
25
+ * @extends {AbstractEvent}
30
26
  * @alias Blockly.Events.BlockBase
31
27
  */
32
- const BlockBase = function(opt_block) {
33
- BlockBase.superClass_.constructor.call(this);
34
- this.isBlank = typeof opt_block === 'undefined';
35
-
28
+ class BlockBase extends AbstractEvent {
36
29
  /**
37
- * The block ID for the block this event pertains to
38
- * @type {string}
30
+ * @param {!Block=} opt_block The block this event corresponds to.
31
+ * Undefined for a blank event.
39
32
  */
40
- this.blockId = this.isBlank ? '' : opt_block.id;
33
+ constructor(opt_block) {
34
+ super();
35
+ this.isBlank = typeof opt_block === 'undefined';
36
+
37
+ /**
38
+ * The block ID for the block this event pertains to
39
+ * @type {string}
40
+ */
41
+ this.blockId = this.isBlank ? '' : opt_block.id;
42
+
43
+ /**
44
+ * The workspace identifier for this event.
45
+ * @type {string}
46
+ */
47
+ this.workspaceId = this.isBlank ? '' : opt_block.workspace.id;
48
+ }
41
49
 
42
50
  /**
43
- * The workspace identifier for this event.
44
- * @type {string}
51
+ * Encode the event as JSON.
52
+ * @return {!Object} JSON representation.
45
53
  */
46
- this.workspaceId = this.isBlank ? '' : opt_block.workspace.id;
47
- };
48
- object.inherits(BlockBase, Abstract);
49
-
50
- /**
51
- * Encode the event as JSON.
52
- * @return {!Object} JSON representation.
53
- */
54
- BlockBase.prototype.toJson = function() {
55
- const json = BlockBase.superClass_.toJson.call(this);
56
- json['blockId'] = this.blockId;
57
- return json;
58
- };
54
+ toJson() {
55
+ const json = super.toJson();
56
+ json['blockId'] = this.blockId;
57
+ return json;
58
+ }
59
59
 
60
- /**
61
- * Decode the JSON event.
62
- * @param {!Object} json JSON representation.
63
- */
64
- BlockBase.prototype.fromJson = function(json) {
65
- BlockBase.superClass_.fromJson.call(this, json);
66
- this.blockId = json['blockId'];
67
- };
60
+ /**
61
+ * Decode the JSON event.
62
+ * @param {!Object} json JSON representation.
63
+ */
64
+ fromJson(json) {
65
+ super.fromJson(json);
66
+ this.blockId = json['blockId'];
67
+ }
68
+ }
68
69
 
69
70
  exports.BlockBase = BlockBase;
@@ -17,7 +17,6 @@ goog.module('Blockly.Events.BlockChange');
17
17
 
18
18
  const Xml = goog.require('Blockly.Xml');
19
19
  const eventUtils = goog.require('Blockly.Events.utils');
20
- const object = goog.require('Blockly.utils.object');
21
20
  const registry = goog.require('Blockly.registry');
22
21
  const {BlockBase} = goog.require('Blockly.Events.BlockBase');
23
22
  /* eslint-disable-next-line no-unused-vars */
@@ -28,145 +27,152 @@ const {Block} = goog.requireType('Blockly.Block');
28
27
 
29
28
  /**
30
29
  * Class for a block change event.
31
- * @param {!Block=} opt_block The changed block. Undefined for a blank
32
- * event.
33
- * @param {string=} opt_element One of 'field', 'comment', 'disabled', etc.
34
- * @param {?string=} opt_name Name of input or field affected, or null.
35
- * @param {*=} opt_oldValue Previous value of element.
36
- * @param {*=} opt_newValue New value of element.
37
30
  * @extends {BlockBase}
38
- * @constructor
39
31
  * @alias Blockly.Events.BlockChange
40
32
  */
41
- const BlockChange = function(
42
- opt_block, opt_element, opt_name, opt_oldValue, opt_newValue) {
43
- BlockChange.superClass_.constructor.call(this, opt_block);
44
- if (!opt_block) {
45
- return; // Blank event to be populated by fromJson.
46
- }
47
- this.element = typeof opt_element === 'undefined' ? '' : opt_element;
48
- this.name = typeof opt_name === 'undefined' ? '' : opt_name;
49
- this.oldValue = typeof opt_oldValue === 'undefined' ? '' : opt_oldValue;
50
- this.newValue = typeof opt_newValue === 'undefined' ? '' : opt_newValue;
51
- };
52
- object.inherits(BlockChange, BlockBase);
33
+ class BlockChange extends BlockBase {
34
+ /**
35
+ * @param {!Block=} opt_block The changed block. Undefined for a blank
36
+ * event.
37
+ * @param {string=} opt_element One of 'field', 'comment', 'disabled', etc.
38
+ * @param {?string=} opt_name Name of input or field affected, or null.
39
+ * @param {*=} opt_oldValue Previous value of element.
40
+ * @param {*=} opt_newValue New value of element.
41
+ */
42
+ constructor(opt_block, opt_element, opt_name, opt_oldValue, opt_newValue) {
43
+ super(opt_block);
53
44
 
54
- /**
55
- * Type of this event.
56
- * @type {string}
57
- */
58
- BlockChange.prototype.type = eventUtils.BLOCK_CHANGE;
45
+ /**
46
+ * Type of this event.
47
+ * @type {string}
48
+ */
49
+ this.type = eventUtils.BLOCK_CHANGE;
59
50
 
60
- /**
61
- * Encode the event as JSON.
62
- * @return {!Object} JSON representation.
63
- */
64
- BlockChange.prototype.toJson = function() {
65
- const json = BlockChange.superClass_.toJson.call(this);
66
- json['element'] = this.element;
67
- if (this.name) {
68
- json['name'] = this.name;
51
+ if (!opt_block) {
52
+ return; // Blank event to be populated by fromJson.
53
+ }
54
+ this.element = typeof opt_element === 'undefined' ? '' : opt_element;
55
+ this.name = typeof opt_name === 'undefined' ? '' : opt_name;
56
+ this.oldValue = typeof opt_oldValue === 'undefined' ? '' : opt_oldValue;
57
+ this.newValue = typeof opt_newValue === 'undefined' ? '' : opt_newValue;
69
58
  }
70
- json['oldValue'] = this.oldValue;
71
- json['newValue'] = this.newValue;
72
- return json;
73
- };
74
59
 
75
- /**
76
- * Decode the JSON event.
77
- * @param {!Object} json JSON representation.
78
- */
79
- BlockChange.prototype.fromJson = function(json) {
80
- BlockChange.superClass_.fromJson.call(this, json);
81
- this.element = json['element'];
82
- this.name = json['name'];
83
- this.oldValue = json['oldValue'];
84
- this.newValue = json['newValue'];
85
- };
86
-
87
- /**
88
- * Does this event record any change of state?
89
- * @return {boolean} False if something changed.
90
- */
91
- BlockChange.prototype.isNull = function() {
92
- return this.oldValue === this.newValue;
93
- };
60
+ /**
61
+ * Encode the event as JSON.
62
+ * @return {!Object} JSON representation.
63
+ */
64
+ toJson() {
65
+ const json = super.toJson();
66
+ json['element'] = this.element;
67
+ if (this.name) {
68
+ json['name'] = this.name;
69
+ }
70
+ json['oldValue'] = this.oldValue;
71
+ json['newValue'] = this.newValue;
72
+ return json;
73
+ }
94
74
 
95
- /**
96
- * Run a change event.
97
- * @param {boolean} forward True if run forward, false if run backward (undo).
98
- */
99
- BlockChange.prototype.run = function(forward) {
100
- const workspace = this.getEventWorkspace_();
101
- const block = workspace.getBlockById(this.blockId);
102
- if (!block) {
103
- console.warn('Can\'t change non-existent block: ' + this.blockId);
104
- return;
75
+ /**
76
+ * Decode the JSON event.
77
+ * @param {!Object} json JSON representation.
78
+ */
79
+ fromJson(json) {
80
+ super.fromJson(json);
81
+ this.element = json['element'];
82
+ this.name = json['name'];
83
+ this.oldValue = json['oldValue'];
84
+ this.newValue = json['newValue'];
105
85
  }
106
- if (block.mutator) {
107
- // Close the mutator (if open) since we don't want to update it.
108
- block.mutator.setVisible(false);
86
+
87
+ /**
88
+ * Does this event record any change of state?
89
+ * @return {boolean} False if something changed.
90
+ */
91
+ isNull() {
92
+ return this.oldValue === this.newValue;
109
93
  }
110
- const value = forward ? this.newValue : this.oldValue;
111
- switch (this.element) {
112
- case 'field': {
113
- const field = block.getField(this.name);
114
- if (field) {
115
- field.setValue(value);
116
- } else {
117
- console.warn('Can\'t set non-existent field: ' + this.name);
118
- }
119
- break;
94
+
95
+ /**
96
+ * Run a change event.
97
+ * @param {boolean} forward True if run forward, false if run backward (undo).
98
+ */
99
+ run(forward) {
100
+ const workspace = this.getEventWorkspace_();
101
+ const block = workspace.getBlockById(this.blockId);
102
+ if (!block) {
103
+ console.warn('Can\'t change non-existent block: ' + this.blockId);
104
+ return;
120
105
  }
121
- case 'comment':
122
- block.setCommentText(/** @type {string} */ (value) || null);
123
- break;
124
- case 'collapsed':
125
- block.setCollapsed(!!value);
126
- break;
127
- case 'disabled':
128
- block.setEnabled(!value);
129
- break;
130
- case 'inline':
131
- block.setInputsInline(!!value);
132
- break;
133
- case 'mutation': {
134
- const oldState = BlockChange.getExtraBlockState_(
135
- /** @type {!BlockSvg} */ (block));
136
- if (block.loadExtraState) {
137
- block.loadExtraState(JSON.parse(/** @type {string} */ (value) || '{}'));
138
- } else if (block.domToMutation) {
139
- block.domToMutation(
140
- Xml.textToDom(/** @type {string} */ (value) || '<mutation/>'));
106
+
107
+ // Assume the block is rendered so that then we can check.
108
+ const blockSvg = /** @type {!BlockSvg} */ (block);
109
+ if (blockSvg.mutator) {
110
+ // Close the mutator (if open) since we don't want to update it.
111
+ blockSvg.mutator.setVisible(false);
112
+ }
113
+ const value = forward ? this.newValue : this.oldValue;
114
+ switch (this.element) {
115
+ case 'field': {
116
+ const field = block.getField(this.name);
117
+ if (field) {
118
+ field.setValue(value);
119
+ } else {
120
+ console.warn('Can\'t set non-existent field: ' + this.name);
121
+ }
122
+ break;
123
+ }
124
+ case 'comment':
125
+ block.setCommentText(/** @type {string} */ (value) || null);
126
+ break;
127
+ case 'collapsed':
128
+ block.setCollapsed(!!value);
129
+ break;
130
+ case 'disabled':
131
+ block.setEnabled(!value);
132
+ break;
133
+ case 'inline':
134
+ block.setInputsInline(!!value);
135
+ break;
136
+ case 'mutation': {
137
+ const oldState = BlockChange.getExtraBlockState_(
138
+ /** @type {!BlockSvg} */ (block));
139
+ if (block.loadExtraState) {
140
+ block.loadExtraState(
141
+ JSON.parse(/** @type {string} */ (value) || '{}'));
142
+ } else if (block.domToMutation) {
143
+ block.domToMutation(
144
+ Xml.textToDom(/** @type {string} */ (value) || '<mutation/>'));
145
+ }
146
+ eventUtils.fire(
147
+ new BlockChange(block, 'mutation', null, oldState, value));
148
+ break;
141
149
  }
142
- eventUtils.fire(
143
- new BlockChange(block, 'mutation', null, oldState, value));
144
- break;
150
+ default:
151
+ console.warn('Unknown change type: ' + this.element);
145
152
  }
146
- default:
147
- console.warn('Unknown change type: ' + this.element);
148
153
  }
149
- };
150
154
 
151
- // TODO (#5397): Encapsulate this in the BlocklyMutationChange event when
152
- // refactoring change events.
153
- /**
154
- * Returns the extra state of the given block (either as XML or a JSO, depending
155
- * on the block's definition).
156
- * @param {!BlockSvg} block The block to get the extra state of.
157
- * @return {string} A stringified version of the extra state of the given block.
158
- * @package
159
- */
160
- BlockChange.getExtraBlockState_ = function(block) {
161
- if (block.saveExtraState) {
162
- const state = block.saveExtraState();
163
- return state ? JSON.stringify(state) : '';
164
- } else if (block.mutationToDom) {
165
- const state = block.mutationToDom();
166
- return state ? Xml.domToText(state) : '';
155
+ // TODO (#5397): Encapsulate this in the BlocklyMutationChange event when
156
+ // refactoring change events.
157
+ /**
158
+ * Returns the extra state of the given block (either as XML or a JSO,
159
+ * depending on the block's definition).
160
+ * @param {!BlockSvg} block The block to get the extra state of.
161
+ * @return {string} A stringified version of the extra state of the given
162
+ * block.
163
+ * @package
164
+ */
165
+ static getExtraBlockState_(block) {
166
+ if (block.saveExtraState) {
167
+ const state = block.saveExtraState();
168
+ return state ? JSON.stringify(state) : '';
169
+ } else if (block.mutationToDom) {
170
+ const state = block.mutationToDom();
171
+ return state ? Xml.domToText(state) : '';
172
+ }
173
+ return '';
167
174
  }
168
- return '';
169
- };
175
+ }
170
176
 
171
177
  registry.register(registry.Type.EVENT, eventUtils.CHANGE, BlockChange);
172
178