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.
- package/CONTRIBUTING.md +170 -22
- package/{LICENSE.txt → LICENSE} +9 -9
- package/README.md +168 -30
- package/dist/suneditor.min.css +1 -1
- package/dist/suneditor.min.js +1 -1
- package/package.json +47 -21
- package/src/assets/design/color.css +121 -0
- package/src/assets/design/index.css +3 -0
- package/src/assets/design/size.css +35 -0
- package/src/assets/design/typography.css +37 -0
- package/src/assets/icons/defaultIcons.js +232 -0
- package/src/assets/suneditor-contents.css +181 -46
- package/src/assets/suneditor.css +1403 -650
- package/src/core/base/eventHandlers/handler_toolbar.js +35 -14
- package/src/core/base/eventHandlers/handler_ww_clipboard.js +23 -4
- package/src/core/base/eventHandlers/handler_ww_dragDrop.js +49 -10
- package/src/core/base/eventHandlers/handler_ww_key_input.js +422 -224
- package/src/core/base/eventHandlers/handler_ww_mouse.js +83 -36
- package/src/core/base/eventManager.js +520 -179
- package/src/core/base/history.js +95 -41
- package/src/core/class/char.js +26 -11
- package/src/core/class/component.js +345 -137
- package/src/core/class/format.js +683 -519
- package/src/core/class/html.js +485 -305
- package/src/core/class/menu.js +133 -47
- package/src/core/class/nodeTransform.js +90 -71
- package/src/core/class/offset.js +408 -92
- package/src/core/class/selection.js +216 -106
- package/src/core/class/shortcuts.js +68 -8
- package/src/core/class/toolbar.js +106 -116
- package/src/core/class/ui.js +422 -0
- package/src/core/class/viewer.js +178 -74
- package/src/core/editor.js +496 -389
- package/src/core/section/actives.js +123 -27
- package/src/core/section/constructor.js +615 -206
- package/src/core/section/context.js +28 -23
- package/src/core/section/documentType.js +561 -0
- package/src/editorInjector/_classes.js +19 -5
- package/src/editorInjector/_core.js +71 -7
- package/src/editorInjector/index.js +63 -1
- package/src/events.js +622 -0
- package/src/helper/clipboard.js +59 -0
- package/src/helper/converter.js +202 -26
- package/src/helper/dom/domCheck.js +304 -0
- package/src/helper/dom/domQuery.js +669 -0
- package/src/helper/dom/domUtils.js +557 -0
- package/src/helper/dom/index.js +12 -0
- package/src/helper/env.js +46 -56
- package/src/helper/index.js +10 -4
- package/src/helper/keyCodeMap.js +183 -0
- package/src/helper/numbers.js +12 -8
- package/src/helper/unicode.js +9 -5
- package/src/langs/ckb.js +74 -4
- package/src/langs/cs.js +72 -2
- package/src/langs/da.js +73 -3
- package/src/langs/de.js +73 -4
- package/src/langs/en.js +23 -3
- package/src/langs/es.js +73 -4
- package/src/langs/fa.js +75 -3
- package/src/langs/fr.js +73 -3
- package/src/langs/he.js +73 -4
- package/src/langs/hu.js +230 -0
- package/src/langs/index.js +7 -3
- package/src/langs/it.js +70 -1
- package/src/langs/ja.js +72 -4
- package/src/langs/km.js +230 -0
- package/src/langs/ko.js +22 -2
- package/src/langs/lv.js +74 -5
- package/src/langs/nl.js +73 -4
- package/src/langs/pl.js +73 -4
- package/src/langs/pt_br.js +70 -1
- package/src/langs/ro.js +74 -5
- package/src/langs/ru.js +73 -4
- package/src/langs/se.js +73 -4
- package/src/langs/tr.js +73 -1
- package/src/langs/{ua.js → uk.js} +75 -6
- package/src/langs/ur.js +77 -8
- package/src/langs/zh_cn.js +74 -5
- package/src/modules/ApiManager.js +77 -54
- package/src/modules/Browser.js +667 -0
- package/src/modules/ColorPicker.js +162 -102
- package/src/modules/Controller.js +273 -142
- package/src/modules/Figure.js +925 -484
- package/src/modules/FileManager.js +121 -69
- package/src/modules/HueSlider.js +113 -61
- package/src/modules/Modal.js +291 -122
- package/src/modules/ModalAnchorEditor.js +383 -234
- package/src/modules/SelectMenu.js +270 -168
- package/src/modules/_DragHandle.js +2 -1
- package/src/modules/index.js +3 -3
- package/src/plugins/browser/audioGallery.js +83 -0
- package/src/plugins/browser/fileBrowser.js +103 -0
- package/src/plugins/browser/fileGallery.js +83 -0
- package/src/plugins/browser/imageGallery.js +81 -0
- package/src/plugins/browser/videoGallery.js +103 -0
- package/src/plugins/command/blockquote.js +40 -27
- package/src/plugins/command/exportPDF.js +134 -0
- package/src/plugins/command/fileUpload.js +229 -162
- package/src/plugins/command/list_bulleted.js +83 -47
- package/src/plugins/command/list_numbered.js +83 -47
- package/src/plugins/dropdown/align.js +66 -54
- package/src/plugins/dropdown/backgroundColor.js +63 -49
- package/src/plugins/dropdown/font.js +71 -47
- package/src/plugins/dropdown/fontColor.js +63 -48
- package/src/plugins/dropdown/formatBlock.js +70 -33
- package/src/plugins/dropdown/hr.js +92 -51
- package/src/plugins/dropdown/layout.js +37 -26
- package/src/plugins/dropdown/lineHeight.js +54 -38
- package/src/plugins/dropdown/list.js +60 -45
- package/src/plugins/dropdown/paragraphStyle.js +51 -30
- package/src/plugins/dropdown/table.js +2003 -813
- package/src/plugins/dropdown/template.js +38 -26
- package/src/plugins/dropdown/textStyle.js +43 -31
- package/src/plugins/field/mention.js +147 -86
- package/src/plugins/index.js +32 -6
- package/src/plugins/input/fontSize.js +161 -108
- package/src/plugins/input/pageNavigator.js +70 -0
- package/src/plugins/modal/audio.js +358 -173
- package/src/plugins/modal/drawing.js +531 -0
- package/src/plugins/modal/embed.js +886 -0
- package/src/plugins/modal/image.js +674 -362
- package/src/plugins/modal/link.js +100 -71
- package/src/plugins/modal/math.js +367 -167
- package/src/plugins/modal/video.js +691 -335
- package/src/plugins/popup/anchor.js +222 -0
- package/src/suneditor.js +50 -13
- package/src/themes/dark.css +122 -0
- package/src/typedef.js +130 -0
- package/types/assets/icons/defaultIcons.d.ts +153 -0
- package/types/core/base/eventHandlers/handler_toolbar.d.ts +41 -0
- package/types/core/base/eventHandlers/handler_ww_clipboard.d.ts +40 -0
- package/types/core/base/eventHandlers/handler_ww_dragDrop.d.ts +35 -0
- package/types/core/base/eventHandlers/handler_ww_key_input.d.ts +45 -0
- package/types/core/base/eventHandlers/handler_ww_mouse.d.ts +39 -0
- package/types/core/base/eventManager.d.ts +385 -0
- package/types/core/base/history.d.ts +81 -0
- package/types/core/class/char.d.ts +60 -0
- package/types/core/class/component.d.ts +212 -0
- package/types/core/class/format.d.ts +616 -0
- package/types/core/class/html.d.ts +422 -0
- package/types/core/class/menu.d.ts +126 -0
- package/types/core/class/nodeTransform.d.ts +93 -0
- package/types/core/class/offset.d.ts +522 -0
- package/types/core/class/selection.d.ts +188 -0
- package/types/core/class/shortcuts.d.ts +142 -0
- package/types/core/class/toolbar.d.ts +189 -0
- package/types/core/class/ui.d.ts +164 -0
- package/types/core/class/viewer.d.ts +140 -0
- package/types/core/editor.d.ts +610 -0
- package/types/core/section/actives.d.ts +46 -0
- package/types/core/section/constructor.d.ts +777 -0
- package/types/core/section/context.d.ts +45 -0
- package/types/core/section/documentType.d.ts +178 -0
- package/types/editorInjector/_classes.d.ts +41 -0
- package/types/editorInjector/_core.d.ts +92 -0
- package/types/editorInjector/index.d.ts +71 -0
- package/types/events.d.ts +273 -0
- package/types/helper/clipboard.d.ts +12 -0
- package/types/helper/converter.d.ts +197 -0
- package/types/helper/dom/domCheck.d.ts +189 -0
- package/types/helper/dom/domQuery.d.ts +223 -0
- package/types/helper/dom/domUtils.d.ts +226 -0
- package/types/helper/dom/index.d.ts +9 -0
- package/types/helper/env.d.ts +132 -0
- package/types/helper/index.d.ts +174 -0
- package/types/helper/keyCodeMap.d.ts +110 -0
- package/types/helper/numbers.d.ts +46 -0
- package/types/helper/unicode.d.ts +28 -0
- package/types/index.d.ts +120 -0
- package/{typings/Lang.d.ts → types/langs/_Lang.d.ts} +173 -103
- package/types/langs/ckb.d.ts +3 -0
- package/types/langs/cs.d.ts +3 -0
- package/types/langs/da.d.ts +3 -0
- package/types/langs/de.d.ts +3 -0
- package/types/langs/en.d.ts +3 -0
- package/types/langs/es.d.ts +3 -0
- package/types/langs/fa.d.ts +3 -0
- package/types/langs/fr.d.ts +3 -0
- package/types/langs/he.d.ts +3 -0
- package/types/langs/hu.d.ts +3 -0
- package/types/langs/index.d.ts +54 -0
- package/types/langs/it.d.ts +3 -0
- package/types/langs/ja.d.ts +3 -0
- package/types/langs/km.d.ts +3 -0
- package/types/langs/ko.d.ts +3 -0
- package/types/langs/lv.d.ts +3 -0
- package/types/langs/nl.d.ts +3 -0
- package/types/langs/pl.d.ts +3 -0
- package/types/langs/pt_br.d.ts +3 -0
- package/types/langs/ro.d.ts +3 -0
- package/types/langs/ru.d.ts +3 -0
- package/types/langs/se.d.ts +3 -0
- package/types/langs/tr.d.ts +3 -0
- package/types/langs/uk.d.ts +3 -0
- package/types/langs/ur.d.ts +3 -0
- package/types/langs/zh_cn.d.ts +3 -0
- package/types/modules/ApiManager.d.ts +125 -0
- package/types/modules/Browser.d.ts +326 -0
- package/types/modules/ColorPicker.d.ts +131 -0
- package/types/modules/Controller.d.ts +251 -0
- package/types/modules/Figure.d.ts +517 -0
- package/types/modules/FileManager.d.ts +202 -0
- package/types/modules/HueSlider.d.ts +136 -0
- package/types/modules/Modal.d.ts +111 -0
- package/types/modules/ModalAnchorEditor.d.ts +236 -0
- package/types/modules/SelectMenu.d.ts +194 -0
- package/types/modules/_DragHandle.d.ts +7 -0
- package/types/modules/index.d.ts +26 -0
- package/types/plugins/browser/audioGallery.d.ts +55 -0
- package/types/plugins/browser/fileBrowser.d.ts +64 -0
- package/types/plugins/browser/fileGallery.d.ts +55 -0
- package/types/plugins/browser/imageGallery.d.ts +51 -0
- package/types/plugins/browser/videoGallery.d.ts +57 -0
- package/types/plugins/command/blockquote.d.ts +28 -0
- package/types/plugins/command/exportPDF.d.ts +46 -0
- package/types/plugins/command/fileUpload.d.ts +156 -0
- package/types/plugins/command/list_bulleted.d.ts +46 -0
- package/types/plugins/command/list_numbered.d.ts +46 -0
- package/types/plugins/dropdown/align.d.ts +60 -0
- package/types/plugins/dropdown/backgroundColor.d.ts +63 -0
- package/types/plugins/dropdown/font.d.ts +54 -0
- package/types/plugins/dropdown/fontColor.d.ts +63 -0
- package/types/plugins/dropdown/formatBlock.d.ts +54 -0
- package/types/plugins/dropdown/hr.d.ts +71 -0
- package/types/plugins/dropdown/layout.d.ts +40 -0
- package/types/plugins/dropdown/lineHeight.d.ts +50 -0
- package/types/plugins/dropdown/list.d.ts +39 -0
- package/types/plugins/dropdown/paragraphStyle.d.ts +54 -0
- package/types/plugins/dropdown/table.d.ts +627 -0
- package/types/plugins/dropdown/template.d.ts +40 -0
- package/types/plugins/dropdown/textStyle.d.ts +41 -0
- package/types/plugins/field/mention.d.ts +102 -0
- package/types/plugins/index.d.ts +107 -0
- package/types/plugins/input/fontSize.d.ts +170 -0
- package/types/plugins/input/pageNavigator.d.ts +28 -0
- package/types/plugins/modal/audio.d.ts +269 -0
- package/types/plugins/modal/drawing.d.ts +246 -0
- package/types/plugins/modal/embed.d.ts +387 -0
- package/types/plugins/modal/image.d.ts +451 -0
- package/types/plugins/modal/link.d.ts +128 -0
- package/types/plugins/modal/math.d.ts +193 -0
- package/types/plugins/modal/video.d.ts +485 -0
- package/types/plugins/popup/anchor.d.ts +56 -0
- package/types/suneditor.d.ts +51 -0
- package/types/typedef.d.ts +233 -0
- package/.eslintignore +0 -7
- package/.eslintrc.json +0 -64
- package/src/assets/icons/_default.js +0 -194
- package/src/core/base/events.js +0 -320
- package/src/core/class/notice.js +0 -42
- package/src/helper/domUtils.js +0 -1177
- package/src/modules/FileBrowser.js +0 -271
- package/src/plugins/command/exportPdf.js +0 -168
- package/src/plugins/fileBrowser/imageGallery.js +0 -81
- package/src/themes/test.css +0 -61
- package/typings/CommandPlugin.d.ts +0 -8
- package/typings/DialogPlugin.d.ts +0 -20
- package/typings/FileBrowserPlugin.d.ts +0 -30
- package/typings/Module.d.ts +0 -15
- package/typings/Plugin.d.ts +0 -42
- package/typings/SubmenuPlugin.d.ts +0 -8
- package/typings/_classes.d.ts +0 -17
- package/typings/_colorPicker.d.ts +0 -60
- package/typings/_core.d.ts +0 -55
- package/typings/align.d.ts +0 -5
- package/typings/audio.d.ts +0 -5
- package/typings/backgroundColor.d.ts +0 -5
- package/typings/blockquote.d.ts +0 -5
- package/typings/char.d.ts +0 -39
- package/typings/component.d.ts +0 -38
- package/typings/context.d.ts +0 -39
- package/typings/converter.d.ts +0 -33
- package/typings/dialog.d.ts +0 -28
- package/typings/domUtils.d.ts +0 -361
- package/typings/editor.d.ts +0 -7
- package/typings/editor.ts +0 -542
- package/typings/env.d.ts +0 -70
- package/typings/eventManager.d.ts +0 -37
- package/typings/events.d.ts +0 -262
- package/typings/fileBrowser.d.ts +0 -42
- package/typings/fileManager.d.ts +0 -67
- package/typings/font.d.ts +0 -5
- package/typings/fontColor.d.ts +0 -5
- package/typings/fontSize.d.ts +0 -5
- package/typings/format.d.ts +0 -191
- package/typings/formatBlock.d.ts +0 -5
- package/typings/history.d.ts +0 -48
- package/typings/horizontalRule.d.ts +0 -5
- package/typings/image.d.ts +0 -5
- package/typings/imageGallery.d.ts +0 -5
- package/typings/index.d.ts +0 -21
- package/typings/index.modules.d.ts +0 -11
- package/typings/index.plugins.d.ts +0 -58
- package/typings/lineHeight.d.ts +0 -5
- package/typings/link.d.ts +0 -5
- package/typings/list.d.ts +0 -5
- package/typings/math.d.ts +0 -5
- package/typings/mediaContainer.d.ts +0 -25
- package/typings/mention.d.ts +0 -5
- package/typings/node.d.ts +0 -57
- package/typings/notice.d.ts +0 -16
- package/typings/numbers.d.ts +0 -29
- package/typings/offset.d.ts +0 -24
- package/typings/options.d.ts +0 -589
- package/typings/paragraphStyle.d.ts +0 -5
- package/typings/resizing.d.ts +0 -141
- package/typings/selection.d.ts +0 -94
- package/typings/shortcuts.d.ts +0 -13
- package/typings/suneditor.d.ts +0 -9
- package/typings/table.d.ts +0 -5
- package/typings/template.d.ts +0 -5
- package/typings/textStyle.d.ts +0 -5
- package/typings/toolbar.d.ts +0 -32
- package/typings/unicode.d.ts +0 -25
- package/typings/video.d.ts +0 -5
|
@@ -1,56 +1,76 @@
|
|
|
1
1
|
import CoreInjector from '../editorInjector/_core';
|
|
2
|
-
import {
|
|
2
|
+
import { dom, env, keyCodeMap } from '../helper';
|
|
3
3
|
|
|
4
4
|
const MENU_MIN_HEIGHT = 38;
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
* @
|
|
9
|
-
* @
|
|
7
|
+
* @typedef {Object} SelectMenuParams
|
|
8
|
+
* @property {string} position Position of the select menu, specified as "[left|right]-[middle|top|bottom]" or "[top|bottom]-[center|left|right]"
|
|
9
|
+
* @property {boolean} [checkList=false] Flag to determine if the checklist is enabled (true or false)
|
|
10
|
+
* @property {"rtl" | "ltr"} [dir="ltr"] Optional text direction: "rtl" for right-to-left, "ltr" for left-to-right
|
|
11
|
+
* @property {number} [splitNum=0] Optional split number for horizontal positioning; defines how many items per row
|
|
12
|
+
* @property {() => void=} openMethod Optional method to call when the menu is opened
|
|
13
|
+
* @property {() => void=} closeMethod Optional method to call when the menu is closed
|
|
10
14
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @class
|
|
18
|
+
* @description Creates a select menu
|
|
19
|
+
*/
|
|
20
|
+
class SelectMenu extends CoreInjector {
|
|
21
|
+
/**
|
|
22
|
+
* @constructor
|
|
23
|
+
* @param {*} inst The instance object that called the constructor.
|
|
24
|
+
* @param {SelectMenuParams} params Select menu options
|
|
25
|
+
*/
|
|
26
|
+
constructor(inst, params) {
|
|
27
|
+
// plugin bisic properties
|
|
28
|
+
super(inst.editor);
|
|
29
|
+
|
|
30
|
+
// members
|
|
31
|
+
this.kink = inst.constructor.key || inst.constructor.name;
|
|
32
|
+
this.inst = inst;
|
|
33
|
+
const positionItems = params.position.split('-');
|
|
34
|
+
this.form = null;
|
|
35
|
+
this.items = [];
|
|
36
|
+
/** @type {HTMLLIElement[]} */
|
|
37
|
+
this.menus = null;
|
|
38
|
+
this.menuLen = 0;
|
|
39
|
+
this.index = -1;
|
|
40
|
+
this.item = null;
|
|
41
|
+
this.isOpen = false;
|
|
42
|
+
this.checkList = !!params.checkList;
|
|
43
|
+
this.position = positionItems[0];
|
|
44
|
+
this.subPosition = positionItems[1];
|
|
45
|
+
this._dirPosition = /^(left|right)$/.test(this.position) ? (this.position === 'left' ? 'right' : 'left') : this.position;
|
|
46
|
+
this._dirSubPosition = /^(left|right)$/.test(this.subPosition) ? (this.subPosition === 'left' ? 'right' : 'left') : this.subPosition;
|
|
47
|
+
this._textDirDiff = params.dir === 'ltr' ? false : params.dir === 'rtl' ? true : null;
|
|
48
|
+
this.splitNum = params.splitNum || 0;
|
|
49
|
+
this.horizontal = !!this.splitNum;
|
|
50
|
+
this.openMethod = params.openMethod;
|
|
51
|
+
this.closeMethod = params.closeMethod;
|
|
52
|
+
this._refer = null;
|
|
53
|
+
this._keydownTarget = null;
|
|
54
|
+
this._selectMethod = null;
|
|
55
|
+
this._bindClose_key = null;
|
|
56
|
+
this._bindClose_mousedown = null;
|
|
57
|
+
this._bindClose_click = null;
|
|
58
|
+
this._closeSignal = false;
|
|
59
|
+
this.__events = null;
|
|
60
|
+
this.__eventHandlers = {
|
|
61
|
+
mousedown: this.#OnMousedown_list.bind(this),
|
|
62
|
+
mousemove: this.#OnMouseMove_list.bind(this),
|
|
63
|
+
click: this.#OnClick_list.bind(this),
|
|
64
|
+
keydown: this.#OnKeyDown_refer.bind(this)
|
|
65
|
+
};
|
|
66
|
+
this.__globalEventHandlers = { keydown: this.#CloseListener_key.bind(this), mousedown: this.#CloseListener_mousedown.bind(this), click: this.#CloseListener_click.bind(this) };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @description Creates the select menu items.
|
|
71
|
+
* @param {Array<string>|__se__NodeCollection} items - Command list of selectable items.
|
|
72
|
+
* @param {Array<string>|__se__NodeCollection} [menus] - Optional list of menu display elements; defaults to `items`.
|
|
73
|
+
*/
|
|
54
74
|
create(items, menus) {
|
|
55
75
|
this.form.firstElementChild.innerHTML = '';
|
|
56
76
|
menus = menus || items;
|
|
@@ -60,21 +80,27 @@ SelectMenu.prototype = {
|
|
|
60
80
|
this._createFormat(html);
|
|
61
81
|
html = '';
|
|
62
82
|
}
|
|
63
|
-
html += `<li class="se-select-item" data-index="${i}">${typeof menus[i] === 'string' ? menus[i] : menus[i].outerHTML}</li>`;
|
|
83
|
+
html += `<li class="se-select-item" data-index="${i}">${typeof menus[i] === 'string' ? menus[i] : /** @type {HTMLElement} */ (menus[i]).outerHTML}</li>`;
|
|
64
84
|
}
|
|
65
85
|
this._createFormat(html);
|
|
66
86
|
|
|
67
|
-
this.items = items;
|
|
68
|
-
this.menus = this.form.querySelectorAll('li');
|
|
87
|
+
this.items = /** @type {Array<string|Node>} */ (items);
|
|
88
|
+
this.menus = Array.from(this.form.querySelectorAll('li'));
|
|
69
89
|
this.menuLen = this.menus.length;
|
|
70
|
-
}
|
|
90
|
+
}
|
|
71
91
|
|
|
92
|
+
/**
|
|
93
|
+
* @description Initializes the select menu and attaches it to a reference element.
|
|
94
|
+
* @param {Node} referElement - The element that triggers the select menu.
|
|
95
|
+
* @param {(command: string) => void} selectMethod - The function to execute when an item is selected.
|
|
96
|
+
* @param {{class?: string, style?: string}} [attr={}] - Additional attributes for the select menu container.
|
|
97
|
+
*/
|
|
72
98
|
on(referElement, selectMethod, attr) {
|
|
73
99
|
if (!attr) attr = {};
|
|
74
|
-
this._refer = referElement;
|
|
75
|
-
this._keydownTarget =
|
|
100
|
+
this._refer = /** @type {HTMLElement} */ (referElement);
|
|
101
|
+
this._keydownTarget = dom.check.isInputElement(referElement) ? referElement : this._w;
|
|
76
102
|
this._selectMethod = selectMethod;
|
|
77
|
-
this.form =
|
|
103
|
+
this.form = dom.utils.createElement(
|
|
78
104
|
'DIV',
|
|
79
105
|
{
|
|
80
106
|
class: 'se-select-menu' + (attr.class ? ' ' + attr.class : ''),
|
|
@@ -83,12 +109,12 @@ SelectMenu.prototype = {
|
|
|
83
109
|
'<div class="se-list-inner"></div>'
|
|
84
110
|
);
|
|
85
111
|
referElement.parentNode.insertBefore(this.form, referElement);
|
|
86
|
-
}
|
|
112
|
+
}
|
|
87
113
|
|
|
88
114
|
/**
|
|
89
115
|
* @description Select menu open
|
|
90
|
-
* @param {string
|
|
91
|
-
* @param {string
|
|
116
|
+
* @param {?string=} position "[left|right]-[middle|top|bottom] | [top|bottom]-[center|left|right]"
|
|
117
|
+
* @param {?string=} onItemQuerySelector The querySelector string of the menu to be activated
|
|
92
118
|
*/
|
|
93
119
|
open(position, onItemQuerySelector) {
|
|
94
120
|
this.editor.selectMenuOn = true;
|
|
@@ -100,69 +126,102 @@ SelectMenu.prototype = {
|
|
|
100
126
|
const subPosition = positionItems[1] || (this._textDirDiff !== null && this._textDirDiff !== this.options.get('_rtl') ? this._dirSubPosition : this.subPosition);
|
|
101
127
|
this._setPosition(mainPosition, subPosition, onItemQuerySelector);
|
|
102
128
|
this.isOpen = true;
|
|
103
|
-
}
|
|
129
|
+
}
|
|
104
130
|
|
|
131
|
+
/**
|
|
132
|
+
* @description Select menu close
|
|
133
|
+
*/
|
|
105
134
|
close() {
|
|
106
135
|
this.editor.selectMenuOn = false;
|
|
107
|
-
|
|
136
|
+
dom.utils.removeClass(this._refer, 'on');
|
|
108
137
|
this._init();
|
|
109
138
|
if (this.form) this.form.style.cssText = '';
|
|
110
139
|
this.isOpen = false;
|
|
111
140
|
if (typeof this.closeMethod === 'function') this.closeMethod();
|
|
112
|
-
}
|
|
141
|
+
}
|
|
113
142
|
|
|
143
|
+
/**
|
|
144
|
+
* @description Get the index of the selected item
|
|
145
|
+
* @param {number} index Item index
|
|
146
|
+
* @returns
|
|
147
|
+
*/
|
|
114
148
|
getItem(index) {
|
|
115
149
|
return this.items[index];
|
|
116
|
-
}
|
|
150
|
+
}
|
|
117
151
|
|
|
152
|
+
/**
|
|
153
|
+
* @description Set the index of the selected item
|
|
154
|
+
* @param {number} index Item index
|
|
155
|
+
*/
|
|
118
156
|
setItem(index) {
|
|
119
157
|
this._selectItem(index);
|
|
120
|
-
}
|
|
158
|
+
}
|
|
121
159
|
|
|
160
|
+
/**
|
|
161
|
+
* @private
|
|
162
|
+
* @description Appends a formatted list of items to the menu.
|
|
163
|
+
* @param {string} html - The HTML string representing the menu items.
|
|
164
|
+
*/
|
|
122
165
|
_createFormat(html) {
|
|
123
166
|
this.form.firstElementChild.innerHTML += `<ul class="se-list-basic se-list-checked${this.horizontal ? ' se-list-horizontal' : ''}">${html}</ul>`;
|
|
124
|
-
}
|
|
167
|
+
}
|
|
125
168
|
|
|
169
|
+
/**
|
|
170
|
+
* @private
|
|
171
|
+
* @description Resets the menu state and removes event listeners.
|
|
172
|
+
*/
|
|
126
173
|
_init() {
|
|
127
174
|
this.__removeEvents();
|
|
128
175
|
this.__removeGlobalEvent();
|
|
129
176
|
this.index = -1;
|
|
130
177
|
this.item = null;
|
|
131
178
|
if (this._onItem) {
|
|
132
|
-
|
|
179
|
+
dom.utils.removeClass(this._onItem, 'se-select-on');
|
|
133
180
|
this._onItem = null;
|
|
134
181
|
}
|
|
135
|
-
}
|
|
182
|
+
}
|
|
136
183
|
|
|
184
|
+
/**
|
|
185
|
+
* @private
|
|
186
|
+
* @description Moves the selection up or down by a specified number of items.
|
|
187
|
+
* @param {number} num - The number of items to move (negative for up, positive for down).
|
|
188
|
+
*/
|
|
137
189
|
_moveItem(num) {
|
|
138
190
|
num = this.index + num;
|
|
139
191
|
const len = this.menuLen;
|
|
140
192
|
const selectIndex = (this.index = num >= len ? 0 : num < 0 ? len - 1 : num);
|
|
141
193
|
|
|
142
194
|
this._selectItem(selectIndex);
|
|
143
|
-
}
|
|
195
|
+
}
|
|
144
196
|
|
|
197
|
+
/**
|
|
198
|
+
* @private
|
|
199
|
+
* @description Highlights and selects an item by index.
|
|
200
|
+
* @param {number} selectIndex - The index of the item to select.
|
|
201
|
+
*/
|
|
145
202
|
_selectItem(selectIndex) {
|
|
146
|
-
|
|
203
|
+
dom.utils.removeClass(this.form, 'se-select-menu-mouse-move');
|
|
147
204
|
|
|
148
205
|
const len = this.menuLen;
|
|
149
206
|
for (let i = 0; i < len; i++) {
|
|
150
207
|
if (i === selectIndex) {
|
|
151
|
-
|
|
208
|
+
dom.utils.addClass(this.menus[i], 'active');
|
|
152
209
|
} else {
|
|
153
|
-
|
|
210
|
+
dom.utils.removeClass(this.menus[i], 'active');
|
|
154
211
|
}
|
|
155
212
|
}
|
|
156
213
|
|
|
157
214
|
this.index = selectIndex;
|
|
158
215
|
this.item = this.items[selectIndex];
|
|
159
|
-
}
|
|
216
|
+
}
|
|
160
217
|
|
|
161
218
|
/**
|
|
162
|
-
* @description Menu open
|
|
163
|
-
* @param {["left"|"right"] | ["top"|"bottom"]} position Menu position
|
|
164
|
-
* @param {["middle"|"top"|"bottom"] | ["center"|"left"|"right"]} subPosition Sub position
|
|
165
219
|
* @private
|
|
220
|
+
* @description Sets the position of the select menu relative to the reference element.
|
|
221
|
+
* @param {string} position Menu position ("left"|"right") | ("top"|"bottom")
|
|
222
|
+
* @param {string} subPosition Sub position ("middle"|"top"|"bottom") | ("center"|"left"|"right")
|
|
223
|
+
* @param {string} [onItemQuerySelector] - A query selector string to highlight a specific item.
|
|
224
|
+
* @param {boolean} [_re=false] - Whether this is a retry after adjusting the position.
|
|
166
225
|
*/
|
|
167
226
|
_setPosition(position, subPosition, onItemQuerySelector, _re) {
|
|
168
227
|
const originP = position;
|
|
@@ -170,8 +229,8 @@ SelectMenu.prototype = {
|
|
|
170
229
|
const target = this._refer;
|
|
171
230
|
form.style.visibility = 'hidden';
|
|
172
231
|
form.style.display = 'block';
|
|
173
|
-
|
|
174
|
-
|
|
232
|
+
dom.utils.removeClass(form, 'se-select-menu-scroll');
|
|
233
|
+
dom.utils.addClass(target, 'on');
|
|
175
234
|
|
|
176
235
|
const formW = form.offsetWidth;
|
|
177
236
|
const targetW = target.offsetWidth;
|
|
@@ -195,7 +254,7 @@ SelectMenu.prototype = {
|
|
|
195
254
|
const targetOffsetTop = target.offsetTop;
|
|
196
255
|
const targetGlobalTop = globalTarget.top;
|
|
197
256
|
const targetHeight = target.offsetHeight;
|
|
198
|
-
const wbottom =
|
|
257
|
+
const wbottom = dom.utils.getClientSize().h - (targetGlobalTop - this._w.scrollY + targetHeight);
|
|
199
258
|
const sideAddH = side ? targetHeight : 0;
|
|
200
259
|
let overH = 10000;
|
|
201
260
|
switch (position) {
|
|
@@ -300,20 +359,29 @@ SelectMenu.prototype = {
|
|
|
300
359
|
const item = form.firstElementChild.querySelector(onItemQuerySelector);
|
|
301
360
|
if (item) {
|
|
302
361
|
this._onItem = item;
|
|
303
|
-
|
|
362
|
+
dom.utils.addClass(item, 'se-select-on');
|
|
304
363
|
}
|
|
305
364
|
}
|
|
306
365
|
|
|
307
366
|
form.style.left = l + 'px';
|
|
308
367
|
form.style.top = t + 'px';
|
|
309
368
|
form.style.visibility = '';
|
|
310
|
-
}
|
|
369
|
+
}
|
|
311
370
|
|
|
371
|
+
/**
|
|
372
|
+
* @private
|
|
373
|
+
* @description Selects an item and triggers the callback function.
|
|
374
|
+
* @param {number} index - The index of the item to select.
|
|
375
|
+
*/
|
|
312
376
|
_select(index) {
|
|
313
|
-
if (this.checkList)
|
|
377
|
+
if (this.checkList) dom.utils.toggleClass(this.menus[index], 'se-checked');
|
|
314
378
|
this._selectMethod(this.getItem(index));
|
|
315
|
-
}
|
|
379
|
+
}
|
|
316
380
|
|
|
381
|
+
/**
|
|
382
|
+
* @private
|
|
383
|
+
* @description Adds event listeners for menu interactions.
|
|
384
|
+
*/
|
|
317
385
|
__addEvents() {
|
|
318
386
|
this.__removeEvents();
|
|
319
387
|
this.__events = this.__eventHandlers;
|
|
@@ -321,126 +389,160 @@ SelectMenu.prototype = {
|
|
|
321
389
|
this.form.addEventListener('mousemove', this.__events.mousemove);
|
|
322
390
|
this.form.addEventListener('click', this.__events.click);
|
|
323
391
|
this._keydownTarget.addEventListener('keydown', this.__events.keydown);
|
|
324
|
-
}
|
|
392
|
+
}
|
|
325
393
|
|
|
394
|
+
/**
|
|
395
|
+
* @private
|
|
396
|
+
* @description Removes event listeners for menu interactions.
|
|
397
|
+
*/
|
|
326
398
|
__removeEvents() {
|
|
327
|
-
if (this.__events
|
|
399
|
+
if (!this.__events) return;
|
|
328
400
|
this.form.removeEventListener('mousedown', this.__events.mousedown);
|
|
329
401
|
this.form.removeEventListener('mousemove', this.__events.mousemove);
|
|
330
402
|
this.form.removeEventListener('click', this.__events.click);
|
|
331
403
|
this._keydownTarget.removeEventListener('keydown', this.__events.keydown);
|
|
332
|
-
this.__events =
|
|
333
|
-
}
|
|
404
|
+
this.__events = null;
|
|
405
|
+
}
|
|
334
406
|
|
|
407
|
+
/**
|
|
408
|
+
* @private
|
|
409
|
+
* @description Adds global event listeners for closing the menu.
|
|
410
|
+
*/
|
|
335
411
|
__addGlobalEvent() {
|
|
336
412
|
this.__removeGlobalEvent();
|
|
337
413
|
this._bindClose_key = this.eventManager.addGlobalEvent('keydown', this.__globalEventHandlers.keydown, true);
|
|
338
414
|
this._bindClose_mousedown = this.eventManager.addGlobalEvent('mousedown', this.__globalEventHandlers.mousedown, true);
|
|
339
|
-
}
|
|
415
|
+
}
|
|
340
416
|
|
|
417
|
+
/**
|
|
418
|
+
* @private
|
|
419
|
+
* @description Removes global event listeners for closing the menu.
|
|
420
|
+
*/
|
|
341
421
|
__removeGlobalEvent() {
|
|
342
422
|
if (this._bindClose_key) this._bindClose_key = this.eventManager.removeGlobalEvent(this._bindClose_key);
|
|
343
423
|
if (this._bindClose_mousedown) this._bindClose_mousedown = this.eventManager.removeGlobalEvent(this._bindClose_mousedown);
|
|
344
424
|
if (this._bindClose_click) this._bindClose_click = this.eventManager.removeGlobalEvent(this._bindClose_click);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
constructor: SelectMenu
|
|
348
|
-
};
|
|
425
|
+
}
|
|
349
426
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
427
|
+
/**
|
|
428
|
+
* @param {KeyboardEvent} e - Event object
|
|
429
|
+
*/
|
|
430
|
+
#OnKeyDown_refer(e) {
|
|
431
|
+
let moveIndex;
|
|
432
|
+
switch (e.code) {
|
|
433
|
+
case 'ArrowUp': // up
|
|
434
|
+
e.preventDefault();
|
|
435
|
+
e.stopPropagation();
|
|
436
|
+
if (this.horizontal && this.index > -1) {
|
|
437
|
+
const num = this.splitNum;
|
|
438
|
+
moveIndex = this.index - num < 0 ? num : -num;
|
|
439
|
+
} else {
|
|
440
|
+
moveIndex = -1;
|
|
441
|
+
}
|
|
442
|
+
break;
|
|
443
|
+
case 'ArrowDown': // down
|
|
444
|
+
e.preventDefault();
|
|
445
|
+
e.stopPropagation();
|
|
446
|
+
if (this.horizontal && this.index > -1) {
|
|
447
|
+
const num = this.splitNum;
|
|
448
|
+
moveIndex = this.index + num > this.menuLen ? -num : num;
|
|
449
|
+
} else {
|
|
450
|
+
moveIndex = 1;
|
|
451
|
+
}
|
|
452
|
+
break;
|
|
453
|
+
case 'ArrowLeft': // left
|
|
454
|
+
e.preventDefault();
|
|
455
|
+
e.stopPropagation();
|
|
360
456
|
moveIndex = -1;
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
case 40: // down
|
|
364
|
-
e.preventDefault();
|
|
365
|
-
e.stopPropagation();
|
|
366
|
-
if (this.horizontal && this.index > -1) {
|
|
367
|
-
const num = this.splitNum;
|
|
368
|
-
moveIndex = this.index + num > this.menuLen ? -num : num;
|
|
369
|
-
} else {
|
|
370
|
-
moveIndex = 1;
|
|
371
|
-
}
|
|
372
|
-
break;
|
|
373
|
-
case 37: // left
|
|
374
|
-
e.preventDefault();
|
|
375
|
-
e.stopPropagation();
|
|
376
|
-
moveIndex = -1;
|
|
377
|
-
break;
|
|
378
|
-
case 39: //right
|
|
379
|
-
e.preventDefault();
|
|
380
|
-
e.stopPropagation();
|
|
381
|
-
moveIndex = 1;
|
|
382
|
-
break;
|
|
383
|
-
case 13:
|
|
384
|
-
case 32: // enter, space
|
|
385
|
-
if (this.index > -1) {
|
|
457
|
+
break;
|
|
458
|
+
case 'ArrowRight': //right
|
|
386
459
|
e.preventDefault();
|
|
387
460
|
e.stopPropagation();
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
461
|
+
moveIndex = 1;
|
|
462
|
+
break;
|
|
463
|
+
case 'Enter':
|
|
464
|
+
case 'Space': // enter, space
|
|
465
|
+
if (this.index > -1) {
|
|
466
|
+
e.preventDefault();
|
|
467
|
+
e.stopPropagation();
|
|
468
|
+
this._select(this.index);
|
|
469
|
+
} else {
|
|
470
|
+
this.close();
|
|
471
|
+
}
|
|
472
|
+
break;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
if (moveIndex) this._moveItem(moveIndex);
|
|
393
476
|
}
|
|
394
477
|
|
|
395
|
-
|
|
396
|
-
}
|
|
478
|
+
/**
|
|
479
|
+
* @param {MouseEvent} e - Event object
|
|
480
|
+
*/
|
|
481
|
+
#OnMousedown_list(e) {
|
|
482
|
+
if (env.isGecko) {
|
|
483
|
+
const eventTarget = dom.query.getEventTarget(e);
|
|
484
|
+
const target = dom.query.getParentElement(eventTarget, '.se-select-item');
|
|
485
|
+
if (target) this.eventManager._injectActiveEvent(target);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
397
488
|
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
489
|
+
/**
|
|
490
|
+
* @param {MouseEvent} e - Event object
|
|
491
|
+
*/
|
|
492
|
+
#OnMouseMove_list(e) {
|
|
493
|
+
const eventTarget = dom.query.getEventTarget(e);
|
|
494
|
+
dom.utils.addClass(this.form, 'se-select-menu-mouse-move');
|
|
495
|
+
const index = eventTarget.getAttribute('data-index');
|
|
496
|
+
if (!index) return;
|
|
497
|
+
this.index = Number(index);
|
|
402
498
|
}
|
|
403
|
-
}
|
|
404
499
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
500
|
+
/**
|
|
501
|
+
* @param {MouseEvent} e - Event object
|
|
502
|
+
*/
|
|
503
|
+
#OnClick_list(e) {
|
|
504
|
+
let target = dom.query.getEventTarget(e);
|
|
505
|
+
let index = null;
|
|
411
506
|
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
507
|
+
while (!index && !/UL/i.test(target.tagName) && !dom.utils.hasClass(target, 'se-select-menu')) {
|
|
508
|
+
index = target.getAttribute('data-index');
|
|
509
|
+
target = target.parentElement;
|
|
510
|
+
}
|
|
415
511
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
target = target.parentNode;
|
|
512
|
+
if (!index) return;
|
|
513
|
+
this._select(Number(index));
|
|
419
514
|
}
|
|
420
515
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
if (!/27/.test(e.keyCode)) return;
|
|
427
|
-
this.close();
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
function CloseListener_mousedown(e) {
|
|
431
|
-
if (this.form.contains(e.target)) return;
|
|
432
|
-
if (e.target !== this._refer) {
|
|
516
|
+
/**
|
|
517
|
+
* @param {KeyboardEvent} e - Event object
|
|
518
|
+
*/
|
|
519
|
+
#CloseListener_key(e) {
|
|
520
|
+
if (!keyCodeMap.isEsc(e.code)) return;
|
|
433
521
|
this.close();
|
|
434
|
-
} else if (!domUtils.isInputElement(e.target)) {
|
|
435
|
-
this._bindClose_click = this.eventManager.addGlobalEvent('click', this.__globalEventHandlers.click, true);
|
|
436
522
|
}
|
|
437
|
-
}
|
|
438
523
|
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
524
|
+
/**
|
|
525
|
+
* @param {MouseEvent} e - Event object
|
|
526
|
+
*/
|
|
527
|
+
#CloseListener_mousedown(e) {
|
|
528
|
+
const eventTarget = dom.query.getEventTarget(e);
|
|
529
|
+
if (this.form.contains(eventTarget)) return;
|
|
530
|
+
if (e.target !== this._refer) {
|
|
531
|
+
this.close();
|
|
532
|
+
} else if (!dom.check.isInputElement(eventTarget)) {
|
|
533
|
+
this._bindClose_click = this.eventManager.addGlobalEvent('click', this.__globalEventHandlers.click, true);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/**
|
|
538
|
+
* @param {MouseEvent} e - Event object
|
|
539
|
+
*/
|
|
540
|
+
#CloseListener_click(e) {
|
|
541
|
+
this._bindClose_click = this.eventManager.removeGlobalEvent(this._bindClose_click);
|
|
542
|
+
if (e.target === this._refer) {
|
|
543
|
+
e.stopPropagation();
|
|
544
|
+
this.close();
|
|
545
|
+
}
|
|
444
546
|
}
|
|
445
547
|
}
|
|
446
548
|
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module _DragHandle
|
|
3
3
|
* @description A module that handles drag and drop events.
|
|
4
|
-
* this module is initialize in the `classes/component.js`.
|
|
4
|
+
* - this module is initialize in the `classes/component.js`.
|
|
5
5
|
*/
|
|
6
|
+
|
|
6
7
|
export const _DragHandle = new Map([
|
|
7
8
|
['__figureInst', null],
|
|
8
9
|
['__dragInst', null],
|
package/src/modules/index.js
CHANGED
|
@@ -3,12 +3,12 @@ import ApiManager from './ApiManager';
|
|
|
3
3
|
import ColorPicker from './ColorPicker';
|
|
4
4
|
import Controller from './Controller';
|
|
5
5
|
import Figure from './Figure';
|
|
6
|
-
import
|
|
6
|
+
import Browser from './Browser';
|
|
7
7
|
import FileManager from './FileManager';
|
|
8
8
|
import HueSlider from './HueSlider';
|
|
9
9
|
import Modal from './Modal';
|
|
10
10
|
import ModalAnchorEditor from './ModalAnchorEditor';
|
|
11
11
|
import SelectMenu from './SelectMenu';
|
|
12
12
|
|
|
13
|
-
export { _DragHandle, ApiManager, ColorPicker, Controller,
|
|
14
|
-
export default { _DragHandle, ApiManager, ColorPicker, Controller,
|
|
13
|
+
export { _DragHandle, ApiManager, ColorPicker, Controller, Browser, FileManager, HueSlider, Figure, Modal, ModalAnchorEditor, SelectMenu };
|
|
14
|
+
export default { _DragHandle, ApiManager, ColorPicker, Controller, Browser, FileManager, HueSlider, Figure, Modal, ModalAnchorEditor, SelectMenu };
|