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
package/core/input.js CHANGED
@@ -15,18 +15,6 @@
15
15
  */
16
16
  goog.module('Blockly.Input');
17
17
 
18
- /**
19
- * Enum for alignment of inputs.
20
- * @enum {number}
21
- * @alias Blockly.Input.Align
22
- */
23
- const Align = {
24
- LEFT: -1,
25
- CENTRE: 0,
26
- RIGHT: 1,
27
- };
28
- exports.Align = Align;
29
-
30
18
  const fieldRegistry = goog.require('Blockly.fieldRegistry');
31
19
  /* eslint-disable-next-line no-unused-vars */
32
20
  const {BlockSvg} = goog.requireType('Blockly.BlockSvg');
@@ -42,285 +30,306 @@ const {inputTypes} = goog.require('Blockly.inputTypes');
42
30
  /** @suppress {extraRequire} */
43
31
  goog.require('Blockly.FieldLabel');
44
32
 
33
+
45
34
  /**
46
35
  * Class for an input with an optional field.
47
- * @param {number} type The type of the input.
48
- * @param {string} name Language-neutral identifier which may used to find this
49
- * input again.
50
- * @param {!Block} block The block containing this input.
51
- * @param {Connection} connection Optional connection for this input.
52
- * @constructor
53
36
  * @alias Blockly.Input
54
37
  */
55
- const Input = function(type, name, block, connection) {
56
- if (type !== inputTypes.DUMMY && !name) {
57
- throw Error('Value inputs and statement inputs must have non-empty name.');
58
- }
59
- /** @type {number} */
60
- this.type = type;
61
- /** @type {string} */
62
- this.name = name;
38
+ class Input {
63
39
  /**
64
- * @type {!Block}
65
- * @private
40
+ * @param {number} type The type of the input.
41
+ * @param {string} name Language-neutral identifier which may used to find
42
+ * this input again.
43
+ * @param {!Block} block The block containing this input.
44
+ * @param {Connection} connection Optional connection for this input.
66
45
  */
67
- this.sourceBlock_ = block;
68
- /** @type {Connection} */
69
- this.connection = connection;
70
- /** @type {!Array<!Field>} */
71
- this.fieldRow = [];
72
- };
73
-
74
- /**
75
- * Alignment of input's fields (left, right or centre).
76
- * @type {number}
77
- */
78
- Input.prototype.align = Align.LEFT;
79
-
80
- /**
81
- * Is the input visible?
82
- * @type {boolean}
83
- * @private
84
- */
85
- Input.prototype.visible_ = true;
86
-
87
- /**
88
- * Get the source block for this input.
89
- * @return {?Block} The source block, or null if there is none.
90
- */
91
- Input.prototype.getSourceBlock = function() {
92
- return this.sourceBlock_;
93
- };
46
+ constructor(type, name, block, connection) {
47
+ if (type !== inputTypes.DUMMY && !name) {
48
+ throw Error(
49
+ 'Value inputs and statement inputs must have non-empty name.');
50
+ }
51
+ /** @type {number} */
52
+ this.type = type;
53
+ /** @type {string} */
54
+ this.name = name;
55
+ /**
56
+ * @type {!Block}
57
+ * @private
58
+ */
59
+ this.sourceBlock_ = block;
60
+ /** @type {Connection} */
61
+ this.connection = connection;
62
+ /** @type {!Array<!Field>} */
63
+ this.fieldRow = [];
94
64
 
95
- /**
96
- * Add a field (or label from string), and all prefix and suffix fields, to the
97
- * end of the input's field row.
98
- * @param {string|!Field} field Something to add as a field.
99
- * @param {string=} opt_name Language-neutral identifier which may used to find
100
- * this field again. Should be unique to the host block.
101
- * @return {!Input} The input being append to (to allow chaining).
102
- */
103
- Input.prototype.appendField = function(field, opt_name) {
104
- this.insertFieldAt(this.fieldRow.length, field, opt_name);
105
- return this;
106
- };
65
+ /**
66
+ * Alignment of input's fields (left, right or centre).
67
+ * @type {number}
68
+ */
69
+ this.align = Align.LEFT;
107
70
 
108
- /**
109
- * Inserts a field (or label from string), and all prefix and suffix fields, at
110
- * the location of the input's field row.
111
- * @param {number} index The index at which to insert field.
112
- * @param {string|!Field} field Something to add as a field.
113
- * @param {string=} opt_name Language-neutral identifier which may used to find
114
- * this field again. Should be unique to the host block.
115
- * @return {number} The index following the last inserted field.
116
- */
117
- Input.prototype.insertFieldAt = function(index, field, opt_name) {
118
- if (index < 0 || index > this.fieldRow.length) {
119
- throw Error('index ' + index + ' out of bounds.');
120
- }
121
- // Falsy field values don't generate a field, unless the field is an empty
122
- // string and named.
123
- if (!field && !(field === '' && opt_name)) {
124
- return index;
71
+ /**
72
+ * Is the input visible?
73
+ * @type {boolean}
74
+ * @private
75
+ */
76
+ this.visible_ = true;
125
77
  }
126
78
 
127
- // Generate a FieldLabel when given a plain text field.
128
- if (typeof field === 'string') {
129
- field = /** @type {!Field} **/ (fieldRegistry.fromJson({
130
- 'type': 'field_label',
131
- 'text': field,
132
- }));
79
+ /**
80
+ * Get the source block for this input.
81
+ * @return {?Block} The source block, or null if there is none.
82
+ */
83
+ getSourceBlock() {
84
+ return this.sourceBlock_;
133
85
  }
134
86
 
135
- field.setSourceBlock(this.sourceBlock_);
136
- if (this.sourceBlock_.rendered) {
137
- field.init();
138
- field.applyColour();
87
+ /**
88
+ * Add a field (or label from string), and all prefix and suffix fields, to
89
+ * the end of the input's field row.
90
+ * @param {string|!Field} field Something to add as a field.
91
+ * @param {string=} opt_name Language-neutral identifier which may used to
92
+ * find this field again. Should be unique to the host block.
93
+ * @return {!Input} The input being append to (to allow chaining).
94
+ */
95
+ appendField(field, opt_name) {
96
+ this.insertFieldAt(this.fieldRow.length, field, opt_name);
97
+ return this;
139
98
  }
140
- field.name = opt_name;
141
- field.setVisible(this.isVisible());
142
99
 
143
- if (field.prefixField) {
144
- // Add any prefix.
145
- index = this.insertFieldAt(index, field.prefixField);
146
- }
147
- // Add the field to the field row.
148
- this.fieldRow.splice(index, 0, field);
149
- index++;
150
- if (field.suffixField) {
151
- // Add any suffix.
152
- index = this.insertFieldAt(index, field.suffixField);
153
- }
100
+ /**
101
+ * Inserts a field (or label from string), and all prefix and suffix fields,
102
+ * at the location of the input's field row.
103
+ * @param {number} index The index at which to insert field.
104
+ * @param {string|!Field} field Something to add as a field.
105
+ * @param {string=} opt_name Language-neutral identifier which may used to
106
+ * find this field again. Should be unique to the host block.
107
+ * @return {number} The index following the last inserted field.
108
+ */
109
+ insertFieldAt(index, field, opt_name) {
110
+ if (index < 0 || index > this.fieldRow.length) {
111
+ throw Error('index ' + index + ' out of bounds.');
112
+ }
113
+ // Falsy field values don't generate a field, unless the field is an empty
114
+ // string and named.
115
+ if (!field && !(field === '' && opt_name)) {
116
+ return index;
117
+ }
118
+
119
+ // Generate a FieldLabel when given a plain text field.
120
+ if (typeof field === 'string') {
121
+ field = /** @type {!Field} **/ (fieldRegistry.fromJson({
122
+ 'type': 'field_label',
123
+ 'text': field,
124
+ }));
125
+ }
126
+
127
+ field.setSourceBlock(this.sourceBlock_);
128
+ if (this.sourceBlock_.rendered) {
129
+ field.init();
130
+ field.applyColour();
131
+ }
132
+ field.name = opt_name;
133
+ field.setVisible(this.isVisible());
134
+
135
+ if (field.prefixField) {
136
+ // Add any prefix.
137
+ index = this.insertFieldAt(index, field.prefixField);
138
+ }
139
+ // Add the field to the field row.
140
+ this.fieldRow.splice(index, 0, field);
141
+ index++;
142
+ if (field.suffixField) {
143
+ // Add any suffix.
144
+ index = this.insertFieldAt(index, field.suffixField);
145
+ }
154
146
 
155
- if (this.sourceBlock_.rendered) {
156
- this.sourceBlock_ = /** @type {!BlockSvg} */ (this.sourceBlock_);
157
- this.sourceBlock_.render();
158
- // Adding a field will cause the block to change shape.
159
- this.sourceBlock_.bumpNeighbours();
147
+ if (this.sourceBlock_.rendered) {
148
+ this.sourceBlock_ = /** @type {!BlockSvg} */ (this.sourceBlock_);
149
+ this.sourceBlock_.render();
150
+ // Adding a field will cause the block to change shape.
151
+ this.sourceBlock_.bumpNeighbours();
152
+ }
153
+ return index;
160
154
  }
161
- return index;
162
- };
163
155
 
164
- /**
165
- * Remove a field from this input.
166
- * @param {string} name The name of the field.
167
- * @param {boolean=} opt_quiet True to prevent an error if field is not present.
168
- * @return {boolean} True if operation succeeds, false if field is not present
169
- * and opt_quiet is true.
170
- * @throws {Error} if the field is not present and opt_quiet is false.
171
- */
172
- Input.prototype.removeField = function(name, opt_quiet) {
173
- for (let i = 0, field; (field = this.fieldRow[i]); i++) {
174
- if (field.name === name) {
175
- field.dispose();
176
- this.fieldRow.splice(i, 1);
177
- if (this.sourceBlock_.rendered) {
178
- this.sourceBlock_ = /** @type {!BlockSvg} */ (this.sourceBlock_);
179
- this.sourceBlock_.render();
180
- // Removing a field will cause the block to change shape.
181
- this.sourceBlock_.bumpNeighbours();
156
+ /**
157
+ * Remove a field from this input.
158
+ * @param {string} name The name of the field.
159
+ * @param {boolean=} opt_quiet True to prevent an error if field is not
160
+ * present.
161
+ * @return {boolean} True if operation succeeds, false if field is not present
162
+ * and opt_quiet is true.
163
+ * @throws {Error} if the field is not present and opt_quiet is false.
164
+ */
165
+ removeField(name, opt_quiet) {
166
+ for (let i = 0, field; (field = this.fieldRow[i]); i++) {
167
+ if (field.name === name) {
168
+ field.dispose();
169
+ this.fieldRow.splice(i, 1);
170
+ if (this.sourceBlock_.rendered) {
171
+ this.sourceBlock_ = /** @type {!BlockSvg} */ (this.sourceBlock_);
172
+ this.sourceBlock_.render();
173
+ // Removing a field will cause the block to change shape.
174
+ this.sourceBlock_.bumpNeighbours();
175
+ }
176
+ return true;
182
177
  }
183
- return true;
184
178
  }
179
+ if (opt_quiet) {
180
+ return false;
181
+ }
182
+ throw Error('Field "' + name + '" not found.');
185
183
  }
186
- if (opt_quiet) {
187
- return false;
184
+
185
+ /**
186
+ * Gets whether this input is visible or not.
187
+ * @return {boolean} True if visible.
188
+ */
189
+ isVisible() {
190
+ return this.visible_;
188
191
  }
189
- throw Error('Field "' + name + '" not found.');
190
- };
191
192
 
192
- /**
193
- * Gets whether this input is visible or not.
194
- * @return {boolean} True if visible.
195
- */
196
- Input.prototype.isVisible = function() {
197
- return this.visible_;
198
- };
193
+ /**
194
+ * Sets whether this input is visible or not.
195
+ * Should only be used to collapse/uncollapse a block.
196
+ * @param {boolean} visible True if visible.
197
+ * @return {!Array<!BlockSvg>} List of blocks to render.
198
+ * @package
199
+ */
200
+ setVisible(visible) {
201
+ // Note: Currently there are only unit tests for block.setCollapsed()
202
+ // because this function is package. If this function goes back to being a
203
+ // public API tests (lots of tests) should be added.
204
+ let renderList = [];
205
+ if (this.visible_ === visible) {
206
+ return renderList;
207
+ }
208
+ this.visible_ = visible;
199
209
 
200
- /**
201
- * Sets whether this input is visible or not.
202
- * Should only be used to collapse/uncollapse a block.
203
- * @param {boolean} visible True if visible.
204
- * @return {!Array<!BlockSvg>} List of blocks to render.
205
- * @package
206
- */
207
- Input.prototype.setVisible = function(visible) {
208
- // Note: Currently there are only unit tests for block.setCollapsed()
209
- // because this function is package. If this function goes back to being a
210
- // public API tests (lots of tests) should be added.
211
- let renderList = [];
212
- if (this.visible_ === visible) {
210
+ for (let y = 0, field; (field = this.fieldRow[y]); y++) {
211
+ field.setVisible(visible);
212
+ }
213
+ if (this.connection) {
214
+ this.connection =
215
+ /** @type {!RenderedConnection} */ (this.connection);
216
+ // Has a connection.
217
+ if (visible) {
218
+ renderList = this.connection.startTrackingAll();
219
+ } else {
220
+ this.connection.stopTrackingAll();
221
+ }
222
+ const child = this.connection.targetBlock();
223
+ if (child) {
224
+ child.getSvgRoot().style.display = visible ? 'block' : 'none';
225
+ }
226
+ }
213
227
  return renderList;
214
228
  }
215
- this.visible_ = visible;
216
229
 
217
- for (let y = 0, field; (field = this.fieldRow[y]); y++) {
218
- field.setVisible(visible);
219
- }
220
- if (this.connection) {
221
- this.connection =
222
- /** @type {!RenderedConnection} */ (this.connection);
223
- // Has a connection.
224
- if (visible) {
225
- renderList = this.connection.startTrackingAll();
226
- } else {
227
- this.connection.stopTrackingAll();
228
- }
229
- const child = this.connection.targetBlock();
230
- if (child) {
231
- child.getSvgRoot().style.display = visible ? 'block' : 'none';
230
+ /**
231
+ * Mark all fields on this input as dirty.
232
+ * @package
233
+ */
234
+ markDirty() {
235
+ for (let y = 0, field; (field = this.fieldRow[y]); y++) {
236
+ field.markDirty();
232
237
  }
233
238
  }
234
- return renderList;
235
- };
236
239
 
237
- /**
238
- * Mark all fields on this input as dirty.
239
- * @package
240
- */
241
- Input.prototype.markDirty = function() {
242
- for (let y = 0, field; (field = this.fieldRow[y]); y++) {
243
- field.markDirty();
240
+ /**
241
+ * Change a connection's compatibility.
242
+ * @param {string|Array<string>|null} check Compatible value type or
243
+ * list of value types. Null if all types are compatible.
244
+ * @return {!Input} The input being modified (to allow chaining).
245
+ */
246
+ setCheck(check) {
247
+ if (!this.connection) {
248
+ throw Error('This input does not have a connection.');
249
+ }
250
+ this.connection.setCheck(check);
251
+ return this;
244
252
  }
245
- };
246
253
 
247
- /**
248
- * Change a connection's compatibility.
249
- * @param {string|Array<string>|null} check Compatible value type or
250
- * list of value types. Null if all types are compatible.
251
- * @return {!Input} The input being modified (to allow chaining).
252
- */
253
- Input.prototype.setCheck = function(check) {
254
- if (!this.connection) {
255
- throw Error('This input does not have a connection.');
254
+ /**
255
+ * Change the alignment of the connection's field(s).
256
+ * @param {number} align One of the values of Align
257
+ * In RTL mode directions are reversed, and Align.RIGHT aligns to the left.
258
+ * @return {!Input} The input being modified (to allow chaining).
259
+ */
260
+ setAlign(align) {
261
+ this.align = align;
262
+ if (this.sourceBlock_.rendered) {
263
+ this.sourceBlock_ = /** @type {!BlockSvg} */ (this.sourceBlock_);
264
+ this.sourceBlock_.render();
265
+ }
266
+ return this;
256
267
  }
257
- this.connection.setCheck(check);
258
- return this;
259
- };
260
268
 
261
- /**
262
- * Change the alignment of the connection's field(s).
263
- * @param {number} align One of the values of Align
264
- * In RTL mode directions are reversed, and Align.RIGHT aligns to the left.
265
- * @return {!Input} The input being modified (to allow chaining).
266
- */
267
- Input.prototype.setAlign = function(align) {
268
- this.align = align;
269
- if (this.sourceBlock_.rendered) {
270
- this.sourceBlock_ = /** @type {!BlockSvg} */ (this.sourceBlock_);
271
- this.sourceBlock_.render();
269
+ /**
270
+ * Changes the connection's shadow block.
271
+ * @param {?Element} shadow DOM representation of a block or null.
272
+ * @return {!Input} The input being modified (to allow chaining).
273
+ */
274
+ setShadowDom(shadow) {
275
+ if (!this.connection) {
276
+ throw Error('This input does not have a connection.');
277
+ }
278
+ this.connection.setShadowDom(shadow);
279
+ return this;
272
280
  }
273
- return this;
274
- };
275
281
 
276
- /**
277
- * Changes the connection's shadow block.
278
- * @param {?Element} shadow DOM representation of a block or null.
279
- * @return {!Input} The input being modified (to allow chaining).
280
- */
281
- Input.prototype.setShadowDom = function(shadow) {
282
- if (!this.connection) {
283
- throw Error('This input does not have a connection.');
282
+ /**
283
+ * Returns the XML representation of the connection's shadow block.
284
+ * @return {?Element} Shadow DOM representation of a block or null.
285
+ */
286
+ getShadowDom() {
287
+ if (!this.connection) {
288
+ throw Error('This input does not have a connection.');
289
+ }
290
+ return this.connection.getShadowDom();
284
291
  }
285
- this.connection.setShadowDom(shadow);
286
- return this;
287
- };
288
292
 
289
- /**
290
- * Returns the XML representation of the connection's shadow block.
291
- * @return {?Element} Shadow DOM representation of a block or null.
292
- */
293
- Input.prototype.getShadowDom = function() {
294
- if (!this.connection) {
295
- throw Error('This input does not have a connection.');
293
+ /**
294
+ * Initialize the fields on this input.
295
+ */
296
+ init() {
297
+ if (!this.sourceBlock_.workspace.rendered) {
298
+ return; // Headless blocks don't need fields initialized.
299
+ }
300
+ for (let i = 0; i < this.fieldRow.length; i++) {
301
+ this.fieldRow[i].init();
302
+ }
296
303
  }
297
- return this.connection.getShadowDom();
298
- };
299
304
 
300
- /**
301
- * Initialize the fields on this input.
302
- */
303
- Input.prototype.init = function() {
304
- if (!this.sourceBlock_.workspace.rendered) {
305
- return; // Headless blocks don't need fields initialized.
306
- }
307
- for (let i = 0; i < this.fieldRow.length; i++) {
308
- this.fieldRow[i].init();
305
+ /**
306
+ * Sever all links to this input.
307
+ * @suppress {checkTypes}
308
+ */
309
+ dispose() {
310
+ for (let i = 0, field; (field = this.fieldRow[i]); i++) {
311
+ field.dispose();
312
+ }
313
+ if (this.connection) {
314
+ this.connection.dispose();
315
+ }
316
+ this.sourceBlock_ = null;
309
317
  }
310
- };
318
+ }
311
319
 
312
320
  /**
313
- * Sever all links to this input.
314
- * @suppress {checkTypes}
321
+ * Enum for alignment of inputs.
322
+ * @enum {number}
323
+ * @alias Blockly.Input.Align
315
324
  */
316
- Input.prototype.dispose = function() {
317
- for (let i = 0, field; (field = this.fieldRow[i]); i++) {
318
- field.dispose();
319
- }
320
- if (this.connection) {
321
- this.connection.dispose();
322
- }
323
- this.sourceBlock_ = null;
325
+ const Align = {
326
+ LEFT: -1,
327
+ CENTRE: 0,
328
+ RIGHT: 1,
324
329
  };
330
+ exports.Align = Align;
331
+
332
+ // Add Align to Input so that `Blockly.Input.Align` is publicly accessible.
333
+ Input.Align = Align;
325
334
 
326
335
  exports.Input = Input;