@ckeditor/ckeditor5-image 40.1.0 → 40.2.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/CHANGELOG.md +25 -25
- package/build/image.js +2 -2
- package/build/translations/ar.js +1 -1
- package/build/translations/ast.js +1 -1
- package/build/translations/az.js +1 -1
- package/build/translations/bg.js +1 -1
- package/build/translations/bn.js +1 -1
- package/build/translations/bs.js +1 -1
- package/build/translations/ca.js +1 -1
- package/build/translations/cs.js +1 -1
- package/build/translations/da.js +1 -1
- package/build/translations/de-ch.js +1 -1
- package/build/translations/de.js +1 -1
- package/build/translations/el.js +1 -1
- package/build/translations/en-au.js +1 -1
- package/build/translations/en-gb.js +1 -1
- package/build/translations/eo.js +1 -1
- package/build/translations/es.js +1 -1
- package/build/translations/et.js +1 -1
- package/build/translations/eu.js +1 -1
- package/build/translations/fa.js +1 -1
- package/build/translations/fi.js +1 -1
- package/build/translations/fr.js +1 -1
- package/build/translations/gl.js +1 -1
- package/build/translations/he.js +1 -1
- package/build/translations/hi.js +1 -1
- package/build/translations/hr.js +1 -1
- package/build/translations/hu.js +1 -1
- package/build/translations/id.js +1 -1
- package/build/translations/it.js +1 -1
- package/build/translations/ja.js +1 -1
- package/build/translations/jv.js +1 -1
- package/build/translations/km.js +1 -1
- package/build/translations/kn.js +1 -1
- package/build/translations/ko.js +1 -1
- package/build/translations/ku.js +1 -1
- package/build/translations/lt.js +1 -1
- package/build/translations/lv.js +1 -1
- package/build/translations/ms.js +1 -1
- package/build/translations/nb.js +1 -1
- package/build/translations/ne.js +1 -1
- package/build/translations/nl.js +1 -1
- package/build/translations/no.js +1 -1
- package/build/translations/pl.js +1 -1
- package/build/translations/pt-br.js +1 -1
- package/build/translations/pt.js +1 -1
- package/build/translations/ro.js +1 -1
- package/build/translations/ru.js +1 -1
- package/build/translations/si.js +1 -1
- package/build/translations/sk.js +1 -1
- package/build/translations/sq.js +1 -1
- package/build/translations/sr-latn.js +1 -1
- package/build/translations/sr.js +1 -1
- package/build/translations/sv.js +1 -1
- package/build/translations/th.js +1 -1
- package/build/translations/tk.js +1 -1
- package/build/translations/tr.js +1 -1
- package/build/translations/tt.js +1 -1
- package/build/translations/ug.js +1 -1
- package/build/translations/uk.js +1 -1
- package/build/translations/ur.js +1 -1
- package/build/translations/uz.js +1 -1
- package/build/translations/vi.js +1 -1
- package/build/translations/zh-cn.js +1 -1
- package/build/translations/zh.js +1 -1
- package/ckeditor5-metadata.json +3 -3
- package/lang/contexts.json +5 -0
- package/lang/translations/ar.po +20 -0
- package/lang/translations/ast.po +20 -0
- package/lang/translations/az.po +20 -0
- package/lang/translations/bg.po +20 -0
- package/lang/translations/bn.po +20 -0
- package/lang/translations/bs.po +20 -0
- package/lang/translations/ca.po +20 -0
- package/lang/translations/cs.po +20 -0
- package/lang/translations/da.po +20 -0
- package/lang/translations/de-ch.po +20 -0
- package/lang/translations/de.po +20 -0
- package/lang/translations/el.po +20 -0
- package/lang/translations/en-au.po +20 -0
- package/lang/translations/en-gb.po +20 -0
- package/lang/translations/en.po +20 -0
- package/lang/translations/eo.po +20 -0
- package/lang/translations/es.po +20 -0
- package/lang/translations/et.po +20 -0
- package/lang/translations/eu.po +20 -0
- package/lang/translations/fa.po +20 -0
- package/lang/translations/fi.po +20 -0
- package/lang/translations/fr.po +20 -0
- package/lang/translations/gl.po +20 -0
- package/lang/translations/he.po +20 -0
- package/lang/translations/hi.po +20 -0
- package/lang/translations/hr.po +20 -0
- package/lang/translations/hu.po +20 -0
- package/lang/translations/id.po +20 -0
- package/lang/translations/it.po +20 -0
- package/lang/translations/ja.po +20 -0
- package/lang/translations/jv.po +20 -0
- package/lang/translations/km.po +20 -0
- package/lang/translations/kn.po +20 -0
- package/lang/translations/ko.po +20 -0
- package/lang/translations/ku.po +20 -0
- package/lang/translations/lt.po +20 -0
- package/lang/translations/lv.po +20 -0
- package/lang/translations/ms.po +20 -0
- package/lang/translations/nb.po +20 -0
- package/lang/translations/ne.po +20 -0
- package/lang/translations/nl.po +20 -0
- package/lang/translations/no.po +20 -0
- package/lang/translations/pl.po +20 -0
- package/lang/translations/pt-br.po +20 -0
- package/lang/translations/pt.po +20 -0
- package/lang/translations/ro.po +20 -0
- package/lang/translations/ru.po +20 -0
- package/lang/translations/si.po +20 -0
- package/lang/translations/sk.po +20 -0
- package/lang/translations/sq.po +20 -0
- package/lang/translations/sr-latn.po +20 -0
- package/lang/translations/sr.po +20 -0
- package/lang/translations/sv.po +20 -0
- package/lang/translations/th.po +20 -0
- package/lang/translations/tk.po +20 -0
- package/lang/translations/tr.po +20 -0
- package/lang/translations/tt.po +20 -0
- package/lang/translations/ug.po +21 -1
- package/lang/translations/uk.po +20 -0
- package/lang/translations/ur.po +20 -0
- package/lang/translations/uz.po +20 -0
- package/lang/translations/vi.po +20 -0
- package/lang/translations/zh-cn.po +20 -0
- package/lang/translations/zh.po +20 -0
- package/package.json +3 -3
- package/src/imageblock.d.ts +2 -1
- package/src/imageblock.js +2 -1
- package/src/imageconfig.d.ts +9 -13
- package/src/imageinline.d.ts +2 -1
- package/src/imageinline.js +2 -1
- package/src/imageinsert/imageinsertui.d.ts +38 -10
- package/src/imageinsert/imageinsertui.js +126 -93
- package/src/imageinsert/imageinsertviaurlui.d.ts +44 -0
- package/src/imageinsert/imageinsertviaurlui.js +122 -0
- package/src/imageinsert/ui/imageinsertformview.d.ts +56 -0
- package/src/imageinsert/ui/imageinsertformview.js +112 -0
- package/src/imageinsert/ui/imageinserturlview.d.ts +107 -0
- package/src/imageinsert/ui/imageinserturlview.js +156 -0
- package/src/imageinsertviaurl.d.ts +2 -1
- package/src/imageinsertviaurl.js +2 -1
- package/src/imagetextalternative/ui/textalternativeformview.d.ts +18 -0
- package/src/imageupload/imageuploadui.js +30 -6
- package/theme/imageinsert.css +5 -17
- package/src/imageinsert/ui/imageinsertformrowview.d.ts +0 -61
- package/src/imageinsert/ui/imageinsertformrowview.js +0 -54
- package/src/imageinsert/ui/imageinsertpanelview.d.ts +0 -106
- package/src/imageinsert/ui/imageinsertpanelview.js +0 -161
- package/src/imageinsert/utils.d.ts +0 -25
- package/src/imageinsert/utils.js +0 -58
- package/theme/imageinsertformrowview.css +0 -36
|
@@ -0,0 +1,112 @@
|
|
|
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 image/imageinsert/ui/imageinsertformview
|
|
7
|
+
*/
|
|
8
|
+
import { View, ViewCollection, submitHandler, FocusCycler, CollapsibleView } from 'ckeditor5/src/ui';
|
|
9
|
+
import { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';
|
|
10
|
+
import '../../../theme/imageinsert.css';
|
|
11
|
+
/**
|
|
12
|
+
* The view displayed in the insert image dropdown.
|
|
13
|
+
*
|
|
14
|
+
* See {@link module:image/imageinsert/imageinsertui~ImageInsertUI}.
|
|
15
|
+
*/
|
|
16
|
+
export default class ImageInsertFormView extends View {
|
|
17
|
+
/**
|
|
18
|
+
* Creates a view for the dropdown panel of {@link module:image/imageinsert/imageinsertui~ImageInsertUI}.
|
|
19
|
+
*
|
|
20
|
+
* @param locale The localization services instance.
|
|
21
|
+
* @param integrations An integrations object that contains components (or tokens for components) to be shown in the panel view.
|
|
22
|
+
*/
|
|
23
|
+
constructor(locale, integrations = []) {
|
|
24
|
+
super(locale);
|
|
25
|
+
this.focusTracker = new FocusTracker();
|
|
26
|
+
this.keystrokes = new KeystrokeHandler();
|
|
27
|
+
this._focusables = new ViewCollection();
|
|
28
|
+
this.children = this.createCollection();
|
|
29
|
+
this._focusCycler = new FocusCycler({
|
|
30
|
+
focusables: this._focusables,
|
|
31
|
+
focusTracker: this.focusTracker,
|
|
32
|
+
keystrokeHandler: this.keystrokes,
|
|
33
|
+
actions: {
|
|
34
|
+
// Navigate form fields backwards using the Shift + Tab keystroke.
|
|
35
|
+
focusPrevious: 'shift + tab',
|
|
36
|
+
// Navigate form fields forwards using the Tab key.
|
|
37
|
+
focusNext: 'tab'
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
for (const view of integrations) {
|
|
41
|
+
this.children.add(view);
|
|
42
|
+
this._focusables.add(view);
|
|
43
|
+
if (view instanceof CollapsibleView) {
|
|
44
|
+
this._focusables.addMany(view.children);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (this._focusables.length > 1) {
|
|
48
|
+
for (const view of this._focusables) {
|
|
49
|
+
if (isViewWithFocusCycler(view)) {
|
|
50
|
+
view.focusCycler.on('forwardCycle', evt => {
|
|
51
|
+
this._focusCycler.focusNext();
|
|
52
|
+
evt.stop();
|
|
53
|
+
});
|
|
54
|
+
view.focusCycler.on('backwardCycle', evt => {
|
|
55
|
+
this._focusCycler.focusPrevious();
|
|
56
|
+
evt.stop();
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
this.setTemplate({
|
|
62
|
+
tag: 'form',
|
|
63
|
+
attributes: {
|
|
64
|
+
class: [
|
|
65
|
+
'ck',
|
|
66
|
+
'ck-image-insert-form'
|
|
67
|
+
],
|
|
68
|
+
tabindex: -1
|
|
69
|
+
},
|
|
70
|
+
children: this.children
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* @inheritDoc
|
|
75
|
+
*/
|
|
76
|
+
render() {
|
|
77
|
+
super.render();
|
|
78
|
+
submitHandler({
|
|
79
|
+
view: this
|
|
80
|
+
});
|
|
81
|
+
for (const view of this._focusables) {
|
|
82
|
+
this.focusTracker.add(view.element);
|
|
83
|
+
}
|
|
84
|
+
// Start listening for the keystrokes coming from #element.
|
|
85
|
+
this.keystrokes.listenTo(this.element);
|
|
86
|
+
const stopPropagation = (data) => data.stopPropagation();
|
|
87
|
+
// Since the form is in the dropdown panel which is a child of the toolbar, the toolbar's
|
|
88
|
+
// keystroke handler would take over the key management in the URL input. We need to prevent
|
|
89
|
+
// this ASAP. Otherwise, the basic caret movement using the arrow keys will be impossible.
|
|
90
|
+
this.keystrokes.set('arrowright', stopPropagation);
|
|
91
|
+
this.keystrokes.set('arrowleft', stopPropagation);
|
|
92
|
+
this.keystrokes.set('arrowup', stopPropagation);
|
|
93
|
+
this.keystrokes.set('arrowdown', stopPropagation);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* @inheritDoc
|
|
97
|
+
*/
|
|
98
|
+
destroy() {
|
|
99
|
+
super.destroy();
|
|
100
|
+
this.focusTracker.destroy();
|
|
101
|
+
this.keystrokes.destroy();
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Focuses the first {@link #_focusables focusable} in the form.
|
|
105
|
+
*/
|
|
106
|
+
focus() {
|
|
107
|
+
this._focusCycler.focusFirst();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function isViewWithFocusCycler(view) {
|
|
111
|
+
return 'focusCycler' in view;
|
|
112
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
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
|
+
import { ButtonView, View, FocusCycler, LabeledFieldView, type InputTextView } from 'ckeditor5/src/ui';
|
|
6
|
+
import { FocusTracker, KeystrokeHandler, type Locale } from 'ckeditor5/src/utils';
|
|
7
|
+
/**
|
|
8
|
+
* The insert an image via URL view.
|
|
9
|
+
*
|
|
10
|
+
* See {@link module:image/imageinsert/imageinsertviaurlui~ImageInsertViaUrlUI}.
|
|
11
|
+
*/
|
|
12
|
+
export default class ImageInsertUrlView extends View {
|
|
13
|
+
/**
|
|
14
|
+
* The URL input field view.
|
|
15
|
+
*/
|
|
16
|
+
urlInputView: LabeledFieldView<InputTextView>;
|
|
17
|
+
/**
|
|
18
|
+
* The "insert/update" button view.
|
|
19
|
+
*/
|
|
20
|
+
insertButtonView: ButtonView;
|
|
21
|
+
/**
|
|
22
|
+
* The "cancel" button view.
|
|
23
|
+
*/
|
|
24
|
+
cancelButtonView: ButtonView;
|
|
25
|
+
/**
|
|
26
|
+
* The value of the URL input.
|
|
27
|
+
*
|
|
28
|
+
* @observable
|
|
29
|
+
*/
|
|
30
|
+
imageURLInputValue: string;
|
|
31
|
+
/**
|
|
32
|
+
* Observable property used to alter labels while some image is selected and when it is not.
|
|
33
|
+
*
|
|
34
|
+
* @observable
|
|
35
|
+
*/
|
|
36
|
+
isImageSelected: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Observable property indicating whether the form interactive elements should be enabled.
|
|
39
|
+
*
|
|
40
|
+
* @observable
|
|
41
|
+
*/
|
|
42
|
+
isEnabled: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Tracks information about DOM focus in the form.
|
|
45
|
+
*/
|
|
46
|
+
readonly focusTracker: FocusTracker;
|
|
47
|
+
/**
|
|
48
|
+
* An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}.
|
|
49
|
+
*/
|
|
50
|
+
readonly keystrokes: KeystrokeHandler;
|
|
51
|
+
/**
|
|
52
|
+
* Helps cycling over {@link #_focusables} in the form.
|
|
53
|
+
*/
|
|
54
|
+
readonly focusCycler: FocusCycler;
|
|
55
|
+
/**
|
|
56
|
+
* A collection of views that can be focused in the form.
|
|
57
|
+
*/
|
|
58
|
+
private readonly _focusables;
|
|
59
|
+
/**
|
|
60
|
+
* Creates a view for the dropdown panel of {@link module:image/imageinsert/imageinsertui~ImageInsertUI}.
|
|
61
|
+
*
|
|
62
|
+
* @param locale The localization services instance.
|
|
63
|
+
*/
|
|
64
|
+
constructor(locale: Locale);
|
|
65
|
+
/**
|
|
66
|
+
* @inheritDoc
|
|
67
|
+
*/
|
|
68
|
+
render(): void;
|
|
69
|
+
/**
|
|
70
|
+
* @inheritDoc
|
|
71
|
+
*/
|
|
72
|
+
destroy(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Creates the {@link #urlInputView}.
|
|
75
|
+
*/
|
|
76
|
+
private _createUrlInputView;
|
|
77
|
+
/**
|
|
78
|
+
* Creates the {@link #insertButtonView}.
|
|
79
|
+
*/
|
|
80
|
+
private _createInsertButton;
|
|
81
|
+
/**
|
|
82
|
+
* Creates the {@link #cancelButtonView}.
|
|
83
|
+
*/
|
|
84
|
+
private _createCancelButton;
|
|
85
|
+
/**
|
|
86
|
+
* Focuses the view.
|
|
87
|
+
*/
|
|
88
|
+
focus(direction: 1 | -1): void;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Fired when the form view is submitted.
|
|
92
|
+
*
|
|
93
|
+
* @eventName ~ImageInsertUrlView#submit
|
|
94
|
+
*/
|
|
95
|
+
export type ImageInsertUrlViewSubmitEvent = {
|
|
96
|
+
name: 'submit';
|
|
97
|
+
args: [];
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Fired when the form view is canceled.
|
|
101
|
+
*
|
|
102
|
+
* @eventName ~ImageInsertUrlView#cancel
|
|
103
|
+
*/
|
|
104
|
+
export type ImageInsertUrlViewCancelEvent = {
|
|
105
|
+
name: 'cancel';
|
|
106
|
+
args: [];
|
|
107
|
+
};
|
|
@@ -0,0 +1,156 @@
|
|
|
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 image/imageinsert/ui/imageinserturlview
|
|
7
|
+
*/
|
|
8
|
+
import { icons } from 'ckeditor5/src/core';
|
|
9
|
+
import { ButtonView, View, ViewCollection, FocusCycler, LabeledFieldView, createLabeledInputText } from 'ckeditor5/src/ui';
|
|
10
|
+
import { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';
|
|
11
|
+
/**
|
|
12
|
+
* The insert an image via URL view.
|
|
13
|
+
*
|
|
14
|
+
* See {@link module:image/imageinsert/imageinsertviaurlui~ImageInsertViaUrlUI}.
|
|
15
|
+
*/
|
|
16
|
+
export default class ImageInsertUrlView extends View {
|
|
17
|
+
/**
|
|
18
|
+
* Creates a view for the dropdown panel of {@link module:image/imageinsert/imageinsertui~ImageInsertUI}.
|
|
19
|
+
*
|
|
20
|
+
* @param locale The localization services instance.
|
|
21
|
+
*/
|
|
22
|
+
constructor(locale) {
|
|
23
|
+
super(locale);
|
|
24
|
+
this.set('imageURLInputValue', '');
|
|
25
|
+
this.set('isImageSelected', false);
|
|
26
|
+
this.set('isEnabled', true);
|
|
27
|
+
this.focusTracker = new FocusTracker();
|
|
28
|
+
this.keystrokes = new KeystrokeHandler();
|
|
29
|
+
this._focusables = new ViewCollection();
|
|
30
|
+
this.focusCycler = new FocusCycler({
|
|
31
|
+
focusables: this._focusables,
|
|
32
|
+
focusTracker: this.focusTracker,
|
|
33
|
+
keystrokeHandler: this.keystrokes,
|
|
34
|
+
actions: {
|
|
35
|
+
// Navigate form fields backwards using the Shift + Tab keystroke.
|
|
36
|
+
focusPrevious: 'shift + tab',
|
|
37
|
+
// Navigate form fields forwards using the Tab key.
|
|
38
|
+
focusNext: 'tab'
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
this.urlInputView = this._createUrlInputView();
|
|
42
|
+
this.insertButtonView = this._createInsertButton();
|
|
43
|
+
this.cancelButtonView = this._createCancelButton();
|
|
44
|
+
this._focusables.addMany([
|
|
45
|
+
this.urlInputView,
|
|
46
|
+
this.insertButtonView,
|
|
47
|
+
this.cancelButtonView
|
|
48
|
+
]);
|
|
49
|
+
this.setTemplate({
|
|
50
|
+
tag: 'div',
|
|
51
|
+
attributes: {
|
|
52
|
+
class: [
|
|
53
|
+
'ck',
|
|
54
|
+
'ck-image-insert-url'
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
children: [
|
|
58
|
+
this.urlInputView,
|
|
59
|
+
{
|
|
60
|
+
tag: 'div',
|
|
61
|
+
attributes: {
|
|
62
|
+
class: [
|
|
63
|
+
'ck',
|
|
64
|
+
'ck-image-insert-url__action-row'
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
children: [
|
|
68
|
+
this.insertButtonView,
|
|
69
|
+
this.cancelButtonView
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* @inheritDoc
|
|
77
|
+
*/
|
|
78
|
+
render() {
|
|
79
|
+
super.render();
|
|
80
|
+
for (const view of this._focusables) {
|
|
81
|
+
this.focusTracker.add(view.element);
|
|
82
|
+
}
|
|
83
|
+
// Start listening for the keystrokes coming from #element.
|
|
84
|
+
this.keystrokes.listenTo(this.element);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* @inheritDoc
|
|
88
|
+
*/
|
|
89
|
+
destroy() {
|
|
90
|
+
super.destroy();
|
|
91
|
+
this.focusTracker.destroy();
|
|
92
|
+
this.keystrokes.destroy();
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Creates the {@link #urlInputView}.
|
|
96
|
+
*/
|
|
97
|
+
_createUrlInputView() {
|
|
98
|
+
const locale = this.locale;
|
|
99
|
+
const t = locale.t;
|
|
100
|
+
const urlInputView = new LabeledFieldView(locale, createLabeledInputText);
|
|
101
|
+
urlInputView.bind('label').to(this, 'isImageSelected', value => value ? t('Update image URL') : t('Insert image via URL'));
|
|
102
|
+
urlInputView.bind('isEnabled').to(this);
|
|
103
|
+
urlInputView.fieldView.placeholder = 'https://example.com/image.png';
|
|
104
|
+
urlInputView.fieldView.bind('value').to(this, 'imageURLInputValue', (value) => value || '');
|
|
105
|
+
urlInputView.fieldView.on('input', () => {
|
|
106
|
+
this.imageURLInputValue = urlInputView.fieldView.element.value.trim();
|
|
107
|
+
});
|
|
108
|
+
return urlInputView;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Creates the {@link #insertButtonView}.
|
|
112
|
+
*/
|
|
113
|
+
_createInsertButton() {
|
|
114
|
+
const locale = this.locale;
|
|
115
|
+
const t = locale.t;
|
|
116
|
+
const insertButtonView = new ButtonView(locale);
|
|
117
|
+
insertButtonView.set({
|
|
118
|
+
icon: icons.check,
|
|
119
|
+
class: 'ck-button-save',
|
|
120
|
+
type: 'submit',
|
|
121
|
+
withText: true
|
|
122
|
+
});
|
|
123
|
+
insertButtonView.bind('label').to(this, 'isImageSelected', value => value ? t('Update') : t('Insert'));
|
|
124
|
+
insertButtonView.bind('isEnabled').to(this, 'imageURLInputValue', this, 'isEnabled', (...values) => values.every(value => value));
|
|
125
|
+
insertButtonView.delegate('execute').to(this, 'submit');
|
|
126
|
+
return insertButtonView;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Creates the {@link #cancelButtonView}.
|
|
130
|
+
*/
|
|
131
|
+
_createCancelButton() {
|
|
132
|
+
const locale = this.locale;
|
|
133
|
+
const t = locale.t;
|
|
134
|
+
const cancelButtonView = new ButtonView(locale);
|
|
135
|
+
cancelButtonView.set({
|
|
136
|
+
label: t('Cancel'),
|
|
137
|
+
icon: icons.cancel,
|
|
138
|
+
class: 'ck-button-cancel',
|
|
139
|
+
withText: true
|
|
140
|
+
});
|
|
141
|
+
cancelButtonView.bind('isEnabled').to(this);
|
|
142
|
+
cancelButtonView.delegate('execute').to(this, 'cancel');
|
|
143
|
+
return cancelButtonView;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Focuses the view.
|
|
147
|
+
*/
|
|
148
|
+
focus(direction) {
|
|
149
|
+
if (direction === -1) {
|
|
150
|
+
this.focusCycler.focusLast();
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
this.focusCycler.focusFirst();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { Plugin } from 'ckeditor5/src/core';
|
|
9
9
|
import ImageInsertUI from './imageinsert/imageinsertui';
|
|
10
|
+
import ImageInsertViaUrlUI from './imageinsert/imageinsertviaurlui';
|
|
10
11
|
/**
|
|
11
12
|
* The image insert via URL plugin.
|
|
12
13
|
*
|
|
@@ -26,5 +27,5 @@ export default class ImageInsertViaUrl extends Plugin {
|
|
|
26
27
|
/**
|
|
27
28
|
* @inheritDoc
|
|
28
29
|
*/
|
|
29
|
-
static get requires(): readonly [typeof ImageInsertUI];
|
|
30
|
+
static get requires(): readonly [typeof ImageInsertViaUrlUI, typeof ImageInsertUI];
|
|
30
31
|
}
|
package/src/imageinsertviaurl.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { Plugin } from 'ckeditor5/src/core';
|
|
9
9
|
import ImageInsertUI from './imageinsert/imageinsertui';
|
|
10
|
+
import ImageInsertViaUrlUI from './imageinsert/imageinsertviaurlui';
|
|
10
11
|
/**
|
|
11
12
|
* The image insert via URL plugin.
|
|
12
13
|
*
|
|
@@ -29,6 +30,6 @@ export default class ImageInsertViaUrl extends Plugin {
|
|
|
29
30
|
* @inheritDoc
|
|
30
31
|
*/
|
|
31
32
|
static get requires() {
|
|
32
|
-
return [ImageInsertUI];
|
|
33
|
+
return [ImageInsertViaUrlUI, ImageInsertUI];
|
|
33
34
|
}
|
|
34
35
|
}
|
|
@@ -70,3 +70,21 @@ export default class TextAlternativeFormView extends View {
|
|
|
70
70
|
*/
|
|
71
71
|
private _createLabeledInputView;
|
|
72
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Fired when the form view is submitted.
|
|
75
|
+
*
|
|
76
|
+
* @eventName ~TextAlternativeFormView#submit
|
|
77
|
+
*/
|
|
78
|
+
export type TextAlternativeFormViewSubmitEvent = {
|
|
79
|
+
name: 'submit';
|
|
80
|
+
args: [];
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Fired when the form view is canceled.
|
|
84
|
+
*
|
|
85
|
+
* @eventName ~TextAlternativeFormView#cancel
|
|
86
|
+
*/
|
|
87
|
+
export type TextAlternativeFormViewCancelEvent = {
|
|
88
|
+
name: 'cancel';
|
|
89
|
+
args: [];
|
|
90
|
+
};
|
|
@@ -33,14 +33,12 @@ export default class ImageUploadUI extends Plugin {
|
|
|
33
33
|
const imageTypesRegExp = createImageTypeRegExp(imageTypes);
|
|
34
34
|
view.set({
|
|
35
35
|
acceptedType: imageTypes.map(type => `image/${type}`).join(','),
|
|
36
|
-
allowMultipleFiles: true
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
label: t('Insert image'),
|
|
40
|
-
icon: icons.image,
|
|
36
|
+
allowMultipleFiles: true,
|
|
37
|
+
label: t('Upload image from computer'),
|
|
38
|
+
icon: icons.imageUpload,
|
|
41
39
|
tooltip: true
|
|
42
40
|
});
|
|
43
|
-
view.
|
|
41
|
+
view.bind('isEnabled').to(command);
|
|
44
42
|
view.on('done', (evt, files) => {
|
|
45
43
|
const imagesToUpload = Array.from(files).filter(file => imageTypesRegExp.test(file.type));
|
|
46
44
|
if (imagesToUpload.length) {
|
|
@@ -53,5 +51,31 @@ export default class ImageUploadUI extends Plugin {
|
|
|
53
51
|
// Setup `uploadImage` button and add `imageUpload` button as an alias for backward compatibility.
|
|
54
52
|
editor.ui.componentFactory.add('uploadImage', componentCreator);
|
|
55
53
|
editor.ui.componentFactory.add('imageUpload', componentCreator);
|
|
54
|
+
if (editor.plugins.has('ImageInsertUI')) {
|
|
55
|
+
const imageInsertUI = editor.plugins.get('ImageInsertUI');
|
|
56
|
+
const command = editor.commands.get('uploadImage');
|
|
57
|
+
imageInsertUI.registerIntegration({
|
|
58
|
+
name: 'upload',
|
|
59
|
+
observable: command,
|
|
60
|
+
buttonViewCreator: () => {
|
|
61
|
+
const uploadImageButton = editor.ui.componentFactory.create('uploadImage');
|
|
62
|
+
uploadImageButton.bind('label').to(imageInsertUI, 'isImageSelected', isImageSelected => isImageSelected ?
|
|
63
|
+
t('Replace image from computer') :
|
|
64
|
+
t('Upload image from computer'));
|
|
65
|
+
return uploadImageButton;
|
|
66
|
+
},
|
|
67
|
+
formViewCreator: () => {
|
|
68
|
+
const uploadImageButton = editor.ui.componentFactory.create('uploadImage');
|
|
69
|
+
uploadImageButton.withText = true;
|
|
70
|
+
uploadImageButton.bind('label').to(imageInsertUI, 'isImageSelected', isImageSelected => isImageSelected ?
|
|
71
|
+
t('Replace from computer') :
|
|
72
|
+
t('Upload from computer'));
|
|
73
|
+
uploadImageButton.on('execute', () => {
|
|
74
|
+
imageInsertUI.dropdownView.isOpen = false;
|
|
75
|
+
});
|
|
76
|
+
return uploadImageButton;
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
56
80
|
}
|
|
57
81
|
}
|
package/theme/imageinsert.css
CHANGED
|
@@ -3,21 +3,9 @@
|
|
|
3
3
|
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
.ck.ck-image-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
display: block;
|
|
12
|
-
width: 100%;
|
|
13
|
-
margin: var(--ck-spacing-standard) auto;
|
|
14
|
-
border: 1px solid hsl(0, 0%, 80%);
|
|
15
|
-
border-radius: var(--ck-border-radius);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/* https://github.com/ckeditor/ckeditor5/issues/7986 */
|
|
19
|
-
.ck.ck-splitbutton > .ck-file-dialog-button.ck-button {
|
|
20
|
-
padding: 0;
|
|
21
|
-
margin: 0;
|
|
22
|
-
border: none;
|
|
6
|
+
.ck.ck-image-insert-url {
|
|
7
|
+
& .ck-image-insert-url__action-row {
|
|
8
|
+
display: grid;
|
|
9
|
+
grid-template-columns: repeat(2, 1fr);
|
|
10
|
+
}
|
|
23
11
|
}
|
|
@@ -1,61 +0,0 @@
|
|
|
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 image/imageinsert/ui/imageinsertformrowview
|
|
7
|
-
*/
|
|
8
|
-
import type { Locale } from 'ckeditor5/src/utils';
|
|
9
|
-
import { View, type ViewCollection, type LabelView } from 'ckeditor5/src/ui';
|
|
10
|
-
import '../../../theme/imageinsertformrowview.css';
|
|
11
|
-
/**
|
|
12
|
-
* The class representing a single row in a complex form,
|
|
13
|
-
* used by {@link module:image/imageinsert/ui/imageinsertpanelview~ImageInsertPanelView}.
|
|
14
|
-
*
|
|
15
|
-
* **Note**: For now this class is private. When more use cases appear (beyond `ckeditor5-table` and `ckeditor5-image`),
|
|
16
|
-
* it will become a component in `ckeditor5-ui`.
|
|
17
|
-
*
|
|
18
|
-
* @private
|
|
19
|
-
*/
|
|
20
|
-
export default class ImageUploadFormRowView 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
|
-
* @private
|
|
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
|
-
* @private
|
|
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,54 +0,0 @@
|
|
|
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
|
-
import { View } from 'ckeditor5/src/ui';
|
|
6
|
-
import '../../../theme/imageinsertformrowview.css';
|
|
7
|
-
/**
|
|
8
|
-
* The class representing a single row in a complex form,
|
|
9
|
-
* used by {@link module:image/imageinsert/ui/imageinsertpanelview~ImageInsertPanelView}.
|
|
10
|
-
*
|
|
11
|
-
* **Note**: For now this class is private. When more use cases appear (beyond `ckeditor5-table` and `ckeditor5-image`),
|
|
12
|
-
* it will become a component in `ckeditor5-ui`.
|
|
13
|
-
*
|
|
14
|
-
* @private
|
|
15
|
-
*/
|
|
16
|
-
export default class ImageUploadFormRowView extends View {
|
|
17
|
-
/**
|
|
18
|
-
* Creates an instance of the form row class.
|
|
19
|
-
*
|
|
20
|
-
* @param locale The locale instance.
|
|
21
|
-
* @param options.labelView When passed, the row gets the `group` and `aria-labelledby`
|
|
22
|
-
* DOM attributes and gets described by the label.
|
|
23
|
-
*/
|
|
24
|
-
constructor(locale, options = {}) {
|
|
25
|
-
super(locale);
|
|
26
|
-
const bind = this.bindTemplate;
|
|
27
|
-
this.set('class', options.class || null);
|
|
28
|
-
this.children = this.createCollection();
|
|
29
|
-
if (options.children) {
|
|
30
|
-
options.children.forEach(child => this.children.add(child));
|
|
31
|
-
}
|
|
32
|
-
this.set('_role', null);
|
|
33
|
-
this.set('_ariaLabelledBy', null);
|
|
34
|
-
if (options.labelView) {
|
|
35
|
-
this.set({
|
|
36
|
-
_role: 'group',
|
|
37
|
-
_ariaLabelledBy: options.labelView.id
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
this.setTemplate({
|
|
41
|
-
tag: 'div',
|
|
42
|
-
attributes: {
|
|
43
|
-
class: [
|
|
44
|
-
'ck',
|
|
45
|
-
'ck-form__row',
|
|
46
|
-
bind.to('class')
|
|
47
|
-
],
|
|
48
|
-
role: bind.to('_role'),
|
|
49
|
-
'aria-labelledby': bind.to('_ariaLabelledBy')
|
|
50
|
-
},
|
|
51
|
-
children: this.children
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
}
|