@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,217 +1,217 @@
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/imageresize/imageresizebuttons
7
- */
8
- import { Plugin, icons } from 'ckeditor5/src/core';
9
- import { ButtonView, DropdownButtonView, Model, createDropdown, addListToDropdown } from 'ckeditor5/src/ui';
10
- import { CKEditorError, Collection } from 'ckeditor5/src/utils';
11
- import ImageResizeEditing from './imageresizeediting';
12
- const RESIZE_ICONS = {
13
- small: icons.objectSizeSmall,
14
- medium: icons.objectSizeMedium,
15
- large: icons.objectSizeLarge,
16
- original: icons.objectSizeFull
17
- };
18
- /**
19
- * The image resize buttons plugin.
20
- *
21
- * It adds a possibility to resize images using the toolbar dropdown or individual buttons, depending on the plugin configuration.
22
- */
23
- export default class ImageResizeButtons extends Plugin {
24
- /**
25
- * @inheritDoc
26
- */
27
- static get requires() {
28
- return [ImageResizeEditing];
29
- }
30
- /**
31
- * @inheritDoc
32
- */
33
- static get pluginName() {
34
- return 'ImageResizeButtons';
35
- }
36
- /**
37
- * @inheritDoc
38
- */
39
- constructor(editor) {
40
- super(editor);
41
- this._resizeUnit = editor.config.get('image.resizeUnit');
42
- }
43
- /**
44
- * @inheritDoc
45
- */
46
- init() {
47
- const editor = this.editor;
48
- const options = editor.config.get('image.resizeOptions');
49
- const command = editor.commands.get('resizeImage');
50
- this.bind('isEnabled').to(command);
51
- for (const option of options) {
52
- this._registerImageResizeButton(option);
53
- }
54
- this._registerImageResizeDropdown(options);
55
- }
56
- /**
57
- * A helper function that creates a standalone button component for the plugin.
58
- *
59
- * @param resizeOption A model of the resize option.
60
- */
61
- _registerImageResizeButton(option) {
62
- const editor = this.editor;
63
- const { name, value, icon } = option;
64
- const optionValueWithUnit = value ? value + this._resizeUnit : null;
65
- editor.ui.componentFactory.add(name, locale => {
66
- const button = new ButtonView(locale);
67
- const command = editor.commands.get('resizeImage');
68
- const labelText = this._getOptionLabelValue(option, true);
69
- if (!RESIZE_ICONS[icon]) {
70
- /**
71
- * When configuring {@link module:image/imageconfig~ImageConfig#resizeOptions `config.image.resizeOptions`} for standalone
72
- * buttons, a valid `icon` token must be set for each option.
73
- *
74
- * See all valid options described in the
75
- * {@link module:image/imageconfig~ImageResizeOption plugin configuration}.
76
- *
77
- * @error imageresizebuttons-missing-icon
78
- * @param option Invalid image resize option.
79
- */
80
- throw new CKEditorError('imageresizebuttons-missing-icon', editor, option);
81
- }
82
- button.set({
83
- // Use the `label` property for a verbose description (because of ARIA).
84
- label: labelText,
85
- icon: RESIZE_ICONS[icon],
86
- tooltip: labelText,
87
- isToggleable: true
88
- });
89
- // Bind button to the command.
90
- button.bind('isEnabled').to(this);
91
- button.bind('isOn').to(command, 'value', getIsOnButtonCallback(optionValueWithUnit));
92
- this.listenTo(button, 'execute', () => {
93
- editor.execute('resizeImage', { width: optionValueWithUnit });
94
- });
95
- return button;
96
- });
97
- }
98
- /**
99
- * A helper function that creates a dropdown component for the plugin containing all the resize options defined in
100
- * the editor configuration.
101
- *
102
- * @param options An array of configured options.
103
- */
104
- _registerImageResizeDropdown(options) {
105
- const editor = this.editor;
106
- const t = editor.t;
107
- const originalSizeOption = options.find(option => !option.value);
108
- const componentCreator = (locale) => {
109
- const command = editor.commands.get('resizeImage');
110
- const dropdownView = createDropdown(locale, DropdownButtonView);
111
- const dropdownButton = dropdownView.buttonView;
112
- const accessibleLabel = t('Resize image');
113
- dropdownButton.set({
114
- tooltip: accessibleLabel,
115
- commandValue: originalSizeOption.value,
116
- icon: RESIZE_ICONS.medium,
117
- isToggleable: true,
118
- label: this._getOptionLabelValue(originalSizeOption),
119
- withText: true,
120
- class: 'ck-resize-image-button',
121
- ariaLabel: accessibleLabel,
122
- ariaLabelledBy: undefined
123
- });
124
- dropdownButton.bind('label').to(command, 'value', commandValue => {
125
- if (commandValue && commandValue.width) {
126
- return commandValue.width;
127
- }
128
- else {
129
- return this._getOptionLabelValue(originalSizeOption);
130
- }
131
- });
132
- dropdownView.bind('isEnabled').to(this);
133
- addListToDropdown(dropdownView, () => this._getResizeDropdownListItemDefinitions(options, command), {
134
- ariaLabel: t('Image resize list'),
135
- role: 'menu'
136
- });
137
- // Execute command when an item from the dropdown is selected.
138
- this.listenTo(dropdownView, 'execute', evt => {
139
- editor.execute(evt.source.commandName, { width: evt.source.commandValue });
140
- editor.editing.view.focus();
141
- });
142
- return dropdownView;
143
- };
144
- // Register `resizeImage` dropdown and add `imageResize` dropdown as an alias for backward compatibility.
145
- editor.ui.componentFactory.add('resizeImage', componentCreator);
146
- editor.ui.componentFactory.add('imageResize', componentCreator);
147
- }
148
- /**
149
- * A helper function for creating an option label value string.
150
- *
151
- * @param option A resize option object.
152
- * @param forTooltip An optional flag for creating a tooltip label.
153
- * @returns A user-defined label combined from the numeric value and the resize unit or the default label
154
- * for reset options (`Original`).
155
- */
156
- _getOptionLabelValue(option, forTooltip = false) {
157
- const t = this.editor.t;
158
- if (option.label) {
159
- return option.label;
160
- }
161
- else if (forTooltip) {
162
- if (option.value) {
163
- return t('Resize image to %0', option.value + this._resizeUnit);
164
- }
165
- else {
166
- return t('Resize image to the original size');
167
- }
168
- }
169
- else {
170
- if (option.value) {
171
- return option.value + this._resizeUnit;
172
- }
173
- else {
174
- return t('Original');
175
- }
176
- }
177
- }
178
- /**
179
- * A helper function that parses the resize options and returns list item definitions ready for use in the dropdown.
180
- *
181
- * @param options The resize options.
182
- * @param command The resize image command.
183
- * @returns Dropdown item definitions.
184
- */
185
- _getResizeDropdownListItemDefinitions(options, command) {
186
- const itemDefinitions = new Collection();
187
- options.map(option => {
188
- const optionValueWithUnit = option.value ? option.value + this._resizeUnit : null;
189
- const definition = {
190
- type: 'button',
191
- model: new Model({
192
- commandName: 'resizeImage',
193
- commandValue: optionValueWithUnit,
194
- label: this._getOptionLabelValue(option),
195
- role: 'menuitemradio',
196
- withText: true,
197
- icon: null
198
- })
199
- };
200
- definition.model.bind('isOn').to(command, 'value', getIsOnButtonCallback(optionValueWithUnit));
201
- itemDefinitions.add(definition);
202
- });
203
- return itemDefinitions;
204
- }
205
- }
206
- /**
207
- * A helper function for setting the `isOn` state of buttons in value bindings.
208
- */
209
- function getIsOnButtonCallback(value) {
210
- return (commandValue) => {
211
- const objectCommandValue = commandValue;
212
- if (value === null && objectCommandValue === value) {
213
- return true;
214
- }
215
- return objectCommandValue !== null && objectCommandValue.width === value;
216
- };
217
- }
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/imageresize/imageresizebuttons
7
+ */
8
+ import { Plugin, icons } from 'ckeditor5/src/core';
9
+ import { ButtonView, DropdownButtonView, Model, createDropdown, addListToDropdown } from 'ckeditor5/src/ui';
10
+ import { CKEditorError, Collection } from 'ckeditor5/src/utils';
11
+ import ImageResizeEditing from './imageresizeediting';
12
+ const RESIZE_ICONS = {
13
+ small: icons.objectSizeSmall,
14
+ medium: icons.objectSizeMedium,
15
+ large: icons.objectSizeLarge,
16
+ original: icons.objectSizeFull
17
+ };
18
+ /**
19
+ * The image resize buttons plugin.
20
+ *
21
+ * It adds a possibility to resize images using the toolbar dropdown or individual buttons, depending on the plugin configuration.
22
+ */
23
+ export default class ImageResizeButtons extends Plugin {
24
+ /**
25
+ * @inheritDoc
26
+ */
27
+ static get requires() {
28
+ return [ImageResizeEditing];
29
+ }
30
+ /**
31
+ * @inheritDoc
32
+ */
33
+ static get pluginName() {
34
+ return 'ImageResizeButtons';
35
+ }
36
+ /**
37
+ * @inheritDoc
38
+ */
39
+ constructor(editor) {
40
+ super(editor);
41
+ this._resizeUnit = editor.config.get('image.resizeUnit');
42
+ }
43
+ /**
44
+ * @inheritDoc
45
+ */
46
+ init() {
47
+ const editor = this.editor;
48
+ const options = editor.config.get('image.resizeOptions');
49
+ const command = editor.commands.get('resizeImage');
50
+ this.bind('isEnabled').to(command);
51
+ for (const option of options) {
52
+ this._registerImageResizeButton(option);
53
+ }
54
+ this._registerImageResizeDropdown(options);
55
+ }
56
+ /**
57
+ * A helper function that creates a standalone button component for the plugin.
58
+ *
59
+ * @param resizeOption A model of the resize option.
60
+ */
61
+ _registerImageResizeButton(option) {
62
+ const editor = this.editor;
63
+ const { name, value, icon } = option;
64
+ const optionValueWithUnit = value ? value + this._resizeUnit : null;
65
+ editor.ui.componentFactory.add(name, locale => {
66
+ const button = new ButtonView(locale);
67
+ const command = editor.commands.get('resizeImage');
68
+ const labelText = this._getOptionLabelValue(option, true);
69
+ if (!RESIZE_ICONS[icon]) {
70
+ /**
71
+ * When configuring {@link module:image/imageconfig~ImageConfig#resizeOptions `config.image.resizeOptions`} for standalone
72
+ * buttons, a valid `icon` token must be set for each option.
73
+ *
74
+ * See all valid options described in the
75
+ * {@link module:image/imageconfig~ImageResizeOption plugin configuration}.
76
+ *
77
+ * @error imageresizebuttons-missing-icon
78
+ * @param option Invalid image resize option.
79
+ */
80
+ throw new CKEditorError('imageresizebuttons-missing-icon', editor, option);
81
+ }
82
+ button.set({
83
+ // Use the `label` property for a verbose description (because of ARIA).
84
+ label: labelText,
85
+ icon: RESIZE_ICONS[icon],
86
+ tooltip: labelText,
87
+ isToggleable: true
88
+ });
89
+ // Bind button to the command.
90
+ button.bind('isEnabled').to(this);
91
+ button.bind('isOn').to(command, 'value', getIsOnButtonCallback(optionValueWithUnit));
92
+ this.listenTo(button, 'execute', () => {
93
+ editor.execute('resizeImage', { width: optionValueWithUnit });
94
+ });
95
+ return button;
96
+ });
97
+ }
98
+ /**
99
+ * A helper function that creates a dropdown component for the plugin containing all the resize options defined in
100
+ * the editor configuration.
101
+ *
102
+ * @param options An array of configured options.
103
+ */
104
+ _registerImageResizeDropdown(options) {
105
+ const editor = this.editor;
106
+ const t = editor.t;
107
+ const originalSizeOption = options.find(option => !option.value);
108
+ const componentCreator = (locale) => {
109
+ const command = editor.commands.get('resizeImage');
110
+ const dropdownView = createDropdown(locale, DropdownButtonView);
111
+ const dropdownButton = dropdownView.buttonView;
112
+ const accessibleLabel = t('Resize image');
113
+ dropdownButton.set({
114
+ tooltip: accessibleLabel,
115
+ commandValue: originalSizeOption.value,
116
+ icon: RESIZE_ICONS.medium,
117
+ isToggleable: true,
118
+ label: this._getOptionLabelValue(originalSizeOption),
119
+ withText: true,
120
+ class: 'ck-resize-image-button',
121
+ ariaLabel: accessibleLabel,
122
+ ariaLabelledBy: undefined
123
+ });
124
+ dropdownButton.bind('label').to(command, 'value', commandValue => {
125
+ if (commandValue && commandValue.width) {
126
+ return commandValue.width;
127
+ }
128
+ else {
129
+ return this._getOptionLabelValue(originalSizeOption);
130
+ }
131
+ });
132
+ dropdownView.bind('isEnabled').to(this);
133
+ addListToDropdown(dropdownView, () => this._getResizeDropdownListItemDefinitions(options, command), {
134
+ ariaLabel: t('Image resize list'),
135
+ role: 'menu'
136
+ });
137
+ // Execute command when an item from the dropdown is selected.
138
+ this.listenTo(dropdownView, 'execute', evt => {
139
+ editor.execute(evt.source.commandName, { width: evt.source.commandValue });
140
+ editor.editing.view.focus();
141
+ });
142
+ return dropdownView;
143
+ };
144
+ // Register `resizeImage` dropdown and add `imageResize` dropdown as an alias for backward compatibility.
145
+ editor.ui.componentFactory.add('resizeImage', componentCreator);
146
+ editor.ui.componentFactory.add('imageResize', componentCreator);
147
+ }
148
+ /**
149
+ * A helper function for creating an option label value string.
150
+ *
151
+ * @param option A resize option object.
152
+ * @param forTooltip An optional flag for creating a tooltip label.
153
+ * @returns A user-defined label combined from the numeric value and the resize unit or the default label
154
+ * for reset options (`Original`).
155
+ */
156
+ _getOptionLabelValue(option, forTooltip = false) {
157
+ const t = this.editor.t;
158
+ if (option.label) {
159
+ return option.label;
160
+ }
161
+ else if (forTooltip) {
162
+ if (option.value) {
163
+ return t('Resize image to %0', option.value + this._resizeUnit);
164
+ }
165
+ else {
166
+ return t('Resize image to the original size');
167
+ }
168
+ }
169
+ else {
170
+ if (option.value) {
171
+ return option.value + this._resizeUnit;
172
+ }
173
+ else {
174
+ return t('Original');
175
+ }
176
+ }
177
+ }
178
+ /**
179
+ * A helper function that parses the resize options and returns list item definitions ready for use in the dropdown.
180
+ *
181
+ * @param options The resize options.
182
+ * @param command The resize image command.
183
+ * @returns Dropdown item definitions.
184
+ */
185
+ _getResizeDropdownListItemDefinitions(options, command) {
186
+ const itemDefinitions = new Collection();
187
+ options.map(option => {
188
+ const optionValueWithUnit = option.value ? option.value + this._resizeUnit : null;
189
+ const definition = {
190
+ type: 'button',
191
+ model: new Model({
192
+ commandName: 'resizeImage',
193
+ commandValue: optionValueWithUnit,
194
+ label: this._getOptionLabelValue(option),
195
+ role: 'menuitemradio',
196
+ withText: true,
197
+ icon: null
198
+ })
199
+ };
200
+ definition.model.bind('isOn').to(command, 'value', getIsOnButtonCallback(optionValueWithUnit));
201
+ itemDefinitions.add(definition);
202
+ });
203
+ return itemDefinitions;
204
+ }
205
+ }
206
+ /**
207
+ * A helper function for setting the `isOn` state of buttons in value bindings.
208
+ */
209
+ function getIsOnButtonCallback(value) {
210
+ return (commandValue) => {
211
+ const objectCommandValue = commandValue;
212
+ if (value === null && objectCommandValue === value) {
213
+ return true;
214
+ }
215
+ return objectCommandValue !== null && objectCommandValue.width === value;
216
+ };
217
+ }
@@ -1,37 +1,37 @@
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 { type Editor, Plugin } from 'ckeditor5/src/core';
6
- import ImageUtils from '../imageutils';
7
- /**
8
- * The image resize editing feature.
9
- *
10
- * It adds the ability to resize each image using handles or manually by
11
- * {@link module:image/imageresize/imageresizebuttons~ImageResizeButtons} buttons.
12
- */
13
- export default class ImageResizeEditing extends Plugin {
14
- /**
15
- * @inheritDoc
16
- */
17
- static get requires(): readonly [typeof ImageUtils];
18
- /**
19
- * @inheritDoc
20
- */
21
- static get pluginName(): "ImageResizeEditing";
22
- /**
23
- * @inheritDoc
24
- */
25
- constructor(editor: Editor);
26
- /**
27
- * @inheritDoc
28
- */
29
- init(): void;
30
- private _registerSchema;
31
- /**
32
- * Registers image resize converters.
33
- *
34
- * @param imageType The type of the image.
35
- */
36
- private _registerConverters;
37
- }
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 { type Editor, Plugin } from 'ckeditor5/src/core';
6
+ import ImageUtils from '../imageutils';
7
+ /**
8
+ * The image resize editing feature.
9
+ *
10
+ * It adds the ability to resize each image using handles or manually by
11
+ * {@link module:image/imageresize/imageresizebuttons~ImageResizeButtons} buttons.
12
+ */
13
+ export default class ImageResizeEditing extends Plugin {
14
+ /**
15
+ * @inheritDoc
16
+ */
17
+ static get requires(): readonly [typeof ImageUtils];
18
+ /**
19
+ * @inheritDoc
20
+ */
21
+ static get pluginName(): "ImageResizeEditing";
22
+ /**
23
+ * @inheritDoc
24
+ */
25
+ constructor(editor: Editor);
26
+ /**
27
+ * @inheritDoc
28
+ */
29
+ init(): void;
30
+ private _registerSchema;
31
+ /**
32
+ * Registers image resize converters.
33
+ *
34
+ * @param imageType The type of the image.
35
+ */
36
+ private _registerConverters;
37
+ }