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
@@ -17,7 +17,6 @@ goog.module('Blockly.CollapsibleToolboxCategory');
17
17
 
18
18
  const aria = goog.require('Blockly.utils.aria');
19
19
  const dom = goog.require('Blockly.utils.dom');
20
- const object = goog.require('Blockly.utils.object');
21
20
  const registry = goog.require('Blockly.registry');
22
21
  const toolbox = goog.require('Blockly.utils.toolbox');
23
22
  /* eslint-disable-next-line no-unused-vars */
@@ -32,277 +31,277 @@ const {ToolboxSeparator} = goog.require('Blockly.ToolboxSeparator');
32
31
 
33
32
  /**
34
33
  * Class for a category in a toolbox that can be collapsed.
35
- * @param {!toolbox.CategoryInfo} categoryDef The information needed
36
- * to create a category in the toolbox.
37
- * @param {!IToolbox} toolbox The parent toolbox for the category.
38
- * @param {ICollapsibleToolboxItem=} opt_parent The parent category or null if
39
- * the category does not have a parent.
40
- * @constructor
41
- * @extends {ToolboxCategory}
42
34
  * @implements {ICollapsibleToolboxItem}
43
35
  * @alias Blockly.CollapsibleToolboxCategory
44
36
  */
45
- const CollapsibleToolboxCategory = function(categoryDef, toolbox, opt_parent) {
37
+ class CollapsibleToolboxCategory extends ToolboxCategory {
46
38
  /**
47
- * Container for any child categories.
48
- * @type {?Element}
49
- * @protected
39
+ * @param {!toolbox.CategoryInfo} categoryDef The information needed
40
+ * to create a category in the toolbox.
41
+ * @param {!IToolbox} toolbox The parent toolbox for the category.
42
+ * @param {ICollapsibleToolboxItem=} opt_parent The parent category or null if
43
+ * the category does not have a parent.
50
44
  */
51
- this.subcategoriesDiv_ = null;
45
+ constructor(categoryDef, toolbox, opt_parent) {
46
+ super(categoryDef, toolbox, opt_parent);
47
+
48
+ /**
49
+ * Container for any child categories.
50
+ * @type {?HTMLDivElement}
51
+ * @protected
52
+ */
53
+ this.subcategoriesDiv_ = null;
54
+
55
+ /**
56
+ * Whether or not the category should display its subcategories.
57
+ * @type {boolean}
58
+ * @protected
59
+ */
60
+ this.expanded_ = false;
61
+
62
+ /**
63
+ * The child toolbox items for this category.
64
+ * @type {!Array<!IToolboxItem>}
65
+ * @protected
66
+ */
67
+ this.toolboxItems_ = [];
68
+ }
52
69
 
53
70
  /**
54
- * Whether or not the category should display its subcategories.
55
- * @type {boolean}
56
- * @protected
71
+ * @override
57
72
  */
58
- this.expanded_ = false;
73
+ makeDefaultCssConfig_() {
74
+ const cssConfig = super.makeDefaultCssConfig_();
75
+ cssConfig['contents'] = 'blocklyToolboxContents';
76
+ return cssConfig;
77
+ }
59
78
 
60
79
  /**
61
- * The child toolbox items for this category.
62
- * @type {!Array<!IToolboxItem>}
63
- * @protected
80
+ * @override
64
81
  */
65
- this.toolboxItems_ = [];
66
-
67
- CollapsibleToolboxCategory.superClass_.constructor.call(
68
- this, categoryDef, toolbox, opt_parent);
69
- };
70
-
71
- object.inherits(CollapsibleToolboxCategory, ToolboxCategory);
72
-
73
- /**
74
- * All the CSS class names that are used to create a collapsible
75
- * category. This is all the properties from the regular category plus contents.
76
- * @typedef {{
77
- * container:?string,
78
- * row:?string,
79
- * rowcontentcontainer:?string,
80
- * icon:?string,
81
- * label:?string,
82
- * selected:?string,
83
- * openicon:?string,
84
- * closedicon:?string,
85
- * contents:?string
86
- * }}
87
- */
88
- CollapsibleToolboxCategory.CssConfig;
89
-
90
- /**
91
- * Name used for registering a collapsible toolbox category.
92
- * @const {string}
93
- */
94
- CollapsibleToolboxCategory.registrationName = 'collapsibleCategory';
95
-
96
- /**
97
- * @override
98
- */
99
- CollapsibleToolboxCategory.prototype.makeDefaultCssConfig_ = function() {
100
- const cssConfig =
101
- CollapsibleToolboxCategory.superClass_.makeDefaultCssConfig_.call(this);
102
- cssConfig['contents'] = 'blocklyToolboxContents';
103
- return cssConfig;
104
- };
105
-
106
- /**
107
- * @override
108
- */
109
- CollapsibleToolboxCategory.prototype.parseContents_ = function(categoryDef) {
110
- const contents = categoryDef['contents'];
111
- let prevIsFlyoutItem = true;
112
-
113
- if (categoryDef['custom']) {
114
- this.flyoutItems_ = categoryDef['custom'];
115
- } else if (contents) {
116
- for (let i = 0; i < contents.length; i++) {
117
- const itemDef = contents[i];
118
- // Separators can exist as either a flyout item or a toolbox item so
119
- // decide where it goes based on the type of the previous item.
120
- if (!registry.hasItem(registry.Type.TOOLBOX_ITEM, itemDef['kind']) ||
121
- (itemDef['kind'].toLowerCase() ===
122
- ToolboxSeparator.registrationName &&
123
- prevIsFlyoutItem)) {
124
- const flyoutItem = /** @type {toolbox.FlyoutItemInfo} */ (itemDef);
125
- this.flyoutItems_.push(flyoutItem);
126
- prevIsFlyoutItem = true;
127
- } else {
128
- this.createToolboxItem_(itemDef);
129
- prevIsFlyoutItem = false;
82
+ parseContents_(categoryDef) {
83
+ const contents = categoryDef['contents'];
84
+ let prevIsFlyoutItem = true;
85
+
86
+ if (categoryDef['custom']) {
87
+ this.flyoutItems_ = categoryDef['custom'];
88
+ } else if (contents) {
89
+ for (let i = 0; i < contents.length; i++) {
90
+ const itemDef = contents[i];
91
+ // Separators can exist as either a flyout item or a toolbox item so
92
+ // decide where it goes based on the type of the previous item.
93
+ if (!registry.hasItem(registry.Type.TOOLBOX_ITEM, itemDef['kind']) ||
94
+ (itemDef['kind'].toLowerCase() ===
95
+ ToolboxSeparator.registrationName &&
96
+ prevIsFlyoutItem)) {
97
+ const flyoutItem = /** @type {toolbox.FlyoutItemInfo} */ (itemDef);
98
+ this.flyoutItems_.push(flyoutItem);
99
+ prevIsFlyoutItem = true;
100
+ } else {
101
+ this.createToolboxItem_(itemDef);
102
+ prevIsFlyoutItem = false;
103
+ }
130
104
  }
131
105
  }
132
106
  }
133
- };
134
107
 
135
- /**
136
- * Creates a toolbox item and adds it to the list of toolbox items.
137
- * @param {!toolbox.ToolboxItemInfo} itemDef The information needed
138
- * to create a toolbox item.
139
- * @private
140
- */
141
- CollapsibleToolboxCategory.prototype.createToolboxItem_ = function(itemDef) {
142
- let registryName = itemDef['kind'];
143
- const categoryDef = /** @type {!toolbox.CategoryInfo} */ (itemDef);
144
-
145
- // Categories that are collapsible are created using a class registered under
146
- // a different name.
147
- if (registryName.toUpperCase() == 'CATEGORY' &&
148
- toolbox.isCategoryCollapsible(categoryDef)) {
149
- registryName = CollapsibleToolboxCategory.registrationName;
108
+ /**
109
+ * Creates a toolbox item and adds it to the list of toolbox items.
110
+ * @param {!toolbox.ToolboxItemInfo} itemDef The information needed
111
+ * to create a toolbox item.
112
+ * @private
113
+ */
114
+ createToolboxItem_(itemDef) {
115
+ let registryName = itemDef['kind'];
116
+ const categoryDef = /** @type {!toolbox.CategoryInfo} */ (itemDef);
117
+
118
+ // Categories that are collapsible are created using a class registered
119
+ // under a different name.
120
+ if (registryName.toUpperCase() == 'CATEGORY' &&
121
+ toolbox.isCategoryCollapsible(categoryDef)) {
122
+ registryName = CollapsibleToolboxCategory.registrationName;
123
+ }
124
+ const ToolboxItemClass =
125
+ registry.getClass(registry.Type.TOOLBOX_ITEM, registryName);
126
+ const toolboxItem =
127
+ new ToolboxItemClass(itemDef, this.parentToolbox_, this);
128
+ this.toolboxItems_.push(toolboxItem);
150
129
  }
151
- const ToolboxItemClass =
152
- registry.getClass(registry.Type.TOOLBOX_ITEM, registryName);
153
- const toolboxItem = new ToolboxItemClass(itemDef, this.parentToolbox_, this);
154
- this.toolboxItems_.push(toolboxItem);
155
- };
156
-
157
- /**
158
- * @override
159
- */
160
- CollapsibleToolboxCategory.prototype.init = function() {
161
- CollapsibleToolboxCategory.superClass_.init.call(this);
162
130
 
163
- this.setExpanded(
164
- this.toolboxItemDef_['expanded'] === 'true' ||
165
- this.toolboxItemDef_['expanded']);
166
- };
131
+ /**
132
+ * @override
133
+ */
134
+ init() {
135
+ super.init();
167
136
 
168
- /**
169
- * @override
170
- */
171
- CollapsibleToolboxCategory.prototype.createDom_ = function() {
172
- CollapsibleToolboxCategory.superClass_.createDom_.call(this);
137
+ this.setExpanded(
138
+ this.toolboxItemDef_['expanded'] === 'true' ||
139
+ this.toolboxItemDef_['expanded']);
140
+ }
173
141
 
174
- const subCategories = this.getChildToolboxItems();
175
- this.subcategoriesDiv_ = this.createSubCategoriesDom_(subCategories);
176
- aria.setRole(this.subcategoriesDiv_, aria.Role.GROUP);
177
- this.htmlDiv_.appendChild(this.subcategoriesDiv_);
142
+ /**
143
+ * @override
144
+ */
145
+ createDom_() {
146
+ super.createDom_();
178
147
 
179
- return this.htmlDiv_;
180
- };
148
+ const subCategories = this.getChildToolboxItems();
149
+ this.subcategoriesDiv_ = this.createSubCategoriesDom_(subCategories);
150
+ aria.setRole(this.subcategoriesDiv_, aria.Role.GROUP);
151
+ this.htmlDiv_.appendChild(this.subcategoriesDiv_);
181
152
 
182
- /**
183
- * @override
184
- */
185
- CollapsibleToolboxCategory.prototype.createIconDom_ = function() {
186
- const toolboxIcon = document.createElement('span');
187
- if (!this.parentToolbox_.isHorizontal()) {
188
- dom.addClass(toolboxIcon, this.cssConfig_['icon']);
189
- toolboxIcon.style.visibility = 'visible';
153
+ return this.htmlDiv_;
190
154
  }
191
155
 
192
- toolboxIcon.style.display = 'inline-block';
193
- return toolboxIcon;
194
- };
156
+ /**
157
+ * @override
158
+ */
159
+ createIconDom_() {
160
+ const toolboxIcon = document.createElement('span');
161
+ if (!this.parentToolbox_.isHorizontal()) {
162
+ dom.addClass(toolboxIcon, this.cssConfig_['icon']);
163
+ toolboxIcon.style.visibility = 'visible';
164
+ }
195
165
 
196
- /**
197
- * Create the DOM for all subcategories.
198
- * @param {!Array<!IToolboxItem>} subcategories The subcategories.
199
- * @return {!Element} The div holding all the subcategories.
200
- * @protected
201
- */
202
- CollapsibleToolboxCategory.prototype.createSubCategoriesDom_ = function(
203
- subcategories) {
204
- const contentsContainer = document.createElement('div');
205
- dom.addClass(contentsContainer, this.cssConfig_['contents']);
206
-
207
- for (let i = 0; i < subcategories.length; i++) {
208
- const newCategory = subcategories[i];
209
- newCategory.init();
210
- const newCategoryDiv = newCategory.getDiv();
211
- contentsContainer.appendChild(newCategoryDiv);
212
- if (newCategory.getClickTarget) {
213
- newCategory.getClickTarget().setAttribute('id', newCategory.getId());
166
+ toolboxIcon.style.display = 'inline-block';
167
+ return toolboxIcon;
168
+ }
169
+
170
+ /**
171
+ * Create the DOM for all subcategories.
172
+ * @param {!Array<!IToolboxItem>} subcategories The subcategories.
173
+ * @return {!HTMLDivElement} The div holding all the subcategories.
174
+ * @protected
175
+ */
176
+ createSubCategoriesDom_(subcategories) {
177
+ const contentsContainer =
178
+ /** @type {!HTMLDivElement} */ (document.createElement('div'));
179
+ dom.addClass(contentsContainer, this.cssConfig_['contents']);
180
+
181
+ for (let i = 0; i < subcategories.length; i++) {
182
+ const newCategory = subcategories[i];
183
+ newCategory.init();
184
+ const newCategoryDiv = newCategory.getDiv();
185
+ contentsContainer.appendChild(newCategoryDiv);
186
+ if (newCategory.getClickTarget) {
187
+ newCategory.getClickTarget().setAttribute('id', newCategory.getId());
188
+ }
214
189
  }
190
+ return contentsContainer;
215
191
  }
216
- return contentsContainer;
217
- };
218
192
 
193
+ /**
194
+ * Opens or closes the current category.
195
+ * @param {boolean} isExpanded True to expand the category, false to close.
196
+ * @public
197
+ */
198
+ setExpanded(isExpanded) {
199
+ if (this.expanded_ === isExpanded) {
200
+ return;
201
+ }
202
+ this.expanded_ = isExpanded;
203
+ if (isExpanded) {
204
+ this.subcategoriesDiv_.style.display = 'block';
205
+ this.openIcon_(this.iconDom_);
206
+ } else {
207
+ this.subcategoriesDiv_.style.display = 'none';
208
+ this.closeIcon_(this.iconDom_);
209
+ }
210
+ aria.setState(
211
+ /** @type {!HTMLDivElement} */ (this.htmlDiv_), aria.State.EXPANDED,
212
+ isExpanded);
219
213
 
220
- /**
221
- * Opens or closes the current category.
222
- * @param {boolean} isExpanded True to expand the category, false to close.
223
- * @public
224
- */
225
- CollapsibleToolboxCategory.prototype.setExpanded = function(isExpanded) {
226
- if (this.expanded_ === isExpanded) {
227
- return;
214
+ this.parentToolbox_.handleToolboxItemResize();
228
215
  }
229
- this.expanded_ = isExpanded;
230
- if (isExpanded) {
231
- this.subcategoriesDiv_.style.display = 'block';
232
- this.openIcon_(this.iconDom_);
233
- } else {
234
- this.subcategoriesDiv_.style.display = 'none';
235
- this.closeIcon_(this.iconDom_);
216
+
217
+ /**
218
+ * @override
219
+ */
220
+ setVisible_(isVisible) {
221
+ this.htmlDiv_.style.display = isVisible ? 'block' : 'none';
222
+ const childToolboxItems = this.getChildToolboxItems();
223
+ for (let i = 0; i < childToolboxItems.length; i++) {
224
+ const child = childToolboxItems[i];
225
+ child.setVisible_(isVisible);
226
+ }
227
+ this.isHidden_ = !isVisible;
228
+
229
+ if (this.parentToolbox_.getSelectedItem() === this) {
230
+ this.parentToolbox_.clearSelection();
231
+ }
236
232
  }
237
- aria.setState(
238
- /** @type {!Element} */ (this.htmlDiv_), aria.State.EXPANDED, isExpanded);
239
233
 
240
- this.parentToolbox_.handleToolboxItemResize();
241
- };
234
+ /**
235
+ * Whether the category is expanded to show its child subcategories.
236
+ * @return {boolean} True if the toolbox item shows its children, false if it
237
+ * is collapsed.
238
+ * @public
239
+ */
240
+ isExpanded() {
241
+ return this.expanded_;
242
+ }
242
243
 
243
- /**
244
- * @override
245
- */
246
- CollapsibleToolboxCategory.prototype.setVisible_ = function(isVisible) {
247
- this.htmlDiv_.style.display = isVisible ? 'block' : 'none';
248
- const childToolboxItems = this.getChildToolboxItems();
249
- for (let i = 0; i < childToolboxItems.length; i++) {
250
- const child = childToolboxItems[i];
251
- child.setVisible_(isVisible);
244
+ /**
245
+ * @override
246
+ */
247
+ isCollapsible() {
248
+ return true;
252
249
  }
253
- this.isHidden_ = !isVisible;
254
250
 
255
- if (this.parentToolbox_.getSelectedItem() === this) {
256
- this.parentToolbox_.clearSelection();
251
+ /**
252
+ * @override
253
+ */
254
+ onClick(_e) {
255
+ this.toggleExpanded();
257
256
  }
258
- };
259
257
 
260
- /**
261
- * Whether the category is expanded to show its child subcategories.
262
- * @return {boolean} True if the toolbox item shows its children, false if it
263
- * is collapsed.
264
- * @public
265
- */
266
- CollapsibleToolboxCategory.prototype.isExpanded = function() {
267
- return this.expanded_;
268
- };
258
+ /**
259
+ * Toggles whether or not the category is expanded.
260
+ * @public
261
+ */
262
+ toggleExpanded() {
263
+ this.setExpanded(!this.expanded_);
264
+ }
269
265
 
270
- /**
271
- * @override
272
- */
273
- CollapsibleToolboxCategory.prototype.isCollapsible = function() {
274
- return true;
275
- };
266
+ /**
267
+ * @override
268
+ */
269
+ getDiv() {
270
+ return this.htmlDiv_;
271
+ }
276
272
 
277
- /**
278
- * @override
279
- */
280
- CollapsibleToolboxCategory.prototype.onClick = function(_e) {
281
- this.toggleExpanded();
282
- };
273
+ /**
274
+ * Gets any children toolbox items. (ex. Gets the subcategories)
275
+ * @return {!Array<!IToolboxItem>} The child toolbox items.
276
+ */
277
+ getChildToolboxItems() {
278
+ return this.toolboxItems_;
279
+ }
280
+ }
283
281
 
284
282
  /**
285
- * Toggles whether or not the category is expanded.
286
- * @public
283
+ * All the CSS class names that are used to create a collapsible
284
+ * category. This is all the properties from the regular category plus contents.
285
+ * @typedef {{
286
+ * container:?string,
287
+ * row:?string,
288
+ * rowcontentcontainer:?string,
289
+ * icon:?string,
290
+ * label:?string,
291
+ * selected:?string,
292
+ * openicon:?string,
293
+ * closedicon:?string,
294
+ * contents:?string
295
+ * }}
287
296
  */
288
- CollapsibleToolboxCategory.prototype.toggleExpanded = function() {
289
- this.setExpanded(!this.expanded_);
290
- };
297
+ CollapsibleToolboxCategory.CssConfig;
291
298
 
292
299
  /**
300
+ * Name used for registering a collapsible toolbox category.
301
+ * @type {string}
293
302
  * @override
294
303
  */
295
- CollapsibleToolboxCategory.prototype.getDiv = function() {
296
- return this.htmlDiv_;
297
- };
298
-
299
- /**
300
- * Gets any children toolbox items. (ex. Gets the subcategories)
301
- * @return {!Array<!IToolboxItem>} The child toolbox items.
302
- */
303
- CollapsibleToolboxCategory.prototype.getChildToolboxItems = function() {
304
- return this.toolboxItems_;
305
- };
304
+ CollapsibleToolboxCategory.registrationName = 'collapsibleCategory';
306
305
 
307
306
 
308
307
  registry.register(
@@ -29,26 +29,68 @@ const {ToolboxItem} = goog.require('Blockly.ToolboxItem');
29
29
  /**
30
30
  * Class for a toolbox separator. This is the thin visual line that appears on
31
31
  * the toolbox. This item is not interactable.
32
- * @param {!toolbox.SeparatorInfo} separatorDef The information
33
- * needed to create a separator.
34
- * @param {!IToolbox} toolbox The parent toolbox for the separator.
35
- * @constructor
36
32
  * @extends {ToolboxItem}
37
33
  * @alias Blockly.ToolboxSeparator
38
34
  */
39
- const ToolboxSeparator = function(separatorDef, toolbox) {
40
- ToolboxSeparator.superClass_.constructor.call(this, separatorDef, toolbox);
35
+ class ToolboxSeparator extends ToolboxItem {
41
36
  /**
42
- * All the CSS class names that are used to create a separator.
43
- * @type {!ToolboxSeparator.CssConfig}
37
+ * @param {!toolbox.SeparatorInfo} separatorDef The information
38
+ * needed to create a separator.
39
+ * @param {!IToolbox} toolbox The parent toolbox for the separator.
40
+ */
41
+ constructor(separatorDef, toolbox) {
42
+ super(separatorDef, toolbox);
43
+ /**
44
+ * All the CSS class names that are used to create a separator.
45
+ * @type {!ToolboxSeparator.CssConfig}
46
+ * @protected
47
+ */
48
+ this.cssConfig_ = {'container': 'blocklyTreeSeparator'};
49
+
50
+ /**
51
+ * @type {?HTMLDivElement}
52
+ * @private
53
+ */
54
+ this.htmlDiv_ = null;
55
+
56
+ const cssConfig = separatorDef['cssconfig'] || separatorDef['cssConfig'];
57
+ object.mixin(this.cssConfig_, cssConfig);
58
+ }
59
+
60
+ /**
61
+ * @override
62
+ */
63
+ init() {
64
+ this.createDom_();
65
+ }
66
+
67
+ /**
68
+ * Creates the DOM for a separator.
69
+ * @return {!HTMLDivElement} The parent element for the separator.
44
70
  * @protected
45
71
  */
46
- this.cssConfig_ = {'container': 'blocklyTreeSeparator'};
72
+ createDom_() {
73
+ const container =
74
+ /** @type {!HTMLDivElement} */ (document.createElement('div'));
75
+ dom.addClass(container, this.cssConfig_['container']);
76
+ this.htmlDiv_ = container;
77
+ return container;
78
+ }
79
+
80
+ /**
81
+ * @override
82
+ */
83
+ getDiv() {
84
+ return /** @type {!HTMLDivElement} */ (this.htmlDiv_);
85
+ }
47
86
 
48
- const cssConfig = separatorDef['cssconfig'] || separatorDef['cssConfig'];
49
- object.mixin(this.cssConfig_, cssConfig);
50
- };
51
- object.inherits(ToolboxSeparator, ToolboxItem);
87
+ /**
88
+ * @override
89
+ */
90
+ dispose() {
91
+ dom.removeNode(/** @type {!HTMLDivElement} */ (this.htmlDiv_));
92
+ }
93
+ }
52
94
 
53
95
  /**
54
96
  * All the CSS class names that are used to create a separator.
@@ -60,61 +102,28 @@ ToolboxSeparator.CssConfig;
60
102
 
61
103
  /**
62
104
  * Name used for registering a toolbox separator.
63
- * @const {string}
105
+ * @type {string}
64
106
  */
65
107
  ToolboxSeparator.registrationName = 'sep';
66
108
 
67
- /**
68
- * @override
69
- */
70
- ToolboxSeparator.prototype.init = function() {
71
- this.createDom_();
72
- };
73
-
74
- /**
75
- * Creates the DOM for a separator.
76
- * @return {!Element} The parent element for the separator.
77
- * @protected
78
- */
79
- ToolboxSeparator.prototype.createDom_ = function() {
80
- const container = document.createElement('div');
81
- dom.addClass(container, this.cssConfig_['container']);
82
- this.htmlDiv_ = container;
83
- return container;
84
- };
85
-
86
- /**
87
- * @override
88
- */
89
- ToolboxSeparator.prototype.getDiv = function() {
90
- return this.htmlDiv_;
91
- };
92
-
93
- /**
94
- * @override
95
- */
96
- ToolboxSeparator.prototype.dispose = function() {
97
- dom.removeNode(this.htmlDiv_);
98
- };
99
-
100
109
  /**
101
110
  * CSS for Toolbox. See css.js for use.
102
111
  */
103
112
  Css.register(`
104
- .blocklyTreeSeparator {
105
- border-bottom: solid #e5e5e5 1px;
106
- height: 0;
107
- margin: 5px 0;
108
- }
109
-
110
- .blocklyToolboxDiv[layout="h"] .blocklyTreeSeparator {
111
- border-right: solid #e5e5e5 1px;
112
- border-bottom: none;
113
- height: auto;
114
- margin: 0 5px 0 5px;
115
- padding: 5px 0;
116
- width: 0;
117
- }
113
+ .blocklyTreeSeparator {
114
+ border-bottom: solid #e5e5e5 1px;
115
+ height: 0;
116
+ margin: 5px 0;
117
+ }
118
+
119
+ .blocklyToolboxDiv[layout="h"] .blocklyTreeSeparator {
120
+ border-right: solid #e5e5e5 1px;
121
+ border-bottom: none;
122
+ height: auto;
123
+ margin: 0 5px 0 5px;
124
+ padding: 5px 0;
125
+ width: 0;
126
+ }
118
127
  `);
119
128
 
120
129
  registry.register(