@ckeditor/ckeditor5-ui 40.0.0 → 40.1.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.
- package/LICENSE.md +3 -3
- package/lang/translations/pt-br.po +1 -1
- package/lang/translations/ug.po +26 -26
- package/package.json +3 -3
- package/src/arialiveannouncer.d.ts +94 -0
- package/src/arialiveannouncer.js +113 -0
- package/src/augmentation.d.ts +86 -86
- package/src/augmentation.js +5 -5
- package/src/autocomplete/autocompleteview.d.ts +81 -81
- package/src/autocomplete/autocompleteview.js +153 -146
- package/src/bindings/addkeyboardhandlingforgrid.d.ts +27 -27
- package/src/bindings/addkeyboardhandlingforgrid.js +107 -107
- package/src/bindings/clickoutsidehandler.d.ts +28 -28
- package/src/bindings/clickoutsidehandler.js +36 -36
- package/src/bindings/csstransitiondisablermixin.d.ts +40 -40
- package/src/bindings/csstransitiondisablermixin.js +55 -55
- package/src/bindings/injectcsstransitiondisabler.d.ts +59 -59
- package/src/bindings/injectcsstransitiondisabler.js +71 -71
- package/src/bindings/preventdefault.d.ts +33 -33
- package/src/bindings/preventdefault.js +34 -34
- package/src/bindings/submithandler.d.ts +57 -57
- package/src/bindings/submithandler.js +47 -47
- package/src/button/button.d.ts +172 -178
- package/src/button/button.js +5 -5
- package/src/button/buttonlabel.d.ts +34 -34
- package/src/button/buttonlabel.js +5 -5
- package/src/button/buttonlabelview.d.ts +31 -31
- package/src/button/buttonlabelview.js +42 -42
- package/src/button/buttonview.d.ts +181 -185
- package/src/button/buttonview.js +217 -219
- package/src/button/switchbuttonview.d.ts +45 -45
- package/src/button/switchbuttonview.js +75 -75
- package/src/colorgrid/colorgridview.d.ts +132 -132
- package/src/colorgrid/colorgridview.js +124 -124
- package/src/colorgrid/colortileview.d.ts +28 -28
- package/src/colorgrid/colortileview.js +40 -40
- package/src/colorgrid/utils.d.ts +47 -47
- package/src/colorgrid/utils.js +84 -84
- package/src/colorpicker/colorpickerview.d.ts +137 -137
- package/src/colorpicker/colorpickerview.js +270 -270
- package/src/colorpicker/utils.d.ts +43 -43
- package/src/colorpicker/utils.js +99 -99
- package/src/colorselector/colorgridsfragmentview.d.ts +194 -194
- package/src/colorselector/colorgridsfragmentview.js +289 -289
- package/src/colorselector/colorpickerfragmentview.d.ts +128 -128
- package/src/colorselector/colorpickerfragmentview.js +205 -205
- package/src/colorselector/colorselectorview.d.ts +242 -242
- package/src/colorselector/colorselectorview.js +256 -256
- package/src/colorselector/documentcolorcollection.d.ts +70 -70
- package/src/colorselector/documentcolorcollection.js +42 -42
- package/src/componentfactory.d.ts +81 -81
- package/src/componentfactory.js +104 -104
- package/src/dropdown/button/dropdownbutton.d.ts +25 -25
- package/src/dropdown/button/dropdownbutton.js +5 -5
- package/src/dropdown/button/dropdownbuttonview.d.ts +48 -48
- package/src/dropdown/button/dropdownbuttonview.js +66 -66
- package/src/dropdown/button/splitbuttonview.d.ts +161 -161
- package/src/dropdown/button/splitbuttonview.js +152 -152
- package/src/dropdown/dropdownpanelfocusable.d.ts +21 -21
- package/src/dropdown/dropdownpanelfocusable.js +5 -5
- package/src/dropdown/dropdownpanelview.d.ts +62 -62
- package/src/dropdown/dropdownpanelview.js +97 -97
- package/src/dropdown/dropdownview.d.ts +315 -315
- package/src/dropdown/dropdownview.js +379 -379
- package/src/dropdown/utils.d.ts +235 -235
- package/src/dropdown/utils.js +463 -458
- package/src/editableui/editableuiview.d.ts +72 -72
- package/src/editableui/editableuiview.js +112 -112
- package/src/editableui/inline/inlineeditableuiview.d.ts +40 -40
- package/src/editableui/inline/inlineeditableuiview.js +48 -48
- package/src/editorui/bodycollection.d.ts +55 -55
- package/src/editorui/bodycollection.js +84 -84
- package/src/editorui/boxed/boxededitoruiview.d.ts +40 -40
- package/src/editorui/boxed/boxededitoruiview.js +81 -81
- package/src/editorui/editorui.d.ts +288 -282
- package/src/editorui/editorui.js +412 -410
- package/src/editorui/editoruiview.d.ts +39 -39
- package/src/editorui/editoruiview.js +38 -38
- package/src/editorui/poweredby.d.ts +71 -71
- package/src/editorui/poweredby.js +276 -276
- package/src/focuscycler.d.ts +226 -226
- package/src/focuscycler.js +245 -245
- package/src/formheader/formheaderview.d.ts +59 -59
- package/src/formheader/formheaderview.js +69 -69
- package/src/highlightedtext/highlightedtextview.d.ts +38 -38
- package/src/highlightedtext/highlightedtextview.js +102 -102
- package/src/icon/iconview.d.ts +85 -85
- package/src/icon/iconview.js +114 -114
- package/src/iframe/iframeview.d.ts +50 -50
- package/src/iframe/iframeview.js +63 -63
- package/src/index.d.ts +73 -73
- package/src/index.js +70 -70
- package/src/input/inputbase.d.ts +107 -107
- package/src/input/inputbase.js +110 -110
- package/src/input/inputview.d.ts +36 -36
- package/src/input/inputview.js +24 -24
- package/src/inputnumber/inputnumberview.d.ts +49 -49
- package/src/inputnumber/inputnumberview.js +40 -40
- package/src/inputtext/inputtextview.d.ts +18 -18
- package/src/inputtext/inputtextview.js +27 -27
- package/src/label/labelview.d.ts +36 -36
- package/src/label/labelview.js +41 -41
- package/src/labeledfield/labeledfieldview.d.ts +187 -187
- package/src/labeledfield/labeledfieldview.js +157 -157
- package/src/labeledfield/utils.d.ts +123 -123
- package/src/labeledfield/utils.js +176 -176
- package/src/labeledinput/labeledinputview.d.ts +125 -125
- package/src/labeledinput/labeledinputview.js +125 -125
- package/src/list/listitemgroupview.d.ts +59 -51
- package/src/list/listitemgroupview.js +63 -75
- package/src/list/listitemview.d.ts +36 -36
- package/src/list/listitemview.js +42 -42
- package/src/list/listseparatorview.d.ts +18 -18
- package/src/list/listseparatorview.js +28 -28
- package/src/list/listview.d.ts +122 -122
- package/src/list/listview.js +187 -187
- package/src/model.d.ts +22 -22
- package/src/model.js +31 -31
- package/src/notification/notification.d.ts +211 -211
- package/src/notification/notification.js +187 -187
- package/src/panel/balloon/balloonpanelview.d.ts +685 -685
- package/src/panel/balloon/balloonpanelview.js +1010 -1010
- package/src/panel/balloon/contextualballoon.d.ts +299 -299
- package/src/panel/balloon/contextualballoon.js +572 -572
- package/src/panel/sticky/stickypanelview.d.ts +156 -156
- package/src/panel/sticky/stickypanelview.js +234 -234
- package/src/search/filteredview.d.ts +31 -31
- package/src/search/filteredview.js +5 -5
- package/src/search/searchinfoview.d.ts +45 -45
- package/src/search/searchinfoview.js +59 -59
- package/src/search/searchresultsview.d.ts +54 -54
- package/src/search/searchresultsview.js +65 -65
- package/src/search/text/searchtextqueryview.d.ts +76 -76
- package/src/search/text/searchtextqueryview.js +75 -75
- package/src/search/text/searchtextview.d.ts +219 -219
- package/src/search/text/searchtextview.js +201 -201
- package/src/spinner/spinnerview.d.ts +25 -25
- package/src/spinner/spinnerview.js +38 -38
- package/src/template.d.ts +942 -942
- package/src/template.js +1294 -1294
- package/src/textarea/textareaview.d.ts +88 -88
- package/src/textarea/textareaview.js +142 -140
- package/src/toolbar/balloon/balloontoolbar.d.ts +122 -122
- package/src/toolbar/balloon/balloontoolbar.js +300 -300
- package/src/toolbar/block/blockbuttonview.d.ts +35 -35
- package/src/toolbar/block/blockbuttonview.js +41 -41
- package/src/toolbar/block/blocktoolbar.d.ts +161 -161
- package/src/toolbar/block/blocktoolbar.js +395 -395
- package/src/toolbar/normalizetoolbarconfig.d.ts +40 -40
- package/src/toolbar/normalizetoolbarconfig.js +52 -51
- package/src/toolbar/toolbarlinebreakview.d.ts +18 -18
- package/src/toolbar/toolbarlinebreakview.js +28 -28
- package/src/toolbar/toolbarseparatorview.d.ts +18 -18
- package/src/toolbar/toolbarseparatorview.js +28 -28
- package/src/toolbar/toolbarview.d.ts +266 -266
- package/src/toolbar/toolbarview.js +719 -719
- package/src/tooltipmanager.d.ts +180 -180
- package/src/tooltipmanager.js +353 -353
- package/src/view.d.ts +422 -422
- package/src/view.js +396 -396
- package/src/viewcollection.d.ts +139 -139
- package/src/viewcollection.js +206 -206
- package/theme/components/arialiveannouncer/arialiveannouncer.css +10 -0
- package/theme/components/button/button.css +9 -1
- package/theme/components/formheader/formheader.css +0 -4
|
@@ -1,88 +1,88 @@
|
|
|
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 ui/textarea/textareaview
|
|
7
|
-
*/
|
|
8
|
-
import { type Locale } from '@ckeditor/ckeditor5-utils';
|
|
9
|
-
import InputBase from '../input/inputbase';
|
|
10
|
-
import '../../theme/components/input/input.css';
|
|
11
|
-
import '../../theme/components/textarea/textarea.css';
|
|
12
|
-
/**
|
|
13
|
-
* The textarea view class.
|
|
14
|
-
*
|
|
15
|
-
* ```ts
|
|
16
|
-
* const textareaView = new TextareaView();
|
|
17
|
-
*
|
|
18
|
-
* textareaView.minRows = 2;
|
|
19
|
-
* textareaView.maxRows = 10;
|
|
20
|
-
*
|
|
21
|
-
* textareaView.render();
|
|
22
|
-
*
|
|
23
|
-
* document.body.append( textareaView.element );
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
export default class TextareaView extends InputBase<HTMLTextAreaElement> {
|
|
27
|
-
/**
|
|
28
|
-
* Specifies the visible height of a text area, in lines.
|
|
29
|
-
*
|
|
30
|
-
* @observable
|
|
31
|
-
* @default 2
|
|
32
|
-
*/
|
|
33
|
-
minRows: number;
|
|
34
|
-
/**
|
|
35
|
-
* Specifies the maximum number of rows.
|
|
36
|
-
*
|
|
37
|
-
* @observable
|
|
38
|
-
* @default 5
|
|
39
|
-
*/
|
|
40
|
-
maxRows: number;
|
|
41
|
-
/**
|
|
42
|
-
* Specifies the value of HTML attribute that indicates whether the user can resize the element.
|
|
43
|
-
*
|
|
44
|
-
* @observable
|
|
45
|
-
* @default 'none'
|
|
46
|
-
*/
|
|
47
|
-
resize: 'both' | 'horizontal' | 'vertical' | 'none';
|
|
48
|
-
/**
|
|
49
|
-
* An internal property that stores the current height of the textarea. Used for the DOM binding.
|
|
50
|
-
*
|
|
51
|
-
* @observable
|
|
52
|
-
* @default null
|
|
53
|
-
* @internal
|
|
54
|
-
*/
|
|
55
|
-
_height: number | null;
|
|
56
|
-
/**
|
|
57
|
-
* @inheritDoc
|
|
58
|
-
*/
|
|
59
|
-
constructor(locale?: Locale);
|
|
60
|
-
/**
|
|
61
|
-
* @inheritDoc
|
|
62
|
-
*/
|
|
63
|
-
render(): void;
|
|
64
|
-
/**
|
|
65
|
-
* @inheritDoc
|
|
66
|
-
*/
|
|
67
|
-
reset(): void;
|
|
68
|
-
/**
|
|
69
|
-
* Updates the {@link #_height} of the view depending on {@link #minRows}, {@link #maxRows}, and the current content size.
|
|
70
|
-
*
|
|
71
|
-
* **Note**: This method overrides manual resize done by the user using a handle. It's a known bug.
|
|
72
|
-
*/
|
|
73
|
-
private _updateAutoGrowHeight;
|
|
74
|
-
/**
|
|
75
|
-
* Validates the {@link #minRows} and {@link #maxRows} properties and warns in the console if the configuration is incorrect.
|
|
76
|
-
*/
|
|
77
|
-
private _validateMinMaxRows;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Fired every time the layout of the {@link module:ui/textarea/textareaview~TextareaView} possibly changed as a result
|
|
81
|
-
* of the user input or the value change via {@link module:ui/textarea/textareaview~TextareaView#value}.
|
|
82
|
-
*
|
|
83
|
-
* @eventName ~TextareaView#update
|
|
84
|
-
*/
|
|
85
|
-
export type TextareaViewUpdateEvent = {
|
|
86
|
-
name: 'update';
|
|
87
|
-
args: [];
|
|
88
|
-
};
|
|
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 ui/textarea/textareaview
|
|
7
|
+
*/
|
|
8
|
+
import { type Locale } from '@ckeditor/ckeditor5-utils';
|
|
9
|
+
import InputBase from '../input/inputbase';
|
|
10
|
+
import '../../theme/components/input/input.css';
|
|
11
|
+
import '../../theme/components/textarea/textarea.css';
|
|
12
|
+
/**
|
|
13
|
+
* The textarea view class.
|
|
14
|
+
*
|
|
15
|
+
* ```ts
|
|
16
|
+
* const textareaView = new TextareaView();
|
|
17
|
+
*
|
|
18
|
+
* textareaView.minRows = 2;
|
|
19
|
+
* textareaView.maxRows = 10;
|
|
20
|
+
*
|
|
21
|
+
* textareaView.render();
|
|
22
|
+
*
|
|
23
|
+
* document.body.append( textareaView.element );
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export default class TextareaView extends InputBase<HTMLTextAreaElement> {
|
|
27
|
+
/**
|
|
28
|
+
* Specifies the visible height of a text area, in lines.
|
|
29
|
+
*
|
|
30
|
+
* @observable
|
|
31
|
+
* @default 2
|
|
32
|
+
*/
|
|
33
|
+
minRows: number;
|
|
34
|
+
/**
|
|
35
|
+
* Specifies the maximum number of rows.
|
|
36
|
+
*
|
|
37
|
+
* @observable
|
|
38
|
+
* @default 5
|
|
39
|
+
*/
|
|
40
|
+
maxRows: number;
|
|
41
|
+
/**
|
|
42
|
+
* Specifies the value of HTML attribute that indicates whether the user can resize the element.
|
|
43
|
+
*
|
|
44
|
+
* @observable
|
|
45
|
+
* @default 'none'
|
|
46
|
+
*/
|
|
47
|
+
resize: 'both' | 'horizontal' | 'vertical' | 'none';
|
|
48
|
+
/**
|
|
49
|
+
* An internal property that stores the current height of the textarea. Used for the DOM binding.
|
|
50
|
+
*
|
|
51
|
+
* @observable
|
|
52
|
+
* @default null
|
|
53
|
+
* @internal
|
|
54
|
+
*/
|
|
55
|
+
_height: number | null;
|
|
56
|
+
/**
|
|
57
|
+
* @inheritDoc
|
|
58
|
+
*/
|
|
59
|
+
constructor(locale?: Locale);
|
|
60
|
+
/**
|
|
61
|
+
* @inheritDoc
|
|
62
|
+
*/
|
|
63
|
+
render(): void;
|
|
64
|
+
/**
|
|
65
|
+
* @inheritDoc
|
|
66
|
+
*/
|
|
67
|
+
reset(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Updates the {@link #_height} of the view depending on {@link #minRows}, {@link #maxRows}, and the current content size.
|
|
70
|
+
*
|
|
71
|
+
* **Note**: This method overrides manual resize done by the user using a handle. It's a known bug.
|
|
72
|
+
*/
|
|
73
|
+
private _updateAutoGrowHeight;
|
|
74
|
+
/**
|
|
75
|
+
* Validates the {@link #minRows} and {@link #maxRows} properties and warns in the console if the configuration is incorrect.
|
|
76
|
+
*/
|
|
77
|
+
private _validateMinMaxRows;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Fired every time the layout of the {@link module:ui/textarea/textareaview~TextareaView} possibly changed as a result
|
|
81
|
+
* of the user input or the value change via {@link module:ui/textarea/textareaview~TextareaView#value}.
|
|
82
|
+
*
|
|
83
|
+
* @eventName ~TextareaView#update
|
|
84
|
+
*/
|
|
85
|
+
export type TextareaViewUpdateEvent = {
|
|
86
|
+
name: 'update';
|
|
87
|
+
args: [];
|
|
88
|
+
};
|
|
@@ -1,140 +1,142 @@
|
|
|
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 ui/textarea/textareaview
|
|
7
|
-
*/
|
|
8
|
-
import { Rect, toUnit, getBorderWidths, global, CKEditorError } from '@ckeditor/ckeditor5-utils';
|
|
9
|
-
import InputBase from '../input/inputbase';
|
|
10
|
-
import '../../theme/components/input/input.css';
|
|
11
|
-
import '../../theme/components/textarea/textarea.css';
|
|
12
|
-
/**
|
|
13
|
-
* The textarea view class.
|
|
14
|
-
*
|
|
15
|
-
* ```ts
|
|
16
|
-
* const textareaView = new TextareaView();
|
|
17
|
-
*
|
|
18
|
-
* textareaView.minRows = 2;
|
|
19
|
-
* textareaView.maxRows = 10;
|
|
20
|
-
*
|
|
21
|
-
* textareaView.render();
|
|
22
|
-
*
|
|
23
|
-
* document.body.append( textareaView.element );
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
export default class TextareaView extends InputBase {
|
|
27
|
-
/**
|
|
28
|
-
* @inheritDoc
|
|
29
|
-
*/
|
|
30
|
-
constructor(locale) {
|
|
31
|
-
super(locale);
|
|
32
|
-
const toPx = toUnit('px');
|
|
33
|
-
this.set('minRows', 2);
|
|
34
|
-
this.set('maxRows', 5);
|
|
35
|
-
this.set('_height', null);
|
|
36
|
-
this.set('resize', 'none');
|
|
37
|
-
this.on('change:minRows', this._validateMinMaxRows.bind(this));
|
|
38
|
-
this.on('change:maxRows', this._validateMinMaxRows.bind(this));
|
|
39
|
-
const bind = this.bindTemplate;
|
|
40
|
-
this.template.tag = 'textarea';
|
|
41
|
-
this.extendTemplate({
|
|
42
|
-
attributes: {
|
|
43
|
-
class: ['ck-textarea'],
|
|
44
|
-
style: {
|
|
45
|
-
height: bind.to('_height', height => height ? toPx(height) : null),
|
|
46
|
-
resize: bind.to('resize')
|
|
47
|
-
},
|
|
48
|
-
rows: bind.to('minRows')
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* @inheritDoc
|
|
54
|
-
*/
|
|
55
|
-
render() {
|
|
56
|
-
super.render();
|
|
57
|
-
this.on('input', () => {
|
|
58
|
-
this._updateAutoGrowHeight(true);
|
|
59
|
-
this.fire('update');
|
|
60
|
-
});
|
|
61
|
-
this.on('change:value', () => {
|
|
62
|
-
// The content needs to be updated by the browser after the value is changed. It takes a few ms.
|
|
63
|
-
global.window.requestAnimationFrame(() => {
|
|
64
|
-
this.
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
*
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const
|
|
86
|
-
const
|
|
87
|
-
const
|
|
88
|
-
const
|
|
89
|
-
const
|
|
90
|
-
const
|
|
91
|
-
const
|
|
92
|
-
const
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
//
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
* @
|
|
117
|
-
* @param
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
clone
|
|
131
|
-
clone.style.
|
|
132
|
-
clone.style.
|
|
133
|
-
clone.style.
|
|
134
|
-
clone.style.
|
|
135
|
-
clone.
|
|
136
|
-
clone.
|
|
137
|
-
clone.
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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 ui/textarea/textareaview
|
|
7
|
+
*/
|
|
8
|
+
import { Rect, toUnit, getBorderWidths, global, CKEditorError, isVisible } from '@ckeditor/ckeditor5-utils';
|
|
9
|
+
import InputBase from '../input/inputbase';
|
|
10
|
+
import '../../theme/components/input/input.css';
|
|
11
|
+
import '../../theme/components/textarea/textarea.css';
|
|
12
|
+
/**
|
|
13
|
+
* The textarea view class.
|
|
14
|
+
*
|
|
15
|
+
* ```ts
|
|
16
|
+
* const textareaView = new TextareaView();
|
|
17
|
+
*
|
|
18
|
+
* textareaView.minRows = 2;
|
|
19
|
+
* textareaView.maxRows = 10;
|
|
20
|
+
*
|
|
21
|
+
* textareaView.render();
|
|
22
|
+
*
|
|
23
|
+
* document.body.append( textareaView.element );
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export default class TextareaView extends InputBase {
|
|
27
|
+
/**
|
|
28
|
+
* @inheritDoc
|
|
29
|
+
*/
|
|
30
|
+
constructor(locale) {
|
|
31
|
+
super(locale);
|
|
32
|
+
const toPx = toUnit('px');
|
|
33
|
+
this.set('minRows', 2);
|
|
34
|
+
this.set('maxRows', 5);
|
|
35
|
+
this.set('_height', null);
|
|
36
|
+
this.set('resize', 'none');
|
|
37
|
+
this.on('change:minRows', this._validateMinMaxRows.bind(this));
|
|
38
|
+
this.on('change:maxRows', this._validateMinMaxRows.bind(this));
|
|
39
|
+
const bind = this.bindTemplate;
|
|
40
|
+
this.template.tag = 'textarea';
|
|
41
|
+
this.extendTemplate({
|
|
42
|
+
attributes: {
|
|
43
|
+
class: ['ck-textarea'],
|
|
44
|
+
style: {
|
|
45
|
+
height: bind.to('_height', height => height ? toPx(height) : null),
|
|
46
|
+
resize: bind.to('resize')
|
|
47
|
+
},
|
|
48
|
+
rows: bind.to('minRows')
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* @inheritDoc
|
|
54
|
+
*/
|
|
55
|
+
render() {
|
|
56
|
+
super.render();
|
|
57
|
+
this.on('input', () => {
|
|
58
|
+
this._updateAutoGrowHeight(true);
|
|
59
|
+
this.fire('update');
|
|
60
|
+
});
|
|
61
|
+
this.on('change:value', () => {
|
|
62
|
+
// The content needs to be updated by the browser after the value is changed. It takes a few ms.
|
|
63
|
+
global.window.requestAnimationFrame(() => {
|
|
64
|
+
if (isVisible(this.element)) {
|
|
65
|
+
this._updateAutoGrowHeight();
|
|
66
|
+
this.fire('update');
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* @inheritDoc
|
|
73
|
+
*/
|
|
74
|
+
reset() {
|
|
75
|
+
super.reset();
|
|
76
|
+
this._updateAutoGrowHeight();
|
|
77
|
+
this.fire('update');
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Updates the {@link #_height} of the view depending on {@link #minRows}, {@link #maxRows}, and the current content size.
|
|
81
|
+
*
|
|
82
|
+
* **Note**: This method overrides manual resize done by the user using a handle. It's a known bug.
|
|
83
|
+
*/
|
|
84
|
+
_updateAutoGrowHeight(shouldScroll) {
|
|
85
|
+
const viewElement = this.element;
|
|
86
|
+
const singleLineContentClone = getTextareaElementClone(viewElement, '1');
|
|
87
|
+
const fullTextValueClone = getTextareaElementClone(viewElement, viewElement.value);
|
|
88
|
+
const singleLineContentStyles = singleLineContentClone.ownerDocument.defaultView.getComputedStyle(singleLineContentClone);
|
|
89
|
+
const verticalPaddings = parseFloat(singleLineContentStyles.paddingTop) + parseFloat(singleLineContentStyles.paddingBottom);
|
|
90
|
+
const borders = getBorderWidths(singleLineContentClone);
|
|
91
|
+
const lineHeight = parseFloat(singleLineContentStyles.lineHeight);
|
|
92
|
+
const verticalBorder = borders.top + borders.bottom;
|
|
93
|
+
const singleLineAreaDefaultHeight = new Rect(singleLineContentClone).height;
|
|
94
|
+
const numberOfLines = Math.round((fullTextValueClone.scrollHeight - verticalPaddings) / lineHeight);
|
|
95
|
+
const maxHeight = this.maxRows * lineHeight + verticalPaddings + verticalBorder;
|
|
96
|
+
// There's a --ck-ui-component-min-height CSS custom property that enforces min height of the component.
|
|
97
|
+
// This min-height is relevant only when there's one line of text. Other than that, we can rely on line-height.
|
|
98
|
+
const minHeight = numberOfLines === 1 ? singleLineAreaDefaultHeight : this.minRows * lineHeight + verticalPaddings + verticalBorder;
|
|
99
|
+
// The size of textarea is controlled by height style instead of rows attribute because event though it is
|
|
100
|
+
// a more complex solution, it is immune to the layout textarea has been rendered in (gird, flex).
|
|
101
|
+
this._height = Math.min(Math.max(Math.max(numberOfLines, this.minRows) * lineHeight + verticalPaddings + verticalBorder, minHeight), maxHeight);
|
|
102
|
+
if (shouldScroll) {
|
|
103
|
+
viewElement.scrollTop = viewElement.scrollHeight;
|
|
104
|
+
}
|
|
105
|
+
singleLineContentClone.remove();
|
|
106
|
+
fullTextValueClone.remove();
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Validates the {@link #minRows} and {@link #maxRows} properties and warns in the console if the configuration is incorrect.
|
|
110
|
+
*/
|
|
111
|
+
_validateMinMaxRows() {
|
|
112
|
+
if (this.minRows > this.maxRows) {
|
|
113
|
+
/**
|
|
114
|
+
* The minimum number of rows is greater than the maximum number of rows.
|
|
115
|
+
*
|
|
116
|
+
* @error ui-textarea-view-min-rows-greater-than-max-rows
|
|
117
|
+
* @param textareaView The misconfigured textarea view instance.
|
|
118
|
+
* @param minRows The value of `minRows` property.
|
|
119
|
+
* @param maxRows The value of `maxRows` property.
|
|
120
|
+
*/
|
|
121
|
+
throw new CKEditorError('ui-textarea-view-min-rows-greater-than-max-rows', {
|
|
122
|
+
textareaView: this,
|
|
123
|
+
minRows: this.minRows,
|
|
124
|
+
maxRows: this.maxRows
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function getTextareaElementClone(element, value) {
|
|
130
|
+
const clone = element.cloneNode();
|
|
131
|
+
clone.style.position = 'absolute';
|
|
132
|
+
clone.style.top = '-99999px';
|
|
133
|
+
clone.style.left = '-99999px';
|
|
134
|
+
clone.style.height = 'auto';
|
|
135
|
+
clone.style.overflow = 'hidden';
|
|
136
|
+
clone.style.width = element.ownerDocument.defaultView.getComputedStyle(element).width;
|
|
137
|
+
clone.tabIndex = -1;
|
|
138
|
+
clone.rows = 1;
|
|
139
|
+
clone.value = value;
|
|
140
|
+
element.parentNode.insertBefore(clone, element);
|
|
141
|
+
return clone;
|
|
142
|
+
}
|