@ckeditor/ckeditor5-table 36.0.1 → 37.0.0-alpha.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 (166) hide show
  1. package/build/table.js +1 -1
  2. package/package.json +34 -29
  3. package/src/commands/insertcolumncommand.d.ts +61 -0
  4. package/src/commands/insertcolumncommand.js +45 -60
  5. package/src/commands/insertrowcommand.d.ts +60 -0
  6. package/src/commands/insertrowcommand.js +44 -59
  7. package/src/commands/inserttablecommand.d.ts +50 -0
  8. package/src/commands/inserttablecommand.js +51 -68
  9. package/src/commands/mergecellcommand.d.ts +76 -0
  10. package/src/commands/mergecellcommand.js +169 -244
  11. package/src/commands/mergecellscommand.d.ts +33 -0
  12. package/src/commands/mergecellscommand.js +72 -101
  13. package/src/commands/removecolumncommand.d.ts +34 -0
  14. package/src/commands/removecolumncommand.js +88 -102
  15. package/src/commands/removerowcommand.d.ts +34 -0
  16. package/src/commands/removerowcommand.js +63 -80
  17. package/src/commands/selectcolumncommand.d.ts +38 -0
  18. package/src/commands/selectcolumncommand.js +41 -54
  19. package/src/commands/selectrowcommand.d.ts +38 -0
  20. package/src/commands/selectrowcommand.js +38 -48
  21. package/src/commands/setheadercolumncommand.d.ts +55 -0
  22. package/src/commands/setheadercolumncommand.js +48 -73
  23. package/src/commands/setheaderrowcommand.d.ts +58 -0
  24. package/src/commands/setheaderrowcommand.js +56 -85
  25. package/src/commands/splitcellcommand.d.ts +49 -0
  26. package/src/commands/splitcellcommand.js +35 -49
  27. package/src/converters/downcast.d.ts +63 -0
  28. package/src/converters/downcast.js +98 -130
  29. package/src/converters/table-caption-post-fixer.d.ts +20 -0
  30. package/src/converters/table-caption-post-fixer.js +36 -52
  31. package/src/converters/table-cell-paragraph-post-fixer.d.ts +32 -0
  32. package/src/converters/table-cell-paragraph-post-fixer.js +88 -119
  33. package/src/converters/table-cell-refresh-handler.d.ts +18 -0
  34. package/src/converters/table-cell-refresh-handler.js +29 -48
  35. package/src/converters/table-headings-refresh-handler.d.ts +17 -0
  36. package/src/converters/table-headings-refresh-handler.js +35 -54
  37. package/src/converters/table-layout-post-fixer.d.ts +226 -0
  38. package/src/converters/table-layout-post-fixer.js +276 -313
  39. package/src/converters/tableproperties.d.ts +54 -0
  40. package/src/converters/tableproperties.js +136 -168
  41. package/src/converters/upcasttable.d.ts +49 -0
  42. package/src/converters/upcasttable.js +196 -251
  43. package/src/index.d.ts +29 -0
  44. package/src/index.js +0 -2
  45. package/src/plaintableoutput.d.ts +30 -0
  46. package/src/plaintableoutput.js +107 -135
  47. package/src/table.d.ts +38 -0
  48. package/src/table.js +12 -88
  49. package/src/tablecaption/tablecaptionediting.d.ts +68 -0
  50. package/src/tablecaption/tablecaptionediting.js +104 -135
  51. package/src/tablecaption/tablecaptionui.d.ts +26 -0
  52. package/src/tablecaption/tablecaptionui.js +42 -58
  53. package/src/tablecaption/toggletablecaptioncommand.d.ts +73 -0
  54. package/src/tablecaption/toggletablecaptioncommand.js +77 -92
  55. package/src/tablecaption/utils.d.ts +42 -0
  56. package/src/tablecaption/utils.js +35 -61
  57. package/src/tablecaption.d.ts +27 -0
  58. package/src/tablecaption.js +12 -19
  59. package/src/tablecellproperties/commands/tablecellbackgroundcolorcommand.d.ts +37 -0
  60. package/src/tablecellproperties/commands/tablecellbackgroundcolorcommand.js +14 -20
  61. package/src/tablecellproperties/commands/tablecellbordercolorcommand.d.ts +42 -0
  62. package/src/tablecellproperties/commands/tablecellbordercolorcommand.js +27 -37
  63. package/src/tablecellproperties/commands/tablecellborderstylecommand.d.ts +42 -0
  64. package/src/tablecellproperties/commands/tablecellborderstylecommand.js +27 -37
  65. package/src/tablecellproperties/commands/tablecellborderwidthcommand.d.ts +56 -0
  66. package/src/tablecellproperties/commands/tablecellborderwidthcommand.js +42 -53
  67. package/src/tablecellproperties/commands/tablecellheightcommand.d.ts +51 -0
  68. package/src/tablecellproperties/commands/tablecellheightcommand.js +29 -36
  69. package/src/tablecellproperties/commands/tablecellhorizontalalignmentcommand.d.ts +37 -0
  70. package/src/tablecellproperties/commands/tablecellhorizontalalignmentcommand.js +14 -20
  71. package/src/tablecellproperties/commands/tablecellpaddingcommand.d.ts +56 -0
  72. package/src/tablecellproperties/commands/tablecellpaddingcommand.js +42 -53
  73. package/src/tablecellproperties/commands/tablecellpropertycommand.d.ts +62 -0
  74. package/src/tablecellproperties/commands/tablecellpropertycommand.js +77 -122
  75. package/src/tablecellproperties/commands/tablecellverticalalignmentcommand.d.ts +45 -0
  76. package/src/tablecellproperties/commands/tablecellverticalalignmentcommand.js +14 -20
  77. package/src/tablecellproperties/tablecellpropertiesediting.d.ts +47 -0
  78. package/src/tablecellproperties/tablecellpropertiesediting.js +194 -236
  79. package/src/tablecellproperties/tablecellpropertiesui.d.ts +117 -0
  80. package/src/tablecellproperties/tablecellpropertiesui.js +303 -456
  81. package/src/tablecellproperties/ui/tablecellpropertiesview.d.ts +227 -0
  82. package/src/tablecellproperties/ui/tablecellpropertiesview.js +509 -844
  83. package/src/tablecellproperties.d.ts +33 -0
  84. package/src/tablecellproperties.js +12 -98
  85. package/src/tablecellwidth/commands/tablecellwidthcommand.d.ts +51 -0
  86. package/src/tablecellwidth/commands/tablecellwidthcommand.js +29 -35
  87. package/src/tablecellwidth/tablecellwidthediting.d.ts +34 -0
  88. package/src/tablecellwidth/tablecellwidthediting.js +26 -38
  89. package/src/tableclipboard.d.ts +68 -0
  90. package/src/tableclipboard.js +429 -568
  91. package/src/tablecolumnresize/constants.d.ts +20 -0
  92. package/src/tablecolumnresize/constants.js +0 -10
  93. package/src/tablecolumnresize/converters.d.ts +18 -0
  94. package/src/tablecolumnresize/converters.js +35 -119
  95. package/src/tablecolumnresize/tablecolumnresizeediting.d.ts +142 -0
  96. package/src/tablecolumnresize/tablecolumnresizeediting.js +545 -711
  97. package/src/tablecolumnresize/tablewidthscommand.d.ts +38 -0
  98. package/src/tablecolumnresize/tablewidthscommand.js +61 -0
  99. package/src/tablecolumnresize/utils.d.ts +141 -0
  100. package/src/tablecolumnresize/utils.js +256 -233
  101. package/src/tablecolumnresize.d.ts +29 -0
  102. package/src/tablecolumnresize.js +12 -19
  103. package/src/tableconfig.d.ts +341 -0
  104. package/src/tableconfig.js +5 -0
  105. package/src/tableediting.d.ts +102 -0
  106. package/src/tableediting.js +157 -176
  107. package/src/tablekeyboard.d.ts +68 -0
  108. package/src/tablekeyboard.js +261 -344
  109. package/src/tablemouse/mouseeventsobserver.d.ts +62 -0
  110. package/src/tablemouse/mouseeventsobserver.js +12 -49
  111. package/src/tablemouse.d.ts +51 -0
  112. package/src/tablemouse.js +154 -202
  113. package/src/tableproperties/commands/tablealignmentcommand.d.ts +37 -0
  114. package/src/tableproperties/commands/tablealignmentcommand.js +14 -20
  115. package/src/tableproperties/commands/tablebackgroundcolorcommand.d.ts +37 -0
  116. package/src/tableproperties/commands/tablebackgroundcolorcommand.js +14 -20
  117. package/src/tableproperties/commands/tablebordercolorcommand.d.ts +42 -0
  118. package/src/tableproperties/commands/tablebordercolorcommand.js +27 -37
  119. package/src/tableproperties/commands/tableborderstylecommand.d.ts +42 -0
  120. package/src/tableproperties/commands/tableborderstylecommand.js +27 -37
  121. package/src/tableproperties/commands/tableborderwidthcommand.d.ts +56 -0
  122. package/src/tableproperties/commands/tableborderwidthcommand.js +42 -53
  123. package/src/tableproperties/commands/tableheightcommand.d.ts +51 -0
  124. package/src/tableproperties/commands/tableheightcommand.js +29 -33
  125. package/src/tableproperties/commands/tablepropertycommand.d.ts +61 -0
  126. package/src/tableproperties/commands/tablepropertycommand.js +68 -112
  127. package/src/tableproperties/commands/tablewidthcommand.d.ts +51 -0
  128. package/src/tableproperties/commands/tablewidthcommand.js +29 -33
  129. package/src/tableproperties/tablepropertiesediting.d.ts +45 -0
  130. package/src/tableproperties/tablepropertiesediting.js +164 -210
  131. package/src/tableproperties/tablepropertiesui.d.ts +119 -0
  132. package/src/tableproperties/tablepropertiesui.js +294 -439
  133. package/src/tableproperties/ui/tablepropertiesview.d.ts +203 -0
  134. package/src/tableproperties/ui/tablepropertiesview.js +427 -718
  135. package/src/tableproperties.d.ts +33 -0
  136. package/src/tableproperties.js +12 -95
  137. package/src/tableselection.d.ts +111 -0
  138. package/src/tableselection.js +279 -376
  139. package/src/tabletoolbar.d.ts +37 -0
  140. package/src/tabletoolbar.js +39 -92
  141. package/src/tableui.d.ts +58 -0
  142. package/src/tableui.js +281 -338
  143. package/src/tableutils.d.ts +453 -0
  144. package/src/tableutils.js +1015 -1229
  145. package/src/tablewalker.d.ts +323 -0
  146. package/src/tablewalker.js +308 -548
  147. package/src/ui/colorinputview.d.ts +143 -0
  148. package/src/ui/colorinputview.js +229 -366
  149. package/src/ui/formrowview.d.ts +61 -0
  150. package/src/ui/formrowview.js +38 -84
  151. package/src/ui/inserttableview.d.ts +77 -0
  152. package/src/ui/inserttableview.js +152 -242
  153. package/src/utils/common.d.ts +42 -0
  154. package/src/utils/common.js +33 -57
  155. package/src/utils/structure.d.ts +245 -0
  156. package/src/utils/structure.js +261 -379
  157. package/src/utils/table-properties.d.ts +67 -0
  158. package/src/utils/table-properties.js +60 -81
  159. package/src/utils/ui/contextualballoon.d.ts +34 -0
  160. package/src/utils/ui/contextualballoon.js +70 -89
  161. package/src/utils/ui/table-properties.d.ts +193 -0
  162. package/src/utils/ui/table-properties.js +259 -319
  163. package/src/utils/ui/widget.d.ts +16 -0
  164. package/src/utils/ui/widget.js +24 -46
  165. package/src/tablecolumnresize/tablecolumnwidthscommand.js +0 -55
  166. 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
  }