@ckeditor/ckeditor5-table 38.1.1 → 38.2.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 (169) hide show
  1. package/build/table.js +1 -1
  2. package/package.json +3 -2
  3. package/src/augmentation.d.ts +76 -76
  4. package/src/augmentation.js +5 -5
  5. package/src/commands/insertcolumncommand.d.ts +55 -55
  6. package/src/commands/insertcolumncommand.js +67 -67
  7. package/src/commands/insertrowcommand.d.ts +54 -54
  8. package/src/commands/insertrowcommand.js +66 -66
  9. package/src/commands/inserttablecommand.d.ts +44 -44
  10. package/src/commands/inserttablecommand.js +69 -69
  11. package/src/commands/mergecellcommand.d.ts +68 -68
  12. package/src/commands/mergecellcommand.js +198 -198
  13. package/src/commands/mergecellscommand.d.ts +28 -28
  14. package/src/commands/mergecellscommand.js +94 -94
  15. package/src/commands/removecolumncommand.d.ts +29 -29
  16. package/src/commands/removecolumncommand.js +109 -109
  17. package/src/commands/removerowcommand.d.ts +29 -29
  18. package/src/commands/removerowcommand.js +82 -82
  19. package/src/commands/selectcolumncommand.d.ts +33 -33
  20. package/src/commands/selectcolumncommand.js +60 -60
  21. package/src/commands/selectrowcommand.d.ts +33 -33
  22. package/src/commands/selectrowcommand.js +56 -56
  23. package/src/commands/setheadercolumncommand.d.ts +50 -50
  24. package/src/commands/setheadercolumncommand.js +71 -71
  25. package/src/commands/setheaderrowcommand.d.ts +53 -53
  26. package/src/commands/setheaderrowcommand.js +79 -79
  27. package/src/commands/splitcellcommand.d.ts +43 -43
  28. package/src/commands/splitcellcommand.js +54 -54
  29. package/src/converters/downcast.d.ts +63 -63
  30. package/src/converters/downcast.js +146 -146
  31. package/src/converters/table-caption-post-fixer.d.ts +20 -20
  32. package/src/converters/table-caption-post-fixer.js +53 -53
  33. package/src/converters/table-cell-paragraph-post-fixer.d.ts +32 -32
  34. package/src/converters/table-cell-paragraph-post-fixer.js +107 -107
  35. package/src/converters/table-cell-refresh-handler.d.ts +18 -18
  36. package/src/converters/table-cell-refresh-handler.js +45 -45
  37. package/src/converters/table-headings-refresh-handler.d.ts +17 -17
  38. package/src/converters/table-headings-refresh-handler.js +49 -49
  39. package/src/converters/table-layout-post-fixer.d.ts +226 -226
  40. package/src/converters/table-layout-post-fixer.js +367 -367
  41. package/src/converters/tableproperties.d.ts +54 -54
  42. package/src/converters/tableproperties.js +159 -159
  43. package/src/converters/upcasttable.d.ts +49 -49
  44. package/src/converters/upcasttable.js +243 -243
  45. package/src/index.d.ts +60 -60
  46. package/src/index.js +30 -30
  47. package/src/plaintableoutput.d.ts +26 -26
  48. package/src/plaintableoutput.js +123 -123
  49. package/src/table.d.ts +40 -40
  50. package/src/table.js +44 -44
  51. package/src/tablecaption/tablecaptionediting.d.ts +63 -63
  52. package/src/tablecaption/tablecaptionediting.js +122 -122
  53. package/src/tablecaption/tablecaptionui.d.ts +21 -21
  54. package/src/tablecaption/tablecaptionui.js +57 -57
  55. package/src/tablecaption/toggletablecaptioncommand.d.ts +68 -68
  56. package/src/tablecaption/toggletablecaptioncommand.js +104 -104
  57. package/src/tablecaption/utils.d.ts +42 -42
  58. package/src/tablecaption/utils.js +67 -67
  59. package/src/tablecaption.d.ts +24 -24
  60. package/src/tablecaption.js +28 -28
  61. package/src/tablecellproperties/commands/tablecellbackgroundcolorcommand.d.ts +32 -32
  62. package/src/tablecellproperties/commands/tablecellbackgroundcolorcommand.js +30 -30
  63. package/src/tablecellproperties/commands/tablecellbordercolorcommand.d.ts +37 -37
  64. package/src/tablecellproperties/commands/tablecellbordercolorcommand.js +44 -44
  65. package/src/tablecellproperties/commands/tablecellborderstylecommand.d.ts +37 -37
  66. package/src/tablecellproperties/commands/tablecellborderstylecommand.js +44 -44
  67. package/src/tablecellproperties/commands/tablecellborderwidthcommand.d.ts +51 -51
  68. package/src/tablecellproperties/commands/tablecellborderwidthcommand.js +64 -64
  69. package/src/tablecellproperties/commands/tablecellheightcommand.d.ts +46 -46
  70. package/src/tablecellproperties/commands/tablecellheightcommand.js +51 -51
  71. package/src/tablecellproperties/commands/tablecellhorizontalalignmentcommand.d.ts +32 -32
  72. package/src/tablecellproperties/commands/tablecellhorizontalalignmentcommand.js +30 -30
  73. package/src/tablecellproperties/commands/tablecellpaddingcommand.d.ts +51 -51
  74. package/src/tablecellproperties/commands/tablecellpaddingcommand.js +64 -64
  75. package/src/tablecellproperties/commands/tablecellpropertycommand.d.ts +62 -62
  76. package/src/tablecellproperties/commands/tablecellpropertycommand.js +92 -92
  77. package/src/tablecellproperties/commands/tablecellverticalalignmentcommand.d.ts +40 -40
  78. package/src/tablecellproperties/commands/tablecellverticalalignmentcommand.js +38 -38
  79. package/src/tablecellproperties/tablecellpropertiesediting.d.ts +43 -43
  80. package/src/tablecellproperties/tablecellpropertiesediting.js +241 -241
  81. package/src/tablecellproperties/tablecellpropertiesui.d.ts +112 -112
  82. package/src/tablecellproperties/tablecellpropertiesui.js +330 -328
  83. package/src/tablecellproperties/ui/tablecellpropertiesview.d.ts +228 -227
  84. package/src/tablecellproperties/ui/tablecellpropertiesview.js +539 -537
  85. package/src/tablecellproperties.d.ts +30 -30
  86. package/src/tablecellproperties.js +34 -34
  87. package/src/tablecellwidth/commands/tablecellwidthcommand.d.ts +46 -46
  88. package/src/tablecellwidth/commands/tablecellwidthcommand.js +51 -51
  89. package/src/tablecellwidth/tablecellwidthediting.d.ts +29 -29
  90. package/src/tablecellwidth/tablecellwidthediting.js +45 -45
  91. package/src/tableclipboard.d.ts +65 -65
  92. package/src/tableclipboard.js +450 -450
  93. package/src/tablecolumnresize/constants.d.ts +20 -20
  94. package/src/tablecolumnresize/constants.js +20 -20
  95. package/src/tablecolumnresize/converters.d.ts +18 -18
  96. package/src/tablecolumnresize/converters.js +45 -45
  97. package/src/tablecolumnresize/tablecolumnresizeediting.d.ts +139 -139
  98. package/src/tablecolumnresize/tablecolumnresizeediting.js +571 -571
  99. package/src/tablecolumnresize/tablewidthscommand.d.ts +38 -38
  100. package/src/tablecolumnresize/tablewidthscommand.js +61 -61
  101. package/src/tablecolumnresize/utils.d.ts +141 -141
  102. package/src/tablecolumnresize/utils.js +330 -330
  103. package/src/tablecolumnresize.d.ts +26 -26
  104. package/src/tablecolumnresize.js +30 -30
  105. package/src/tableconfig.d.ts +343 -331
  106. package/src/tableconfig.js +5 -5
  107. package/src/tableediting.d.ts +98 -98
  108. package/src/tableediting.js +191 -191
  109. package/src/tablekeyboard.d.ts +68 -68
  110. package/src/tablekeyboard.js +279 -279
  111. package/src/tablemouse/mouseeventsobserver.d.ts +62 -62
  112. package/src/tablemouse/mouseeventsobserver.js +35 -35
  113. package/src/tablemouse.d.ts +48 -48
  114. package/src/tablemouse.js +172 -172
  115. package/src/tableproperties/commands/tablealignmentcommand.d.ts +32 -32
  116. package/src/tableproperties/commands/tablealignmentcommand.js +30 -30
  117. package/src/tableproperties/commands/tablebackgroundcolorcommand.d.ts +32 -32
  118. package/src/tableproperties/commands/tablebackgroundcolorcommand.js +30 -30
  119. package/src/tableproperties/commands/tablebordercolorcommand.d.ts +37 -37
  120. package/src/tableproperties/commands/tablebordercolorcommand.js +44 -44
  121. package/src/tableproperties/commands/tableborderstylecommand.d.ts +37 -37
  122. package/src/tableproperties/commands/tableborderstylecommand.js +44 -44
  123. package/src/tableproperties/commands/tableborderwidthcommand.d.ts +51 -51
  124. package/src/tableproperties/commands/tableborderwidthcommand.js +64 -64
  125. package/src/tableproperties/commands/tableheightcommand.d.ts +46 -46
  126. package/src/tableproperties/commands/tableheightcommand.js +54 -54
  127. package/src/tableproperties/commands/tablepropertycommand.d.ts +61 -61
  128. package/src/tableproperties/commands/tablepropertycommand.js +80 -80
  129. package/src/tableproperties/commands/tablewidthcommand.d.ts +46 -46
  130. package/src/tableproperties/commands/tablewidthcommand.js +54 -54
  131. package/src/tableproperties/tablepropertiesediting.d.ts +40 -40
  132. package/src/tableproperties/tablepropertiesediting.js +206 -206
  133. package/src/tableproperties/tablepropertiesui.d.ts +114 -114
  134. package/src/tableproperties/tablepropertiesui.js +321 -319
  135. package/src/tableproperties/ui/tablepropertiesview.d.ts +207 -203
  136. package/src/tableproperties/ui/tablepropertiesview.js +457 -455
  137. package/src/tableproperties.d.ts +30 -30
  138. package/src/tableproperties.js +34 -34
  139. package/src/tableselection.d.ts +107 -107
  140. package/src/tableselection.js +297 -297
  141. package/src/tabletoolbar.d.ts +32 -32
  142. package/src/tabletoolbar.js +57 -57
  143. package/src/tableui.d.ts +53 -53
  144. package/src/tableui.js +309 -309
  145. package/src/tableutils.d.ts +448 -448
  146. package/src/tableutils.js +1041 -1041
  147. package/src/tablewalker.d.ts +323 -323
  148. package/src/tablewalker.js +333 -333
  149. package/src/ui/colorinputview.d.ts +140 -143
  150. package/src/ui/colorinputview.js +265 -248
  151. package/src/ui/formrowview.d.ts +61 -61
  152. package/src/ui/formrowview.js +57 -57
  153. package/src/ui/inserttableview.d.ts +77 -77
  154. package/src/ui/inserttableview.js +169 -169
  155. package/src/utils/common.d.ts +42 -42
  156. package/src/utils/common.js +57 -57
  157. package/src/utils/structure.d.ts +245 -245
  158. package/src/utils/structure.js +426 -426
  159. package/src/utils/table-properties.d.ts +67 -67
  160. package/src/utils/table-properties.js +86 -86
  161. package/src/utils/ui/contextualballoon.d.ts +34 -34
  162. package/src/utils/ui/contextualballoon.js +106 -106
  163. package/src/utils/ui/table-properties.d.ts +195 -193
  164. package/src/utils/ui/table-properties.js +362 -360
  165. package/src/utils/ui/widget.d.ts +16 -16
  166. package/src/utils/ui/widget.js +38 -38
  167. package/theme/tablecaption.css +7 -7
  168. package/theme/tablecolumnresize.css +2 -2
  169. package/build/table.js.map +0 -1
@@ -1,248 +1,265 @@
1
- /**
2
- * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
- */
5
- /**
6
- * @module table/ui/colorinputview
7
- */
8
- import { View, InputTextView, ButtonView, createDropdown, ColorGridView, FocusCycler, ViewCollection } from 'ckeditor5/src/ui';
9
- import { icons } from 'ckeditor5/src/core';
10
- import { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';
11
- import '../../theme/colorinput.css';
12
- /**
13
- * The color input view class. It allows the user to type in a color (hex, rgb, etc.)
14
- * or choose it from the configurable color palette with a preview.
15
- *
16
- * @internal
17
- */
18
- export default class ColorInputView extends View {
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
- }
231
- }
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, ' ');
248
- }
1
+ /**
2
+ * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @module table/ui/colorinputview
7
+ */
8
+ import { View, InputTextView, createDropdown, FocusCycler, ViewCollection, ColorSelectorView } from 'ckeditor5/src/ui.js';
9
+ import { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils.js';
10
+ import '../../theme/colorinput.css';
11
+ /**
12
+ * The color input view class. It allows the user to type in a color (hex, rgb, etc.)
13
+ * or choose it from the configurable color palette with a preview.
14
+ *
15
+ * @internal
16
+ */
17
+ export default class ColorInputView extends View {
18
+ /**
19
+ * Creates an instance of the color input view.
20
+ *
21
+ * @param locale The locale instance.
22
+ * @param options The input options.
23
+ * @param options.colorDefinitions The colors to be displayed in the palette inside the input's dropdown.
24
+ * @param options.columns The number of columns in which the colors will be displayed.
25
+ * @param options.defaultColorValue If specified, the color input view will replace the "Remove color" button with
26
+ * the "Restore default" button. Instead of clearing the input field, the default color value will be set.
27
+ */
28
+ constructor(locale, options) {
29
+ super(locale);
30
+ this.set('value', '');
31
+ this.set('isReadOnly', false);
32
+ this.set('isFocused', false);
33
+ this.set('isEmpty', true);
34
+ this.options = options;
35
+ this.focusTracker = new FocusTracker();
36
+ this._focusables = new ViewCollection();
37
+ this.dropdownView = this._createDropdownView();
38
+ this.inputView = this._createInputTextView();
39
+ this.keystrokes = new KeystrokeHandler();
40
+ this._stillTyping = false;
41
+ this._focusCycler = new FocusCycler({
42
+ focusables: this._focusables,
43
+ focusTracker: this.focusTracker,
44
+ keystrokeHandler: this.keystrokes,
45
+ actions: {
46
+ // Navigate items backwards using the <kbd>Shift</kbd> + <kbd>Tab</kbd> keystroke.
47
+ focusPrevious: 'shift + tab',
48
+ // Navigate items forwards using the <kbd>Tab</kbd> key.
49
+ focusNext: 'tab'
50
+ }
51
+ });
52
+ this.setTemplate({
53
+ tag: 'div',
54
+ attributes: {
55
+ class: [
56
+ 'ck',
57
+ 'ck-input-color'
58
+ ]
59
+ },
60
+ children: [
61
+ this.dropdownView,
62
+ this.inputView
63
+ ]
64
+ });
65
+ this.on('change:value', (evt, name, inputValue) => this._setInputValue(inputValue));
66
+ }
67
+ /**
68
+ * @inheritDoc
69
+ */
70
+ render() {
71
+ super.render();
72
+ // Start listening for the keystrokes coming from the dropdown panel view.
73
+ this.keystrokes.listenTo(this.dropdownView.panelView.element);
74
+ }
75
+ /**
76
+ * Focuses the input.
77
+ */
78
+ focus() {
79
+ this.inputView.focus();
80
+ }
81
+ /**
82
+ * @inheritDoc
83
+ */
84
+ destroy() {
85
+ super.destroy();
86
+ this.focusTracker.destroy();
87
+ this.keystrokes.destroy();
88
+ }
89
+ /**
90
+ * Creates and configures the {@link #dropdownView}.
91
+ */
92
+ _createDropdownView() {
93
+ const locale = this.locale;
94
+ const t = locale.t;
95
+ const bind = this.bindTemplate;
96
+ const colorSelector = this._createColorSelector(locale);
97
+ const dropdown = createDropdown(locale);
98
+ const colorPreview = new View();
99
+ colorPreview.setTemplate({
100
+ tag: 'span',
101
+ attributes: {
102
+ class: [
103
+ 'ck',
104
+ 'ck-input-color__button__preview'
105
+ ],
106
+ style: {
107
+ backgroundColor: bind.to('value')
108
+ }
109
+ },
110
+ children: [{
111
+ tag: 'span',
112
+ attributes: {
113
+ class: [
114
+ 'ck',
115
+ 'ck-input-color__button__preview__no-color-indicator',
116
+ bind.if('value', 'ck-hidden', value => value != '')
117
+ ]
118
+ }
119
+ }]
120
+ });
121
+ dropdown.buttonView.extendTemplate({
122
+ attributes: {
123
+ class: 'ck-input-color__button'
124
+ }
125
+ });
126
+ dropdown.buttonView.children.add(colorPreview);
127
+ dropdown.buttonView.label = t('Color picker');
128
+ dropdown.buttonView.tooltip = true;
129
+ dropdown.panelPosition = locale.uiLanguageDirection === 'rtl' ? 'se' : 'sw';
130
+ dropdown.panelView.children.add(colorSelector);
131
+ dropdown.bind('isEnabled').to(this, 'isReadOnly', value => !value);
132
+ this._focusables.add(colorSelector);
133
+ this.focusTracker.add(colorSelector.element);
134
+ dropdown.on('change:isOpen', (evt, name, isVisible) => {
135
+ if (isVisible) {
136
+ colorSelector.updateSelectedColors();
137
+ colorSelector.showColorGridsFragment();
138
+ }
139
+ });
140
+ return dropdown;
141
+ }
142
+ /**
143
+ * Creates and configures an instance of {@link module:ui/inputtext/inputtextview~InputTextView}.
144
+ *
145
+ * @returns A configured instance to be set as {@link #inputView}.
146
+ */
147
+ _createInputTextView() {
148
+ const locale = this.locale;
149
+ const inputView = new InputTextView(locale);
150
+ inputView.extendTemplate({
151
+ on: {
152
+ blur: inputView.bindTemplate.to('blur')
153
+ }
154
+ });
155
+ inputView.value = this.value;
156
+ inputView.bind('isReadOnly', 'hasError').to(this);
157
+ this.bind('isFocused', 'isEmpty').to(inputView);
158
+ inputView.on('input', () => {
159
+ const inputValue = inputView.element.value;
160
+ // Check if the value matches one of our defined colors' label.
161
+ const mappedColor = this.options.colorDefinitions.find(def => inputValue === def.label);
162
+ this._stillTyping = true;
163
+ this.value = mappedColor && mappedColor.color || inputValue;
164
+ });
165
+ inputView.on('blur', () => {
166
+ this._stillTyping = false;
167
+ this._setInputValue(inputView.element.value);
168
+ });
169
+ inputView.delegate('input').to(this);
170
+ return inputView;
171
+ }
172
+ /**
173
+ * Creates and configures the panel with "color grid" and "color picker" inside the {@link #dropdownView}.
174
+ */
175
+ _createColorSelector(locale) {
176
+ const t = locale.t;
177
+ const defaultColor = this.options.defaultColorValue || '';
178
+ const removeColorButtonLabel = defaultColor ? t('Restore default') : t('Remove color');
179
+ const colorSelector = new ColorSelectorView(locale, {
180
+ colors: this.options.colorDefinitions,
181
+ columns: this.options.columns,
182
+ removeButtonLabel: removeColorButtonLabel,
183
+ colorPickerLabel: t('Color picker'),
184
+ colorPickerViewConfig: this.options.colorPickerConfig === false ? false : {
185
+ ...this.options.colorPickerConfig,
186
+ hideInput: true
187
+ }
188
+ });
189
+ colorSelector.appendUI();
190
+ colorSelector.on('execute', (evt, data) => {
191
+ if (data.source === 'colorPickerSaveButton') {
192
+ this.dropdownView.isOpen = false;
193
+ return;
194
+ }
195
+ this.value = data.value || defaultColor;
196
+ // Trigger the listener that actually applies the set value.
197
+ this.fire('input');
198
+ if (data.source !== 'colorPicker') {
199
+ this.dropdownView.isOpen = false;
200
+ }
201
+ });
202
+ /**
203
+ * Color is saved before changes in color picker. In case "cancel button" is pressed
204
+ * this color will be applied.
205
+ */
206
+ let backupColor = this.value;
207
+ colorSelector.on('colorPicker:cancel', () => {
208
+ /**
209
+ * Revert color to previous value before changes in color picker.
210
+ */
211
+ this.value = backupColor;
212
+ this.fire('input');
213
+ this.dropdownView.isOpen = false;
214
+ });
215
+ colorSelector.colorGridsFragmentView.colorPickerButtonView.on('execute', () => {
216
+ /**
217
+ * Save color value before changes in color picker.
218
+ */
219
+ backupColor = this.value;
220
+ });
221
+ colorSelector.bind('selectedColor').to(this, 'value');
222
+ return colorSelector;
223
+ }
224
+ /**
225
+ * Sets {@link #inputView}'s value property to the color value or color label,
226
+ * if there is one and the user is not typing.
227
+ *
228
+ * Handles cases like:
229
+ *
230
+ * * Someone picks the color in the grid.
231
+ * * The color is set from the plugin level.
232
+ *
233
+ * @param inputValue Color value to be set.
234
+ */
235
+ _setInputValue(inputValue) {
236
+ if (!this._stillTyping) {
237
+ const normalizedInputValue = normalizeColor(inputValue);
238
+ // Check if the value matches one of our defined colors.
239
+ const mappedColor = this.options.colorDefinitions.find(def => normalizedInputValue === normalizeColor(def.color));
240
+ if (mappedColor) {
241
+ this.inputView.value = mappedColor.label;
242
+ }
243
+ else {
244
+ this.inputView.value = inputValue || '';
245
+ }
246
+ }
247
+ }
248
+ }
249
+ /**
250
+ * Normalizes color value, by stripping extensive whitespace.
251
+ * For example., transforms:
252
+ * * ` rgb( 25 50 0 )` to `rgb(25 50 0)`,
253
+ * * "\t rgb( 25 , 50,0 ) " to `rgb(25 50 0)`.
254
+ *
255
+ * @param colorString The value to be normalized.
256
+ */
257
+ function normalizeColor(colorString) {
258
+ return colorString
259
+ // Remove any whitespace right after `(` or `,`.
260
+ .replace(/([(,])\s+/g, '$1')
261
+ // Remove any whitespace at the beginning or right before the end, `)`, `,`, or another whitespace.
262
+ .replace(/^\s+|\s+(?=[),\s]|$)/g, '')
263
+ // Then, replace `,` or whitespace with a single space.
264
+ .replace(/,|\s/g, ' ');
265
+ }
@@ -1,61 +1,61 @@
1
- /**
2
- * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
- */
5
- /**
6
- * @module table/ui/formrowview
7
- */
8
- import { View, type LabelView, type ViewCollection } from 'ckeditor5/src/ui';
9
- import type { Locale } from 'ckeditor5/src/utils';
10
- import '../../theme/formrow.css';
11
- /**
12
- * The class representing a single row in a complex form,
13
- * used by {@link module:table/tablecellproperties/ui/tablecellpropertiesview~TableCellPropertiesView}.
14
- *
15
- * **Note**: For now this class is private. When more use cases arrive (beyond ckeditor5-table),
16
- * it will become a component in ckeditor5-ui.
17
- *
18
- * @internal
19
- */
20
- export default class FormRowView extends View {
21
- /**
22
- * An additional CSS class added to the {@link #element}.
23
- *
24
- * @observable
25
- */
26
- class: string | null;
27
- /**
28
- * A collection of row items (buttons, dropdowns, etc.).
29
- */
30
- readonly children: ViewCollection;
31
- /**
32
- * The role property reflected by the `role` DOM attribute of the {@link #element}.
33
- *
34
- * **Note**: Used only when a `labelView` is passed to constructor `options`.
35
- *
36
- * @observable
37
- * @internal
38
- */
39
- _role: string | null;
40
- /**
41
- * The ARIA property reflected by the `aria-labelledby` DOM attribute of the {@link #element}.
42
- *
43
- * **Note**: Used only when a `labelView` is passed to constructor `options`.
44
- *
45
- * @observable
46
- * @internal
47
- */
48
- _ariaLabelledBy: string | null;
49
- /**
50
- * Creates an instance of the form row class.
51
- *
52
- * @param locale The locale instance.
53
- * @param options.labelView When passed, the row gets the `group` and `aria-labelledby`
54
- * DOM attributes and gets described by the label.
55
- */
56
- constructor(locale: Locale, options?: {
57
- children?: Array<View>;
58
- class?: string;
59
- labelView?: LabelView;
60
- });
61
- }
1
+ /**
2
+ * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @module table/ui/formrowview
7
+ */
8
+ import { View, type LabelView, type ViewCollection } from 'ckeditor5/src/ui.js';
9
+ import type { Locale } from 'ckeditor5/src/utils.js';
10
+ import '../../theme/formrow.css';
11
+ /**
12
+ * The class representing a single row in a complex form,
13
+ * used by {@link module:table/tablecellproperties/ui/tablecellpropertiesview~TableCellPropertiesView}.
14
+ *
15
+ * **Note**: For now this class is private. When more use cases arrive (beyond ckeditor5-table),
16
+ * it will become a component in ckeditor5-ui.
17
+ *
18
+ * @internal
19
+ */
20
+ export default class FormRowView extends View {
21
+ /**
22
+ * An additional CSS class added to the {@link #element}.
23
+ *
24
+ * @observable
25
+ */
26
+ class: string | null;
27
+ /**
28
+ * A collection of row items (buttons, dropdowns, etc.).
29
+ */
30
+ readonly children: ViewCollection;
31
+ /**
32
+ * The role property reflected by the `role` DOM attribute of the {@link #element}.
33
+ *
34
+ * **Note**: Used only when a `labelView` is passed to constructor `options`.
35
+ *
36
+ * @observable
37
+ * @internal
38
+ */
39
+ _role: string | null;
40
+ /**
41
+ * The ARIA property reflected by the `aria-labelledby` DOM attribute of the {@link #element}.
42
+ *
43
+ * **Note**: Used only when a `labelView` is passed to constructor `options`.
44
+ *
45
+ * @observable
46
+ * @internal
47
+ */
48
+ _ariaLabelledBy: string | null;
49
+ /**
50
+ * Creates an instance of the form row class.
51
+ *
52
+ * @param locale The locale instance.
53
+ * @param options.labelView When passed, the row gets the `group` and `aria-labelledby`
54
+ * DOM attributes and gets described by the label.
55
+ */
56
+ constructor(locale: Locale, options?: {
57
+ children?: Array<View>;
58
+ class?: string;
59
+ labelView?: LabelView;
60
+ });
61
+ }