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
@@ -19,119 +19,130 @@ goog.module('Blockly.FieldLabel');
19
19
 
20
20
  const dom = goog.require('Blockly.utils.dom');
21
21
  const fieldRegistry = goog.require('Blockly.fieldRegistry');
22
- const object = goog.require('Blockly.utils.object');
23
22
  const parsing = goog.require('Blockly.utils.parsing');
24
23
  const {Field} = goog.require('Blockly.Field');
24
+ /* eslint-disable-next-line no-unused-vars */
25
+ const {Sentinel} = goog.requireType('Blockly.utils.Sentinel');
25
26
 
26
27
 
27
28
  /**
28
29
  * Class for a non-editable, non-serializable text field.
29
- * @param {string=} opt_value The initial value of the field. Should cast to a
30
- * string. Defaults to an empty string if null or undefined.
31
- * @param {string=} opt_class Optional CSS class for the field's text.
32
- * @param {Object=} opt_config A map of options used to configure the field.
33
- * See the [field creation documentation]{@link
34
- * https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/label#creation}
35
- * for a list of properties this parameter supports.
36
30
  * @extends {Field}
37
- * @constructor
38
31
  * @alias Blockly.FieldLabel
39
32
  */
40
- const FieldLabel = function(opt_value, opt_class, opt_config) {
33
+ class FieldLabel extends Field {
41
34
  /**
42
- * The html class name to use for this field.
43
- * @type {?string}
44
- * @private
35
+ * @param {(string|!Sentinel)=} opt_value The initial value of the
36
+ * field. Should cast to a string. Defaults to an empty string if null or
37
+ * undefined.
38
+ * Also accepts Field.SKIP_SETUP if you wish to skip setup (only used by
39
+ * subclasses that want to handle configuration and setting the field
40
+ * value after their own constructors have run).
41
+ * @param {string=} opt_class Optional CSS class for the field's text.
42
+ * @param {Object=} opt_config A map of options used to configure the field.
43
+ * See the [field creation documentation]{@link
44
+ * https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/label#creation}
45
+ * for a list of properties this parameter supports.
45
46
  */
46
- this.class_ = null;
47
-
48
- FieldLabel.superClass_.constructor.call(this, opt_value, null, opt_config);
49
-
50
- if (!opt_config) { // If the config was not passed use old configuration.
51
- this.class_ = opt_class || null;
47
+ constructor(opt_value, opt_class, opt_config) {
48
+ super(Field.SKIP_SETUP);
49
+
50
+ /**
51
+ * The html class name to use for this field.
52
+ * @type {?string}
53
+ * @private
54
+ */
55
+ this.class_ = null;
56
+
57
+ /**
58
+ * Editable fields usually show some sort of UI indicating they are
59
+ * editable. This field should not.
60
+ * @type {boolean}
61
+ */
62
+ this.EDITABLE = false;
63
+
64
+ if (opt_value === Field.SKIP_SETUP) return;
65
+ if (opt_config) {
66
+ this.configure_(opt_config);
67
+ } else {
68
+ this.class_ = opt_class || null;
69
+ }
70
+ this.setValue(opt_value);
52
71
  }
53
- };
54
- object.inherits(FieldLabel, Field);
55
-
56
- /**
57
- * The default value for this field.
58
- * @type {*}
59
- * @protected
60
- */
61
- FieldLabel.prototype.DEFAULT_VALUE = '';
62
72
 
63
- /**
64
- * Construct a FieldLabel from a JSON arg object,
65
- * dereferencing any string table references.
66
- * @param {!Object} options A JSON object with options (text, and class).
67
- * @return {!FieldLabel} The new field instance.
68
- * @package
69
- * @nocollapse
70
- */
71
- FieldLabel.fromJson = function(options) {
72
- const text = parsing.replaceMessageReferences(options['text']);
73
- // `this` might be a subclass of FieldLabel if that class doesn't override
74
- // the static fromJson method.
75
- return new this(text, undefined, options);
76
- };
73
+ /**
74
+ * @override
75
+ */
76
+ configure_(config) {
77
+ super.configure_(config);
78
+ this.class_ = config['class'];
79
+ }
77
80
 
78
- /**
79
- * Editable fields usually show some sort of UI indicating they are
80
- * editable. This field should not.
81
- * @type {boolean}
82
- */
83
- FieldLabel.prototype.EDITABLE = false;
81
+ /**
82
+ * Create block UI for this label.
83
+ * @package
84
+ */
85
+ initView() {
86
+ this.createTextElement_();
87
+ if (this.class_) {
88
+ dom.addClass(
89
+ /** @type {!SVGTextElement} */ (this.textElement_), this.class_);
90
+ }
91
+ }
84
92
 
85
- /**
86
- * @override
87
- */
88
- FieldLabel.prototype.configure_ = function(config) {
89
- FieldLabel.superClass_.configure_.call(this, config);
90
- this.class_ = config['class'];
91
- };
93
+ /**
94
+ * Ensure that the input value casts to a valid string.
95
+ * @param {*=} opt_newValue The input value.
96
+ * @return {?string} A valid string, or null if invalid.
97
+ * @protected
98
+ */
99
+ doClassValidation_(opt_newValue) {
100
+ if (opt_newValue === null || opt_newValue === undefined) {
101
+ return null;
102
+ }
103
+ return String(opt_newValue);
104
+ }
92
105
 
93
- /**
94
- * Create block UI for this label.
95
- * @package
96
- */
97
- FieldLabel.prototype.initView = function() {
98
- this.createTextElement_();
99
- if (this.class_) {
100
- dom.addClass(
101
- /** @type {!SVGTextElement} */ (this.textElement_), this.class_);
106
+ /**
107
+ * Set the CSS class applied to the field's textElement_.
108
+ * @param {?string} cssClass The new CSS class name, or null to remove.
109
+ */
110
+ setClass(cssClass) {
111
+ if (this.textElement_) {
112
+ // This check isn't necessary, but it's faster than letting removeClass
113
+ // figure it out.
114
+ if (this.class_) {
115
+ dom.removeClass(this.textElement_, this.class_);
116
+ }
117
+ if (cssClass) {
118
+ dom.addClass(this.textElement_, cssClass);
119
+ }
120
+ }
121
+ this.class_ = cssClass;
102
122
  }
103
- };
104
123
 
105
- /**
106
- * Ensure that the input value casts to a valid string.
107
- * @param {*=} opt_newValue The input value.
108
- * @return {?string} A valid string, or null if invalid.
109
- * @protected
110
- */
111
- FieldLabel.prototype.doClassValidation_ = function(opt_newValue) {
112
- if (opt_newValue === null || opt_newValue === undefined) {
113
- return null;
124
+ /**
125
+ * Construct a FieldLabel from a JSON arg object,
126
+ * dereferencing any string table references.
127
+ * @param {!Object} options A JSON object with options (text, and class).
128
+ * @return {!FieldLabel} The new field instance.
129
+ * @package
130
+ * @nocollapse
131
+ */
132
+ static fromJson(options) {
133
+ const text = parsing.replaceMessageReferences(options['text']);
134
+ // `this` might be a subclass of FieldLabel if that class doesn't override
135
+ // the static fromJson method.
136
+ return new this(text, undefined, options);
114
137
  }
115
- return String(opt_newValue);
116
- };
138
+ }
117
139
 
118
140
  /**
119
- * Set the CSS class applied to the field's textElement_.
120
- * @param {?string} cssClass The new CSS class name, or null to remove.
141
+ * The default value for this field.
142
+ * @type {*}
143
+ * @protected
121
144
  */
122
- FieldLabel.prototype.setClass = function(cssClass) {
123
- if (this.textElement_) {
124
- // This check isn't necessary, but it's faster than letting removeClass
125
- // figure it out.
126
- if (this.class_) {
127
- dom.removeClass(this.textElement_, this.class_);
128
- }
129
- if (cssClass) {
130
- dom.addClass(this.textElement_, cssClass);
131
- }
132
- }
133
- this.class_ = cssClass;
134
- };
145
+ FieldLabel.prototype.DEFAULT_VALUE = '';
135
146
 
136
147
  fieldRegistry.register('field_label', FieldLabel);
137
148
 
@@ -20,59 +20,60 @@
20
20
  goog.module('Blockly.FieldLabelSerializable');
21
21
 
22
22
  const fieldRegistry = goog.require('Blockly.fieldRegistry');
23
- const object = goog.require('Blockly.utils.object');
24
23
  const parsing = goog.require('Blockly.utils.parsing');
25
24
  const {FieldLabel} = goog.require('Blockly.FieldLabel');
26
25
 
27
26
 
28
27
  /**
29
28
  * Class for a non-editable, serializable text field.
30
- * @param {*} opt_value The initial value of the field. Should cast to a
31
- * string. Defaults to an empty string if null or undefined.
32
- * @param {string=} opt_class Optional CSS class for the field's text.
33
- * @param {Object=} opt_config A map of options used to configure the field.
34
- * See the [field creation documentation]{@link
35
- * https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/label-serializable#creation}
36
- * for a list of properties this parameter supports.
37
29
  * @extends {FieldLabel}
38
- * @constructor
39
- *
40
30
  * @alias Blockly.FieldLabelSerializable
41
31
  */
42
- const FieldLabelSerializable = function(opt_value, opt_class, opt_config) {
43
- FieldLabelSerializable.superClass_.constructor.call(
44
- this, opt_value, opt_class, opt_config);
45
- };
46
- object.inherits(FieldLabelSerializable, FieldLabel);
32
+ class FieldLabelSerializable extends FieldLabel {
33
+ /**
34
+ * @param {string=} opt_value The initial value of the field. Should cast to a
35
+ * string. Defaults to an empty string if null or undefined.
36
+ * @param {string=} opt_class Optional CSS class for the field's text.
37
+ * @param {Object=} opt_config A map of options used to configure the field.
38
+ * See the [field creation documentation]{@link
39
+ * https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/label-serializable#creation}
40
+ * for a list of properties this parameter supports.
41
+ */
42
+ constructor(opt_value, opt_class, opt_config) {
43
+ super(String(opt_value ?? ''), opt_class, opt_config);
47
44
 
48
- /**
49
- * Construct a FieldLabelSerializable from a JSON arg object,
50
- * dereferencing any string table references.
51
- * @param {!Object} options A JSON object with options (text, and class).
52
- * @return {!FieldLabelSerializable} The new field instance.
53
- * @package
54
- * @nocollapse
55
- */
56
- FieldLabelSerializable.fromJson = function(options) {
57
- const text = parsing.replaceMessageReferences(options['text']);
58
- // `this` might be a subclass of FieldLabelSerializable if that class doesn't
59
- // override the static fromJson method.
60
- return new this(text, undefined, options);
61
- };
45
+ /**
46
+ * Editable fields usually show some sort of UI indicating they are
47
+ * editable. This field should not.
48
+ * @type {boolean}
49
+ */
50
+ this.EDITABLE = false;
62
51
 
63
- /**
64
- * Editable fields usually show some sort of UI indicating they are
65
- * editable. This field should not.
66
- * @type {boolean}
67
- */
68
- FieldLabelSerializable.prototype.EDITABLE = false;
52
+ /**
53
+ * Serializable fields are saved by the XML renderer, non-serializable
54
+ * fields are not. This field should be serialized, but only edited
55
+ * programmatically.
56
+ * @type {boolean}
57
+ */
58
+ this.SERIALIZABLE = true;
59
+ }
69
60
 
70
- /**
71
- * Serializable fields are saved by the XML renderer, non-serializable fields
72
- * are not. This field should be serialized, but only edited programmatically.
73
- * @type {boolean}
74
- */
75
- FieldLabelSerializable.prototype.SERIALIZABLE = true;
61
+ /**
62
+ * Construct a FieldLabelSerializable from a JSON arg object,
63
+ * dereferencing any string table references.
64
+ * @param {!Object} options A JSON object with options (text, and class).
65
+ * @return {!FieldLabelSerializable} The new field instance.
66
+ * @package
67
+ * @nocollapse
68
+ * @override
69
+ */
70
+ static fromJson(options) {
71
+ const text = parsing.replaceMessageReferences(options['text']);
72
+ // `this` might be a subclass of FieldLabelSerializable if that class
73
+ // doesn't override the static fromJson method.
74
+ return new this(text, undefined, options);
75
+ }
76
+ }
76
77
 
77
78
  fieldRegistry.register('field_label_serializable', FieldLabelSerializable);
78
79