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
@@ -17,226 +17,238 @@ goog.module('Blockly.FieldCheckbox');
17
17
 
18
18
  const dom = goog.require('Blockly.utils.dom');
19
19
  const fieldRegistry = goog.require('Blockly.fieldRegistry');
20
- const object = goog.require('Blockly.utils.object');
21
20
  const {Field} = goog.require('Blockly.Field');
21
+ /* eslint-disable-next-line no-unused-vars */
22
+ const {Sentinel} = goog.requireType('Blockly.utils.Sentinel');
22
23
  /** @suppress {extraRequire} */
23
24
  goog.require('Blockly.Events.BlockChange');
24
25
 
25
26
 
26
27
  /**
27
28
  * Class for a checkbox field.
28
- * @param {string|boolean=} opt_value The initial value of the field. Should
29
- * either be 'TRUE', 'FALSE' or a boolean. Defaults to 'FALSE'.
30
- * @param {Function=} opt_validator A function that is called to validate
31
- * changes to the field's value. Takes in a value ('TRUE' or 'FALSE') &
32
- * returns a validated value ('TRUE' or 'FALSE'), or null to abort the
33
- * change.
34
- * @param {Object=} opt_config A map of options used to configure the field.
35
- * See the [field creation documentation]{@link
36
- * https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/checkbox#creation}
37
- * for a list of properties this parameter supports.
38
29
  * @extends {Field}
39
- * @constructor
40
30
  * @alias Blockly.FieldCheckbox
41
31
  */
42
- const FieldCheckbox = function(opt_value, opt_validator, opt_config) {
32
+ class FieldCheckbox extends Field {
43
33
  /**
44
- * Character for the check mark. Used to apply a different check mark
45
- * character to individual fields.
46
- * @type {?string}
47
- * @private
34
+ * @param {(string|boolean|!Sentinel)=} opt_value The initial value of
35
+ * the field. Should either be 'TRUE', 'FALSE' or a boolean. Defaults to
36
+ * 'FALSE'.
37
+ * Also accepts Field.SKIP_SETUP if you wish to skip setup (only used by
38
+ * subclasses that want to handle configuration and setting the field
39
+ * value after their own constructors have run).
40
+ * @param {Function=} opt_validator A function that is called to validate
41
+ * changes to the field's value. Takes in a value ('TRUE' or 'FALSE') &
42
+ * returns a validated value ('TRUE' or 'FALSE'), or null to abort the
43
+ * change.
44
+ * @param {Object=} opt_config A map of options used to configure the field.
45
+ * See the [field creation documentation]{@link
46
+ * https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/checkbox#creation}
47
+ * for a list of properties this parameter supports.
48
48
  */
49
- this.checkChar_ = null;
50
-
51
- FieldCheckbox.superClass_.constructor.call(
52
- this, opt_value, opt_validator, opt_config);
53
- };
54
- object.inherits(FieldCheckbox, Field);
55
-
56
- /**
57
- * The default value for this field.
58
- * @type {*}
59
- * @protected
60
- */
61
- FieldCheckbox.prototype.DEFAULT_VALUE = false;
62
-
63
- /**
64
- * Construct a FieldCheckbox from a JSON arg object.
65
- * @param {!Object} options A JSON object with options (checked).
66
- * @return {!FieldCheckbox} The new field instance.
67
- * @package
68
- * @nocollapse
69
- */
70
- FieldCheckbox.fromJson = function(options) {
71
- // `this` might be a subclass of FieldCheckbox if that class doesn't override
72
- // the static fromJson method.
73
- return new this(options['checked'], undefined, options);
74
- };
49
+ constructor(opt_value, opt_validator, opt_config) {
50
+ super(Field.SKIP_SETUP);
51
+
52
+ /**
53
+ * Character for the check mark. Used to apply a different check mark
54
+ * character to individual fields.
55
+ * @type {string}
56
+ * @private
57
+ */
58
+ this.checkChar_ = FieldCheckbox.CHECK_CHAR;
59
+
60
+ /**
61
+ * Serializable fields are saved by the serializer, non-serializable fields
62
+ * are not. Editable fields should also be serializable.
63
+ * @type {boolean}
64
+ */
65
+ this.SERIALIZABLE = true;
66
+
67
+ /**
68
+ * Mouse cursor style when over the hotspot that initiates editability.
69
+ * @type {string}
70
+ */
71
+ this.CURSOR = 'default';
72
+
73
+ if (opt_value === Field.SKIP_SETUP) return;
74
+ if (opt_config) this.configure_(opt_config);
75
+ this.setValue(opt_value);
76
+ if (opt_validator) this.setValidator(opt_validator);
77
+ }
75
78
 
76
- /**
77
- * Default character for the checkmark.
78
- * @type {string}
79
- * @const
80
- */
81
- FieldCheckbox.CHECK_CHAR = '\u2713';
79
+ /**
80
+ * Configure the field based on the given map of options.
81
+ * @param {!Object} config A map of options to configure the field based on.
82
+ * @protected
83
+ * @override
84
+ */
85
+ configure_(config) {
86
+ super.configure_(config);
87
+ if (config['checkCharacter']) {
88
+ this.checkChar_ = config['checkCharacter'];
89
+ }
90
+ }
82
91
 
83
- /**
84
- * Serializable fields are saved by the XML renderer, non-serializable fields
85
- * are not. Editable fields should also be serializable.
86
- * @type {boolean}
87
- */
88
- FieldCheckbox.prototype.SERIALIZABLE = true;
92
+ /**
93
+ * Saves this field's value.
94
+ * @return {*} The boolean value held by this field.
95
+ * @override
96
+ * @package
97
+ */
98
+ saveState() {
99
+ const legacyState = this.saveLegacyState(FieldCheckbox);
100
+ if (legacyState !== null) {
101
+ return legacyState;
102
+ }
103
+ return this.getValueBoolean();
104
+ }
89
105
 
90
- /**
91
- * Mouse cursor style when over the hotspot that initiates editability.
92
- */
93
- FieldCheckbox.prototype.CURSOR = 'default';
106
+ /**
107
+ * Create the block UI for this checkbox.
108
+ * @package
109
+ */
110
+ initView() {
111
+ super.initView();
94
112
 
95
- /**
96
- * Configure the field based on the given map of options.
97
- * @param {!Object} config A map of options to configure the field based on.
98
- * @protected
99
- * @override
100
- */
101
- FieldCheckbox.prototype.configure_ = function(config) {
102
- FieldCheckbox.superClass_.configure_.call(this, config);
103
- if (config['checkCharacter']) {
104
- this.checkChar_ = config['checkCharacter'];
113
+ dom.addClass(
114
+ /** @type {!SVGTextElement} **/ (this.textElement_), 'blocklyCheckbox');
115
+ this.textElement_.style.display = this.value_ ? 'block' : 'none';
105
116
  }
106
- };
107
117
 
108
- /**
109
- * Saves this field's value.
110
- * @return {*} The boolean value held by this field.
111
- * @override
112
- * @package
113
- */
114
- FieldCheckbox.prototype.saveState = function() {
115
- const legacyState = this.saveLegacyState(FieldCheckbox);
116
- if (legacyState !== null) {
117
- return legacyState;
118
+ /**
119
+ * @override
120
+ */
121
+ render_() {
122
+ if (this.textContent_) {
123
+ this.textContent_.nodeValue = this.getDisplayText_();
124
+ }
125
+ this.updateSize_(this.getConstants().FIELD_CHECKBOX_X_OFFSET);
118
126
  }
119
- return this.getValueBoolean();
120
- };
121
-
122
- /**
123
- * Create the block UI for this checkbox.
124
- * @package
125
- */
126
- FieldCheckbox.prototype.initView = function() {
127
- FieldCheckbox.superClass_.initView.call(this);
128
127
 
129
- dom.addClass(
130
- /** @type {!SVGTextElement} **/ (this.textElement_), 'blocklyCheckbox');
131
- this.textElement_.style.display = this.value_ ? 'block' : 'none';
132
- };
128
+ /**
129
+ * @override
130
+ */
131
+ getDisplayText_() {
132
+ return this.checkChar_;
133
+ }
133
134
 
134
- /**
135
- * @override
136
- */
137
- FieldCheckbox.prototype.render_ = function() {
138
- if (this.textContent_) {
139
- this.textContent_.nodeValue = this.getDisplayText_();
135
+ /**
136
+ * Set the character used for the check mark.
137
+ * @param {?string} character The character to use for the check mark, or
138
+ * null to use the default.
139
+ */
140
+ setCheckCharacter(character) {
141
+ this.checkChar_ = character || FieldCheckbox.CHECK_CHAR;
142
+ this.forceRerender();
140
143
  }
141
- this.updateSize_(this.getConstants().FIELD_CHECKBOX_X_OFFSET);
142
- };
143
144
 
144
- /**
145
- * @override
146
- */
147
- FieldCheckbox.prototype.getDisplayText_ = function() {
148
- return this.checkChar_ || FieldCheckbox.CHECK_CHAR;
149
- };
145
+ /**
146
+ * Toggle the state of the checkbox on click.
147
+ * @protected
148
+ */
149
+ showEditor_() {
150
+ this.setValue(!this.value_);
151
+ }
150
152
 
151
- /**
152
- * Set the character used for the check mark.
153
- * @param {?string} character The character to use for the check mark, or
154
- * null to use the default.
155
- */
156
- FieldCheckbox.prototype.setCheckCharacter = function(character) {
157
- this.checkChar_ = character;
158
- this.forceRerender();
159
- };
153
+ /**
154
+ * Ensure that the input value is valid ('TRUE' or 'FALSE').
155
+ * @param {*=} opt_newValue The input value.
156
+ * @return {?string} A valid value ('TRUE' or 'FALSE), or null if invalid.
157
+ * @protected
158
+ */
159
+ doClassValidation_(opt_newValue) {
160
+ if (opt_newValue === true || opt_newValue === 'TRUE') {
161
+ return 'TRUE';
162
+ }
163
+ if (opt_newValue === false || opt_newValue === 'FALSE') {
164
+ return 'FALSE';
165
+ }
166
+ return null;
167
+ }
160
168
 
161
- /**
162
- * Toggle the state of the checkbox on click.
163
- * @protected
164
- */
165
- FieldCheckbox.prototype.showEditor_ = function() {
166
- this.setValue(!this.value_);
167
- };
169
+ /**
170
+ * Update the value of the field, and update the checkElement.
171
+ * @param {*} newValue The value to be saved. The default validator guarantees
172
+ * that this is a either 'TRUE' or 'FALSE'.
173
+ * @protected
174
+ */
175
+ doValueUpdate_(newValue) {
176
+ this.value_ = this.convertValueToBool_(newValue);
177
+ // Update visual.
178
+ if (this.textElement_) {
179
+ this.textElement_.style.display = this.value_ ? 'block' : 'none';
180
+ }
181
+ }
168
182
 
169
- /**
170
- * Ensure that the input value is valid ('TRUE' or 'FALSE').
171
- * @param {*=} opt_newValue The input value.
172
- * @return {?string} A valid value ('TRUE' or 'FALSE), or null if invalid.
173
- * @protected
174
- */
175
- FieldCheckbox.prototype.doClassValidation_ = function(opt_newValue) {
176
- if (opt_newValue === true || opt_newValue === 'TRUE') {
177
- return 'TRUE';
183
+ /**
184
+ * Get the value of this field, either 'TRUE' or 'FALSE'.
185
+ * @return {string} The value of this field.
186
+ */
187
+ getValue() {
188
+ return this.value_ ? 'TRUE' : 'FALSE';
178
189
  }
179
- if (opt_newValue === false || opt_newValue === 'FALSE') {
180
- return 'FALSE';
190
+
191
+ /**
192
+ * Get the boolean value of this field.
193
+ * @return {boolean} The boolean value of this field.
194
+ */
195
+ getValueBoolean() {
196
+ return /** @type {boolean} */ (this.value_);
181
197
  }
182
- return null;
183
- };
184
198
 
185
- /**
186
- * Update the value of the field, and update the checkElement.
187
- * @param {*} newValue The value to be saved. The default validator guarantees
188
- * that this is a either 'TRUE' or 'FALSE'.
189
- * @protected
190
- */
191
- FieldCheckbox.prototype.doValueUpdate_ = function(newValue) {
192
- this.value_ = this.convertValueToBool_(newValue);
193
- // Update visual.
194
- if (this.textElement_) {
195
- this.textElement_.style.display = this.value_ ? 'block' : 'none';
199
+ /**
200
+ * Get the text of this field. Used when the block is collapsed.
201
+ * @return {string} Text representing the value of this field
202
+ * ('true' or 'false').
203
+ */
204
+ getText() {
205
+ return String(this.convertValueToBool_(this.value_));
196
206
  }
197
- };
198
207
 
199
- /**
200
- * Get the value of this field, either 'TRUE' or 'FALSE'.
201
- * @return {string} The value of this field.
202
- */
203
- FieldCheckbox.prototype.getValue = function() {
204
- return this.value_ ? 'TRUE' : 'FALSE';
205
- };
208
+ /**
209
+ * Convert a value into a pure boolean.
210
+ *
211
+ * Converts 'TRUE' to true and 'FALSE' to false correctly, everything else
212
+ * is cast to a boolean.
213
+ * @param {*} value The value to convert.
214
+ * @return {boolean} The converted value.
215
+ * @private
216
+ */
217
+ convertValueToBool_(value) {
218
+ if (typeof value === 'string') {
219
+ return value === 'TRUE';
220
+ } else {
221
+ return !!value;
222
+ }
223
+ }
206
224
 
207
- /**
208
- * Get the boolean value of this field.
209
- * @return {boolean} The boolean value of this field.
210
- */
211
- FieldCheckbox.prototype.getValueBoolean = function() {
212
- return /** @type {boolean} */ (this.value_);
213
- };
225
+ /**
226
+ * Construct a FieldCheckbox from a JSON arg object.
227
+ * @param {!Object} options A JSON object with options (checked).
228
+ * @return {!FieldCheckbox} The new field instance.
229
+ * @package
230
+ * @nocollapse
231
+ */
232
+ static fromJson(options) {
233
+ // `this` might be a subclass of FieldCheckbox if that class doesn't
234
+ // 'override' the static fromJson method.
235
+ return new this(options['checked'], undefined, options);
236
+ }
237
+ }
214
238
 
215
239
  /**
216
- * Get the text of this field. Used when the block is collapsed.
217
- * @return {string} Text representing the value of this field
218
- * ('true' or 'false').
240
+ * The default value for this field.
241
+ * @type {*}
242
+ * @protected
219
243
  */
220
- FieldCheckbox.prototype.getText = function() {
221
- return String(this.convertValueToBool_(this.value_));
222
- };
244
+ FieldCheckbox.prototype.DEFAULT_VALUE = false;
223
245
 
224
246
  /**
225
- * Convert a value into a pure boolean.
226
- *
227
- * Converts 'TRUE' to true and 'FALSE' to false correctly, everything else
228
- * is cast to a boolean.
229
- * @param {*} value The value to convert.
230
- * @return {boolean} The converted value.
231
- * @private
247
+ * Default character for the checkmark.
248
+ * @type {string}
249
+ * @const
232
250
  */
233
- FieldCheckbox.prototype.convertValueToBool_ = function(value) {
234
- if (typeof value === 'string') {
235
- return value === 'TRUE';
236
- } else {
237
- return !!value;
238
- }
239
- };
251
+ FieldCheckbox.CHECK_CHAR = '\u2713';
240
252
 
241
253
  fieldRegistry.register('field_checkbox', FieldCheckbox);
242
254