@ckeditor/ckeditor5-image 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/build/image.js +1 -1
- package/package.json +3 -3
- package/src/augmentation.d.ts +56 -56
- package/src/augmentation.js +5 -5
- package/src/autoimage.d.ts +52 -52
- package/src/autoimage.js +132 -132
- package/src/image/converters.d.ts +66 -66
- package/src/image/converters.js +232 -232
- package/src/image/imageblockediting.d.ts +59 -58
- package/src/image/imageblockediting.js +153 -152
- package/src/image/imageediting.d.ts +30 -30
- package/src/image/imageediting.js +63 -63
- package/src/image/imageinlineediting.d.ts +60 -59
- package/src/image/imageinlineediting.js +177 -176
- package/src/image/imageloadobserver.d.ts +48 -48
- package/src/image/imageloadobserver.js +52 -52
- package/src/image/imageplaceholder.d.ts +39 -0
- package/src/image/imageplaceholder.js +113 -0
- package/src/image/imagetypecommand.d.ts +44 -44
- package/src/image/imagetypecommand.js +80 -80
- package/src/image/insertimagecommand.d.ts +66 -66
- package/src/image/insertimagecommand.js +120 -120
- package/src/image/replaceimagesourcecommand.d.ts +51 -34
- package/src/image/replaceimagesourcecommand.js +75 -44
- package/src/image/ui/utils.d.ts +25 -25
- package/src/image/ui/utils.js +44 -44
- package/src/image/utils.d.ts +64 -64
- package/src/image/utils.js +121 -121
- package/src/image.d.ts +34 -34
- package/src/image.js +38 -38
- package/src/imageblock.d.ts +33 -33
- package/src/imageblock.js +37 -37
- package/src/imagecaption/imagecaptionediting.d.ts +89 -89
- package/src/imagecaption/imagecaptionediting.js +225 -225
- package/src/imagecaption/imagecaptionui.d.ts +26 -26
- package/src/imagecaption/imagecaptionui.js +61 -61
- package/src/imagecaption/imagecaptionutils.d.ts +38 -38
- package/src/imagecaption/imagecaptionutils.js +62 -62
- package/src/imagecaption/toggleimagecaptioncommand.d.ts +66 -66
- package/src/imagecaption/toggleimagecaptioncommand.js +138 -138
- package/src/imagecaption.d.ts +26 -26
- package/src/imagecaption.js +30 -30
- package/src/imageconfig.d.ts +716 -713
- package/src/imageconfig.js +5 -5
- package/src/imageinline.d.ts +33 -33
- package/src/imageinline.js +37 -37
- package/src/imageinsert/imageinsertui.d.ts +44 -44
- package/src/imageinsert/imageinsertui.js +141 -141
- package/src/imageinsert/ui/imageinsertformrowview.d.ts +61 -61
- package/src/imageinsert/ui/imageinsertformrowview.js +54 -54
- package/src/imageinsert/ui/imageinsertpanelview.d.ts +106 -106
- package/src/imageinsert/ui/imageinsertpanelview.js +161 -161
- package/src/imageinsert/utils.d.ts +25 -25
- package/src/imageinsert/utils.js +58 -58
- package/src/imageinsert.d.ts +33 -33
- package/src/imageinsert.js +37 -37
- package/src/imageinsertviaurl.d.ts +30 -30
- package/src/imageinsertviaurl.js +34 -34
- package/src/imageresize/imageresizebuttons.d.ts +67 -67
- package/src/imageresize/imageresizebuttons.js +217 -217
- package/src/imageresize/imageresizeediting.d.ts +37 -37
- package/src/imageresize/imageresizeediting.js +165 -165
- package/src/imageresize/imageresizehandles.d.ts +31 -31
- package/src/imageresize/imageresizehandles.js +114 -114
- package/src/imageresize/resizeimagecommand.d.ts +42 -42
- package/src/imageresize/resizeimagecommand.js +63 -63
- package/src/imageresize.d.ts +27 -27
- package/src/imageresize.js +31 -31
- package/src/imagesizeattributes.d.ts +34 -34
- package/src/imagesizeattributes.js +142 -143
- package/src/imagestyle/converters.d.ts +24 -24
- package/src/imagestyle/converters.js +79 -79
- package/src/imagestyle/imagestylecommand.d.ts +68 -68
- package/src/imagestyle/imagestylecommand.js +107 -107
- package/src/imagestyle/imagestyleediting.d.ts +50 -50
- package/src/imagestyle/imagestyleediting.js +108 -108
- package/src/imagestyle/imagestyleui.d.ts +56 -56
- package/src/imagestyle/imagestyleui.js +192 -192
- package/src/imagestyle/utils.d.ts +101 -101
- package/src/imagestyle/utils.js +329 -329
- package/src/imagestyle.d.ts +32 -32
- package/src/imagestyle.js +36 -36
- package/src/imagetextalternative/imagetextalternativecommand.d.ts +34 -34
- package/src/imagetextalternative/imagetextalternativecommand.js +44 -44
- package/src/imagetextalternative/imagetextalternativeediting.d.ts +28 -28
- package/src/imagetextalternative/imagetextalternativeediting.js +35 -35
- package/src/imagetextalternative/imagetextalternativeui.d.ts +68 -68
- package/src/imagetextalternative/imagetextalternativeui.js +173 -173
- package/src/imagetextalternative/ui/textalternativeformview.d.ts +72 -72
- package/src/imagetextalternative/ui/textalternativeformview.js +121 -121
- package/src/imagetextalternative.d.ts +29 -29
- package/src/imagetextalternative.js +33 -33
- package/src/imagetoolbar.d.ts +35 -35
- package/src/imagetoolbar.js +57 -57
- package/src/imageupload/imageuploadediting.d.ts +111 -111
- package/src/imageupload/imageuploadediting.js +337 -337
- package/src/imageupload/imageuploadprogress.d.ts +42 -42
- package/src/imageupload/imageuploadprogress.js +211 -211
- package/src/imageupload/imageuploadui.d.ts +23 -23
- package/src/imageupload/imageuploadui.js +57 -57
- package/src/imageupload/uploadimagecommand.d.ts +60 -60
- package/src/imageupload/uploadimagecommand.js +100 -100
- package/src/imageupload/utils.d.ts +33 -33
- package/src/imageupload/utils.js +112 -112
- package/src/imageupload.d.ts +32 -32
- package/src/imageupload.js +36 -36
- package/src/imageutils.d.ts +125 -125
- package/src/imageutils.js +306 -306
- package/src/index.d.ts +48 -48
- package/src/index.js +39 -39
- package/src/pictureediting.d.ts +88 -88
- package/src/pictureediting.js +130 -130
- package/theme/imageplaceholder.css +10 -0
- package/build/image.js.map +0 -1
|
@@ -1,42 +1,42 @@
|
|
|
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/imageupload/imageuploadprogress
|
|
7
|
-
*/
|
|
8
|
-
import { type Editor, Plugin } from 'ckeditor5/src/core';
|
|
9
|
-
import '../../theme/imageuploadprogress.css';
|
|
10
|
-
import '../../theme/imageuploadicon.css';
|
|
11
|
-
import '../../theme/imageuploadloader.css';
|
|
12
|
-
/**
|
|
13
|
-
* The image upload progress plugin.
|
|
14
|
-
* It shows a placeholder when the image is read from the disk and a progress bar while the image is uploading.
|
|
15
|
-
*/
|
|
16
|
-
export default class ImageUploadProgress extends Plugin {
|
|
17
|
-
/**
|
|
18
|
-
* @inheritDoc
|
|
19
|
-
*/
|
|
20
|
-
static get pluginName(): "ImageUploadProgress";
|
|
21
|
-
/**
|
|
22
|
-
* The image placeholder that is displayed before real image data can be accessed.
|
|
23
|
-
*
|
|
24
|
-
* For the record, this image is a 1x1 px GIF with an aspect ratio set by CSS.
|
|
25
|
-
*/
|
|
26
|
-
private placeholder;
|
|
27
|
-
/**
|
|
28
|
-
* @inheritDoc
|
|
29
|
-
*/
|
|
30
|
-
constructor(editor: Editor);
|
|
31
|
-
/**
|
|
32
|
-
* @inheritDoc
|
|
33
|
-
*/
|
|
34
|
-
init(): void;
|
|
35
|
-
/**
|
|
36
|
-
* This method is called each time the image `uploadStatus` attribute is changed.
|
|
37
|
-
*
|
|
38
|
-
* @param evt An object containing information about the fired event.
|
|
39
|
-
* @param data Additional information about the change.
|
|
40
|
-
*/
|
|
41
|
-
private uploadStatusChange;
|
|
42
|
-
}
|
|
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/imageupload/imageuploadprogress
|
|
7
|
+
*/
|
|
8
|
+
import { type Editor, Plugin } from 'ckeditor5/src/core';
|
|
9
|
+
import '../../theme/imageuploadprogress.css';
|
|
10
|
+
import '../../theme/imageuploadicon.css';
|
|
11
|
+
import '../../theme/imageuploadloader.css';
|
|
12
|
+
/**
|
|
13
|
+
* The image upload progress plugin.
|
|
14
|
+
* It shows a placeholder when the image is read from the disk and a progress bar while the image is uploading.
|
|
15
|
+
*/
|
|
16
|
+
export default class ImageUploadProgress extends Plugin {
|
|
17
|
+
/**
|
|
18
|
+
* @inheritDoc
|
|
19
|
+
*/
|
|
20
|
+
static get pluginName(): "ImageUploadProgress";
|
|
21
|
+
/**
|
|
22
|
+
* The image placeholder that is displayed before real image data can be accessed.
|
|
23
|
+
*
|
|
24
|
+
* For the record, this image is a 1x1 px GIF with an aspect ratio set by CSS.
|
|
25
|
+
*/
|
|
26
|
+
private placeholder;
|
|
27
|
+
/**
|
|
28
|
+
* @inheritDoc
|
|
29
|
+
*/
|
|
30
|
+
constructor(editor: Editor);
|
|
31
|
+
/**
|
|
32
|
+
* @inheritDoc
|
|
33
|
+
*/
|
|
34
|
+
init(): void;
|
|
35
|
+
/**
|
|
36
|
+
* This method is called each time the image `uploadStatus` attribute is changed.
|
|
37
|
+
*
|
|
38
|
+
* @param evt An object containing information about the fired event.
|
|
39
|
+
* @param data Additional information about the change.
|
|
40
|
+
*/
|
|
41
|
+
private uploadStatusChange;
|
|
42
|
+
}
|
|
@@ -1,211 +1,211 @@
|
|
|
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/imageupload/imageuploadprogress
|
|
7
|
-
*/
|
|
8
|
-
/* globals setTimeout */
|
|
9
|
-
import { Plugin } from 'ckeditor5/src/core';
|
|
10
|
-
import { FileRepository } from 'ckeditor5/src/upload';
|
|
11
|
-
import '../../theme/imageuploadprogress.css';
|
|
12
|
-
import '../../theme/imageuploadicon.css';
|
|
13
|
-
import '../../theme/imageuploadloader.css';
|
|
14
|
-
/**
|
|
15
|
-
* The image upload progress plugin.
|
|
16
|
-
* It shows a placeholder when the image is read from the disk and a progress bar while the image is uploading.
|
|
17
|
-
*/
|
|
18
|
-
export default class ImageUploadProgress extends Plugin {
|
|
19
|
-
/**
|
|
20
|
-
* @inheritDoc
|
|
21
|
-
*/
|
|
22
|
-
static get pluginName() {
|
|
23
|
-
return 'ImageUploadProgress';
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* @inheritDoc
|
|
27
|
-
*/
|
|
28
|
-
constructor(editor) {
|
|
29
|
-
super(editor);
|
|
30
|
-
/**
|
|
31
|
-
* This method is called each time the image `uploadStatus` attribute is changed.
|
|
32
|
-
*
|
|
33
|
-
* @param evt An object containing information about the fired event.
|
|
34
|
-
* @param data Additional information about the change.
|
|
35
|
-
*/
|
|
36
|
-
this.uploadStatusChange = (evt, data, conversionApi) => {
|
|
37
|
-
const editor = this.editor;
|
|
38
|
-
const modelImage = data.item;
|
|
39
|
-
const uploadId = modelImage.getAttribute('uploadId');
|
|
40
|
-
if (!conversionApi.consumable.consume(data.item, evt.name)) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
const imageUtils = editor.plugins.get('ImageUtils');
|
|
44
|
-
const fileRepository = editor.plugins.get(FileRepository);
|
|
45
|
-
const status = uploadId ? data.attributeNewValue : null;
|
|
46
|
-
const placeholder = this.placeholder;
|
|
47
|
-
const viewFigure = editor.editing.mapper.toViewElement(modelImage);
|
|
48
|
-
const viewWriter = conversionApi.writer;
|
|
49
|
-
if (status == 'reading') {
|
|
50
|
-
// Start "appearing" effect and show placeholder with infinite progress bar on the top
|
|
51
|
-
// while image is read from disk.
|
|
52
|
-
_startAppearEffect(viewFigure, viewWriter);
|
|
53
|
-
_showPlaceholder(imageUtils, placeholder, viewFigure, viewWriter);
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
// Show progress bar on the top of the image when image is uploading.
|
|
57
|
-
if (status == 'uploading') {
|
|
58
|
-
const loader = fileRepository.loaders.get(uploadId);
|
|
59
|
-
// Start appear effect if needed - see https://github.com/ckeditor/ckeditor5-image/issues/191.
|
|
60
|
-
_startAppearEffect(viewFigure, viewWriter);
|
|
61
|
-
if (!loader) {
|
|
62
|
-
// There is no loader associated with uploadId - this means that image came from external changes.
|
|
63
|
-
// In such cases we still want to show the placeholder until image is fully uploaded.
|
|
64
|
-
// Show placeholder if needed - see https://github.com/ckeditor/ckeditor5-image/issues/191.
|
|
65
|
-
_showPlaceholder(imageUtils, placeholder, viewFigure, viewWriter);
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
// Hide placeholder and initialize progress bar showing upload progress.
|
|
69
|
-
_hidePlaceholder(viewFigure, viewWriter);
|
|
70
|
-
_showProgressBar(viewFigure, viewWriter, loader, editor.editing.view);
|
|
71
|
-
_displayLocalImage(imageUtils, viewFigure, viewWriter, loader);
|
|
72
|
-
}
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
if (status == 'complete' && fileRepository.loaders.get(uploadId)) {
|
|
76
|
-
_showCompleteIcon(viewFigure, viewWriter, editor.editing.view);
|
|
77
|
-
}
|
|
78
|
-
// Clean up.
|
|
79
|
-
_hideProgressBar(viewFigure, viewWriter);
|
|
80
|
-
_hidePlaceholder(viewFigure, viewWriter);
|
|
81
|
-
_stopAppearEffect(viewFigure, viewWriter);
|
|
82
|
-
};
|
|
83
|
-
this.placeholder = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* @inheritDoc
|
|
87
|
-
*/
|
|
88
|
-
init() {
|
|
89
|
-
const editor = this.editor;
|
|
90
|
-
// Upload status change - update image's view according to that status.
|
|
91
|
-
if (editor.plugins.has('ImageBlockEditing')) {
|
|
92
|
-
editor.editing.downcastDispatcher.on('attribute:uploadStatus:imageBlock', this.uploadStatusChange);
|
|
93
|
-
}
|
|
94
|
-
if (editor.plugins.has('ImageInlineEditing')) {
|
|
95
|
-
editor.editing.downcastDispatcher.on('attribute:uploadStatus:imageInline', this.uploadStatusChange);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Adds ck-appear class to the image figure if one is not already applied.
|
|
101
|
-
*/
|
|
102
|
-
function _startAppearEffect(viewFigure, writer) {
|
|
103
|
-
if (!viewFigure.hasClass('ck-appear')) {
|
|
104
|
-
writer.addClass('ck-appear', viewFigure);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Removes ck-appear class to the image figure if one is not already removed.
|
|
109
|
-
*/
|
|
110
|
-
function _stopAppearEffect(viewFigure, writer) {
|
|
111
|
-
writer.removeClass('ck-appear', viewFigure);
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Shows placeholder together with infinite progress bar on given image figure.
|
|
115
|
-
*/
|
|
116
|
-
function _showPlaceholder(imageUtils, placeholder, viewFigure, writer) {
|
|
117
|
-
if (!viewFigure.hasClass('ck-image-upload-placeholder')) {
|
|
118
|
-
writer.addClass('ck-image-upload-placeholder', viewFigure);
|
|
119
|
-
}
|
|
120
|
-
const viewImg = imageUtils.findViewImgElement(viewFigure);
|
|
121
|
-
if (viewImg.getAttribute('src') !== placeholder) {
|
|
122
|
-
writer.setAttribute('src', placeholder, viewImg);
|
|
123
|
-
}
|
|
124
|
-
if (!_getUIElement(viewFigure, 'placeholder')) {
|
|
125
|
-
writer.insert(writer.createPositionAfter(viewImg), _createPlaceholder(writer));
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Removes placeholder together with infinite progress bar on given image figure.
|
|
130
|
-
*/
|
|
131
|
-
function _hidePlaceholder(viewFigure, writer) {
|
|
132
|
-
if (viewFigure.hasClass('ck-image-upload-placeholder')) {
|
|
133
|
-
writer.removeClass('ck-image-upload-placeholder', viewFigure);
|
|
134
|
-
}
|
|
135
|
-
_removeUIElement(viewFigure, writer, 'placeholder');
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Shows progress bar displaying upload progress.
|
|
139
|
-
* Attaches it to the file loader to update when upload percentace is changed.
|
|
140
|
-
*/
|
|
141
|
-
function _showProgressBar(viewFigure, writer, loader, view) {
|
|
142
|
-
const progressBar = _createProgressBar(writer);
|
|
143
|
-
writer.insert(writer.createPositionAt(viewFigure, 'end'), progressBar);
|
|
144
|
-
// Update progress bar width when uploadedPercent is changed.
|
|
145
|
-
loader.on('change:uploadedPercent', (evt, name, value) => {
|
|
146
|
-
view.change(writer => {
|
|
147
|
-
writer.setStyle('width', value + '%', progressBar);
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Hides upload progress bar.
|
|
153
|
-
*/
|
|
154
|
-
function _hideProgressBar(viewFigure, writer) {
|
|
155
|
-
_removeUIElement(viewFigure, writer, 'progressBar');
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Shows complete icon and hides after a certain amount of time.
|
|
159
|
-
*/
|
|
160
|
-
function _showCompleteIcon(viewFigure, writer, view) {
|
|
161
|
-
const completeIcon = writer.createUIElement('div', { class: 'ck-image-upload-complete-icon' });
|
|
162
|
-
writer.insert(writer.createPositionAt(viewFigure, 'end'), completeIcon);
|
|
163
|
-
setTimeout(() => {
|
|
164
|
-
view.change(writer => writer.remove(writer.createRangeOn(completeIcon)));
|
|
165
|
-
}, 3000);
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Create progress bar element using {@link module:engine/view/uielement~UIElement}.
|
|
169
|
-
*/
|
|
170
|
-
function _createProgressBar(writer) {
|
|
171
|
-
const progressBar = writer.createUIElement('div', { class: 'ck-progress-bar' });
|
|
172
|
-
writer.setCustomProperty('progressBar', true, progressBar);
|
|
173
|
-
return progressBar;
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Create placeholder element using {@link module:engine/view/uielement~UIElement}.
|
|
177
|
-
*/
|
|
178
|
-
function _createPlaceholder(writer) {
|
|
179
|
-
const placeholder = writer.createUIElement('div', { class: 'ck-upload-placeholder-loader' });
|
|
180
|
-
writer.setCustomProperty('placeholder', true, placeholder);
|
|
181
|
-
return placeholder;
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Returns {@link module:engine/view/uielement~UIElement} of given unique property from image figure element.
|
|
185
|
-
* Returns `undefined` if element is not found.
|
|
186
|
-
*/
|
|
187
|
-
function _getUIElement(imageFigure, uniqueProperty) {
|
|
188
|
-
for (const child of imageFigure.getChildren()) {
|
|
189
|
-
if (child.getCustomProperty(uniqueProperty)) {
|
|
190
|
-
return child;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Removes {@link module:engine/view/uielement~UIElement} of given unique property from image figure element.
|
|
196
|
-
*/
|
|
197
|
-
function _removeUIElement(viewFigure, writer, uniqueProperty) {
|
|
198
|
-
const element = _getUIElement(viewFigure, uniqueProperty);
|
|
199
|
-
if (element) {
|
|
200
|
-
writer.remove(writer.createRangeOn(element));
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Displays local data from file loader.
|
|
205
|
-
*/
|
|
206
|
-
function _displayLocalImage(imageUtils, viewFigure, writer, loader) {
|
|
207
|
-
if (loader.data) {
|
|
208
|
-
const viewImg = imageUtils.findViewImgElement(viewFigure);
|
|
209
|
-
writer.setAttribute('src', loader.data, viewImg);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
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/imageupload/imageuploadprogress
|
|
7
|
+
*/
|
|
8
|
+
/* globals setTimeout */
|
|
9
|
+
import { Plugin } from 'ckeditor5/src/core';
|
|
10
|
+
import { FileRepository } from 'ckeditor5/src/upload';
|
|
11
|
+
import '../../theme/imageuploadprogress.css';
|
|
12
|
+
import '../../theme/imageuploadicon.css';
|
|
13
|
+
import '../../theme/imageuploadloader.css';
|
|
14
|
+
/**
|
|
15
|
+
* The image upload progress plugin.
|
|
16
|
+
* It shows a placeholder when the image is read from the disk and a progress bar while the image is uploading.
|
|
17
|
+
*/
|
|
18
|
+
export default class ImageUploadProgress extends Plugin {
|
|
19
|
+
/**
|
|
20
|
+
* @inheritDoc
|
|
21
|
+
*/
|
|
22
|
+
static get pluginName() {
|
|
23
|
+
return 'ImageUploadProgress';
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* @inheritDoc
|
|
27
|
+
*/
|
|
28
|
+
constructor(editor) {
|
|
29
|
+
super(editor);
|
|
30
|
+
/**
|
|
31
|
+
* This method is called each time the image `uploadStatus` attribute is changed.
|
|
32
|
+
*
|
|
33
|
+
* @param evt An object containing information about the fired event.
|
|
34
|
+
* @param data Additional information about the change.
|
|
35
|
+
*/
|
|
36
|
+
this.uploadStatusChange = (evt, data, conversionApi) => {
|
|
37
|
+
const editor = this.editor;
|
|
38
|
+
const modelImage = data.item;
|
|
39
|
+
const uploadId = modelImage.getAttribute('uploadId');
|
|
40
|
+
if (!conversionApi.consumable.consume(data.item, evt.name)) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const imageUtils = editor.plugins.get('ImageUtils');
|
|
44
|
+
const fileRepository = editor.plugins.get(FileRepository);
|
|
45
|
+
const status = uploadId ? data.attributeNewValue : null;
|
|
46
|
+
const placeholder = this.placeholder;
|
|
47
|
+
const viewFigure = editor.editing.mapper.toViewElement(modelImage);
|
|
48
|
+
const viewWriter = conversionApi.writer;
|
|
49
|
+
if (status == 'reading') {
|
|
50
|
+
// Start "appearing" effect and show placeholder with infinite progress bar on the top
|
|
51
|
+
// while image is read from disk.
|
|
52
|
+
_startAppearEffect(viewFigure, viewWriter);
|
|
53
|
+
_showPlaceholder(imageUtils, placeholder, viewFigure, viewWriter);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Show progress bar on the top of the image when image is uploading.
|
|
57
|
+
if (status == 'uploading') {
|
|
58
|
+
const loader = fileRepository.loaders.get(uploadId);
|
|
59
|
+
// Start appear effect if needed - see https://github.com/ckeditor/ckeditor5-image/issues/191.
|
|
60
|
+
_startAppearEffect(viewFigure, viewWriter);
|
|
61
|
+
if (!loader) {
|
|
62
|
+
// There is no loader associated with uploadId - this means that image came from external changes.
|
|
63
|
+
// In such cases we still want to show the placeholder until image is fully uploaded.
|
|
64
|
+
// Show placeholder if needed - see https://github.com/ckeditor/ckeditor5-image/issues/191.
|
|
65
|
+
_showPlaceholder(imageUtils, placeholder, viewFigure, viewWriter);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// Hide placeholder and initialize progress bar showing upload progress.
|
|
69
|
+
_hidePlaceholder(viewFigure, viewWriter);
|
|
70
|
+
_showProgressBar(viewFigure, viewWriter, loader, editor.editing.view);
|
|
71
|
+
_displayLocalImage(imageUtils, viewFigure, viewWriter, loader);
|
|
72
|
+
}
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (status == 'complete' && fileRepository.loaders.get(uploadId)) {
|
|
76
|
+
_showCompleteIcon(viewFigure, viewWriter, editor.editing.view);
|
|
77
|
+
}
|
|
78
|
+
// Clean up.
|
|
79
|
+
_hideProgressBar(viewFigure, viewWriter);
|
|
80
|
+
_hidePlaceholder(viewFigure, viewWriter);
|
|
81
|
+
_stopAppearEffect(viewFigure, viewWriter);
|
|
82
|
+
};
|
|
83
|
+
this.placeholder = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* @inheritDoc
|
|
87
|
+
*/
|
|
88
|
+
init() {
|
|
89
|
+
const editor = this.editor;
|
|
90
|
+
// Upload status change - update image's view according to that status.
|
|
91
|
+
if (editor.plugins.has('ImageBlockEditing')) {
|
|
92
|
+
editor.editing.downcastDispatcher.on('attribute:uploadStatus:imageBlock', this.uploadStatusChange);
|
|
93
|
+
}
|
|
94
|
+
if (editor.plugins.has('ImageInlineEditing')) {
|
|
95
|
+
editor.editing.downcastDispatcher.on('attribute:uploadStatus:imageInline', this.uploadStatusChange);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Adds ck-appear class to the image figure if one is not already applied.
|
|
101
|
+
*/
|
|
102
|
+
function _startAppearEffect(viewFigure, writer) {
|
|
103
|
+
if (!viewFigure.hasClass('ck-appear')) {
|
|
104
|
+
writer.addClass('ck-appear', viewFigure);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Removes ck-appear class to the image figure if one is not already removed.
|
|
109
|
+
*/
|
|
110
|
+
function _stopAppearEffect(viewFigure, writer) {
|
|
111
|
+
writer.removeClass('ck-appear', viewFigure);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Shows placeholder together with infinite progress bar on given image figure.
|
|
115
|
+
*/
|
|
116
|
+
function _showPlaceholder(imageUtils, placeholder, viewFigure, writer) {
|
|
117
|
+
if (!viewFigure.hasClass('ck-image-upload-placeholder')) {
|
|
118
|
+
writer.addClass('ck-image-upload-placeholder', viewFigure);
|
|
119
|
+
}
|
|
120
|
+
const viewImg = imageUtils.findViewImgElement(viewFigure);
|
|
121
|
+
if (viewImg.getAttribute('src') !== placeholder) {
|
|
122
|
+
writer.setAttribute('src', placeholder, viewImg);
|
|
123
|
+
}
|
|
124
|
+
if (!_getUIElement(viewFigure, 'placeholder')) {
|
|
125
|
+
writer.insert(writer.createPositionAfter(viewImg), _createPlaceholder(writer));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Removes placeholder together with infinite progress bar on given image figure.
|
|
130
|
+
*/
|
|
131
|
+
function _hidePlaceholder(viewFigure, writer) {
|
|
132
|
+
if (viewFigure.hasClass('ck-image-upload-placeholder')) {
|
|
133
|
+
writer.removeClass('ck-image-upload-placeholder', viewFigure);
|
|
134
|
+
}
|
|
135
|
+
_removeUIElement(viewFigure, writer, 'placeholder');
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Shows progress bar displaying upload progress.
|
|
139
|
+
* Attaches it to the file loader to update when upload percentace is changed.
|
|
140
|
+
*/
|
|
141
|
+
function _showProgressBar(viewFigure, writer, loader, view) {
|
|
142
|
+
const progressBar = _createProgressBar(writer);
|
|
143
|
+
writer.insert(writer.createPositionAt(viewFigure, 'end'), progressBar);
|
|
144
|
+
// Update progress bar width when uploadedPercent is changed.
|
|
145
|
+
loader.on('change:uploadedPercent', (evt, name, value) => {
|
|
146
|
+
view.change(writer => {
|
|
147
|
+
writer.setStyle('width', value + '%', progressBar);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Hides upload progress bar.
|
|
153
|
+
*/
|
|
154
|
+
function _hideProgressBar(viewFigure, writer) {
|
|
155
|
+
_removeUIElement(viewFigure, writer, 'progressBar');
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Shows complete icon and hides after a certain amount of time.
|
|
159
|
+
*/
|
|
160
|
+
function _showCompleteIcon(viewFigure, writer, view) {
|
|
161
|
+
const completeIcon = writer.createUIElement('div', { class: 'ck-image-upload-complete-icon' });
|
|
162
|
+
writer.insert(writer.createPositionAt(viewFigure, 'end'), completeIcon);
|
|
163
|
+
setTimeout(() => {
|
|
164
|
+
view.change(writer => writer.remove(writer.createRangeOn(completeIcon)));
|
|
165
|
+
}, 3000);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Create progress bar element using {@link module:engine/view/uielement~UIElement}.
|
|
169
|
+
*/
|
|
170
|
+
function _createProgressBar(writer) {
|
|
171
|
+
const progressBar = writer.createUIElement('div', { class: 'ck-progress-bar' });
|
|
172
|
+
writer.setCustomProperty('progressBar', true, progressBar);
|
|
173
|
+
return progressBar;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Create placeholder element using {@link module:engine/view/uielement~UIElement}.
|
|
177
|
+
*/
|
|
178
|
+
function _createPlaceholder(writer) {
|
|
179
|
+
const placeholder = writer.createUIElement('div', { class: 'ck-upload-placeholder-loader' });
|
|
180
|
+
writer.setCustomProperty('placeholder', true, placeholder);
|
|
181
|
+
return placeholder;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Returns {@link module:engine/view/uielement~UIElement} of given unique property from image figure element.
|
|
185
|
+
* Returns `undefined` if element is not found.
|
|
186
|
+
*/
|
|
187
|
+
function _getUIElement(imageFigure, uniqueProperty) {
|
|
188
|
+
for (const child of imageFigure.getChildren()) {
|
|
189
|
+
if (child.getCustomProperty(uniqueProperty)) {
|
|
190
|
+
return child;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Removes {@link module:engine/view/uielement~UIElement} of given unique property from image figure element.
|
|
196
|
+
*/
|
|
197
|
+
function _removeUIElement(viewFigure, writer, uniqueProperty) {
|
|
198
|
+
const element = _getUIElement(viewFigure, uniqueProperty);
|
|
199
|
+
if (element) {
|
|
200
|
+
writer.remove(writer.createRangeOn(element));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Displays local data from file loader.
|
|
205
|
+
*/
|
|
206
|
+
function _displayLocalImage(imageUtils, viewFigure, writer, loader) {
|
|
207
|
+
if (loader.data) {
|
|
208
|
+
const viewImg = imageUtils.findViewImgElement(viewFigure);
|
|
209
|
+
writer.setAttribute('src', loader.data, viewImg);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
@@ -1,23 +1,23 @@
|
|
|
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 { Plugin } from 'ckeditor5/src/core';
|
|
6
|
-
/**
|
|
7
|
-
* The image upload button plugin.
|
|
8
|
-
*
|
|
9
|
-
* For a detailed overview, check the {@glink features/images/image-upload/image-upload Image upload feature} documentation.
|
|
10
|
-
*
|
|
11
|
-
* Adds the `'uploadImage'` button to the {@link module:ui/componentfactory~ComponentFactory UI component factory}
|
|
12
|
-
* and also the `imageUpload` button as an alias for backward compatibility.
|
|
13
|
-
*/
|
|
14
|
-
export default class ImageUploadUI extends Plugin {
|
|
15
|
-
/**
|
|
16
|
-
* @inheritDoc
|
|
17
|
-
*/
|
|
18
|
-
static get pluginName(): "ImageUploadUI";
|
|
19
|
-
/**
|
|
20
|
-
* @inheritDoc
|
|
21
|
-
*/
|
|
22
|
-
init(): void;
|
|
23
|
-
}
|
|
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 { Plugin } from 'ckeditor5/src/core';
|
|
6
|
+
/**
|
|
7
|
+
* The image upload button plugin.
|
|
8
|
+
*
|
|
9
|
+
* For a detailed overview, check the {@glink features/images/image-upload/image-upload Image upload feature} documentation.
|
|
10
|
+
*
|
|
11
|
+
* Adds the `'uploadImage'` button to the {@link module:ui/componentfactory~ComponentFactory UI component factory}
|
|
12
|
+
* and also the `imageUpload` button as an alias for backward compatibility.
|
|
13
|
+
*/
|
|
14
|
+
export default class ImageUploadUI extends Plugin {
|
|
15
|
+
/**
|
|
16
|
+
* @inheritDoc
|
|
17
|
+
*/
|
|
18
|
+
static get pluginName(): "ImageUploadUI";
|
|
19
|
+
/**
|
|
20
|
+
* @inheritDoc
|
|
21
|
+
*/
|
|
22
|
+
init(): void;
|
|
23
|
+
}
|