suneditor 3.0.0-alpha.9 → 3.0.0-beta.2

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 (315) hide show
  1. package/CONTRIBUTING.md +170 -22
  2. package/{LICENSE.txt → LICENSE} +9 -9
  3. package/README.md +168 -30
  4. package/dist/suneditor.min.css +1 -1
  5. package/dist/suneditor.min.js +1 -1
  6. package/package.json +47 -21
  7. package/src/assets/design/color.css +121 -0
  8. package/src/assets/design/index.css +3 -0
  9. package/src/assets/design/size.css +35 -0
  10. package/src/assets/design/typography.css +37 -0
  11. package/src/assets/icons/defaultIcons.js +232 -0
  12. package/src/assets/suneditor-contents.css +181 -46
  13. package/src/assets/suneditor.css +1403 -650
  14. package/src/core/base/eventHandlers/handler_toolbar.js +35 -14
  15. package/src/core/base/eventHandlers/handler_ww_clipboard.js +23 -4
  16. package/src/core/base/eventHandlers/handler_ww_dragDrop.js +49 -10
  17. package/src/core/base/eventHandlers/handler_ww_key_input.js +422 -224
  18. package/src/core/base/eventHandlers/handler_ww_mouse.js +83 -36
  19. package/src/core/base/eventManager.js +520 -179
  20. package/src/core/base/history.js +95 -41
  21. package/src/core/class/char.js +26 -11
  22. package/src/core/class/component.js +345 -137
  23. package/src/core/class/format.js +683 -519
  24. package/src/core/class/html.js +485 -305
  25. package/src/core/class/menu.js +133 -47
  26. package/src/core/class/nodeTransform.js +90 -71
  27. package/src/core/class/offset.js +408 -92
  28. package/src/core/class/selection.js +216 -106
  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 +422 -0
  32. package/src/core/class/viewer.js +178 -74
  33. package/src/core/editor.js +496 -389
  34. package/src/core/section/actives.js +123 -27
  35. package/src/core/section/constructor.js +615 -206
  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/events.js +622 -0
  42. package/src/helper/clipboard.js +59 -0
  43. package/src/helper/converter.js +202 -26
  44. package/src/helper/dom/domCheck.js +304 -0
  45. package/src/helper/dom/domQuery.js +669 -0
  46. package/src/helper/dom/domUtils.js +557 -0
  47. package/src/helper/dom/index.js +12 -0
  48. package/src/helper/env.js +46 -56
  49. package/src/helper/index.js +10 -4
  50. package/src/helper/keyCodeMap.js +183 -0
  51. package/src/helper/numbers.js +12 -8
  52. package/src/helper/unicode.js +9 -5
  53. package/src/langs/ckb.js +74 -4
  54. package/src/langs/cs.js +72 -2
  55. package/src/langs/da.js +73 -3
  56. package/src/langs/de.js +73 -4
  57. package/src/langs/en.js +23 -3
  58. package/src/langs/es.js +73 -4
  59. package/src/langs/fa.js +75 -3
  60. package/src/langs/fr.js +73 -3
  61. package/src/langs/he.js +73 -4
  62. package/src/langs/hu.js +230 -0
  63. package/src/langs/index.js +7 -3
  64. package/src/langs/it.js +70 -1
  65. package/src/langs/ja.js +72 -4
  66. package/src/langs/km.js +230 -0
  67. package/src/langs/ko.js +22 -2
  68. package/src/langs/lv.js +74 -5
  69. package/src/langs/nl.js +73 -4
  70. package/src/langs/pl.js +73 -4
  71. package/src/langs/pt_br.js +70 -1
  72. package/src/langs/ro.js +74 -5
  73. package/src/langs/ru.js +73 -4
  74. package/src/langs/se.js +73 -4
  75. package/src/langs/tr.js +73 -1
  76. package/src/langs/{ua.js → uk.js} +75 -6
  77. package/src/langs/ur.js +77 -8
  78. package/src/langs/zh_cn.js +74 -5
  79. package/src/modules/ApiManager.js +77 -54
  80. package/src/modules/Browser.js +667 -0
  81. package/src/modules/ColorPicker.js +162 -102
  82. package/src/modules/Controller.js +273 -142
  83. package/src/modules/Figure.js +925 -484
  84. package/src/modules/FileManager.js +121 -69
  85. package/src/modules/HueSlider.js +113 -61
  86. package/src/modules/Modal.js +291 -122
  87. package/src/modules/ModalAnchorEditor.js +383 -234
  88. package/src/modules/SelectMenu.js +270 -168
  89. package/src/modules/_DragHandle.js +2 -1
  90. package/src/modules/index.js +3 -3
  91. package/src/plugins/browser/audioGallery.js +83 -0
  92. package/src/plugins/browser/fileBrowser.js +103 -0
  93. package/src/plugins/browser/fileGallery.js +83 -0
  94. package/src/plugins/browser/imageGallery.js +81 -0
  95. package/src/plugins/browser/videoGallery.js +103 -0
  96. package/src/plugins/command/blockquote.js +40 -27
  97. package/src/plugins/command/exportPDF.js +134 -0
  98. package/src/plugins/command/fileUpload.js +229 -162
  99. package/src/plugins/command/list_bulleted.js +83 -47
  100. package/src/plugins/command/list_numbered.js +83 -47
  101. package/src/plugins/dropdown/align.js +66 -54
  102. package/src/plugins/dropdown/backgroundColor.js +63 -49
  103. package/src/plugins/dropdown/font.js +71 -47
  104. package/src/plugins/dropdown/fontColor.js +63 -48
  105. package/src/plugins/dropdown/formatBlock.js +70 -33
  106. package/src/plugins/dropdown/hr.js +92 -51
  107. package/src/plugins/dropdown/layout.js +37 -26
  108. package/src/plugins/dropdown/lineHeight.js +54 -38
  109. package/src/plugins/dropdown/list.js +60 -45
  110. package/src/plugins/dropdown/paragraphStyle.js +51 -30
  111. package/src/plugins/dropdown/table.js +2003 -813
  112. package/src/plugins/dropdown/template.js +38 -26
  113. package/src/plugins/dropdown/textStyle.js +43 -31
  114. package/src/plugins/field/mention.js +147 -86
  115. package/src/plugins/index.js +32 -6
  116. package/src/plugins/input/fontSize.js +161 -108
  117. package/src/plugins/input/pageNavigator.js +70 -0
  118. package/src/plugins/modal/audio.js +358 -173
  119. package/src/plugins/modal/drawing.js +531 -0
  120. package/src/plugins/modal/embed.js +886 -0
  121. package/src/plugins/modal/image.js +674 -362
  122. package/src/plugins/modal/link.js +100 -71
  123. package/src/plugins/modal/math.js +367 -167
  124. package/src/plugins/modal/video.js +691 -335
  125. package/src/plugins/popup/anchor.js +222 -0
  126. package/src/suneditor.js +50 -13
  127. package/src/themes/dark.css +122 -0
  128. package/src/typedef.js +130 -0
  129. package/types/assets/icons/defaultIcons.d.ts +153 -0
  130. package/types/core/base/eventHandlers/handler_toolbar.d.ts +41 -0
  131. package/types/core/base/eventHandlers/handler_ww_clipboard.d.ts +40 -0
  132. package/types/core/base/eventHandlers/handler_ww_dragDrop.d.ts +35 -0
  133. package/types/core/base/eventHandlers/handler_ww_key_input.d.ts +45 -0
  134. package/types/core/base/eventHandlers/handler_ww_mouse.d.ts +39 -0
  135. package/types/core/base/eventManager.d.ts +385 -0
  136. package/types/core/base/history.d.ts +81 -0
  137. package/types/core/class/char.d.ts +60 -0
  138. package/types/core/class/component.d.ts +212 -0
  139. package/types/core/class/format.d.ts +616 -0
  140. package/types/core/class/html.d.ts +422 -0
  141. package/types/core/class/menu.d.ts +126 -0
  142. package/types/core/class/nodeTransform.d.ts +93 -0
  143. package/types/core/class/offset.d.ts +522 -0
  144. package/types/core/class/selection.d.ts +188 -0
  145. package/types/core/class/shortcuts.d.ts +142 -0
  146. package/types/core/class/toolbar.d.ts +189 -0
  147. package/types/core/class/ui.d.ts +164 -0
  148. package/types/core/class/viewer.d.ts +140 -0
  149. package/types/core/editor.d.ts +610 -0
  150. package/types/core/section/actives.d.ts +46 -0
  151. package/types/core/section/constructor.d.ts +777 -0
  152. package/types/core/section/context.d.ts +45 -0
  153. package/types/core/section/documentType.d.ts +178 -0
  154. package/types/editorInjector/_classes.d.ts +41 -0
  155. package/types/editorInjector/_core.d.ts +92 -0
  156. package/types/editorInjector/index.d.ts +71 -0
  157. package/types/events.d.ts +273 -0
  158. package/types/helper/clipboard.d.ts +12 -0
  159. package/types/helper/converter.d.ts +197 -0
  160. package/types/helper/dom/domCheck.d.ts +189 -0
  161. package/types/helper/dom/domQuery.d.ts +223 -0
  162. package/types/helper/dom/domUtils.d.ts +226 -0
  163. package/types/helper/dom/index.d.ts +9 -0
  164. package/types/helper/env.d.ts +132 -0
  165. package/types/helper/index.d.ts +174 -0
  166. package/types/helper/keyCodeMap.d.ts +110 -0
  167. package/types/helper/numbers.d.ts +46 -0
  168. package/types/helper/unicode.d.ts +28 -0
  169. package/types/index.d.ts +120 -0
  170. package/{typings/Lang.d.ts → types/langs/_Lang.d.ts} +173 -103
  171. package/types/langs/ckb.d.ts +3 -0
  172. package/types/langs/cs.d.ts +3 -0
  173. package/types/langs/da.d.ts +3 -0
  174. package/types/langs/de.d.ts +3 -0
  175. package/types/langs/en.d.ts +3 -0
  176. package/types/langs/es.d.ts +3 -0
  177. package/types/langs/fa.d.ts +3 -0
  178. package/types/langs/fr.d.ts +3 -0
  179. package/types/langs/he.d.ts +3 -0
  180. package/types/langs/hu.d.ts +3 -0
  181. package/types/langs/index.d.ts +54 -0
  182. package/types/langs/it.d.ts +3 -0
  183. package/types/langs/ja.d.ts +3 -0
  184. package/types/langs/km.d.ts +3 -0
  185. package/types/langs/ko.d.ts +3 -0
  186. package/types/langs/lv.d.ts +3 -0
  187. package/types/langs/nl.d.ts +3 -0
  188. package/types/langs/pl.d.ts +3 -0
  189. package/types/langs/pt_br.d.ts +3 -0
  190. package/types/langs/ro.d.ts +3 -0
  191. package/types/langs/ru.d.ts +3 -0
  192. package/types/langs/se.d.ts +3 -0
  193. package/types/langs/tr.d.ts +3 -0
  194. package/types/langs/uk.d.ts +3 -0
  195. package/types/langs/ur.d.ts +3 -0
  196. package/types/langs/zh_cn.d.ts +3 -0
  197. package/types/modules/ApiManager.d.ts +125 -0
  198. package/types/modules/Browser.d.ts +326 -0
  199. package/types/modules/ColorPicker.d.ts +131 -0
  200. package/types/modules/Controller.d.ts +251 -0
  201. package/types/modules/Figure.d.ts +517 -0
  202. package/types/modules/FileManager.d.ts +202 -0
  203. package/types/modules/HueSlider.d.ts +136 -0
  204. package/types/modules/Modal.d.ts +111 -0
  205. package/types/modules/ModalAnchorEditor.d.ts +236 -0
  206. package/types/modules/SelectMenu.d.ts +194 -0
  207. package/types/modules/_DragHandle.d.ts +7 -0
  208. package/types/modules/index.d.ts +26 -0
  209. package/types/plugins/browser/audioGallery.d.ts +55 -0
  210. package/types/plugins/browser/fileBrowser.d.ts +64 -0
  211. package/types/plugins/browser/fileGallery.d.ts +55 -0
  212. package/types/plugins/browser/imageGallery.d.ts +51 -0
  213. package/types/plugins/browser/videoGallery.d.ts +57 -0
  214. package/types/plugins/command/blockquote.d.ts +28 -0
  215. package/types/plugins/command/exportPDF.d.ts +46 -0
  216. package/types/plugins/command/fileUpload.d.ts +156 -0
  217. package/types/plugins/command/list_bulleted.d.ts +46 -0
  218. package/types/plugins/command/list_numbered.d.ts +46 -0
  219. package/types/plugins/dropdown/align.d.ts +60 -0
  220. package/types/plugins/dropdown/backgroundColor.d.ts +63 -0
  221. package/types/plugins/dropdown/font.d.ts +54 -0
  222. package/types/plugins/dropdown/fontColor.d.ts +63 -0
  223. package/types/plugins/dropdown/formatBlock.d.ts +54 -0
  224. package/types/plugins/dropdown/hr.d.ts +71 -0
  225. package/types/plugins/dropdown/layout.d.ts +40 -0
  226. package/types/plugins/dropdown/lineHeight.d.ts +50 -0
  227. package/types/plugins/dropdown/list.d.ts +39 -0
  228. package/types/plugins/dropdown/paragraphStyle.d.ts +54 -0
  229. package/types/plugins/dropdown/table.d.ts +627 -0
  230. package/types/plugins/dropdown/template.d.ts +40 -0
  231. package/types/plugins/dropdown/textStyle.d.ts +41 -0
  232. package/types/plugins/field/mention.d.ts +102 -0
  233. package/types/plugins/index.d.ts +107 -0
  234. package/types/plugins/input/fontSize.d.ts +170 -0
  235. package/types/plugins/input/pageNavigator.d.ts +28 -0
  236. package/types/plugins/modal/audio.d.ts +269 -0
  237. package/types/plugins/modal/drawing.d.ts +246 -0
  238. package/types/plugins/modal/embed.d.ts +387 -0
  239. package/types/plugins/modal/image.d.ts +451 -0
  240. package/types/plugins/modal/link.d.ts +128 -0
  241. package/types/plugins/modal/math.d.ts +193 -0
  242. package/types/plugins/modal/video.d.ts +485 -0
  243. package/types/plugins/popup/anchor.d.ts +56 -0
  244. package/types/suneditor.d.ts +51 -0
  245. package/types/typedef.d.ts +233 -0
  246. package/.eslintignore +0 -7
  247. package/.eslintrc.json +0 -64
  248. package/src/assets/icons/_default.js +0 -194
  249. package/src/core/base/events.js +0 -320
  250. package/src/core/class/notice.js +0 -42
  251. package/src/helper/domUtils.js +0 -1177
  252. package/src/modules/FileBrowser.js +0 -271
  253. package/src/plugins/command/exportPdf.js +0 -168
  254. package/src/plugins/fileBrowser/imageGallery.js +0 -81
  255. package/src/themes/test.css +0 -61
  256. package/typings/CommandPlugin.d.ts +0 -8
  257. package/typings/DialogPlugin.d.ts +0 -20
  258. package/typings/FileBrowserPlugin.d.ts +0 -30
  259. package/typings/Module.d.ts +0 -15
  260. package/typings/Plugin.d.ts +0 -42
  261. package/typings/SubmenuPlugin.d.ts +0 -8
  262. package/typings/_classes.d.ts +0 -17
  263. package/typings/_colorPicker.d.ts +0 -60
  264. package/typings/_core.d.ts +0 -55
  265. package/typings/align.d.ts +0 -5
  266. package/typings/audio.d.ts +0 -5
  267. package/typings/backgroundColor.d.ts +0 -5
  268. package/typings/blockquote.d.ts +0 -5
  269. package/typings/char.d.ts +0 -39
  270. package/typings/component.d.ts +0 -38
  271. package/typings/context.d.ts +0 -39
  272. package/typings/converter.d.ts +0 -33
  273. package/typings/dialog.d.ts +0 -28
  274. package/typings/domUtils.d.ts +0 -361
  275. package/typings/editor.d.ts +0 -7
  276. package/typings/editor.ts +0 -542
  277. package/typings/env.d.ts +0 -70
  278. package/typings/eventManager.d.ts +0 -37
  279. package/typings/events.d.ts +0 -262
  280. package/typings/fileBrowser.d.ts +0 -42
  281. package/typings/fileManager.d.ts +0 -67
  282. package/typings/font.d.ts +0 -5
  283. package/typings/fontColor.d.ts +0 -5
  284. package/typings/fontSize.d.ts +0 -5
  285. package/typings/format.d.ts +0 -191
  286. package/typings/formatBlock.d.ts +0 -5
  287. package/typings/history.d.ts +0 -48
  288. package/typings/horizontalRule.d.ts +0 -5
  289. package/typings/image.d.ts +0 -5
  290. package/typings/imageGallery.d.ts +0 -5
  291. package/typings/index.d.ts +0 -21
  292. package/typings/index.modules.d.ts +0 -11
  293. package/typings/index.plugins.d.ts +0 -58
  294. package/typings/lineHeight.d.ts +0 -5
  295. package/typings/link.d.ts +0 -5
  296. package/typings/list.d.ts +0 -5
  297. package/typings/math.d.ts +0 -5
  298. package/typings/mediaContainer.d.ts +0 -25
  299. package/typings/mention.d.ts +0 -5
  300. package/typings/node.d.ts +0 -57
  301. package/typings/notice.d.ts +0 -16
  302. package/typings/numbers.d.ts +0 -29
  303. package/typings/offset.d.ts +0 -24
  304. package/typings/options.d.ts +0 -589
  305. package/typings/paragraphStyle.d.ts +0 -5
  306. package/typings/resizing.d.ts +0 -141
  307. package/typings/selection.d.ts +0 -94
  308. package/typings/shortcuts.d.ts +0 -13
  309. package/typings/suneditor.d.ts +0 -9
  310. package/typings/table.d.ts +0 -5
  311. package/typings/template.d.ts +0 -5
  312. package/typings/textStyle.d.ts +0 -5
  313. package/typings/toolbar.d.ts +0 -32
  314. package/typings/unicode.d.ts +0 -25
  315. 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 = GetAttr(element, '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
144
  name: GetAttr(element, 'file-name') || (typeof element.src === 'string' ? element.src.split('/').pop() : ''),
101
- size: GetAttr(element, 'file-size') || 0
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
  };
@@ -141,31 +185,35 @@ FileManager.prototype = {
141
185
 
142
186
  info.src = element.src;
143
187
  info.name = GetAttr(element, 'file-name');
144
- info.size = GetAttr(element, 'file-size') * 1;
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(GetAttr(el, '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
202
  el.scrollIntoView(this.options.get('componentScrollToOptions'));
155
203
  const comp = this.component.get(el);
156
204
  if (comp) {
157
- this.component.select(comp.target, comp.pluginName, false);
205
+ this.component.select(comp.target, comp.pluginName);
158
206
  } else if (typeof this.inst.select === 'function') {
159
207
  this.inst.select(el);
160
208
  }
161
209
  }.bind(this, element);
162
210
 
163
- 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 };
164
212
  if (typeof this.eventHandler === 'function') {
165
213
  this.eventHandler(params);
166
214
  }
167
215
  this.triggerEvent('onFileManagerAction', { ...params, pluginName: this.kind });
168
- },
216
+ }
169
217
 
170
218
  /**
171
219
  * @description Gets the sum of the sizes of the currently saved files.
@@ -177,18 +225,19 @@ FileManager.prototype = {
177
225
  size += this.infoList[i].size * 1;
178
226
  }
179
227
  return size;
180
- },
228
+ }
181
229
 
182
230
  /**
183
- * @description Checke the file's information and modify the tag that does not fit the format.
184
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
185
234
  */
186
235
  _checkInfo(loaded) {
187
236
  const tags = [].slice.call(this.editor.frameContext.get('wysiwyg').querySelectorAll(this.query));
188
237
  const infoList = this.infoList;
189
238
  if (tags.length === infoList.length) {
190
239
  // reset
191
- if (this._componentsInfoReset) {
240
+ if (this.editor._componentsInfoReset) {
192
241
  for (let i = 0, len = tags.length; i < len; i++) {
193
242
  this._setInfo(tags[i], null);
194
243
  }
@@ -222,12 +271,12 @@ FileManager.prototype = {
222
271
 
223
272
  while (tags.length > 0) {
224
273
  const tag = tags.shift();
225
- if (!GetAttr(tag, 'index') || !infoIndex.includes(GetAttr(tag, 'index') * 1)) {
274
+ if (!GetAttr(tag, 'index') || !infoIndex.includes(Number(GetAttr(tag, 'index')))) {
226
275
  currentTags.push(this.infoIndex);
227
276
  tag.removeAttribute('data-se-index');
228
277
  this._setInfo(tag, null);
229
278
  } else {
230
- currentTags.push(GetAttr(tag, 'index') * 1);
279
+ currentTags.push(Number(GetAttr(tag, 'index')));
231
280
  }
232
281
  }
233
282
 
@@ -243,7 +292,7 @@ FileManager.prototype = {
243
292
 
244
293
  infoList.splice(i, 1);
245
294
 
246
- 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 };
247
296
  if (typeof this.eventHandler === 'function') {
248
297
  this.eventHandler(params);
249
298
  }
@@ -251,16 +300,15 @@ FileManager.prototype = {
251
300
 
252
301
  i--;
253
302
  }
254
- },
303
+ }
255
304
 
256
305
  /**
257
- * @description Reset info object and "infoList = []", "infoIndex = 0"
258
- * @param {string} this.kind Plugin name
259
306
  * @private
307
+ * @description Reset info object and "infoList = []", "infoIndex = 0"
260
308
  */
261
309
  _resetInfo() {
262
310
  const eh = typeof this.eventHandler === 'function';
263
- 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 };
264
312
  for (let i = 0, len = this.infoList.length; i < len; i++) {
265
313
  if (eh) this.eventHandler({ ...params, index: this.infoList[i].index, pluginName: this.kind });
266
314
  this.triggerEvent('onFileManagerAction', { ...params, index: this.infoList[i].index, pluginName: this.kind });
@@ -268,12 +316,12 @@ FileManager.prototype = {
268
316
 
269
317
  this.infoList = [];
270
318
  this.infoIndex = 0;
271
- },
319
+ }
272
320
 
273
321
  /**
322
+ * @private
274
323
  * @description Delete info object at "infoList"
275
324
  * @param {number} index index of info object infoList[].index)
276
- * @private
277
325
  */
278
326
  _deleteInfo(index) {
279
327
  if (index >= 0) {
@@ -281,17 +329,21 @@ FileManager.prototype = {
281
329
  if (index === this.infoList[i].index) {
282
330
  this.infoList.splice(i, 1);
283
331
  if (typeof this.eventHandler === 'function') {
284
- 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 });
285
333
  }
286
334
  return;
287
335
  }
288
336
  }
289
337
  }
290
- },
291
-
292
- constructor: FileManager
293
- };
338
+ }
339
+ }
294
340
 
341
+ /**
342
+ * @private
343
+ * @param {Element} element - Element
344
+ * @param {string} name - Attribute name
345
+ * @returns {string|null}
346
+ */
295
347
  function GetAttr(element, name) {
296
348
  const seAttr = element.getAttribute(`data-se-${name}`);
297
349
  if (seAttr) return seAttr;
@@ -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_hueSlider
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_hueSlider} [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*/ `