@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.
- package/README.md +1 -1
- package/build/table.js +1 -1
- package/ckeditor5-metadata.json +6 -6
- package/package.json +34 -29
- package/src/augmentation.d.ts +76 -0
- package/src/augmentation.js +5 -0
- package/src/commands/insertcolumncommand.d.ts +55 -0
- package/src/commands/insertcolumncommand.js +45 -60
- package/src/commands/insertrowcommand.d.ts +54 -0
- package/src/commands/insertrowcommand.js +44 -59
- package/src/commands/inserttablecommand.d.ts +44 -0
- package/src/commands/inserttablecommand.js +50 -68
- package/src/commands/mergecellcommand.d.ts +68 -0
- package/src/commands/mergecellcommand.js +169 -244
- package/src/commands/mergecellscommand.d.ts +28 -0
- package/src/commands/mergecellscommand.js +72 -101
- package/src/commands/removecolumncommand.d.ts +29 -0
- package/src/commands/removecolumncommand.js +88 -102
- package/src/commands/removerowcommand.d.ts +29 -0
- package/src/commands/removerowcommand.js +63 -80
- package/src/commands/selectcolumncommand.d.ts +33 -0
- package/src/commands/selectcolumncommand.js +41 -54
- package/src/commands/selectrowcommand.d.ts +33 -0
- package/src/commands/selectrowcommand.js +38 -48
- package/src/commands/setheadercolumncommand.d.ts +50 -0
- package/src/commands/setheadercolumncommand.js +48 -73
- package/src/commands/setheaderrowcommand.d.ts +53 -0
- package/src/commands/setheaderrowcommand.js +56 -85
- package/src/commands/splitcellcommand.d.ts +43 -0
- package/src/commands/splitcellcommand.js +35 -49
- package/src/converters/downcast.d.ts +63 -0
- package/src/converters/downcast.js +98 -130
- package/src/converters/table-caption-post-fixer.d.ts +20 -0
- package/src/converters/table-caption-post-fixer.js +36 -52
- package/src/converters/table-cell-paragraph-post-fixer.d.ts +32 -0
- package/src/converters/table-cell-paragraph-post-fixer.js +88 -119
- package/src/converters/table-cell-refresh-handler.d.ts +18 -0
- package/src/converters/table-cell-refresh-handler.js +29 -48
- package/src/converters/table-headings-refresh-handler.d.ts +17 -0
- package/src/converters/table-headings-refresh-handler.js +35 -54
- package/src/converters/table-layout-post-fixer.d.ts +226 -0
- package/src/converters/table-layout-post-fixer.js +276 -313
- package/src/converters/tableproperties.d.ts +54 -0
- package/src/converters/tableproperties.js +136 -168
- package/src/converters/upcasttable.d.ts +49 -0
- package/src/converters/upcasttable.js +199 -251
- package/src/index.d.ts +60 -0
- package/src/index.js +1 -2
- package/src/plaintableoutput.d.ts +25 -0
- package/src/plaintableoutput.js +107 -135
- package/src/table.d.ts +33 -0
- package/src/table.js +12 -88
- package/src/tablecaption/tablecaptionediting.d.ts +63 -0
- package/src/tablecaption/tablecaptionediting.js +104 -135
- package/src/tablecaption/tablecaptionui.d.ts +21 -0
- package/src/tablecaption/tablecaptionui.js +42 -58
- package/src/tablecaption/toggletablecaptioncommand.d.ts +68 -0
- package/src/tablecaption/toggletablecaptioncommand.js +77 -92
- package/src/tablecaption/utils.d.ts +42 -0
- package/src/tablecaption/utils.js +35 -61
- package/src/tablecaption.d.ts +22 -0
- package/src/tablecaption.js +12 -19
- package/src/tablecellproperties/commands/tablecellbackgroundcolorcommand.d.ts +32 -0
- package/src/tablecellproperties/commands/tablecellbackgroundcolorcommand.js +14 -20
- package/src/tablecellproperties/commands/tablecellbordercolorcommand.d.ts +37 -0
- package/src/tablecellproperties/commands/tablecellbordercolorcommand.js +27 -37
- package/src/tablecellproperties/commands/tablecellborderstylecommand.d.ts +37 -0
- package/src/tablecellproperties/commands/tablecellborderstylecommand.js +27 -37
- package/src/tablecellproperties/commands/tablecellborderwidthcommand.d.ts +51 -0
- package/src/tablecellproperties/commands/tablecellborderwidthcommand.js +42 -53
- package/src/tablecellproperties/commands/tablecellheightcommand.d.ts +46 -0
- package/src/tablecellproperties/commands/tablecellheightcommand.js +29 -36
- package/src/tablecellproperties/commands/tablecellhorizontalalignmentcommand.d.ts +32 -0
- package/src/tablecellproperties/commands/tablecellhorizontalalignmentcommand.js +14 -20
- package/src/tablecellproperties/commands/tablecellpaddingcommand.d.ts +51 -0
- package/src/tablecellproperties/commands/tablecellpaddingcommand.js +42 -53
- package/src/tablecellproperties/commands/tablecellpropertycommand.d.ts +62 -0
- package/src/tablecellproperties/commands/tablecellpropertycommand.js +77 -122
- package/src/tablecellproperties/commands/tablecellverticalalignmentcommand.d.ts +40 -0
- package/src/tablecellproperties/commands/tablecellverticalalignmentcommand.js +14 -20
- package/src/tablecellproperties/tablecellpropertiesediting.d.ts +41 -0
- package/src/tablecellproperties/tablecellpropertiesediting.js +193 -236
- package/src/tablecellproperties/tablecellpropertiesui.d.ts +111 -0
- package/src/tablecellproperties/tablecellpropertiesui.js +302 -456
- package/src/tablecellproperties/ui/tablecellpropertiesview.d.ts +227 -0
- package/src/tablecellproperties/ui/tablecellpropertiesview.js +509 -844
- package/src/tablecellproperties.d.ts +28 -0
- package/src/tablecellproperties.js +12 -98
- package/src/tablecellwidth/commands/tablecellwidthcommand.d.ts +46 -0
- package/src/tablecellwidth/commands/tablecellwidthcommand.js +29 -35
- package/src/tablecellwidth/tablecellwidthediting.d.ts +28 -0
- package/src/tablecellwidth/tablecellwidthediting.js +25 -38
- package/src/tableclipboard.d.ts +63 -0
- package/src/tableclipboard.js +429 -568
- package/src/tablecolumnresize/constants.d.ts +20 -0
- package/src/tablecolumnresize/constants.js +0 -10
- package/src/tablecolumnresize/converters.d.ts +18 -0
- package/src/tablecolumnresize/converters.js +35 -119
- package/src/tablecolumnresize/tablecolumnresizeediting.d.ts +137 -0
- package/src/tablecolumnresize/tablecolumnresizeediting.js +545 -711
- package/src/tablecolumnresize/tablewidthscommand.d.ts +38 -0
- package/src/tablecolumnresize/tablewidthscommand.js +61 -0
- package/src/tablecolumnresize/utils.d.ts +141 -0
- package/src/tablecolumnresize/utils.js +256 -233
- package/src/tablecolumnresize.d.ts +24 -0
- package/src/tablecolumnresize.js +12 -19
- package/src/tableconfig.d.ts +331 -0
- package/src/tableconfig.js +5 -0
- package/src/tableediting.d.ts +97 -0
- package/src/tableediting.js +157 -176
- package/src/tablekeyboard.d.ts +63 -0
- package/src/tablekeyboard.js +261 -344
- package/src/tablemouse/mouseeventsobserver.d.ts +62 -0
- package/src/tablemouse/mouseeventsobserver.js +13 -50
- package/src/tablemouse.d.ts +46 -0
- package/src/tablemouse.js +154 -202
- package/src/tableproperties/commands/tablealignmentcommand.d.ts +32 -0
- package/src/tableproperties/commands/tablealignmentcommand.js +14 -20
- package/src/tableproperties/commands/tablebackgroundcolorcommand.d.ts +32 -0
- package/src/tableproperties/commands/tablebackgroundcolorcommand.js +14 -20
- package/src/tableproperties/commands/tablebordercolorcommand.d.ts +37 -0
- package/src/tableproperties/commands/tablebordercolorcommand.js +27 -37
- package/src/tableproperties/commands/tableborderstylecommand.d.ts +37 -0
- package/src/tableproperties/commands/tableborderstylecommand.js +27 -37
- package/src/tableproperties/commands/tableborderwidthcommand.d.ts +51 -0
- package/src/tableproperties/commands/tableborderwidthcommand.js +42 -53
- package/src/tableproperties/commands/tableheightcommand.d.ts +46 -0
- package/src/tableproperties/commands/tableheightcommand.js +29 -33
- package/src/tableproperties/commands/tablepropertycommand.d.ts +61 -0
- package/src/tableproperties/commands/tablepropertycommand.js +68 -112
- package/src/tableproperties/commands/tablewidthcommand.d.ts +46 -0
- package/src/tableproperties/commands/tablewidthcommand.js +29 -33
- package/src/tableproperties/tablepropertiesediting.d.ts +39 -0
- package/src/tableproperties/tablepropertiesediting.js +163 -210
- package/src/tableproperties/tablepropertiesui.d.ts +113 -0
- package/src/tableproperties/tablepropertiesui.js +293 -439
- package/src/tableproperties/ui/tablepropertiesview.d.ts +203 -0
- package/src/tableproperties/ui/tablepropertiesview.js +427 -718
- package/src/tableproperties.d.ts +28 -0
- package/src/tableproperties.js +12 -95
- package/src/tableselection.d.ts +106 -0
- package/src/tableselection.js +279 -376
- package/src/tabletoolbar.d.ts +31 -0
- package/src/tabletoolbar.js +38 -92
- package/src/tableui.d.ts +53 -0
- package/src/tableui.js +281 -338
- package/src/tableutils.d.ts +448 -0
- package/src/tableutils.js +1015 -1229
- package/src/tablewalker.d.ts +323 -0
- package/src/tablewalker.js +308 -548
- package/src/ui/colorinputview.d.ts +143 -0
- package/src/ui/colorinputview.js +229 -366
- package/src/ui/formrowview.d.ts +61 -0
- package/src/ui/formrowview.js +38 -84
- package/src/ui/inserttableview.d.ts +77 -0
- package/src/ui/inserttableview.js +152 -242
- package/src/utils/common.d.ts +42 -0
- package/src/utils/common.js +33 -57
- package/src/utils/structure.d.ts +245 -0
- package/src/utils/structure.js +261 -379
- package/src/utils/table-properties.d.ts +67 -0
- package/src/utils/table-properties.js +60 -81
- package/src/utils/ui/contextualballoon.d.ts +34 -0
- package/src/utils/ui/contextualballoon.js +70 -89
- package/src/utils/ui/table-properties.d.ts +193 -0
- package/src/utils/ui/table-properties.js +259 -319
- package/src/utils/ui/widget.d.ts +16 -0
- package/src/utils/ui/widget.js +24 -46
- package/src/tablecolumnresize/tablecolumnwidthscommand.js +0 -55
- package/src/tablecolumnresize/tablewidthresizecommand.js +0 -65
package/src/ui/colorinputview.js
CHANGED
|
@@ -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
|
-
* @
|
|
21
|
-
* @extends module:ui/view~View
|
|
16
|
+
* @internal
|
|
22
17
|
*/
|
|
23
18
|
export default class ColorInputView extends View {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
function normalizeColor(
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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
|
}
|