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
@@ -1,37 +1,140 @@
1
1
  import CoreInjector from '../editorInjector/_core';
2
- import { CreateTooltipInner } from '../core/section/constructor';
3
-
4
- const Modal = function (inst, element) {
5
- CoreInjector.call(this, inst.editor);
6
-
7
- // members
8
- this.inst = inst;
9
- this.kind = inst.constructor.key || inst.constructor.name;
10
- this.form = element;
11
- this.focusElement = element.querySelector('[data-focus]');
12
- this.isUpdate = false;
13
- this._modalArea = this.carrierWrapper.querySelector('.se-modal');
14
- this._modalBack = this.carrierWrapper.querySelector('.se-modal-back');
15
- this._modalInner = this.carrierWrapper.querySelector('.se-modal-inner');
16
- this._closeListener = [CloseListener.bind(this), OnClick_dialog.bind(this)];
17
- this._bindClose = null;
18
- this._onClickEvent = null;
19
- this._closeSignal = false;
20
-
21
- // add element
22
- this._modalInner.appendChild(element);
23
-
24
- // init
25
- this.eventManager.addEvent(element.querySelector('form'), 'submit', Action.bind(this));
26
- this._closeSignal = !this.eventManager.addEvent(element.querySelector('[data-command="close"]'), 'click', this.close.bind(this));
27
- };
28
-
29
- Modal.prototype = {
2
+ import { dom, env, keyCodeMap } from '../helper';
3
+
4
+ const { _w } = env;
5
+ const DIRECTION_CURSOR_MAP = { w: 'ns-resize', h: 'ew-resize', c: 'nwse-resize', wRTL: 'ns-resize', hRTL: 'ew-resize', cRTL: 'nesw-resize' };
6
+
7
+ /**
8
+ * @class
9
+ * @description Modal window module
10
+ */
11
+ class Modal extends CoreInjector {
12
+ /**
13
+ * @description Modal window module
14
+ * @param {* & {editor: __se__EditorCore}} inst The instance object that called the constructor.
15
+ * @param {Element} element Modal element
16
+ */
17
+ constructor(inst, element) {
18
+ super(inst.editor);
19
+ this.offset = this.editor.offset;
20
+ this.ui = this.editor.ui;
21
+
22
+ // members
23
+ this.inst = inst;
24
+ this.kind = inst.constructor.key || inst.constructor.name;
25
+ this.form = /** @type {HTMLElement} */ (element);
26
+ this.isUpdate = false;
27
+
28
+ /** @type {HTMLInputElement} */
29
+ this.focusElement = element.querySelector('[data-focus]');
30
+ /** @type {HTMLElement} */
31
+ this._modalArea = this.carrierWrapper.querySelector('.se-modal');
32
+ /** @type {HTMLElement} */
33
+ this._modalInner = this.carrierWrapper.querySelector('.se-modal .se-modal-inner');
34
+
35
+ this._closeListener = [this.#CloseListener.bind(this), this.#OnClick_dialog.bind(this)];
36
+ this._bindClose = null;
37
+ this._onClickEvent = null;
38
+ this._closeSignal = false;
39
+
40
+ // resie
41
+ /** @type {HTMLElement} */
42
+ this._resizeBody = null;
43
+
44
+ // add element
45
+ this._modalInner.appendChild(element);
46
+
47
+ // init
48
+ this.eventManager.addEvent(element.querySelector('form'), 'submit', this.#Action.bind(this));
49
+ this._closeSignal = !this.eventManager.addEvent(element.querySelector('[data-command="close"]'), 'click', this.close.bind(this));
50
+
51
+ // resize
52
+ if (element.querySelector('.se-modal-resize-handle-w') || element.querySelector('.se-modal-resize-handle-h') || element.querySelector('.se-modal-resize-handle-c') || element.querySelector('.se-modal-resize-form')) {
53
+ if (!(this._resizeBody = element.querySelector('.se-modal-resize-form')) && (this._resizeBody = element.querySelector('.se-modal-body'))) {
54
+ this.eventManager.addEvent(element.querySelector('.se-modal-resize-handle-w'), 'mousedown', this.#OnResizeMouseDown.bind(this, 'w'));
55
+ this.eventManager.addEvent(element.querySelector('.se-modal-resize-handle-h'), 'mousedown', this.#OnResizeMouseDown.bind(this, 'h'));
56
+ this.eventManager.addEvent(element.querySelector('.se-modal-resize-handle-c'), 'mousedown', this.#OnResizeMouseDown.bind(this, 'c'));
57
+
58
+ this._currentHandle = null;
59
+ this.__resizeDir = '';
60
+ this.__offetTop = 0;
61
+ this.__offetLeft = 0;
62
+ this.__globalEventHandlers = {
63
+ mousemove: this.#OnResize.bind(this),
64
+ mouseup: this.#OnResizeMouseUp.bind(this)
65
+ };
66
+ this._bindClose_mousemove = null;
67
+ this._bindClose_mouseup = null;
68
+ }
69
+ }
70
+ }
71
+
72
+ /**
73
+ * @description Create a file input tag in the modal window.
74
+ * @param {{icons: __se__EditorCore['icons'], lang: __se__EditorCore['lang']}} param0 - icons and language object
75
+ * @param {{acceptedFormats: string, allowMultiple}} param1 - options
76
+ * - acceptedFormats: "image/*, video/*, audio/*", etc.
77
+ * - allowMultiple: true or false
78
+ * @returns {string} HTML string
79
+ */
80
+ static CreateFileInput({ icons, lang }, { acceptedFormats, allowMultiple }) {
81
+ return /*html*/ `
82
+ <div class="se-modal-form-files">
83
+ <div class="se-flex-input-wrapper">
84
+ <div class="se-input-form-abs">
85
+ <div>
86
+ <div class="se-input-file-w">
87
+ <div class="se-input-file-icon-up">${icons.upload_tray}</div>
88
+ <div class="se-input-file-icon-files">${icons.file_plus}</div>
89
+ <span class="se-input-file-cnt"></span>
90
+ </div>
91
+ </div>
92
+ </div>
93
+ <input class="se-input-form __se__file_input" data-focus type="file" accept="${acceptedFormats}"${allowMultiple ? ' multiple="multiple"' : ''}/>
94
+ </div>
95
+ <button type="button" class="se-btn se-modal-files-edge-button se-file-remove se-tooltip" aria-label="${lang.remove}">
96
+ ${icons.selection_remove}
97
+ ${dom.utils.createTooltipInner(lang.remove)}
98
+ </button>
99
+ </div>`;
100
+ }
101
+
102
+ /**
103
+ * @description A function called when the contents of "input" have changed and you want to adjust the style.
104
+ * @param {Element} wrapper - Modal file input wrapper(.se-flex-input-wrapper)
105
+ * @param {FileList|File[]} files - FileList object
106
+ */
107
+ static OnChangeFile(wrapper, files) {
108
+ if (!wrapper || !files) return;
109
+
110
+ const fileCnt = /** @type {HTMLElement} */ (wrapper.querySelector('.se-input-file-cnt'));
111
+ const fileUp = /** @type {HTMLElement} */ (wrapper.querySelector('.se-input-file-icon-up'));
112
+ const fileSelected = /** @type {HTMLElement} */ (wrapper.querySelector('.se-input-file-icon-files'));
113
+
114
+ if (files.length > 1) {
115
+ fileUp.style.display = 'none';
116
+ fileSelected.style.display = 'inline-block';
117
+ fileCnt.style.display = '';
118
+ fileCnt.textContent = ` ..${files.length}`;
119
+ } else if (files.length > 0) {
120
+ fileUp.style.display = 'none';
121
+ fileSelected.style.display = 'none';
122
+ fileCnt.style.display = 'block';
123
+ fileCnt.textContent = files[0].name;
124
+ } else {
125
+ fileUp.style.display = 'inline-block';
126
+ fileSelected.style.display = 'none';
127
+ fileCnt.style.display = '';
128
+ fileCnt.textContent = '';
129
+ }
130
+ }
131
+
30
132
  /**
31
133
  * @description Open a modal plugin
134
+ * - The plugin's "init" method is called.
32
135
  */
33
136
  open() {
34
- this.editor._offCurrentModal();
137
+ this.ui._offCurrentModal();
35
138
  this._fixCurrentController(true);
36
139
 
37
140
  if (this._closeSignal) this._modalInner.addEventListener('click', this._closeListener[1]);
@@ -43,135 +146,201 @@ Modal.prototype = {
43
146
  if (!this.isUpdate && typeof this.inst.init === 'function') this.inst.init();
44
147
  if (typeof this.inst.on === 'function') this.inst.on(this.isUpdate);
45
148
 
46
- this._modalArea.style.display = 'block';
47
- this._modalBack.style.display = 'block';
48
- this._modalInner.style.display = 'block';
49
- this.form.style.display = 'block';
149
+ dom.utils.addClass(this._modalArea, 'se-backdrop-show');
150
+ dom.utils.addClass(this.form, 'se-modal-show');
151
+
152
+ if (this._resizeBody) {
153
+ const offset = this._saveOffset();
154
+ const { maxWidth, maxHeight } = _w.getComputedStyle(this.form);
155
+ const mw = `${this.form.offsetWidth - offset.width}px`;
156
+ const mh = `${this.form.offsetTop + (this.form.offsetHeight - this._resizeBody.offsetHeight)}px`;
157
+ // set max
158
+ if (maxWidth && typeof this.__resizeDir === 'string') dom.utils.setStyle(this._resizeBody, 'max-width', `calc(${maxWidth} - ${mw})`);
159
+ if (maxHeight) dom.utils.setStyle(this._resizeBody, 'max-height', `calc(${maxHeight} - ${mh})`);
160
+ }
50
161
 
51
162
  if (this.focusElement) this.focusElement.focus();
52
- },
163
+ }
53
164
 
54
165
  /**
55
166
  * @description Close a modal plugin
56
- * The plugin's "init" method is called.
167
+ * - The plugin's "init" and "off" method is called.
57
168
  */
58
169
  close() {
170
+ this.__removeGlobalEvent();
59
171
  this._fixCurrentController(false);
60
- this.editor.opendModal = null;
172
+ _w.setTimeout(() => {
173
+ this.editor.opendModal = null;
174
+ }, 0);
61
175
 
62
176
  if (this._closeSignal) this._modalInner.removeEventListener('click', this._closeListener[1]);
63
177
  if (this._bindClose) this._bindClose = this.eventManager.removeGlobalEvent(this._bindClose);
64
178
 
65
179
  // close
66
- this.form.style.display = 'none';
67
- this._modalBack.style.display = 'none';
68
- this._modalArea.style.display = 'none';
180
+ dom.utils.removeClass(this._modalArea, 'se-backdrop-show');
181
+ dom.utils.removeClass(this.form, 'se-modal-show');
69
182
 
70
183
  if (typeof this.inst.init === 'function') this.inst.init();
184
+ if (typeof this.inst.off === 'function') this.inst.off(this.isUpdate);
71
185
  this.editor.focus();
72
- },
186
+ }
73
187
 
188
+ /**
189
+ * @private
190
+ * @description Fixes the current controller's display state when the modal is opened or closed.
191
+ * @param {boolean} fixed - Whether to fix or unfix the controller.
192
+ */
74
193
  _fixCurrentController(fixed) {
75
194
  const cont = this.editor.opendControllers;
76
195
  for (let i = 0; i < cont.length; i++) {
77
196
  cont[i].fixed = fixed;
78
197
  cont[i].form.style.display = fixed ? 'none' : 'block';
79
198
  }
80
- },
199
+ }
200
+
201
+ /**
202
+ * @private
203
+ * @description Saves the current offset position of the modal for resizing calculations.
204
+ * @returns {__se__Class_OffsetGlobalInfo} The offset position of the modal.
205
+ */
206
+ _saveOffset() {
207
+ const offset = this.offset.getGlobal(this._resizeBody);
208
+ this.__offetTop = offset.top;
209
+ this.__offetLeft = offset.left;
210
+ return offset;
211
+ }
81
212
 
82
- constructor: Modal
83
- };
213
+ /**
214
+ * @private
215
+ * @description Adds global event listeners for resizing the modal.
216
+ * @param {string} dir - The direction in which resizing is occurring.
217
+ */
218
+ __addGlobalEvent(dir) {
219
+ this.__removeGlobalEvent();
220
+ this.ui.enableBackWrapper(DIRECTION_CURSOR_MAP[dir]);
221
+ this._bindClose_mousemove = this.eventManager.addGlobalEvent('mousemove', this.__globalEventHandlers.mousemove, true);
222
+ this._bindClose_mouseup = this.eventManager.addGlobalEvent('mouseup', this.__globalEventHandlers.mouseup, true);
223
+ }
84
224
 
85
- /**
86
- * The loading bar is executed before "modalAction" is executed.
87
- * return type -
88
- * true : the loading bar and modal window are closed.
89
- * false : only the loading bar is closed.
90
- * undefined : only the modal window is closed.
91
- * -
92
- * exception occurs : the modal window and loading bar are closed.
93
- */
94
- async function Action(e) {
95
- e.preventDefault();
96
- e.stopPropagation();
225
+ /**
226
+ * @private
227
+ * @description Removes global event listeners related to modal resizing.
228
+ */
229
+ __removeGlobalEvent() {
230
+ this.ui.disableBackWrapper();
231
+ if (this._bindClose_mousemove) this._bindClose_mousemove = this.eventManager.removeGlobalEvent(this._bindClose_mousemove);
232
+ if (this._bindClose_mouseup) this._bindClose_mouseup = this.eventManager.removeGlobalEvent(this._bindClose_mouseup);
233
+ }
97
234
 
98
- this.editor.showLoading();
235
+ /**
236
+ * The loading bar is executed before "modalAction" is executed.
237
+ * return type -
238
+ * true : the loading bar and modal window are closed.
239
+ * false : only the loading bar is closed.
240
+ * undefined : only the modal window is closed.
241
+ * -
242
+ * exception occurs : the modal window and loading bar are closed.
243
+ * @param {SubmitEvent} e - Event object
244
+ */
245
+ async #Action(e) {
246
+ e.preventDefault();
247
+ e.stopPropagation();
99
248
 
100
- try {
101
- const result = await this.inst.modalAction();
102
- if (result === false) {
103
- this.editor.hideLoading();
104
- } else if (result === undefined) {
249
+ this.ui.showLoading();
250
+
251
+ try {
252
+ const result = await this.inst.modalAction();
253
+ if (result === false) {
254
+ this.ui.hideLoading();
255
+ } else if (result === undefined) {
256
+ this.close();
257
+ } else {
258
+ this.close();
259
+ this.ui.hideLoading();
260
+ }
261
+ } catch (error) {
105
262
  this.close();
106
- } else {
263
+ this.ui.hideLoading();
264
+ throw Error(`[SUNEDITOR.Modal[${this.kind}].warn] ${error.message}`);
265
+ }
266
+ }
267
+
268
+ /**
269
+ * @param {MouseEvent} e - Event object
270
+ */
271
+ #OnClick_dialog(e) {
272
+ const eventTarget = dom.query.getEventTarget(e);
273
+ if (/close/.test(eventTarget.getAttribute('data-command')) || eventTarget === this._modalInner) {
107
274
  this.close();
108
- this.editor.hideLoading();
109
275
  }
110
- } catch (error) {
111
- this.close();
112
- this.editor.hideLoading();
113
- throw Error(`[SUNEDITOR.Modal[${this.kind}].warn] ${error.message}`);
114
276
  }
115
- }
116
277
 
117
- function OnClick_dialog(e) {
118
- if (/close/.test(e.target.getAttribute('data-command')) || e.target === this._modalInner) {
278
+ /**
279
+ * @param {KeyboardEvent} e - Event object
280
+ */
281
+ #CloseListener(e) {
282
+ if (!keyCodeMap.isEsc(e.code)) return;
119
283
  this.close();
120
284
  }
121
- }
122
285
 
123
- function CloseListener(e) {
124
- if (!/27/.test(e.keyCode)) return;
125
- this.close();
126
- }
286
+ /** ---------- Resize events ---------- */
287
+ /**
288
+ * @param {string} dir - The direction in which the resize handle is located.
289
+ * @param {MouseEvent} e - Event object
290
+ */
291
+ #OnResizeMouseDown(dir, e) {
292
+ this._currentHandle = dom.query.getEventTarget(e);
293
+ dom.utils.addClass(this._currentHandle, 'active');
294
+ this.__addGlobalEvent((this.__resizeDir = dir + (this.options.get('_rtl') ? 'RTL' : '')));
295
+ }
127
296
 
128
- // HTML Creator ======================================================================================================
129
-
130
- // Create a file input tag
131
- Modal.CreateFileInput = function ({ icons, lang }, { acceptedFormats, allowMultiple }) {
132
- return /*html*/ `
133
- <div class="se-modal-form-files">
134
- <div class="se-flex-input-wrapper">
135
- <div class="se-input-form-abs">
136
- <div>
137
- <div class="se-input-file-w">
138
- <div class="se-input-file-icon-up">${icons.upload_tray}</div>
139
- <div class="se-input-file-icon-files">${icons.file_plus}</div>
140
- <span class="se-input-file-cnt"></span>
141
- </div>
142
- </div>
143
- </div>
144
- <input class="se-input-form __se__file_input" data-focus type="file" accept="${acceptedFormats}"${allowMultiple ? ' multiple="multiple"' : ''}/>
145
- </div>
146
- <button type="button" class="se-btn se-modal-files-edge-button se-file-remove se-tooltip" aria-label="${lang.remove}">
147
- ${icons.selection_remove}
148
- ${CreateTooltipInner(lang.remove)}
149
- </button>
150
- </div>`;
151
- };
152
- Modal.OnChangeFile = function (wrapper, files) {
153
- if (!wrapper || !files) return;
154
-
155
- const fileCnt = wrapper.querySelector('.se-input-file-cnt');
156
- const fileUp = wrapper.querySelector('.se-input-file-icon-up');
157
- const fileSelected = wrapper.querySelector('.se-input-file-icon-files');
158
-
159
- if (files.length > 1) {
160
- fileUp.style.display = 'none';
161
- fileSelected.style.display = 'inline-block';
162
- fileCnt.style.display = '';
163
- fileCnt.textContent = ` ..${files.length}`;
164
- } else if (files.length > 0) {
165
- fileUp.style.display = 'none';
166
- fileSelected.style.display = 'none';
167
- fileCnt.style.display = 'block';
168
- fileCnt.textContent = files[0].name;
169
- } else {
170
- fileUp.style.display = 'inline-block';
171
- fileSelected.style.display = 'none';
172
- fileCnt.style.display = '';
173
- fileCnt.textContent = '';
297
+ /**
298
+ * @param {MouseEvent} e - Event object
299
+ */
300
+ #OnResize(e) {
301
+ switch (this.__resizeDir) {
302
+ case 'w':
303
+ case 'wRTL': {
304
+ const h = e.clientY - this.__offetTop - this._resizeBody.offsetHeight;
305
+ this._resizeBody.style.height = this._resizeBody.offsetHeight + h + 'px';
306
+ break;
307
+ }
308
+ case 'h': {
309
+ const w = e.clientX - this.__offetLeft - this._resizeBody.offsetWidth;
310
+ this._resizeBody.style.width = this._resizeBody.offsetWidth + w + 'px';
311
+ break;
312
+ }
313
+ case 'hRTL': {
314
+ const w = this.__offetLeft - e.clientX;
315
+ this._resizeBody.style.width = this._resizeBody.offsetWidth + w + 'px';
316
+ break;
317
+ }
318
+ case 'c': {
319
+ const w = e.clientX - this.__offetLeft - this._resizeBody.offsetWidth;
320
+ const h = e.clientY - this.__offetTop - this._resizeBody.offsetHeight;
321
+ this._resizeBody.style.width = this._resizeBody.offsetWidth + w + 'px';
322
+ this._resizeBody.style.height = this._resizeBody.offsetHeight + h + 'px';
323
+ break;
324
+ }
325
+ case 'cRTL': {
326
+ const w = this.__offetLeft - e.clientX;
327
+ const h = e.clientY - this.__offetTop - this._resizeBody.offsetHeight;
328
+ this._resizeBody.style.width = this._resizeBody.offsetWidth + w + 'px';
329
+ this._resizeBody.style.height = this._resizeBody.offsetHeight + h + 'px';
330
+ break;
331
+ }
332
+ }
333
+
334
+ this._saveOffset();
335
+
336
+ if (typeof this.inst.modalResize === 'function') this.inst.modalResize();
174
337
  }
175
- };
338
+
339
+ #OnResizeMouseUp() {
340
+ dom.utils.removeClass(this._currentHandle, 'active');
341
+ this._currentHandle = null;
342
+ this.__removeGlobalEvent();
343
+ }
344
+ }
176
345
 
177
346
  export default Modal;