suneditor 3.0.0-alpha.2 → 3.0.0-alpha.20

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 (306) hide show
  1. package/.eslintrc.json +4 -3
  2. package/CONTRIBUTING.md +4 -2
  3. package/README.md +19 -11
  4. package/README_V3_TEMP.md +705 -0
  5. package/dist/suneditor.min.css +1 -0
  6. package/dist/suneditor.min.js +1 -0
  7. package/example.md +587 -0
  8. package/package.json +15 -9
  9. package/src/assets/icons/_default.js +166 -131
  10. package/src/assets/{suneditor-content.css → suneditor-contents.css} +182 -45
  11. package/src/assets/suneditor.css +1195 -556
  12. package/src/assets/variables.css +138 -0
  13. package/src/core/base/eventHandlers/handler_toolbar.js +35 -14
  14. package/src/core/base/eventHandlers/handler_ww_clipboard.js +29 -4
  15. package/src/core/base/eventHandlers/handler_ww_dragDrop.js +59 -15
  16. package/src/core/base/eventHandlers/handler_ww_key_input.js +426 -212
  17. package/src/core/base/eventHandlers/handler_ww_mouse.js +108 -32
  18. package/src/core/base/eventManager.js +540 -209
  19. package/src/core/base/events.js +616 -320
  20. package/src/core/base/history.js +93 -39
  21. package/src/core/class/char.js +29 -13
  22. package/src/core/class/component.js +332 -145
  23. package/src/core/class/format.js +671 -509
  24. package/src/core/class/html.js +504 -290
  25. package/src/core/class/menu.js +114 -47
  26. package/src/core/class/nodeTransform.js +111 -66
  27. package/src/core/class/offset.js +409 -105
  28. package/src/core/class/selection.js +220 -108
  29. package/src/core/class/shortcuts.js +68 -8
  30. package/src/core/class/toolbar.js +106 -116
  31. package/src/core/class/ui.js +330 -0
  32. package/src/core/class/viewer.js +178 -74
  33. package/src/core/editor.js +489 -384
  34. package/src/core/section/actives.js +118 -22
  35. package/src/core/section/constructor.js +504 -170
  36. package/src/core/section/context.js +28 -23
  37. package/src/core/section/documentType.js +561 -0
  38. package/src/editorInjector/_classes.js +19 -5
  39. package/src/editorInjector/_core.js +71 -7
  40. package/src/editorInjector/index.js +63 -1
  41. package/src/helper/converter.js +137 -19
  42. package/src/helper/dom/domCheck.js +294 -0
  43. package/src/helper/dom/domQuery.js +609 -0
  44. package/src/helper/dom/domUtils.js +533 -0
  45. package/src/helper/dom/index.js +12 -0
  46. package/src/helper/env.js +42 -19
  47. package/src/helper/index.js +7 -4
  48. package/src/helper/keyCodeMap.js +183 -0
  49. package/src/helper/numbers.js +8 -8
  50. package/src/helper/unicode.js +5 -5
  51. package/src/langs/ckb.js +69 -3
  52. package/src/langs/cs.js +67 -1
  53. package/src/langs/da.js +68 -2
  54. package/src/langs/de.js +68 -3
  55. package/src/langs/en.js +29 -1
  56. package/src/langs/es.js +68 -3
  57. package/src/langs/fa.js +70 -2
  58. package/src/langs/fr.js +68 -2
  59. package/src/langs/he.js +68 -3
  60. package/src/langs/hu.js +226 -0
  61. package/src/langs/index.js +3 -2
  62. package/src/langs/it.js +65 -0
  63. package/src/langs/ja.js +68 -3
  64. package/src/langs/ko.js +66 -1
  65. package/src/langs/lv.js +68 -3
  66. package/src/langs/nl.js +68 -3
  67. package/src/langs/pl.js +68 -3
  68. package/src/langs/pt_br.js +65 -0
  69. package/src/langs/ro.js +69 -4
  70. package/src/langs/ru.js +68 -3
  71. package/src/langs/se.js +68 -3
  72. package/src/langs/tr.js +68 -0
  73. package/src/langs/ua.js +68 -3
  74. package/src/langs/ur.js +71 -6
  75. package/src/langs/zh_cn.js +69 -4
  76. package/src/modules/ApiManager.js +77 -54
  77. package/src/modules/Browser.js +667 -0
  78. package/src/modules/ColorPicker.js +162 -102
  79. package/src/modules/Controller.js +233 -136
  80. package/src/modules/Figure.js +913 -489
  81. package/src/modules/FileManager.js +141 -72
  82. package/src/modules/HueSlider.js +113 -61
  83. package/src/modules/Modal.js +292 -113
  84. package/src/modules/ModalAnchorEditor.js +380 -230
  85. package/src/modules/SelectMenu.js +270 -168
  86. package/src/modules/_DragHandle.js +2 -1
  87. package/src/modules/index.js +3 -3
  88. package/src/plugins/browser/audioGallery.js +83 -0
  89. package/src/plugins/browser/fileBrowser.js +103 -0
  90. package/src/plugins/browser/fileGallery.js +83 -0
  91. package/src/plugins/browser/imageGallery.js +81 -0
  92. package/src/plugins/browser/videoGallery.js +103 -0
  93. package/src/plugins/command/blockquote.js +40 -27
  94. package/src/plugins/command/exportPDF.js +134 -0
  95. package/src/plugins/command/fileUpload.js +226 -158
  96. package/src/plugins/command/list_bulleted.js +93 -47
  97. package/src/plugins/command/list_numbered.js +93 -47
  98. package/src/plugins/dropdown/align.js +66 -54
  99. package/src/plugins/dropdown/backgroundColor.js +76 -45
  100. package/src/plugins/dropdown/font.js +71 -47
  101. package/src/plugins/dropdown/fontColor.js +78 -46
  102. package/src/plugins/dropdown/formatBlock.js +74 -33
  103. package/src/plugins/dropdown/hr.js +102 -51
  104. package/src/plugins/dropdown/layout.js +37 -26
  105. package/src/plugins/dropdown/lineHeight.js +54 -38
  106. package/src/plugins/dropdown/list.js +60 -45
  107. package/src/plugins/dropdown/paragraphStyle.js +51 -30
  108. package/src/plugins/dropdown/table.js +1269 -777
  109. package/src/plugins/dropdown/template.js +38 -26
  110. package/src/plugins/dropdown/textStyle.js +43 -31
  111. package/src/plugins/field/mention.js +144 -82
  112. package/src/plugins/index.js +32 -6
  113. package/src/plugins/input/fontSize.js +161 -108
  114. package/src/plugins/input/pageNavigator.js +70 -0
  115. package/src/plugins/modal/audio.js +341 -169
  116. package/src/plugins/modal/drawing.js +530 -0
  117. package/src/plugins/modal/embed.js +886 -0
  118. package/src/plugins/modal/image.js +673 -358
  119. package/src/plugins/modal/link.js +100 -71
  120. package/src/plugins/modal/math.js +384 -168
  121. package/src/plugins/modal/video.js +693 -336
  122. package/src/plugins/popup/anchor.js +222 -0
  123. package/src/suneditor.js +54 -12
  124. package/src/themes/dark.css +85 -0
  125. package/src/typedef.js +86 -0
  126. package/types/assets/icons/_default.d.ts +152 -0
  127. package/types/core/base/eventHandlers/handler_toolbar.d.ts +41 -0
  128. package/types/core/base/eventHandlers/handler_ww_clipboard.d.ts +40 -0
  129. package/types/core/base/eventHandlers/handler_ww_dragDrop.d.ts +35 -0
  130. package/types/core/base/eventHandlers/handler_ww_key_input.d.ts +45 -0
  131. package/types/core/base/eventHandlers/handler_ww_mouse.d.ts +39 -0
  132. package/types/core/base/eventManager.d.ts +377 -0
  133. package/types/core/base/events.d.ts +297 -0
  134. package/types/core/base/history.d.ts +81 -0
  135. package/types/core/class/char.d.ts +60 -0
  136. package/types/core/class/component.d.ts +259 -0
  137. package/types/core/class/format.d.ts +615 -0
  138. package/types/core/class/html.d.ts +377 -0
  139. package/types/core/class/menu.d.ts +118 -0
  140. package/types/core/class/nodeTransform.d.ts +93 -0
  141. package/types/core/class/offset.d.ts +512 -0
  142. package/types/core/class/selection.d.ts +188 -0
  143. package/types/core/class/shortcuts.d.ts +142 -0
  144. package/types/core/class/toolbar.d.ts +189 -0
  145. package/types/core/class/ui.d.ts +144 -0
  146. package/types/core/class/viewer.d.ts +140 -0
  147. package/types/core/editor.d.ts +606 -0
  148. package/types/core/section/actives.d.ts +46 -0
  149. package/types/core/section/constructor.d.ts +748 -0
  150. package/types/core/section/context.d.ts +45 -0
  151. package/types/core/section/documentType.d.ts +178 -0
  152. package/types/editorInjector/_classes.d.ts +41 -0
  153. package/types/editorInjector/_core.d.ts +92 -0
  154. package/types/editorInjector/index.d.ts +71 -0
  155. package/types/helper/converter.d.ts +150 -0
  156. package/types/helper/dom/domCheck.d.ts +182 -0
  157. package/types/helper/dom/domQuery.d.ts +214 -0
  158. package/types/helper/dom/domUtils.d.ts +211 -0
  159. package/types/helper/dom/index.d.ts +9 -0
  160. package/types/helper/env.d.ts +149 -0
  161. package/types/helper/index.d.ts +163 -0
  162. package/types/helper/keyCodeMap.d.ts +110 -0
  163. package/types/helper/numbers.d.ts +43 -0
  164. package/types/helper/unicode.d.ts +28 -0
  165. package/types/index.d.ts +0 -0
  166. package/{typings/Lang.d.ts → types/langs/_Lang.d.ts} +170 -103
  167. package/types/langs/ckb.d.ts +384 -0
  168. package/types/langs/cs.d.ts +384 -0
  169. package/types/langs/da.d.ts +384 -0
  170. package/types/langs/de.d.ts +384 -0
  171. package/types/langs/en.d.ts +384 -0
  172. package/types/langs/es.d.ts +384 -0
  173. package/types/langs/fa.d.ts +384 -0
  174. package/types/langs/fr.d.ts +384 -0
  175. package/types/langs/he.d.ts +384 -0
  176. package/types/langs/hu.d.ts +384 -0
  177. package/types/langs/index.d.ts +48 -0
  178. package/types/langs/it.d.ts +384 -0
  179. package/types/langs/ja.d.ts +384 -0
  180. package/types/langs/ko.d.ts +384 -0
  181. package/types/langs/lv.d.ts +384 -0
  182. package/types/langs/nl.d.ts +384 -0
  183. package/types/langs/pl.d.ts +384 -0
  184. package/types/langs/pt_br.d.ts +384 -0
  185. package/types/langs/ro.d.ts +384 -0
  186. package/types/langs/ru.d.ts +384 -0
  187. package/types/langs/se.d.ts +384 -0
  188. package/types/langs/tr.d.ts +384 -0
  189. package/types/langs/ua.d.ts +384 -0
  190. package/types/langs/ur.d.ts +384 -0
  191. package/types/langs/zh_cn.d.ts +384 -0
  192. package/types/modules/ApiManager.d.ts +125 -0
  193. package/types/modules/Browser.d.ts +326 -0
  194. package/types/modules/ColorPicker.d.ts +131 -0
  195. package/types/modules/Controller.d.ts +231 -0
  196. package/types/modules/Figure.d.ts +504 -0
  197. package/types/modules/FileManager.d.ts +202 -0
  198. package/types/modules/HueSlider.d.ts +136 -0
  199. package/types/modules/Modal.d.ts +117 -0
  200. package/types/modules/ModalAnchorEditor.d.ts +236 -0
  201. package/types/modules/SelectMenu.d.ts +194 -0
  202. package/types/modules/_DragHandle.d.ts +7 -0
  203. package/types/modules/index.d.ts +26 -0
  204. package/types/plugins/browser/audioGallery.d.ts +55 -0
  205. package/types/plugins/browser/fileBrowser.d.ts +64 -0
  206. package/types/plugins/browser/fileGallery.d.ts +55 -0
  207. package/types/plugins/browser/imageGallery.d.ts +51 -0
  208. package/types/plugins/browser/videoGallery.d.ts +57 -0
  209. package/types/plugins/command/blockquote.d.ts +28 -0
  210. package/types/plugins/command/exportPDF.d.ts +46 -0
  211. package/types/plugins/command/fileUpload.d.ts +156 -0
  212. package/types/plugins/command/list_bulleted.d.ts +56 -0
  213. package/types/plugins/command/list_numbered.d.ts +56 -0
  214. package/types/plugins/dropdown/align.d.ts +60 -0
  215. package/types/plugins/dropdown/backgroundColor.d.ts +63 -0
  216. package/types/plugins/dropdown/font.d.ts +54 -0
  217. package/types/plugins/dropdown/fontColor.d.ts +63 -0
  218. package/types/plugins/dropdown/formatBlock.d.ts +58 -0
  219. package/types/plugins/dropdown/hr.d.ts +81 -0
  220. package/types/plugins/dropdown/layout.d.ts +40 -0
  221. package/types/plugins/dropdown/lineHeight.d.ts +50 -0
  222. package/types/plugins/dropdown/list.d.ts +39 -0
  223. package/types/plugins/dropdown/paragraphStyle.d.ts +54 -0
  224. package/types/plugins/dropdown/table.d.ts +579 -0
  225. package/types/plugins/dropdown/template.d.ts +40 -0
  226. package/types/plugins/dropdown/textStyle.d.ts +41 -0
  227. package/types/plugins/field/mention.d.ts +102 -0
  228. package/types/plugins/index.d.ts +107 -0
  229. package/types/plugins/input/fontSize.d.ts +170 -0
  230. package/types/plugins/input/pageNavigator.d.ts +28 -0
  231. package/types/plugins/modal/audio.d.ts +269 -0
  232. package/types/plugins/modal/drawing.d.ts +246 -0
  233. package/types/plugins/modal/embed.d.ts +387 -0
  234. package/types/plugins/modal/image.d.ts +451 -0
  235. package/types/plugins/modal/link.d.ts +128 -0
  236. package/types/plugins/modal/math.d.ts +193 -0
  237. package/types/plugins/modal/video.d.ts +485 -0
  238. package/types/plugins/popup/anchor.d.ts +56 -0
  239. package/types/suneditor.d.ts +51 -0
  240. package/types/typedef-global.d.ts +144 -0
  241. package/src/core/class/notice.js +0 -42
  242. package/src/helper/domUtils.js +0 -1177
  243. package/src/modules/FileBrowser.js +0 -271
  244. package/src/plugins/command/exportPdf.js +0 -168
  245. package/src/plugins/fileBrowser/imageGallery.js +0 -81
  246. package/src/themes/test.css +0 -61
  247. package/typings/CommandPlugin.d.ts +0 -8
  248. package/typings/DialogPlugin.d.ts +0 -20
  249. package/typings/FileBrowserPlugin.d.ts +0 -30
  250. package/typings/Module.d.ts +0 -15
  251. package/typings/Plugin.d.ts +0 -42
  252. package/typings/SubmenuPlugin.d.ts +0 -8
  253. package/typings/_classes.d.ts +0 -17
  254. package/typings/_colorPicker.d.ts +0 -60
  255. package/typings/_core.d.ts +0 -55
  256. package/typings/align.d.ts +0 -5
  257. package/typings/audio.d.ts +0 -5
  258. package/typings/backgroundColor.d.ts +0 -5
  259. package/typings/blockquote.d.ts +0 -5
  260. package/typings/char.d.ts +0 -39
  261. package/typings/component.d.ts +0 -38
  262. package/typings/context.d.ts +0 -39
  263. package/typings/converter.d.ts +0 -33
  264. package/typings/dialog.d.ts +0 -28
  265. package/typings/domUtils.d.ts +0 -361
  266. package/typings/editor.d.ts +0 -7
  267. package/typings/editor.ts +0 -542
  268. package/typings/env.d.ts +0 -70
  269. package/typings/eventManager.d.ts +0 -37
  270. package/typings/events.d.ts +0 -262
  271. package/typings/fileBrowser.d.ts +0 -42
  272. package/typings/fileManager.d.ts +0 -67
  273. package/typings/font.d.ts +0 -5
  274. package/typings/fontColor.d.ts +0 -5
  275. package/typings/fontSize.d.ts +0 -5
  276. package/typings/format.d.ts +0 -191
  277. package/typings/formatBlock.d.ts +0 -5
  278. package/typings/history.d.ts +0 -48
  279. package/typings/horizontalRule.d.ts +0 -5
  280. package/typings/image.d.ts +0 -5
  281. package/typings/imageGallery.d.ts +0 -5
  282. package/typings/index.d.ts +0 -21
  283. package/typings/index.modules.d.ts +0 -11
  284. package/typings/index.plugins.d.ts +0 -58
  285. package/typings/lineHeight.d.ts +0 -5
  286. package/typings/link.d.ts +0 -5
  287. package/typings/list.d.ts +0 -5
  288. package/typings/math.d.ts +0 -5
  289. package/typings/mediaContainer.d.ts +0 -25
  290. package/typings/mention.d.ts +0 -5
  291. package/typings/node.d.ts +0 -57
  292. package/typings/notice.d.ts +0 -16
  293. package/typings/numbers.d.ts +0 -29
  294. package/typings/offset.d.ts +0 -24
  295. package/typings/options.d.ts +0 -589
  296. package/typings/paragraphStyle.d.ts +0 -5
  297. package/typings/resizing.d.ts +0 -141
  298. package/typings/selection.d.ts +0 -94
  299. package/typings/shortcuts.d.ts +0 -13
  300. package/typings/suneditor.d.ts +0 -9
  301. package/typings/table.d.ts +0 -5
  302. package/typings/template.d.ts +0 -5
  303. package/typings/textStyle.d.ts +0 -5
  304. package/typings/toolbar.d.ts +0 -32
  305. package/typings/unicode.d.ts +0 -25
  306. package/typings/video.d.ts +0 -5
@@ -2,44 +2,79 @@ import CoreInjector from '../editorInjector/_core';
2
2
  import ApiManager from './ApiManager';
3
3
 
4
4
  /**
5
- *
6
- * @param {*} inst
7
- * @param {{ query: string, loadHandler: Function, eventHandler: Function, figure: Figure instance | null }} params
5
+ * @typedef {Object} FileStateInfo
6
+ * @property {string} src File source
7
+ * @property {number} index File index
8
+ * @property {string} name File name
9
+ * @property {number} size File size
8
10
  */
9
- const FileManager = function (inst, params) {
10
- CoreInjector.call(this, inst.editor);
11
-
12
- // members
13
- inst.__fileManagement = this;
14
- this.kind = inst.constructor.key || inst.constructor.name;
15
- this.inst = inst;
16
- this.component = inst.editor.component;
17
- this.query = params.query;
18
- this.loadHandler = params.loadHandler;
19
- this.eventHandler = params.eventHandler;
20
- this.infoList = [];
21
- this.infoIndex = 0;
22
- this.uploadFileLength = 0;
23
- this.__updateTags = [];
24
- // api manager
25
- this.apiManager = new ApiManager(this, null);
26
- };
27
-
28
- FileManager.prototype = {
11
+
12
+ /**
13
+ * @typedef {Object} FileStateParams
14
+ * @property {__se__EditorCore} editor - The root editor instance
15
+ * @property {Node} element File element
16
+ * @property {number} index File index
17
+ * @property {string} state File state ("create"|"update"|"delete")
18
+ * @property {FileStateInfo} info File information
19
+ * @property {number} remainingFilesCount Remaining file count
20
+ * @property {string} pluginName Plugin name
21
+ */
22
+
23
+ /**
24
+ * @typedef {Object} FileManagerParams
25
+ * @property {string} query The query selector used to find file elements in the editor
26
+ * @property {(params: Array<FileStateInfo>) => void=} loadHandler A function to handle the loaded file information
27
+ * @property {(info: FileStateParams) => void=} eventHandler A function to handle file-related events
28
+ */
29
+
30
+ /**
31
+ * @class
32
+ * @description This module manages the file information of the editor.
33
+ */
34
+ class FileManager extends CoreInjector {
35
+ /**
36
+ * @constructor
37
+ * @param {*} inst The instance object that called the constructor.
38
+ * @param {FileManagerParams} params FileManager options
39
+ */
40
+ constructor(inst, params) {
41
+ super(inst.editor);
42
+ this.ui = this.editor.ui;
43
+
44
+ // members
45
+ inst.__fileManagement = this;
46
+ this.kind = inst.constructor.key || inst.constructor.name;
47
+ this.inst = inst;
48
+ this.component = inst.editor.component;
49
+ this.query = params.query;
50
+ this.loadHandler = params.loadHandler;
51
+ this.eventHandler = params.eventHandler;
52
+ this.infoList = [];
53
+ this.infoIndex = 0;
54
+ this.uploadFileLength = 0;
55
+ this.__updateTags = [];
56
+ // api manager
57
+ this.apiManager = new ApiManager(this, null);
58
+
59
+ // se-ts-ignore - call by editor
60
+ void this._resetInfo;
61
+ void this._checkInfo;
62
+ }
63
+
29
64
  /**
30
65
  * @description Upload the file to the server.
31
66
  * @param {string} uploadUrl Upload server url
32
- * @param {Object|null} uploadHeader Request header
33
- * @param {Files|{FormData, size}} data FormData in body or Files array
34
- * @param {Function|null} callBack Success call back function
35
- * @param {Function|null} errorCallBack Error call back function
67
+ * @param {?Object<string, string>} uploadHeader Request header
68
+ * @param {FileList|File[]|{formData: FormData, size: number}} data FormData in body or Files array
69
+ * @param {?(xmlHttp: XMLHttpRequest) => boolean=} callBack Success call back function
70
+ * @param {?(res: *, xmlHttp: XMLHttpRequest) => string=} errorCallBack Error call back function
36
71
  */
37
72
  upload(uploadUrl, uploadHeader, data, callBack, errorCallBack) {
38
- this.editor.showLoading();
73
+ this.ui.showLoading();
39
74
 
40
75
  let formData = null;
41
76
  // create formData
42
- if (data.length) {
77
+ if ('length' in data) {
43
78
  formData = new FormData();
44
79
  for (let i = 0, len = data.length; i < len; i++) {
45
80
  formData.append('file-' + i, data[i]);
@@ -51,20 +86,21 @@ FileManager.prototype = {
51
86
  }
52
87
 
53
88
  this.apiManager.call({ method: 'POST', url: uploadUrl, headers: uploadHeader, data: formData, callBack, errorCallBack });
54
- },
89
+ }
55
90
 
56
91
  /**
57
92
  * @description Upload the file to the server.
58
93
  * @param {string} uploadUrl Upload server url
59
- * @param {Object|null} uploadHeader Request header
60
- * @param {Files|{FormData, size}} data FormData in body or Files array
94
+ * @param {?Object<string, string>} uploadHeader Request header
95
+ * @param {FileList|File[]|{formData: FormData, size: number}} data FormData in body or Files array
96
+ * @returns {Promise<XMLHttpRequest>}
61
97
  */
62
98
  async asyncUpload(uploadUrl, uploadHeader, data) {
63
- this.editor.showLoading();
99
+ this.ui.showLoading();
64
100
 
65
101
  let formData = null;
66
102
  // create formData
67
- if (data.length) {
103
+ if ('length' in data) {
68
104
  formData = new FormData();
69
105
  for (let i = 0, len = data.length; i < len; i++) {
70
106
  formData.append('file-' + i, data[i]);
@@ -76,44 +112,52 @@ FileManager.prototype = {
76
112
  }
77
113
 
78
114
  return await this.apiManager.asyncCall({ method: 'POST', url: uploadUrl, headers: uploadHeader, data: formData });
79
- },
115
+ }
80
116
 
117
+ /**
118
+ * @description Set the file information to the element.
119
+ * @param {Node} element File information element
120
+ * @param {Object} params
121
+ * @param {string} params.name File name
122
+ * @param {number} params.size File size
123
+ * @returns
124
+ */
81
125
  setFileData(element, { name, size }) {
82
126
  if (!element) return;
83
- element.setAttribute('data-se-file-name', name);
84
- element.setAttribute('data-se-file-size', size);
85
- },
127
+ /** @type {Element} */ (element).setAttribute('data-se-file-name', name);
128
+ /** @type {Element} */ (element).setAttribute('data-se-file-size', size + '');
129
+ }
86
130
 
87
131
  /**
88
- * @description Create info object of file and add it to "infoList"
89
132
  * @private
90
- * @param {Element} element
91
- * @param {Object|null} file
133
+ * @description Create info object of file and add it to "infoList"
134
+ * @param {HTMLMediaElement} element
135
+ * @param {{name: string, size: number}|null} file File information
92
136
  */
93
137
  _setInfo(element, file) {
94
- let dataIndex = element.getAttribute('data-se-index');
138
+ let dataIndex = Number(GetAttr(element, 'index'));
95
139
  let info = null;
96
140
  let state = '';
97
141
 
98
142
  if (!file) {
99
143
  file = {
100
- name: element.getAttribute('data-se-file-name') || (typeof element.src === 'string' ? element.src.split('/').pop() : ''),
101
- size: element.getAttribute('data-se-file-size') || 0
144
+ name: GetAttr(element, 'file-name') || (typeof element.src === 'string' ? element.src.split('/').pop() : ''),
145
+ size: Number(GetAttr(element, 'file-size')) || 0
102
146
  };
103
147
  }
104
148
 
105
149
  // create
106
- if (!dataIndex || this._componentsInfoInit) {
150
+ if (!dataIndex || this.editor._componentsInfoInit) {
107
151
  state = 'create';
108
152
  dataIndex = this.infoIndex++;
109
153
 
110
- element.setAttribute('data-se-index', dataIndex);
154
+ element.setAttribute('data-se-index', dataIndex + '');
111
155
  element.setAttribute('data-se-file-name', file.name);
112
- element.setAttribute('data-se-file-size', file.size);
156
+ element.setAttribute('data-se-file-size', file.size + '');
113
157
 
114
158
  info = {
115
159
  src: element.src,
116
- index: dataIndex * 1,
160
+ index: dataIndex,
117
161
  name: file.name,
118
162
  size: file.size
119
163
  };
@@ -140,27 +184,36 @@ FileManager.prototype = {
140
184
  }
141
185
 
142
186
  info.src = element.src;
143
- info.name = element.getAttribute('data-se-file-name');
144
- info.size = element.getAttribute('data-se-file-size') * 1;
187
+ info.name = GetAttr(element, 'file-name');
188
+ info.size = Number(GetAttr(element, 'file-size'));
145
189
  }
146
190
 
147
191
  // method bind
148
192
  info.element = element;
193
+
149
194
  info.delete = function (el) {
150
195
  if (typeof this.inst.destroy === 'function') this.inst.destroy.call(this.inst, el);
151
- this._deleteInfo(el.getAttribute('data-se-index') * 1);
196
+ this._deleteInfo(Number(GetAttr(el, 'index')));
152
197
  }.bind(this, element);
198
+ // se-ts-ignore
199
+ void this._deleteInfo;
200
+
153
201
  info.select = function (el) {
154
- el.scrollIntoView(true);
155
- if (typeof this.inst.select === 'function') this._w.setTimeout(this.inst.select.bind(this.inst, el), 0);
202
+ el.scrollIntoView(this.options.get('componentScrollToOptions'));
203
+ const comp = this.component.get(el);
204
+ if (comp) {
205
+ this.component.select(comp.target, comp.pluginName, false);
206
+ } else if (typeof this.inst.select === 'function') {
207
+ this.inst.select(el);
208
+ }
156
209
  }.bind(this, element);
157
210
 
158
- const params = { editor: this.editor, element, index: dataIndex, state, info, remainingFilesCount: --this.uploadFileLength < 0 ? 0 : this.uploadFileLength };
211
+ const params = { editor: this.editor, element, index: dataIndex, state, info, remainingFilesCount: --this.uploadFileLength < 0 ? 0 : this.uploadFileLength, pluginName: this.kind };
159
212
  if (typeof this.eventHandler === 'function') {
160
213
  this.eventHandler(params);
161
214
  }
162
215
  this.triggerEvent('onFileManagerAction', { ...params, pluginName: this.kind });
163
- },
216
+ }
164
217
 
165
218
  /**
166
219
  * @description Gets the sum of the sizes of the currently saved files.
@@ -172,18 +225,19 @@ FileManager.prototype = {
172
225
  size += this.infoList[i].size * 1;
173
226
  }
174
227
  return size;
175
- },
228
+ }
176
229
 
177
230
  /**
178
- * @description Checke the file's information and modify the tag that does not fit the format.
179
231
  * @private
232
+ * @description Checke the file's information and modify the tag that does not fit the format.
233
+ * @param {boolean} loaded Whether the editor is loaded
180
234
  */
181
235
  _checkInfo(loaded) {
182
236
  const tags = [].slice.call(this.editor.frameContext.get('wysiwyg').querySelectorAll(this.query));
183
237
  const infoList = this.infoList;
184
238
  if (tags.length === infoList.length) {
185
239
  // reset
186
- if (this._componentsInfoReset) {
240
+ if (this.editor._componentsInfoReset) {
187
241
  for (let i = 0, len = tags.length; i < len; i++) {
188
242
  this._setInfo(tags[i], null);
189
243
  }
@@ -194,7 +248,7 @@ FileManager.prototype = {
194
248
  info = infoList[i];
195
249
  if (
196
250
  tags.filter(function (t) {
197
- return info.src === t.src && info.index.toString() === t.getAttribute('data-se-index');
251
+ return info.src === t.src && info.index.toString() === GetAttr(t, 'index');
198
252
  }).length === 0
199
253
  ) {
200
254
  infoUpdate = true;
@@ -217,12 +271,12 @@ FileManager.prototype = {
217
271
 
218
272
  while (tags.length > 0) {
219
273
  const tag = tags.shift();
220
- if (!tag.getAttribute('data-se-index') || !infoIndex.includes(tag.getAttribute('data-se-index') * 1)) {
274
+ if (!GetAttr(tag, 'index') || !infoIndex.includes(Number(GetAttr(tag, 'index')))) {
221
275
  currentTags.push(this.infoIndex);
222
276
  tag.removeAttribute('data-se-index');
223
277
  this._setInfo(tag, null);
224
278
  } else {
225
- currentTags.push(tag.getAttribute('data-se-index') * 1);
279
+ currentTags.push(Number(GetAttr(tag, 'index')));
226
280
  }
227
281
  }
228
282
 
@@ -238,7 +292,7 @@ FileManager.prototype = {
238
292
 
239
293
  infoList.splice(i, 1);
240
294
 
241
- const params = { editor: this.editor, element: null, index: dataIndex, state: 'delete', info: null, remainingFilesCount: 0 };
295
+ const params = { editor: this.editor, element: null, index: dataIndex, state: 'delete', info: null, remainingFilesCount: 0, pluginName: this.kind };
242
296
  if (typeof this.eventHandler === 'function') {
243
297
  this.eventHandler(params);
244
298
  }
@@ -246,16 +300,15 @@ FileManager.prototype = {
246
300
 
247
301
  i--;
248
302
  }
249
- },
303
+ }
250
304
 
251
305
  /**
252
- * @description Reset info object and "infoList = []", "infoIndex = 0"
253
- * @param {string} this.kind Plugin name
254
306
  * @private
307
+ * @description Reset info object and "infoList = []", "infoIndex = 0"
255
308
  */
256
309
  _resetInfo() {
257
310
  const eh = typeof this.eventHandler === 'function';
258
- const params = { editor: this.editor, element: null, state: 'delete', info: null, remainingFilesCount: 0 };
311
+ const params = { editor: this.editor, element: null, state: 'delete', info: null, remainingFilesCount: 0, pluginName: this.kind };
259
312
  for (let i = 0, len = this.infoList.length; i < len; i++) {
260
313
  if (eh) this.eventHandler({ ...params, index: this.infoList[i].index, pluginName: this.kind });
261
314
  this.triggerEvent('onFileManagerAction', { ...params, index: this.infoList[i].index, pluginName: this.kind });
@@ -263,12 +316,12 @@ FileManager.prototype = {
263
316
 
264
317
  this.infoList = [];
265
318
  this.infoIndex = 0;
266
- },
319
+ }
267
320
 
268
321
  /**
322
+ * @private
269
323
  * @description Delete info object at "infoList"
270
324
  * @param {number} index index of info object infoList[].index)
271
- * @private
272
325
  */
273
326
  _deleteInfo(index) {
274
327
  if (index >= 0) {
@@ -276,15 +329,31 @@ FileManager.prototype = {
276
329
  if (index === this.infoList[i].index) {
277
330
  this.infoList.splice(i, 1);
278
331
  if (typeof this.eventHandler === 'function') {
279
- this.eventHandler({ editor: this.editor, element: null, index, state: 'delete', info: null, remainingFilesCount: 0 });
332
+ this.eventHandler({ editor: this.editor, element: null, index, state: 'delete', info: null, remainingFilesCount: 0, pluginName: this.kind });
280
333
  }
281
334
  return;
282
335
  }
283
336
  }
284
337
  }
285
- },
338
+ }
339
+ }
286
340
 
287
- constructor: FileManager
288
- };
341
+ /**
342
+ * @private
343
+ * @param {Element} element - Element
344
+ * @param {string} name - Attribute name
345
+ * @returns {string|null}
346
+ */
347
+ function GetAttr(element, name) {
348
+ const seAttr = element.getAttribute(`data-se-${name}`);
349
+ if (seAttr) return seAttr;
350
+
351
+ // v2-migration
352
+ const v2SeAttr = element.getAttribute(`data-${name}`);
353
+ if (!v2SeAttr) return null;
354
+ element.removeAttribute(`data-${name}`);
355
+ element.setAttribute(`data-se-${name}`, v2SeAttr);
356
+ return v2SeAttr;
357
+ }
289
358
 
290
359
  export default FileManager;
@@ -1,4 +1,8 @@
1
- import { domUtils, env } from '../helper';
1
+ /**
2
+ * @fileoverview Implements HueSlider.
3
+ */
4
+
5
+ import { dom, env } from '../helper';
2
6
  import Controller from './Controller';
3
7
 
4
8
  const { isMobile } = env;
@@ -41,9 +45,9 @@ function CreateSliderCtx() {
41
45
  </div>
42
46
  `;
43
47
 
44
- const slider = domUtils.createElement('DIV', { class: 'se-hue-slider' }, html);
45
- const wheelCanvas = slider.querySelector('.se-hue-wheel');
46
- const gradientBarCanvas = slider.querySelector('.se-hue-gradient');
48
+ const slider = dom.utils.createElement('DIV', { class: 'se-hue-slider' }, html);
49
+ const wheelCanvas = /** @type {HTMLCanvasElement} */ (slider.querySelector('.se-hue-wheel'));
50
+ const gradientBarCanvas = /** @type {HTMLCanvasElement} */ (slider.querySelector('.se-hue-gradient'));
47
51
  const currentColors = slider.querySelector('.se-hue-final-hex').children;
48
52
 
49
53
  return {
@@ -52,71 +56,110 @@ function CreateSliderCtx() {
52
56
  offscreenCtx: offscreenCanvas.getContext('2d'),
53
57
  wheel: wheelCanvas,
54
58
  wheelCtx: wheelCanvas.getContext('2d'),
55
- wheelPointer: slider.querySelector('.se-hue-wheel-pointer'),
59
+ wheelPointer: /** @type {HTMLElement} */ (slider.querySelector('.se-hue-wheel-pointer')),
56
60
  gradientBar: gradientBarCanvas,
57
- gradientPointer: slider.querySelector('.se-hue-gradient-pointer'),
58
- fanalColorHex: currentColors[0],
59
- fanalColorBackground: currentColors[1]
61
+ gradientPointer: /** @type {HTMLElement} */ (slider.querySelector('.se-hue-gradient-pointer')),
62
+ fanalColorHex: /** @type {HTMLElement} */ (currentColors[0]),
63
+ fanalColorBackground: /** @type {HTMLElement} */ (currentColors[1])
60
64
  };
61
65
  }
62
66
 
63
67
  /**
68
+ * @typedef {import('../modules/Controller').ControllerParams} ControllerParams
69
+ */
70
+
71
+ /**
72
+ * @typedef {Object} HueSliderColor
73
+ * @property {string} hex - HEX color
74
+ * @property {number} r - Red color value
75
+ * @property {number} g - Green color value
76
+ * @property {number} b - Blue color value
77
+ * @property {number} h - Hue color value
78
+ * @property {number} s - Saturation color value
79
+ * @property {number} l - Lightness color value
80
+ */
81
+
82
+ /**
83
+ * @typedef {Object} HueSliderParams
84
+ * @property {Node} [form] The form element to attach the hue slider.
85
+ * @property {boolean} [isNewForm] Whether to create a new form element.
86
+ * @property {ControllerParams} [controllerOptions] Controller options
87
+ */
88
+
89
+ /**
90
+ * @class
64
91
  * @description Create a Hue slider. (only create one at a time)
65
- * When you call the .attach() method, the hue slider is appended to the form element.
92
+ * - When you call the .attach() method, the hue slider is appended to the form element.
66
93
  * It must be called every time it is used.
67
- * @param {{form: Element}} params {form: Element}
68
94
  */
69
- const HueSlider = function (inst, params, className) {
70
- if (!params) params = {};
71
-
72
- this.editor = inst.editor;
73
- this.eventManager = inst.eventManager;
74
- this.inst = inst;
75
-
76
- // members
77
- this.form = params.form;
78
- this.ctx = {
79
- wheelX: wheelX,
80
- wheelY: wheelY,
81
- lightness: LIGHTNESS,
82
- wheelPointerX: '50%',
83
- wheelPointerY: '50%',
84
- gradientPointerX: 'calc(100% - 14px)',
85
- color: DEFAULT_COLOR_VALUE
86
- };
87
- this.isOpen = false;
88
- this.controlle = null;
89
- this.__globalMouseDown = null;
90
- this.__globalMouseMove = null;
91
- this.__globalMouseUp = null;
92
-
93
- // init default controller
94
- if (!params.isNewForm) {
95
- const hueController = CreateHTML_basicControllerForm(inst.editor, className);
96
- this.form = hueController.querySelector('.se-hue');
97
- this.controller = new Controller(this, hueController, { position: 'top', isWWTarget: false, ...params.controllerOptions });
98
-
99
- // buttons
100
- this.eventManager.addEvent(hueController.querySelector('.se-btn-success'), 'click', () => {
101
- inst.hueSliderAction(this.get());
102
- this.close();
103
- });
104
- this.eventManager.addEvent(hueController.querySelector('.se-btn-danger'), 'click', () => {
105
- this.close();
106
- });
95
+ class HueSlider {
96
+ /**
97
+ * @constructor
98
+ * @param {*} inst The instance object that called the constructor.
99
+ * @param {HueSliderParams} [params={}] Hue slider options
100
+ * @param {string} [className=""] The class name of the hue slider.
101
+ */
102
+ constructor(inst, params, className) {
103
+ if (!params) params = {};
104
+
105
+ this.editor = inst.editor;
106
+ this.eventManager = inst.eventManager;
107
+ this.inst = inst;
108
+
109
+ // members
110
+ this.form = params.form;
111
+ this.ctx = {
112
+ wheelX: wheelX,
113
+ wheelY: wheelY,
114
+ lightness: LIGHTNESS,
115
+ wheelPointerX: '50%',
116
+ wheelPointerY: '50%',
117
+ gradientPointerX: 'calc(100% - 14px)',
118
+ color: DEFAULT_COLOR_VALUE
119
+ };
120
+ this.isOpen = false;
121
+ this.controlle = null;
122
+ this.__globalMouseDown = null;
123
+ this.__globalMouseMove = null;
124
+ this.__globalMouseUp = null;
125
+
126
+ // init default controller
127
+ if (!params.isNewForm) {
128
+ const hueController = CreateHTML_basicControllerForm(inst.editor, className);
129
+ this.form = hueController.querySelector('.se-hue');
130
+ this.controller = new Controller(this, hueController, { position: 'top', isWWTarget: false, ...params.controllerOptions });
131
+
132
+ // buttons
133
+ this.eventManager.addEvent(hueController.querySelector('.se-btn-success'), 'click', () => {
134
+ inst.hueSliderAction(this.get());
135
+ this.close();
136
+ });
137
+ this.eventManager.addEvent(hueController.querySelector('.se-btn-danger'), 'click', () => {
138
+ this.close();
139
+ });
140
+ }
107
141
  }
108
- };
109
142
 
110
- HueSlider.prototype = {
143
+ /**
144
+ * @description Get the current color information.
145
+ * @returns {HueSliderColor} color information
146
+ */
111
147
  get() {
112
148
  return finalColor;
113
- },
149
+ }
114
150
 
151
+ /**
152
+ * @description Open the hue slider.
153
+ * @param {Node} target The element to attach the hue slider.
154
+ */
115
155
  open(target) {
116
156
  this.attach();
117
157
  this.controller.open(target, null, { isWWTarget: false, initMethod: null, addOffset: null });
118
- },
158
+ }
119
159
 
160
+ /**
161
+ * @description Reset information and close the hue slider.
162
+ */
120
163
  off() {
121
164
  this.ctx = {
122
165
  gradientPointerX: gradientPointer.style.left,
@@ -130,13 +173,21 @@ HueSlider.prototype = {
130
173
 
131
174
  this.controller.close();
132
175
  this.init();
133
- },
176
+ }
134
177
 
178
+ /**
179
+ * @description Close the hue slider. (include off method)
180
+ * - Call the instance's hueSliderCancelAction method.
181
+ */
135
182
  close() {
136
183
  this.off();
137
184
  this.inst.hueSliderCancelAction();
138
- },
185
+ }
139
186
 
187
+ /**
188
+ * @description Attach the hue slider to the form element.
189
+ * @param {?Node=} form The element to attach the hue slider.
190
+ */
140
191
  attach(form) {
141
192
  // drow
142
193
  this.init();
@@ -176,12 +227,15 @@ HueSlider.prototype = {
176
227
  moveEvent.func = OnTouchmove;
177
228
  }
178
229
 
179
- this.__globalMouseDown = this.eventManager.addGlobalEvent(downEvent.name, downEvent.func, { passive: false, useCapture: true });
230
+ this.__globalMouseDown = this.eventManager.addGlobalEvent(downEvent.name, downEvent.func, { passive: false, capture: true });
180
231
  this.__globalMouseMove = this.eventManager.addGlobalEvent(moveEvent.name, moveEvent.func, true);
181
232
  this.__globalMouseUp = this.eventManager.addGlobalEvent(upEvent.name, upEvent.func, true);
182
233
  this.isOpen = true;
183
- },
234
+ }
184
235
 
236
+ /**
237
+ * @description Initialize the hue slider information.
238
+ */
185
239
  init() {
186
240
  this.isOpen = false;
187
241
  isWheelragging = false;
@@ -189,10 +243,8 @@ HueSlider.prototype = {
189
243
  if (this.__globalMouseDown) this.__globalMouseDown = this.eventManager.removeGlobalEvent(this.__globalMouseDown);
190
244
  if (this.__globalMouseMove) this.__globalMouseMove = this.eventManager.removeGlobalEvent(this.__globalMouseMove);
191
245
  if (this.__globalMouseUp) this.__globalMouseUp = this.eventManager.removeGlobalEvent(this.__globalMouseUp);
192
- },
193
-
194
- constructor: HueSlider
195
- };
246
+ }
247
+ }
196
248
 
197
249
  // init
198
250
  const { slider, offscreenCanvas, offscreenCtx, wheel, wheelCtx, wheelPointer, gradientBar, gradientPointer, fanalColorHex, fanalColorBackground } = CreateSliderCtx();
@@ -495,7 +547,7 @@ drawColorWheelToContext(offscreenCtx);
495
547
  drawColorWheel();
496
548
 
497
549
  function CreateHTML_basicControllerForm({ lang, icons }, className) {
498
- const hueController = domUtils.createElement(
550
+ const hueController = dom.utils.createElement(
499
551
  'DIV',
500
552
  { class: `se-controller ${className}` },
501
553
  /*html*/ `