@ckeditor/ckeditor5-table 36.0.1 → 37.0.0-alpha.1

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 (170) hide show
  1. package/README.md +1 -1
  2. package/build/table.js +1 -1
  3. package/ckeditor5-metadata.json +6 -6
  4. package/package.json +34 -29
  5. package/src/augmentation.d.ts +76 -0
  6. package/src/augmentation.js +5 -0
  7. package/src/commands/insertcolumncommand.d.ts +55 -0
  8. package/src/commands/insertcolumncommand.js +45 -60
  9. package/src/commands/insertrowcommand.d.ts +54 -0
  10. package/src/commands/insertrowcommand.js +44 -59
  11. package/src/commands/inserttablecommand.d.ts +44 -0
  12. package/src/commands/inserttablecommand.js +50 -68
  13. package/src/commands/mergecellcommand.d.ts +68 -0
  14. package/src/commands/mergecellcommand.js +169 -244
  15. package/src/commands/mergecellscommand.d.ts +28 -0
  16. package/src/commands/mergecellscommand.js +72 -101
  17. package/src/commands/removecolumncommand.d.ts +29 -0
  18. package/src/commands/removecolumncommand.js +88 -102
  19. package/src/commands/removerowcommand.d.ts +29 -0
  20. package/src/commands/removerowcommand.js +63 -80
  21. package/src/commands/selectcolumncommand.d.ts +33 -0
  22. package/src/commands/selectcolumncommand.js +41 -54
  23. package/src/commands/selectrowcommand.d.ts +33 -0
  24. package/src/commands/selectrowcommand.js +38 -48
  25. package/src/commands/setheadercolumncommand.d.ts +50 -0
  26. package/src/commands/setheadercolumncommand.js +48 -73
  27. package/src/commands/setheaderrowcommand.d.ts +53 -0
  28. package/src/commands/setheaderrowcommand.js +56 -85
  29. package/src/commands/splitcellcommand.d.ts +43 -0
  30. package/src/commands/splitcellcommand.js +35 -49
  31. package/src/converters/downcast.d.ts +63 -0
  32. package/src/converters/downcast.js +98 -130
  33. package/src/converters/table-caption-post-fixer.d.ts +20 -0
  34. package/src/converters/table-caption-post-fixer.js +36 -52
  35. package/src/converters/table-cell-paragraph-post-fixer.d.ts +32 -0
  36. package/src/converters/table-cell-paragraph-post-fixer.js +88 -119
  37. package/src/converters/table-cell-refresh-handler.d.ts +18 -0
  38. package/src/converters/table-cell-refresh-handler.js +29 -48
  39. package/src/converters/table-headings-refresh-handler.d.ts +17 -0
  40. package/src/converters/table-headings-refresh-handler.js +35 -54
  41. package/src/converters/table-layout-post-fixer.d.ts +226 -0
  42. package/src/converters/table-layout-post-fixer.js +276 -313
  43. package/src/converters/tableproperties.d.ts +54 -0
  44. package/src/converters/tableproperties.js +136 -168
  45. package/src/converters/upcasttable.d.ts +49 -0
  46. package/src/converters/upcasttable.js +199 -251
  47. package/src/index.d.ts +60 -0
  48. package/src/index.js +1 -2
  49. package/src/plaintableoutput.d.ts +25 -0
  50. package/src/plaintableoutput.js +107 -135
  51. package/src/table.d.ts +33 -0
  52. package/src/table.js +12 -88
  53. package/src/tablecaption/tablecaptionediting.d.ts +63 -0
  54. package/src/tablecaption/tablecaptionediting.js +104 -135
  55. package/src/tablecaption/tablecaptionui.d.ts +21 -0
  56. package/src/tablecaption/tablecaptionui.js +42 -58
  57. package/src/tablecaption/toggletablecaptioncommand.d.ts +68 -0
  58. package/src/tablecaption/toggletablecaptioncommand.js +77 -92
  59. package/src/tablecaption/utils.d.ts +42 -0
  60. package/src/tablecaption/utils.js +35 -61
  61. package/src/tablecaption.d.ts +22 -0
  62. package/src/tablecaption.js +12 -19
  63. package/src/tablecellproperties/commands/tablecellbackgroundcolorcommand.d.ts +32 -0
  64. package/src/tablecellproperties/commands/tablecellbackgroundcolorcommand.js +14 -20
  65. package/src/tablecellproperties/commands/tablecellbordercolorcommand.d.ts +37 -0
  66. package/src/tablecellproperties/commands/tablecellbordercolorcommand.js +27 -37
  67. package/src/tablecellproperties/commands/tablecellborderstylecommand.d.ts +37 -0
  68. package/src/tablecellproperties/commands/tablecellborderstylecommand.js +27 -37
  69. package/src/tablecellproperties/commands/tablecellborderwidthcommand.d.ts +51 -0
  70. package/src/tablecellproperties/commands/tablecellborderwidthcommand.js +42 -53
  71. package/src/tablecellproperties/commands/tablecellheightcommand.d.ts +46 -0
  72. package/src/tablecellproperties/commands/tablecellheightcommand.js +29 -36
  73. package/src/tablecellproperties/commands/tablecellhorizontalalignmentcommand.d.ts +32 -0
  74. package/src/tablecellproperties/commands/tablecellhorizontalalignmentcommand.js +14 -20
  75. package/src/tablecellproperties/commands/tablecellpaddingcommand.d.ts +51 -0
  76. package/src/tablecellproperties/commands/tablecellpaddingcommand.js +42 -53
  77. package/src/tablecellproperties/commands/tablecellpropertycommand.d.ts +62 -0
  78. package/src/tablecellproperties/commands/tablecellpropertycommand.js +77 -122
  79. package/src/tablecellproperties/commands/tablecellverticalalignmentcommand.d.ts +40 -0
  80. package/src/tablecellproperties/commands/tablecellverticalalignmentcommand.js +14 -20
  81. package/src/tablecellproperties/tablecellpropertiesediting.d.ts +41 -0
  82. package/src/tablecellproperties/tablecellpropertiesediting.js +193 -236
  83. package/src/tablecellproperties/tablecellpropertiesui.d.ts +111 -0
  84. package/src/tablecellproperties/tablecellpropertiesui.js +302 -456
  85. package/src/tablecellproperties/ui/tablecellpropertiesview.d.ts +227 -0
  86. package/src/tablecellproperties/ui/tablecellpropertiesview.js +509 -844
  87. package/src/tablecellproperties.d.ts +28 -0
  88. package/src/tablecellproperties.js +12 -98
  89. package/src/tablecellwidth/commands/tablecellwidthcommand.d.ts +46 -0
  90. package/src/tablecellwidth/commands/tablecellwidthcommand.js +29 -35
  91. package/src/tablecellwidth/tablecellwidthediting.d.ts +28 -0
  92. package/src/tablecellwidth/tablecellwidthediting.js +25 -38
  93. package/src/tableclipboard.d.ts +63 -0
  94. package/src/tableclipboard.js +429 -568
  95. package/src/tablecolumnresize/constants.d.ts +20 -0
  96. package/src/tablecolumnresize/constants.js +0 -10
  97. package/src/tablecolumnresize/converters.d.ts +18 -0
  98. package/src/tablecolumnresize/converters.js +35 -119
  99. package/src/tablecolumnresize/tablecolumnresizeediting.d.ts +137 -0
  100. package/src/tablecolumnresize/tablecolumnresizeediting.js +545 -711
  101. package/src/tablecolumnresize/tablewidthscommand.d.ts +38 -0
  102. package/src/tablecolumnresize/tablewidthscommand.js +61 -0
  103. package/src/tablecolumnresize/utils.d.ts +141 -0
  104. package/src/tablecolumnresize/utils.js +256 -233
  105. package/src/tablecolumnresize.d.ts +24 -0
  106. package/src/tablecolumnresize.js +12 -19
  107. package/src/tableconfig.d.ts +331 -0
  108. package/src/tableconfig.js +5 -0
  109. package/src/tableediting.d.ts +97 -0
  110. package/src/tableediting.js +157 -176
  111. package/src/tablekeyboard.d.ts +63 -0
  112. package/src/tablekeyboard.js +261 -344
  113. package/src/tablemouse/mouseeventsobserver.d.ts +62 -0
  114. package/src/tablemouse/mouseeventsobserver.js +13 -50
  115. package/src/tablemouse.d.ts +46 -0
  116. package/src/tablemouse.js +154 -202
  117. package/src/tableproperties/commands/tablealignmentcommand.d.ts +32 -0
  118. package/src/tableproperties/commands/tablealignmentcommand.js +14 -20
  119. package/src/tableproperties/commands/tablebackgroundcolorcommand.d.ts +32 -0
  120. package/src/tableproperties/commands/tablebackgroundcolorcommand.js +14 -20
  121. package/src/tableproperties/commands/tablebordercolorcommand.d.ts +37 -0
  122. package/src/tableproperties/commands/tablebordercolorcommand.js +27 -37
  123. package/src/tableproperties/commands/tableborderstylecommand.d.ts +37 -0
  124. package/src/tableproperties/commands/tableborderstylecommand.js +27 -37
  125. package/src/tableproperties/commands/tableborderwidthcommand.d.ts +51 -0
  126. package/src/tableproperties/commands/tableborderwidthcommand.js +42 -53
  127. package/src/tableproperties/commands/tableheightcommand.d.ts +46 -0
  128. package/src/tableproperties/commands/tableheightcommand.js +29 -33
  129. package/src/tableproperties/commands/tablepropertycommand.d.ts +61 -0
  130. package/src/tableproperties/commands/tablepropertycommand.js +68 -112
  131. package/src/tableproperties/commands/tablewidthcommand.d.ts +46 -0
  132. package/src/tableproperties/commands/tablewidthcommand.js +29 -33
  133. package/src/tableproperties/tablepropertiesediting.d.ts +39 -0
  134. package/src/tableproperties/tablepropertiesediting.js +163 -210
  135. package/src/tableproperties/tablepropertiesui.d.ts +113 -0
  136. package/src/tableproperties/tablepropertiesui.js +293 -439
  137. package/src/tableproperties/ui/tablepropertiesview.d.ts +203 -0
  138. package/src/tableproperties/ui/tablepropertiesview.js +427 -718
  139. package/src/tableproperties.d.ts +28 -0
  140. package/src/tableproperties.js +12 -95
  141. package/src/tableselection.d.ts +106 -0
  142. package/src/tableselection.js +279 -376
  143. package/src/tabletoolbar.d.ts +31 -0
  144. package/src/tabletoolbar.js +38 -92
  145. package/src/tableui.d.ts +53 -0
  146. package/src/tableui.js +281 -338
  147. package/src/tableutils.d.ts +448 -0
  148. package/src/tableutils.js +1015 -1229
  149. package/src/tablewalker.d.ts +323 -0
  150. package/src/tablewalker.js +308 -548
  151. package/src/ui/colorinputview.d.ts +143 -0
  152. package/src/ui/colorinputview.js +229 -366
  153. package/src/ui/formrowview.d.ts +61 -0
  154. package/src/ui/formrowview.js +38 -84
  155. package/src/ui/inserttableview.d.ts +77 -0
  156. package/src/ui/inserttableview.js +152 -242
  157. package/src/utils/common.d.ts +42 -0
  158. package/src/utils/common.js +33 -57
  159. package/src/utils/structure.d.ts +245 -0
  160. package/src/utils/structure.js +261 -379
  161. package/src/utils/table-properties.d.ts +67 -0
  162. package/src/utils/table-properties.js +60 -81
  163. package/src/utils/ui/contextualballoon.d.ts +34 -0
  164. package/src/utils/ui/contextualballoon.js +70 -89
  165. package/src/utils/ui/table-properties.d.ts +193 -0
  166. package/src/utils/ui/table-properties.js +259 -319
  167. package/src/utils/ui/widget.d.ts +16 -0
  168. package/src/utils/ui/widget.js +24 -46
  169. package/src/tablecolumnresize/tablecolumnwidthscommand.js +0 -55
  170. package/src/tablecolumnresize/tablewidthresizecommand.js +0 -65
@@ -2,384 +2,247 @@
2
2
  * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
3
  * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
4
  */
5
-
6
5
  /**
7
6
  * @module table/ui/colorinputview
8
7
  */
9
-
10
8
  import { View, InputTextView, ButtonView, createDropdown, ColorGridView, FocusCycler, ViewCollection } from 'ckeditor5/src/ui';
11
9
  import { icons } from 'ckeditor5/src/core';
12
10
  import { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';
13
-
14
11
  import '../../theme/colorinput.css';
15
-
16
12
  /**
17
13
  * The color input view class. It allows the user to type in a color (hex, rgb, etc.)
18
14
  * or choose it from the configurable color palette with a preview.
19
15
  *
20
- * @private
21
- * @extends module:ui/view~View
16
+ * @internal
22
17
  */
23
18
  export default class ColorInputView extends View {
24
- /**
25
- * Creates an instance of the color input view.
26
- *
27
- * @param {module:utils/locale~Locale} locale The locale instance.
28
- * @param {Object} options The input options.
29
- * @param {Array.<module:ui/colorgrid/colorgrid~ColorDefinition>} options.colorDefinitions The colors to be displayed
30
- * in the palette inside the input's dropdown.
31
- * @param {Number} options.columns The number of columns in which the colors will be displayed.
32
- * @param {String} [options.defaultColorValue] If specified, the color input view will replace the "Remove color" button with
33
- * the "Restore default" button. Instead of clearing the input field, the default color value will be set.
34
- */
35
- constructor( locale, options ) {
36
- super( locale );
37
-
38
- /**
39
- * The value of the input.
40
- *
41
- * @observable
42
- * @member {String} #value
43
- * @default ''
44
- */
45
- this.set( 'value', '' );
46
-
47
- /**
48
- * Controls whether the input view is in read-only mode.
49
- *
50
- * @observable
51
- * @member {Boolean} #isReadOnly
52
- * @default false
53
- */
54
- this.set( 'isReadOnly', false );
55
-
56
- /**
57
- * An observable flag set to `true` when the input is focused by the user.
58
- * `false` otherwise.
59
- *
60
- * @readonly
61
- * @observable
62
- * @member {Boolean} #isFocused
63
- * @default false
64
- */
65
- this.set( 'isFocused', false );
66
-
67
- /**
68
- * An observable flag set to `true` when the input contains no text.
69
- *
70
- * @readonly
71
- * @observable
72
- * @member {Boolean} #isEmpty
73
- * @default true
74
- */
75
- this.set( 'isEmpty', true );
76
-
77
- /**
78
- * A cached reference to the options passed to the constructor.
79
- *
80
- * @member {Object}
81
- */
82
- this.options = options;
83
-
84
- /**
85
- * Tracks information about the DOM focus in the view.
86
- *
87
- * @readonly
88
- * @member {module:utils/focustracker~FocusTracker}
89
- */
90
- this.focusTracker = new FocusTracker();
91
-
92
- /**
93
- * A collection of views that can be focused in the view.
94
- *
95
- * @readonly
96
- * @protected
97
- * @member {module:ui/viewcollection~ViewCollection}
98
- */
99
- this._focusables = new ViewCollection();
100
-
101
- /**
102
- * An instance of the dropdown allowing to select a color from a grid.
103
- *
104
- * @member {module:ui/dropdown/dropdown~DropdownView}
105
- */
106
- this.dropdownView = this._createDropdownView();
107
-
108
- /**
109
- * An instance of the input allowing the user to type a color value.
110
- *
111
- * @member {module:ui/inputtext/inputtextview~InputTextView}
112
- */
113
- this.inputView = this._createInputTextView();
114
-
115
- /**
116
- * An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}.
117
- *
118
- * @readonly
119
- * @member {module:utils/keystrokehandler~KeystrokeHandler}
120
- */
121
- this.keystrokes = new KeystrokeHandler();
122
-
123
- /**
124
- * The flag that indicates whether the user is still typing.
125
- * If set to true, it means that the text input field ({@link #inputView}) still has the focus.
126
- * So, we should interrupt the user by replacing the input's value.
127
- *
128
- * @protected
129
- * @member {Boolean}
130
- */
131
- this._stillTyping = false;
132
-
133
- /**
134
- * Helps cycling over focusable items in the view.
135
- *
136
- * @readonly
137
- * @protected
138
- * @member {module:ui/focuscycler~FocusCycler}
139
- */
140
- this._focusCycler = new FocusCycler( {
141
- focusables: this._focusables,
142
- focusTracker: this.focusTracker,
143
- keystrokeHandler: this.keystrokes,
144
- actions: {
145
- // Navigate items backwards using the <kbd>Shift</kbd> + <kbd>Tab</kbd> keystroke.
146
- focusPrevious: 'shift + tab',
147
-
148
- // Navigate items forwards using the <kbd>Tab</kbd> key.
149
- focusNext: 'tab'
150
- }
151
- } );
152
-
153
- this.setTemplate( {
154
- tag: 'div',
155
- attributes: {
156
- class: [
157
- 'ck',
158
- 'ck-input-color'
159
- ]
160
- },
161
- children: [
162
- this.dropdownView,
163
- this.inputView
164
- ]
165
- } );
166
-
167
- this.on( 'change:value', ( evt, name, inputValue ) => this._setInputValue( inputValue ) );
168
- }
169
-
170
- /**
171
- * @inheritDoc
172
- */
173
- render() {
174
- super.render();
175
-
176
- // Start listening for the keystrokes coming from the dropdown panel view.
177
- this.keystrokes.listenTo( this.dropdownView.panelView.element );
178
- }
179
-
180
- /**
181
- * Focuses the input.
182
- */
183
- focus() {
184
- this.inputView.focus();
185
- }
186
-
187
- /**
188
- * @inheritDoc
189
- */
190
- destroy() {
191
- super.destroy();
192
-
193
- this.focusTracker.destroy();
194
- this.keystrokes.destroy();
195
- }
196
-
197
- /**
198
- * Creates and configures the {@link #dropdownView}.
199
- *
200
- * @private
201
- */
202
- _createDropdownView() {
203
- const locale = this.locale;
204
- const t = locale.t;
205
- const bind = this.bindTemplate;
206
- const colorGrid = this._createColorGrid( locale );
207
- const dropdown = createDropdown( locale );
208
- const colorPreview = new View();
209
- const removeColorButton = this._createRemoveColorButton();
210
-
211
- colorPreview.setTemplate( {
212
- tag: 'span',
213
- attributes: {
214
- class: [
215
- 'ck',
216
- 'ck-input-color__button__preview'
217
- ],
218
- style: {
219
- backgroundColor: bind.to( 'value' )
220
- }
221
- },
222
- children: [ {
223
- tag: 'span',
224
- attributes: {
225
- class: [
226
- 'ck',
227
- 'ck-input-color__button__preview__no-color-indicator',
228
- bind.if( 'value', 'ck-hidden', value => value != '' )
229
- ]
230
- }
231
- } ]
232
- } );
233
-
234
- dropdown.buttonView.extendTemplate( {
235
- attributes: {
236
- class: 'ck-input-color__button'
237
- }
238
- } );
239
-
240
- dropdown.buttonView.children.add( colorPreview );
241
- dropdown.buttonView.label = t( 'Color picker' );
242
- dropdown.buttonView.tooltip = true;
243
-
244
- dropdown.panelPosition = locale.uiLanguageDirection === 'rtl' ? 'se' : 'sw';
245
- dropdown.panelView.children.add( removeColorButton );
246
- dropdown.panelView.children.add( colorGrid );
247
- dropdown.bind( 'isEnabled' ).to( this, 'isReadOnly', value => !value );
248
-
249
- this._focusables.add( removeColorButton );
250
- this._focusables.add( colorGrid );
251
-
252
- this.focusTracker.add( removeColorButton.element );
253
- this.focusTracker.add( colorGrid.element );
254
-
255
- return dropdown;
256
- }
257
-
258
- /**
259
- * Creates and configures an instance of {@link module:ui/inputtext/inputtextview~InputTextView}.
260
- *
261
- * @private
262
- * @returns {module:ui/inputtext/inputtextview~InputTextView} A configured instance to be set as {@link #inputView}.
263
- */
264
- _createInputTextView() {
265
- const locale = this.locale;
266
- const inputView = new InputTextView( locale );
267
-
268
- inputView.extendTemplate( {
269
- on: {
270
- blur: inputView.bindTemplate.to( 'blur' )
271
- }
272
- } );
273
-
274
- inputView.value = this.value;
275
- inputView.bind( 'isReadOnly', 'hasError' ).to( this );
276
- this.bind( 'isFocused', 'isEmpty' ).to( inputView );
277
-
278
- inputView.on( 'input', () => {
279
- const inputValue = inputView.element.value;
280
- // Check if the value matches one of our defined colors' label.
281
- const mappedColor = this.options.colorDefinitions.find( def => inputValue === def.label );
282
-
283
- this._stillTyping = true;
284
- this.value = mappedColor && mappedColor.color || inputValue;
285
- } );
286
-
287
- inputView.on( 'blur', () => {
288
- this._stillTyping = false;
289
- this._setInputValue( inputView.element.value );
290
- } );
291
-
292
- inputView.delegate( 'input' ).to( this );
293
-
294
- return inputView;
295
- }
296
-
297
- /**
298
- * Creates and configures the button that clears the color.
299
- *
300
- * @private
301
- */
302
- _createRemoveColorButton() {
303
- const locale = this.locale;
304
- const t = locale.t;
305
- const removeColorButton = new ButtonView( locale );
306
- const defaultColor = this.options.defaultColorValue || '';
307
- const removeColorButtonLabel = defaultColor ? t( 'Restore default' ) : t( 'Remove color' );
308
-
309
- removeColorButton.class = 'ck-input-color__remove-color';
310
- removeColorButton.withText = true;
311
- removeColorButton.icon = icons.eraser;
312
- removeColorButton.label = removeColorButtonLabel;
313
- removeColorButton.on( 'execute', () => {
314
- this.value = defaultColor;
315
- this.dropdownView.isOpen = false;
316
- this.fire( 'input' );
317
- } );
318
-
319
- return removeColorButton;
320
- }
321
-
322
- /**
323
- * Creates and configures the color grid inside the {@link #dropdownView}.
324
- *
325
- * @private
326
- */
327
- _createColorGrid( locale ) {
328
- const colorGrid = new ColorGridView( locale, {
329
- colorDefinitions: this.options.colorDefinitions,
330
- columns: this.options.columns
331
- } );
332
-
333
- colorGrid.on( 'execute', ( evtData, data ) => {
334
- this.value = data.value;
335
- this.dropdownView.isOpen = false;
336
- this.fire( 'input' );
337
- } );
338
- colorGrid.bind( 'selectedColor' ).to( this, 'value' );
339
-
340
- return colorGrid;
341
- }
342
-
343
- /**
344
- * Sets {@link #inputView}'s value property to the color value or color label,
345
- * if there is one and the user is not typing.
346
- *
347
- * Handles cases like:
348
- *
349
- * * Someone picks the color in the grid.
350
- * * The color is set from the plugin level.
351
- *
352
- * @private
353
- * @param {String} inputValue Color value to be set.
354
- */
355
- _setInputValue( inputValue ) {
356
- if ( !this._stillTyping ) {
357
- const normalizedInputValue = normalizeColor( inputValue );
358
- // Check if the value matches one of our defined colors.
359
- const mappedColor = this.options.colorDefinitions.find( def => normalizedInputValue === normalizeColor( def.color ) );
360
-
361
- if ( mappedColor ) {
362
- this.inputView.value = mappedColor.label;
363
- } else {
364
- this.inputView.value = inputValue || '';
365
- }
366
- }
367
- }
19
+ /**
20
+ * Creates an instance of the color input view.
21
+ *
22
+ * @param locale The locale instance.
23
+ * @param options The input options.
24
+ * @param options.colorDefinitions The colors to be displayed in the palette inside the input's dropdown.
25
+ * @param options.columns The number of columns in which the colors will be displayed.
26
+ * @param options.defaultColorValue If specified, the color input view will replace the "Remove color" button with
27
+ * the "Restore default" button. Instead of clearing the input field, the default color value will be set.
28
+ */
29
+ constructor(locale, options) {
30
+ super(locale);
31
+ this.set('value', '');
32
+ this.set('isReadOnly', false);
33
+ this.set('isFocused', false);
34
+ this.set('isEmpty', true);
35
+ this.options = options;
36
+ this.focusTracker = new FocusTracker();
37
+ this._focusables = new ViewCollection();
38
+ this.dropdownView = this._createDropdownView();
39
+ this.inputView = this._createInputTextView();
40
+ this.keystrokes = new KeystrokeHandler();
41
+ this._stillTyping = false;
42
+ this._focusCycler = new FocusCycler({
43
+ focusables: this._focusables,
44
+ focusTracker: this.focusTracker,
45
+ keystrokeHandler: this.keystrokes,
46
+ actions: {
47
+ // Navigate items backwards using the <kbd>Shift</kbd> + <kbd>Tab</kbd> keystroke.
48
+ focusPrevious: 'shift + tab',
49
+ // Navigate items forwards using the <kbd>Tab</kbd> key.
50
+ focusNext: 'tab'
51
+ }
52
+ });
53
+ this.setTemplate({
54
+ tag: 'div',
55
+ attributes: {
56
+ class: [
57
+ 'ck',
58
+ 'ck-input-color'
59
+ ]
60
+ },
61
+ children: [
62
+ this.dropdownView,
63
+ this.inputView
64
+ ]
65
+ });
66
+ this.on('change:value', (evt, name, inputValue) => this._setInputValue(inputValue));
67
+ }
68
+ /**
69
+ * @inheritDoc
70
+ */
71
+ render() {
72
+ super.render();
73
+ // Start listening for the keystrokes coming from the dropdown panel view.
74
+ this.keystrokes.listenTo(this.dropdownView.panelView.element);
75
+ }
76
+ /**
77
+ * Focuses the input.
78
+ */
79
+ focus() {
80
+ this.inputView.focus();
81
+ }
82
+ /**
83
+ * @inheritDoc
84
+ */
85
+ destroy() {
86
+ super.destroy();
87
+ this.focusTracker.destroy();
88
+ this.keystrokes.destroy();
89
+ }
90
+ /**
91
+ * Creates and configures the {@link #dropdownView}.
92
+ */
93
+ _createDropdownView() {
94
+ const locale = this.locale;
95
+ const t = locale.t;
96
+ const bind = this.bindTemplate;
97
+ const colorGrid = this._createColorGrid(locale);
98
+ const dropdown = createDropdown(locale);
99
+ const colorPreview = new View();
100
+ const removeColorButton = this._createRemoveColorButton();
101
+ colorPreview.setTemplate({
102
+ tag: 'span',
103
+ attributes: {
104
+ class: [
105
+ 'ck',
106
+ 'ck-input-color__button__preview'
107
+ ],
108
+ style: {
109
+ backgroundColor: bind.to('value')
110
+ }
111
+ },
112
+ children: [{
113
+ tag: 'span',
114
+ attributes: {
115
+ class: [
116
+ 'ck',
117
+ 'ck-input-color__button__preview__no-color-indicator',
118
+ bind.if('value', 'ck-hidden', value => value != '')
119
+ ]
120
+ }
121
+ }]
122
+ });
123
+ dropdown.buttonView.extendTemplate({
124
+ attributes: {
125
+ class: 'ck-input-color__button'
126
+ }
127
+ });
128
+ dropdown.buttonView.children.add(colorPreview);
129
+ dropdown.buttonView.label = t('Color picker');
130
+ dropdown.buttonView.tooltip = true;
131
+ dropdown.panelPosition = locale.uiLanguageDirection === 'rtl' ? 'se' : 'sw';
132
+ dropdown.panelView.children.add(removeColorButton);
133
+ dropdown.panelView.children.add(colorGrid);
134
+ dropdown.bind('isEnabled').to(this, 'isReadOnly', value => !value);
135
+ this._focusables.add(removeColorButton);
136
+ this._focusables.add(colorGrid);
137
+ this.focusTracker.add(removeColorButton.element);
138
+ this.focusTracker.add(colorGrid.element);
139
+ return dropdown;
140
+ }
141
+ /**
142
+ * Creates and configures an instance of {@link module:ui/inputtext/inputtextview~InputTextView}.
143
+ *
144
+ * @returns A configured instance to be set as {@link #inputView}.
145
+ */
146
+ _createInputTextView() {
147
+ const locale = this.locale;
148
+ const inputView = new InputTextView(locale);
149
+ inputView.extendTemplate({
150
+ on: {
151
+ blur: inputView.bindTemplate.to('blur')
152
+ }
153
+ });
154
+ inputView.value = this.value;
155
+ inputView.bind('isReadOnly', 'hasError').to(this);
156
+ this.bind('isFocused', 'isEmpty').to(inputView);
157
+ inputView.on('input', () => {
158
+ const inputValue = inputView.element.value;
159
+ // Check if the value matches one of our defined colors' label.
160
+ const mappedColor = this.options.colorDefinitions.find(def => inputValue === def.label);
161
+ this._stillTyping = true;
162
+ this.value = mappedColor && mappedColor.color || inputValue;
163
+ });
164
+ inputView.on('blur', () => {
165
+ this._stillTyping = false;
166
+ this._setInputValue(inputView.element.value);
167
+ });
168
+ inputView.delegate('input').to(this);
169
+ return inputView;
170
+ }
171
+ /**
172
+ * Creates and configures the button that clears the color.
173
+ */
174
+ _createRemoveColorButton() {
175
+ const locale = this.locale;
176
+ const t = locale.t;
177
+ const removeColorButton = new ButtonView(locale);
178
+ const defaultColor = this.options.defaultColorValue || '';
179
+ const removeColorButtonLabel = defaultColor ? t('Restore default') : t('Remove color');
180
+ removeColorButton.class = 'ck-input-color__remove-color';
181
+ removeColorButton.withText = true;
182
+ removeColorButton.icon = icons.eraser;
183
+ removeColorButton.label = removeColorButtonLabel;
184
+ removeColorButton.on('execute', () => {
185
+ this.value = defaultColor;
186
+ this.dropdownView.isOpen = false;
187
+ this.fire('input');
188
+ });
189
+ return removeColorButton;
190
+ }
191
+ /**
192
+ * Creates and configures the color grid inside the {@link #dropdownView}.
193
+ */
194
+ _createColorGrid(locale) {
195
+ const colorGrid = new ColorGridView(locale, {
196
+ colorDefinitions: this.options.colorDefinitions,
197
+ columns: this.options.columns
198
+ });
199
+ colorGrid.on('execute', (evtData, data) => {
200
+ this.value = data.value;
201
+ this.dropdownView.isOpen = false;
202
+ this.fire('input');
203
+ });
204
+ colorGrid.bind('selectedColor').to(this, 'value');
205
+ return colorGrid;
206
+ }
207
+ /**
208
+ * Sets {@link #inputView}'s value property to the color value or color label,
209
+ * if there is one and the user is not typing.
210
+ *
211
+ * Handles cases like:
212
+ *
213
+ * * Someone picks the color in the grid.
214
+ * * The color is set from the plugin level.
215
+ *
216
+ * @param inputValue Color value to be set.
217
+ */
218
+ _setInputValue(inputValue) {
219
+ if (!this._stillTyping) {
220
+ const normalizedInputValue = normalizeColor(inputValue);
221
+ // Check if the value matches one of our defined colors.
222
+ const mappedColor = this.options.colorDefinitions.find(def => normalizedInputValue === normalizeColor(def.color));
223
+ if (mappedColor) {
224
+ this.inputView.value = mappedColor.label;
225
+ }
226
+ else {
227
+ this.inputView.value = inputValue || '';
228
+ }
229
+ }
230
+ }
368
231
  }
369
-
370
- // Normalizes color value, by stripping extensive whitespace.
371
- // For example., transforms:
372
- // * ` rgb( 25 50 0 )` to `rgb(25 50 0)`,
373
- // * "\t rgb( 25 , 50,0 ) " to `rgb(25 50 0)`.
374
- //
375
- // @param {String} colorString The value to be normalized.
376
- // @returns {String}
377
- function normalizeColor( colorString ) {
378
- return colorString
379
- // Remove any whitespace right after `(` or `,`.
380
- .replace( /([(,])\s+/g, '$1' )
381
- // Remove any whitespace at the beginning or right before the end, `)`, `,`, or another whitespace.
382
- .replace( /^\s+|\s+(?=[),\s]|$)/g, '' )
383
- // Then, replace `,` or whitespace with a single space.
384
- .replace( /,|\s/g, ' ' );
232
+ /**
233
+ * Normalizes color value, by stripping extensive whitespace.
234
+ * For example., transforms:
235
+ * * ` rgb( 25 50 0 )` to `rgb(25 50 0)`,
236
+ * * "\t rgb( 25 , 50,0 ) " to `rgb(25 50 0)`.
237
+ *
238
+ * @param colorString The value to be normalized.
239
+ */
240
+ function normalizeColor(colorString) {
241
+ return colorString
242
+ // Remove any whitespace right after `(` or `,`.
243
+ .replace(/([(,])\s+/g, '$1')
244
+ // Remove any whitespace at the beginning or right before the end, `)`, `,`, or another whitespace.
245
+ .replace(/^\s+|\s+(?=[),\s]|$)/g, '')
246
+ // Then, replace `,` or whitespace with a single space.
247
+ .replace(/,|\s/g, ' ');
385
248
  }