@ckeditor/ckeditor5-image 40.0.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.
Files changed (253) hide show
  1. package/CHANGELOG.md +25 -25
  2. package/LICENSE.md +3 -3
  3. package/build/image.js +2 -2
  4. package/build/translations/ar.js +1 -1
  5. package/build/translations/ast.js +1 -1
  6. package/build/translations/az.js +1 -1
  7. package/build/translations/bg.js +1 -1
  8. package/build/translations/bn.js +1 -1
  9. package/build/translations/bs.js +1 -1
  10. package/build/translations/ca.js +1 -1
  11. package/build/translations/cs.js +1 -1
  12. package/build/translations/da.js +1 -1
  13. package/build/translations/de-ch.js +1 -1
  14. package/build/translations/de.js +1 -1
  15. package/build/translations/el.js +1 -1
  16. package/build/translations/en-au.js +1 -1
  17. package/build/translations/en-gb.js +1 -1
  18. package/build/translations/eo.js +1 -1
  19. package/build/translations/es.js +1 -1
  20. package/build/translations/et.js +1 -1
  21. package/build/translations/eu.js +1 -1
  22. package/build/translations/fa.js +1 -1
  23. package/build/translations/fi.js +1 -1
  24. package/build/translations/fr.js +1 -1
  25. package/build/translations/gl.js +1 -1
  26. package/build/translations/he.js +1 -1
  27. package/build/translations/hi.js +1 -1
  28. package/build/translations/hr.js +1 -1
  29. package/build/translations/hu.js +1 -1
  30. package/build/translations/id.js +1 -1
  31. package/build/translations/it.js +1 -1
  32. package/build/translations/ja.js +1 -1
  33. package/build/translations/jv.js +1 -1
  34. package/build/translations/km.js +1 -1
  35. package/build/translations/kn.js +1 -1
  36. package/build/translations/ko.js +1 -1
  37. package/build/translations/ku.js +1 -1
  38. package/build/translations/lt.js +1 -1
  39. package/build/translations/lv.js +1 -1
  40. package/build/translations/ms.js +1 -1
  41. package/build/translations/nb.js +1 -1
  42. package/build/translations/ne.js +1 -1
  43. package/build/translations/nl.js +1 -1
  44. package/build/translations/no.js +1 -1
  45. package/build/translations/pl.js +1 -1
  46. package/build/translations/pt-br.js +1 -1
  47. package/build/translations/pt.js +1 -1
  48. package/build/translations/ro.js +1 -1
  49. package/build/translations/ru.js +1 -1
  50. package/build/translations/si.js +1 -1
  51. package/build/translations/sk.js +1 -1
  52. package/build/translations/sq.js +1 -1
  53. package/build/translations/sr-latn.js +1 -1
  54. package/build/translations/sr.js +1 -1
  55. package/build/translations/sv.js +1 -1
  56. package/build/translations/th.js +1 -1
  57. package/build/translations/tk.js +1 -1
  58. package/build/translations/tr.js +1 -1
  59. package/build/translations/tt.js +1 -1
  60. package/build/translations/ug.js +1 -1
  61. package/build/translations/uk.js +1 -1
  62. package/build/translations/ur.js +1 -1
  63. package/build/translations/uz.js +1 -1
  64. package/build/translations/vi.js +1 -1
  65. package/build/translations/zh-cn.js +1 -1
  66. package/build/translations/zh.js +1 -1
  67. package/ckeditor5-metadata.json +3 -3
  68. package/lang/contexts.json +5 -0
  69. package/lang/translations/ar.po +20 -0
  70. package/lang/translations/ast.po +20 -0
  71. package/lang/translations/az.po +20 -0
  72. package/lang/translations/bg.po +20 -0
  73. package/lang/translations/bn.po +20 -0
  74. package/lang/translations/bs.po +20 -0
  75. package/lang/translations/ca.po +20 -0
  76. package/lang/translations/cs.po +20 -0
  77. package/lang/translations/da.po +20 -0
  78. package/lang/translations/de-ch.po +20 -0
  79. package/lang/translations/de.po +20 -0
  80. package/lang/translations/el.po +20 -0
  81. package/lang/translations/en-au.po +20 -0
  82. package/lang/translations/en-gb.po +20 -0
  83. package/lang/translations/en.po +20 -0
  84. package/lang/translations/eo.po +20 -0
  85. package/lang/translations/es.po +20 -0
  86. package/lang/translations/et.po +20 -0
  87. package/lang/translations/eu.po +20 -0
  88. package/lang/translations/fa.po +20 -0
  89. package/lang/translations/fi.po +20 -0
  90. package/lang/translations/fr.po +20 -0
  91. package/lang/translations/gl.po +20 -0
  92. package/lang/translations/he.po +20 -0
  93. package/lang/translations/hi.po +20 -0
  94. package/lang/translations/hr.po +20 -0
  95. package/lang/translations/hu.po +20 -0
  96. package/lang/translations/id.po +20 -0
  97. package/lang/translations/it.po +20 -0
  98. package/lang/translations/ja.po +20 -0
  99. package/lang/translations/jv.po +20 -0
  100. package/lang/translations/km.po +20 -0
  101. package/lang/translations/kn.po +20 -0
  102. package/lang/translations/ko.po +20 -0
  103. package/lang/translations/ku.po +20 -0
  104. package/lang/translations/lt.po +20 -0
  105. package/lang/translations/lv.po +20 -0
  106. package/lang/translations/ms.po +20 -0
  107. package/lang/translations/nb.po +20 -0
  108. package/lang/translations/ne.po +20 -0
  109. package/lang/translations/nl.po +20 -0
  110. package/lang/translations/no.po +20 -0
  111. package/lang/translations/pl.po +20 -0
  112. package/lang/translations/pt-br.po +20 -0
  113. package/lang/translations/pt.po +20 -0
  114. package/lang/translations/ro.po +20 -0
  115. package/lang/translations/ru.po +20 -0
  116. package/lang/translations/si.po +20 -0
  117. package/lang/translations/sk.po +20 -0
  118. package/lang/translations/sq.po +20 -0
  119. package/lang/translations/sr-latn.po +20 -0
  120. package/lang/translations/sr.po +20 -0
  121. package/lang/translations/sv.po +20 -0
  122. package/lang/translations/th.po +20 -0
  123. package/lang/translations/tk.po +20 -0
  124. package/lang/translations/tr.po +20 -0
  125. package/lang/translations/tt.po +20 -0
  126. package/lang/translations/ug.po +21 -1
  127. package/lang/translations/uk.po +20 -0
  128. package/lang/translations/ur.po +20 -0
  129. package/lang/translations/uz.po +20 -0
  130. package/lang/translations/vi.po +20 -0
  131. package/lang/translations/zh-cn.po +20 -0
  132. package/lang/translations/zh.po +20 -0
  133. package/package.json +3 -3
  134. package/src/augmentation.d.ts +56 -56
  135. package/src/augmentation.js +5 -5
  136. package/src/autoimage.d.ts +52 -52
  137. package/src/autoimage.js +132 -132
  138. package/src/image/converters.d.ts +66 -66
  139. package/src/image/converters.js +232 -232
  140. package/src/image/imageblockediting.d.ts +59 -58
  141. package/src/image/imageblockediting.js +153 -152
  142. package/src/image/imageediting.d.ts +30 -30
  143. package/src/image/imageediting.js +63 -63
  144. package/src/image/imageinlineediting.d.ts +60 -59
  145. package/src/image/imageinlineediting.js +177 -176
  146. package/src/image/imageloadobserver.d.ts +48 -48
  147. package/src/image/imageloadobserver.js +52 -52
  148. package/src/image/imageplaceholder.d.ts +39 -0
  149. package/src/image/imageplaceholder.js +113 -0
  150. package/src/image/imagetypecommand.d.ts +44 -44
  151. package/src/image/imagetypecommand.js +80 -80
  152. package/src/image/insertimagecommand.d.ts +66 -66
  153. package/src/image/insertimagecommand.js +120 -120
  154. package/src/image/replaceimagesourcecommand.d.ts +51 -34
  155. package/src/image/replaceimagesourcecommand.js +75 -44
  156. package/src/image/ui/utils.d.ts +25 -25
  157. package/src/image/ui/utils.js +44 -44
  158. package/src/image/utils.d.ts +64 -64
  159. package/src/image/utils.js +121 -121
  160. package/src/image.d.ts +34 -34
  161. package/src/image.js +38 -38
  162. package/src/imageblock.d.ts +34 -33
  163. package/src/imageblock.js +38 -37
  164. package/src/imagecaption/imagecaptionediting.d.ts +89 -89
  165. package/src/imagecaption/imagecaptionediting.js +225 -225
  166. package/src/imagecaption/imagecaptionui.d.ts +26 -26
  167. package/src/imagecaption/imagecaptionui.js +61 -61
  168. package/src/imagecaption/imagecaptionutils.d.ts +38 -38
  169. package/src/imagecaption/imagecaptionutils.js +62 -62
  170. package/src/imagecaption/toggleimagecaptioncommand.d.ts +66 -66
  171. package/src/imagecaption/toggleimagecaptioncommand.js +138 -138
  172. package/src/imagecaption.d.ts +26 -26
  173. package/src/imagecaption.js +30 -30
  174. package/src/imageconfig.d.ts +712 -713
  175. package/src/imageconfig.js +5 -5
  176. package/src/imageinline.d.ts +34 -33
  177. package/src/imageinline.js +38 -37
  178. package/src/imageinsert/imageinsertui.d.ts +72 -44
  179. package/src/imageinsert/imageinsertui.js +174 -141
  180. package/src/imageinsert/imageinsertviaurlui.d.ts +44 -0
  181. package/src/imageinsert/imageinsertviaurlui.js +122 -0
  182. package/src/imageinsert/ui/imageinsertformview.d.ts +56 -0
  183. package/src/imageinsert/ui/imageinsertformview.js +112 -0
  184. package/src/imageinsert/ui/imageinserturlview.d.ts +107 -0
  185. package/src/imageinsert/ui/imageinserturlview.js +156 -0
  186. package/src/imageinsert.d.ts +33 -33
  187. package/src/imageinsert.js +37 -37
  188. package/src/imageinsertviaurl.d.ts +31 -30
  189. package/src/imageinsertviaurl.js +35 -34
  190. package/src/imageresize/imageresizebuttons.d.ts +67 -67
  191. package/src/imageresize/imageresizebuttons.js +217 -217
  192. package/src/imageresize/imageresizeediting.d.ts +37 -37
  193. package/src/imageresize/imageresizeediting.js +165 -165
  194. package/src/imageresize/imageresizehandles.d.ts +31 -31
  195. package/src/imageresize/imageresizehandles.js +114 -114
  196. package/src/imageresize/resizeimagecommand.d.ts +42 -42
  197. package/src/imageresize/resizeimagecommand.js +63 -63
  198. package/src/imageresize.d.ts +27 -27
  199. package/src/imageresize.js +31 -31
  200. package/src/imagesizeattributes.d.ts +34 -34
  201. package/src/imagesizeattributes.js +142 -143
  202. package/src/imagestyle/converters.d.ts +24 -24
  203. package/src/imagestyle/converters.js +79 -79
  204. package/src/imagestyle/imagestylecommand.d.ts +68 -68
  205. package/src/imagestyle/imagestylecommand.js +107 -107
  206. package/src/imagestyle/imagestyleediting.d.ts +50 -50
  207. package/src/imagestyle/imagestyleediting.js +108 -108
  208. package/src/imagestyle/imagestyleui.d.ts +56 -56
  209. package/src/imagestyle/imagestyleui.js +192 -192
  210. package/src/imagestyle/utils.d.ts +101 -101
  211. package/src/imagestyle/utils.js +329 -329
  212. package/src/imagestyle.d.ts +32 -32
  213. package/src/imagestyle.js +36 -36
  214. package/src/imagetextalternative/imagetextalternativecommand.d.ts +34 -34
  215. package/src/imagetextalternative/imagetextalternativecommand.js +44 -44
  216. package/src/imagetextalternative/imagetextalternativeediting.d.ts +28 -28
  217. package/src/imagetextalternative/imagetextalternativeediting.js +35 -35
  218. package/src/imagetextalternative/imagetextalternativeui.d.ts +68 -68
  219. package/src/imagetextalternative/imagetextalternativeui.js +173 -173
  220. package/src/imagetextalternative/ui/textalternativeformview.d.ts +90 -72
  221. package/src/imagetextalternative/ui/textalternativeformview.js +121 -121
  222. package/src/imagetextalternative.d.ts +29 -29
  223. package/src/imagetextalternative.js +33 -33
  224. package/src/imagetoolbar.d.ts +35 -35
  225. package/src/imagetoolbar.js +57 -57
  226. package/src/imageupload/imageuploadediting.d.ts +111 -111
  227. package/src/imageupload/imageuploadediting.js +337 -337
  228. package/src/imageupload/imageuploadprogress.d.ts +42 -42
  229. package/src/imageupload/imageuploadprogress.js +211 -211
  230. package/src/imageupload/imageuploadui.d.ts +23 -23
  231. package/src/imageupload/imageuploadui.js +81 -57
  232. package/src/imageupload/uploadimagecommand.d.ts +60 -60
  233. package/src/imageupload/uploadimagecommand.js +100 -100
  234. package/src/imageupload/utils.d.ts +33 -33
  235. package/src/imageupload/utils.js +112 -112
  236. package/src/imageupload.d.ts +32 -32
  237. package/src/imageupload.js +36 -36
  238. package/src/imageutils.d.ts +125 -125
  239. package/src/imageutils.js +306 -306
  240. package/src/index.d.ts +48 -48
  241. package/src/index.js +39 -39
  242. package/src/pictureediting.d.ts +88 -88
  243. package/src/pictureediting.js +130 -130
  244. package/theme/imageinsert.css +5 -17
  245. package/theme/imageplaceholder.css +10 -0
  246. package/build/image.js.map +0 -1
  247. package/src/imageinsert/ui/imageinsertformrowview.d.ts +0 -61
  248. package/src/imageinsert/ui/imageinsertformrowview.js +0 -54
  249. package/src/imageinsert/ui/imageinsertpanelview.d.ts +0 -106
  250. package/src/imageinsert/ui/imageinsertpanelview.js +0 -161
  251. package/src/imageinsert/utils.d.ts +0 -25
  252. package/src/imageinsert/utils.js +0 -58
  253. package/theme/imageinsertformrowview.css +0 -36
@@ -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
+ }