suneditor 3.0.0-beta.2 → 3.0.0-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +186 -184
- package/LICENSE +21 -21
- package/README.md +157 -180
- package/dist/suneditor.min.css +1 -1
- package/dist/suneditor.min.js +1 -1
- package/package.json +126 -123
- package/src/assets/design/color.css +131 -121
- package/src/assets/design/index.css +3 -3
- package/src/assets/design/size.css +37 -35
- package/src/assets/design/typography.css +37 -37
- package/src/assets/icons/defaultIcons.js +247 -232
- package/src/assets/suneditor-contents.css +779 -778
- package/src/assets/suneditor.css +43 -35
- package/src/core/base/eventHandlers/handler_toolbar.js +135 -135
- package/src/core/base/eventHandlers/handler_ww_clipboard.js +56 -56
- package/src/core/base/eventHandlers/handler_ww_dragDrop.js +115 -113
- package/src/core/base/eventHandlers/handler_ww_key_input.js +1200 -1200
- package/src/core/base/eventHandlers/handler_ww_mouse.js +194 -194
- package/src/core/base/eventManager.js +1550 -1484
- package/src/core/base/history.js +355 -355
- package/src/core/class/char.js +163 -162
- package/src/core/class/component.js +856 -842
- package/src/core/class/format.js +3433 -3422
- package/src/core/class/html.js +1927 -1890
- package/src/core/class/menu.js +357 -346
- package/src/core/class/nodeTransform.js +424 -424
- package/src/core/class/offset.js +858 -891
- package/src/core/class/selection.js +710 -620
- package/src/core/class/shortcuts.js +98 -98
- package/src/core/class/toolbar.js +438 -430
- package/src/core/class/ui.js +424 -422
- package/src/core/class/viewer.js +750 -750
- package/src/core/editor.js +1810 -1708
- package/src/core/section/actives.js +268 -241
- package/src/core/section/constructor.js +1348 -1661
- package/src/core/section/context.js +102 -102
- package/src/core/section/documentType.js +582 -561
- package/src/core/section/options.js +367 -0
- package/src/core/util/instanceCheck.js +59 -0
- package/src/editorInjector/_classes.js +36 -36
- package/src/editorInjector/_core.js +92 -92
- package/src/editorInjector/index.js +75 -75
- package/src/events.js +634 -622
- package/src/helper/clipboard.js +59 -59
- package/src/helper/converter.js +586 -564
- package/src/helper/dom/domCheck.js +304 -304
- package/src/helper/dom/domQuery.js +677 -669
- package/src/helper/dom/domUtils.js +618 -557
- package/src/helper/dom/index.js +12 -12
- package/src/helper/env.js +249 -240
- package/src/helper/index.js +25 -25
- package/src/helper/keyCodeMap.js +183 -183
- package/src/helper/numbers.js +72 -72
- package/src/helper/unicode.js +47 -47
- package/src/langs/ckb.js +231 -231
- package/src/langs/cs.js +231 -231
- package/src/langs/da.js +231 -231
- package/src/langs/de.js +231 -231
- package/src/langs/en.js +230 -230
- package/src/langs/es.js +231 -231
- package/src/langs/fa.js +231 -231
- package/src/langs/fr.js +231 -231
- package/src/langs/he.js +231 -231
- package/src/langs/hu.js +230 -230
- package/src/langs/index.js +28 -28
- package/src/langs/it.js +231 -231
- package/src/langs/ja.js +230 -230
- package/src/langs/km.js +230 -230
- package/src/langs/ko.js +230 -230
- package/src/langs/lv.js +231 -231
- package/src/langs/nl.js +231 -231
- package/src/langs/pl.js +231 -231
- package/src/langs/pt_br.js +231 -231
- package/src/langs/ro.js +231 -231
- package/src/langs/ru.js +231 -231
- package/src/langs/se.js +231 -231
- package/src/langs/tr.js +231 -231
- package/src/langs/uk.js +231 -231
- package/src/langs/ur.js +231 -231
- package/src/langs/zh_cn.js +231 -231
- package/src/modules/ApiManager.js +191 -191
- package/src/modules/Browser.js +669 -667
- package/src/modules/ColorPicker.js +364 -362
- package/src/modules/Controller.js +474 -454
- package/src/modules/Figure.js +1620 -1617
- package/src/modules/FileManager.js +359 -359
- package/src/modules/HueSlider.js +577 -565
- package/src/modules/Modal.js +346 -346
- package/src/modules/ModalAnchorEditor.js +643 -643
- package/src/modules/SelectMenu.js +549 -549
- package/src/modules/_DragHandle.js +17 -17
- package/src/modules/index.js +14 -14
- package/src/plugins/browser/audioGallery.js +83 -83
- package/src/plugins/browser/fileBrowser.js +103 -103
- package/src/plugins/browser/fileGallery.js +83 -83
- package/src/plugins/browser/imageGallery.js +81 -81
- package/src/plugins/browser/videoGallery.js +103 -103
- package/src/plugins/command/blockquote.js +61 -60
- package/src/plugins/command/exportPDF.js +134 -134
- package/src/plugins/command/fileUpload.js +456 -456
- package/src/plugins/command/list_bulleted.js +149 -148
- package/src/plugins/command/list_numbered.js +152 -151
- package/src/plugins/dropdown/align.js +157 -155
- package/src/plugins/dropdown/backgroundColor.js +108 -104
- package/src/plugins/dropdown/font.js +141 -137
- package/src/plugins/dropdown/fontColor.js +109 -105
- package/src/plugins/dropdown/formatBlock.js +170 -178
- package/src/plugins/dropdown/hr.js +152 -152
- package/src/plugins/dropdown/layout.js +83 -83
- package/src/plugins/dropdown/lineHeight.js +131 -130
- package/src/plugins/dropdown/list.js +123 -122
- package/src/plugins/dropdown/paragraphStyle.js +138 -138
- package/src/plugins/dropdown/table.js +4110 -4000
- package/src/plugins/dropdown/template.js +83 -83
- package/src/plugins/dropdown/textStyle.js +149 -149
- package/src/plugins/field/mention.js +242 -242
- package/src/plugins/index.js +120 -120
- package/src/plugins/input/fontSize.js +414 -410
- package/src/plugins/input/pageNavigator.js +71 -70
- package/src/plugins/modal/audio.js +677 -677
- package/src/plugins/modal/drawing.js +537 -531
- package/src/plugins/modal/embed.js +886 -886
- package/src/plugins/modal/image.js +1377 -1376
- package/src/plugins/modal/link.js +248 -240
- package/src/plugins/modal/math.js +563 -563
- package/src/plugins/modal/video.js +1226 -1226
- package/src/plugins/popup/anchor.js +224 -222
- package/src/suneditor.js +114 -107
- package/src/themes/dark.css +132 -122
- package/src/typedef.js +132 -130
- package/types/assets/icons/defaultIcons.d.ts +8 -0
- package/types/core/base/eventManager.d.ts +29 -4
- package/types/core/class/char.d.ts +2 -1
- package/types/core/class/component.d.ts +1 -2
- package/types/core/class/format.d.ts +8 -1
- package/types/core/class/html.d.ts +8 -0
- package/types/core/class/menu.d.ts +8 -0
- package/types/core/class/offset.d.ts +24 -26
- package/types/core/class/selection.d.ts +2 -0
- package/types/core/class/toolbar.d.ts +6 -0
- package/types/core/class/ui.d.ts +1 -1
- package/types/core/editor.d.ts +34 -12
- package/types/core/section/constructor.d.ts +5 -638
- package/types/core/section/documentType.d.ts +12 -2
- package/types/core/section/options.d.ts +740 -0
- package/types/core/util/instanceCheck.d.ts +50 -0
- package/types/editorInjector/_core.d.ts +5 -5
- package/types/editorInjector/index.d.ts +2 -2
- package/types/events.d.ts +2 -0
- package/types/helper/converter.d.ts +9 -0
- package/types/helper/dom/domQuery.d.ts +5 -5
- package/types/helper/dom/domUtils.d.ts +8 -0
- package/types/helper/env.d.ts +6 -1
- package/types/helper/index.d.ts +4 -1
- package/types/index.d.ts +122 -120
- package/types/langs/_Lang.d.ts +194 -194
- package/types/modules/ColorPicker.d.ts +5 -1
- package/types/modules/Controller.d.ts +8 -4
- package/types/modules/Figure.d.ts +2 -1
- package/types/modules/HueSlider.d.ts +4 -1
- package/types/modules/SelectMenu.d.ts +1 -1
- package/types/plugins/command/blockquote.d.ts +1 -0
- package/types/plugins/command/list_bulleted.d.ts +1 -0
- package/types/plugins/command/list_numbered.d.ts +1 -0
- package/types/plugins/dropdown/align.d.ts +1 -0
- package/types/plugins/dropdown/backgroundColor.d.ts +1 -0
- package/types/plugins/dropdown/font.d.ts +1 -0
- package/types/plugins/dropdown/fontColor.d.ts +1 -0
- package/types/plugins/dropdown/formatBlock.d.ts +3 -2
- package/types/plugins/dropdown/lineHeight.d.ts +1 -0
- package/types/plugins/dropdown/list.d.ts +1 -0
- package/types/plugins/dropdown/table.d.ts +6 -0
- package/types/plugins/input/fontSize.d.ts +1 -0
- package/types/plugins/modal/drawing.d.ts +4 -0
- package/types/plugins/modal/link.d.ts +32 -15
- package/types/suneditor.d.ts +13 -9
- package/types/typedef.d.ts +8 -0
package/src/modules/Modal.js
CHANGED
|
@@ -1,346 +1,346 @@
|
|
|
1
|
-
import CoreInjector from '../editorInjector/_core';
|
|
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
|
-
|
|
132
|
-
/**
|
|
133
|
-
* @description Open a modal plugin
|
|
134
|
-
* - The plugin's "init" method is called.
|
|
135
|
-
*/
|
|
136
|
-
open() {
|
|
137
|
-
this.ui._offCurrentModal();
|
|
138
|
-
this._fixCurrentController(true);
|
|
139
|
-
|
|
140
|
-
if (this._closeSignal) this._modalInner.addEventListener('click', this._closeListener[1]);
|
|
141
|
-
if (this._bindClose) this._bindClose = this.eventManager.removeGlobalEvent(this._bindClose);
|
|
142
|
-
this._bindClose = this.eventManager.addGlobalEvent('keydown', this._closeListener[0]);
|
|
143
|
-
this.isUpdate = this.kind === this.editor.currentControllerName;
|
|
144
|
-
this.editor.opendModal = this;
|
|
145
|
-
|
|
146
|
-
if (!this.isUpdate && typeof this.inst.init === 'function') this.inst.init();
|
|
147
|
-
if (typeof this.inst.on === 'function') this.inst.on(this.isUpdate);
|
|
148
|
-
|
|
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
|
-
}
|
|
161
|
-
|
|
162
|
-
if (this.focusElement) this.focusElement.focus();
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* @description Close a modal plugin
|
|
167
|
-
* - The plugin's "init" and "off" method is called.
|
|
168
|
-
*/
|
|
169
|
-
close() {
|
|
170
|
-
this.__removeGlobalEvent();
|
|
171
|
-
this._fixCurrentController(false);
|
|
172
|
-
_w.setTimeout(() => {
|
|
173
|
-
this.editor.opendModal = null;
|
|
174
|
-
}, 0);
|
|
175
|
-
|
|
176
|
-
if (this._closeSignal) this._modalInner.removeEventListener('click', this._closeListener[1]);
|
|
177
|
-
if (this._bindClose) this._bindClose = this.eventManager.removeGlobalEvent(this._bindClose);
|
|
178
|
-
|
|
179
|
-
// close
|
|
180
|
-
dom.utils.removeClass(this._modalArea, 'se-backdrop-show');
|
|
181
|
-
dom.utils.removeClass(this.form, 'se-modal-show');
|
|
182
|
-
|
|
183
|
-
if (typeof this.inst.init === 'function') this.inst.init();
|
|
184
|
-
if (typeof this.inst.off === 'function') this.inst.off(this.isUpdate);
|
|
185
|
-
this.editor.focus();
|
|
186
|
-
}
|
|
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
|
-
*/
|
|
193
|
-
_fixCurrentController(fixed) {
|
|
194
|
-
const cont = this.editor.opendControllers;
|
|
195
|
-
for (let i = 0; i < cont.length; i++) {
|
|
196
|
-
cont[i].fixed = fixed;
|
|
197
|
-
cont[i].form.style.display = fixed ? 'none' : 'block';
|
|
198
|
-
}
|
|
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
|
-
}
|
|
212
|
-
|
|
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
|
-
}
|
|
224
|
-
|
|
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
|
-
}
|
|
234
|
-
|
|
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();
|
|
248
|
-
|
|
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) {
|
|
262
|
-
this.close();
|
|
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) {
|
|
274
|
-
this.close();
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
/**
|
|
279
|
-
* @param {KeyboardEvent} e - Event object
|
|
280
|
-
*/
|
|
281
|
-
#CloseListener(e) {
|
|
282
|
-
if (!keyCodeMap.isEsc(e.code)) return;
|
|
283
|
-
this.close();
|
|
284
|
-
}
|
|
285
|
-
|
|
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
|
-
}
|
|
296
|
-
|
|
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();
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
#OnResizeMouseUp() {
|
|
340
|
-
dom.utils.removeClass(this._currentHandle, 'active');
|
|
341
|
-
this._currentHandle = null;
|
|
342
|
-
this.__removeGlobalEvent();
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
export default Modal;
|
|
1
|
+
import CoreInjector from '../editorInjector/_core';
|
|
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
|
+
|
|
132
|
+
/**
|
|
133
|
+
* @description Open a modal plugin
|
|
134
|
+
* - The plugin's "init" method is called.
|
|
135
|
+
*/
|
|
136
|
+
open() {
|
|
137
|
+
this.ui._offCurrentModal();
|
|
138
|
+
this._fixCurrentController(true);
|
|
139
|
+
|
|
140
|
+
if (this._closeSignal) this._modalInner.addEventListener('click', this._closeListener[1]);
|
|
141
|
+
if (this._bindClose) this._bindClose = this.eventManager.removeGlobalEvent(this._bindClose);
|
|
142
|
+
this._bindClose = this.eventManager.addGlobalEvent('keydown', this._closeListener[0]);
|
|
143
|
+
this.isUpdate = this.kind === this.editor.currentControllerName;
|
|
144
|
+
this.editor.opendModal = this;
|
|
145
|
+
|
|
146
|
+
if (!this.isUpdate && typeof this.inst.init === 'function') this.inst.init();
|
|
147
|
+
if (typeof this.inst.on === 'function') this.inst.on(this.isUpdate);
|
|
148
|
+
|
|
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
|
+
}
|
|
161
|
+
|
|
162
|
+
if (this.focusElement) this.focusElement.focus();
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* @description Close a modal plugin
|
|
167
|
+
* - The plugin's "init" and "off" method is called.
|
|
168
|
+
*/
|
|
169
|
+
close() {
|
|
170
|
+
this.__removeGlobalEvent();
|
|
171
|
+
this._fixCurrentController(false);
|
|
172
|
+
_w.setTimeout(() => {
|
|
173
|
+
this.editor.opendModal = null;
|
|
174
|
+
}, 0);
|
|
175
|
+
|
|
176
|
+
if (this._closeSignal) this._modalInner.removeEventListener('click', this._closeListener[1]);
|
|
177
|
+
if (this._bindClose) this._bindClose = this.eventManager.removeGlobalEvent(this._bindClose);
|
|
178
|
+
|
|
179
|
+
// close
|
|
180
|
+
dom.utils.removeClass(this._modalArea, 'se-backdrop-show');
|
|
181
|
+
dom.utils.removeClass(this.form, 'se-modal-show');
|
|
182
|
+
|
|
183
|
+
if (typeof this.inst.init === 'function') this.inst.init();
|
|
184
|
+
if (typeof this.inst.off === 'function') this.inst.off(this.isUpdate);
|
|
185
|
+
this.editor.focus();
|
|
186
|
+
}
|
|
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
|
+
*/
|
|
193
|
+
_fixCurrentController(fixed) {
|
|
194
|
+
const cont = this.editor.opendControllers;
|
|
195
|
+
for (let i = 0; i < cont.length; i++) {
|
|
196
|
+
cont[i].fixed = fixed;
|
|
197
|
+
cont[i].form.style.display = fixed ? 'none' : 'block';
|
|
198
|
+
}
|
|
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
|
+
}
|
|
212
|
+
|
|
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
|
+
}
|
|
224
|
+
|
|
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
|
+
}
|
|
234
|
+
|
|
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();
|
|
248
|
+
|
|
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) {
|
|
262
|
+
this.close();
|
|
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) {
|
|
274
|
+
this.close();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* @param {KeyboardEvent} e - Event object
|
|
280
|
+
*/
|
|
281
|
+
#CloseListener(e) {
|
|
282
|
+
if (!keyCodeMap.isEsc(e.code)) return;
|
|
283
|
+
this.close();
|
|
284
|
+
}
|
|
285
|
+
|
|
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
|
+
}
|
|
296
|
+
|
|
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();
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
#OnResizeMouseUp() {
|
|
340
|
+
dom.utils.removeClass(this._currentHandle, 'active');
|
|
341
|
+
this._currentHandle = null;
|
|
342
|
+
this.__removeGlobalEvent();
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
export default Modal;
|