suneditor 3.0.0-beta.9 → 3.0.0-rc.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/README.md +65 -57
- package/dist/suneditor-contents.min.css +1 -0
- package/dist/suneditor.min.css +1 -1
- package/dist/suneditor.min.js +1 -1
- package/package.json +110 -61
- package/src/assets/design/color.css +36 -17
- package/src/assets/design/size.css +2 -0
- package/src/assets/icons/defaultIcons.js +17 -2
- package/src/assets/suneditor-contents.css +51 -16
- package/src/assets/suneditor.css +116 -43
- package/src/core/config/contextProvider.js +288 -0
- package/src/core/config/eventManager.js +188 -0
- package/src/core/config/instanceCheck.js +59 -0
- package/src/core/config/optionProvider.js +452 -0
- package/src/core/editor.js +166 -1637
- package/src/core/event/actions/index.js +229 -0
- package/src/core/event/effects/common.registry.js +74 -0
- package/src/core/event/effects/keydown.registry.js +573 -0
- package/src/core/event/effects/ruleHelpers.js +148 -0
- package/src/core/event/eventOrchestrator.js +944 -0
- package/src/core/event/executor.js +27 -0
- package/src/core/{base/eventHandlers → event/handlers}/handler_toolbar.js +27 -28
- package/src/core/{base/eventHandlers → event/handlers}/handler_ww_clipboard.js +10 -8
- package/src/core/{base/eventHandlers → event/handlers}/handler_ww_dragDrop.js +22 -23
- package/src/core/event/handlers/handler_ww_input.js +75 -0
- package/src/core/event/handlers/handler_ww_key.js +228 -0
- package/src/core/event/handlers/handler_ww_mouse.js +166 -0
- package/src/core/event/ports.js +211 -0
- package/src/core/event/reducers/keydown.reducer.js +97 -0
- package/src/core/event/rules/keydown.rule.arrow.js +63 -0
- package/src/core/event/rules/keydown.rule.backspace.js +208 -0
- package/src/core/event/rules/keydown.rule.delete.js +132 -0
- package/src/core/event/rules/keydown.rule.enter.js +150 -0
- package/src/core/event/rules/keydown.rule.tab.js +35 -0
- package/src/core/event/support/defaultLineManager.js +136 -0
- package/src/core/event/support/selectionState.js +204 -0
- package/src/core/kernel/coreKernel.js +320 -0
- package/src/core/kernel/kernelInjector.js +19 -0
- package/src/core/kernel/store.js +173 -0
- package/src/core/{class → logic/dom}/char.js +42 -45
- package/src/core/logic/dom/format.js +1075 -0
- package/src/core/{class → logic/dom}/html.js +743 -624
- package/src/core/logic/dom/inline.js +1847 -0
- package/src/core/logic/dom/listFormat.js +601 -0
- package/src/core/{class → logic/dom}/nodeTransform.js +92 -72
- package/src/core/{class → logic/dom}/offset.js +254 -317
- package/src/core/logic/dom/selection.js +754 -0
- package/src/core/logic/panel/menu.js +389 -0
- package/src/core/logic/panel/toolbar.js +449 -0
- package/src/core/logic/panel/viewer.js +761 -0
- package/src/core/logic/shell/_commandExecutor.js +380 -0
- package/src/core/logic/shell/commandDispatcher.js +241 -0
- package/src/core/logic/shell/component.js +970 -0
- package/src/core/logic/shell/focusManager.js +110 -0
- package/src/core/{base → logic/shell}/history.js +110 -60
- package/src/core/logic/shell/pluginManager.js +363 -0
- package/src/core/logic/shell/shortcuts.js +130 -0
- package/src/core/logic/shell/ui.js +904 -0
- package/src/core/schema/context.js +66 -0
- package/src/core/schema/frameContext.js +160 -0
- package/src/core/schema/options.js +628 -0
- package/src/core/section/constructor.js +194 -500
- package/src/core/section/documentType.js +297 -222
- package/src/events.js +808 -543
- package/src/helper/clipboard.js +27 -16
- package/src/helper/converter.js +100 -78
- package/src/helper/dom/domCheck.js +56 -30
- package/src/helper/dom/domQuery.js +159 -89
- package/src/helper/dom/domUtils.js +114 -49
- package/src/helper/dom/index.js +5 -1
- package/src/helper/env.js +26 -26
- package/src/helper/index.js +1 -1
- package/src/helper/keyCodeMap.js +25 -28
- package/src/helper/numbers.js +4 -8
- package/src/helper/unicode.js +4 -8
- package/src/hooks/base.js +307 -0
- package/src/hooks/params.js +130 -0
- package/src/interfaces/contracts.js +227 -0
- package/src/interfaces/index.js +7 -0
- package/src/interfaces/plugins.js +239 -0
- package/src/langs/ckb.js +4 -4
- package/src/langs/cs.js +4 -4
- package/src/langs/da.js +4 -4
- package/src/langs/de.js +4 -4
- package/src/langs/en.js +4 -4
- package/src/langs/es.js +4 -4
- package/src/langs/fa.js +4 -4
- package/src/langs/fr.js +4 -4
- package/src/langs/he.js +4 -4
- package/src/langs/hu.js +4 -4
- package/src/langs/it.js +4 -4
- package/src/langs/ja.js +4 -4
- package/src/langs/km.js +4 -4
- package/src/langs/ko.js +4 -4
- package/src/langs/lv.js +4 -4
- package/src/langs/nl.js +4 -4
- package/src/langs/pl.js +4 -4
- package/src/langs/pt_br.js +13 -13
- package/src/langs/ro.js +4 -4
- package/src/langs/ru.js +4 -4
- package/src/langs/se.js +4 -4
- package/src/langs/tr.js +4 -4
- package/src/langs/uk.js +4 -4
- package/src/langs/ur.js +4 -4
- package/src/langs/zh_cn.js +4 -4
- package/src/modules/{Browser.js → contract/Browser.js} +119 -128
- package/src/modules/{ColorPicker.js → contract/ColorPicker.js} +132 -142
- package/src/modules/contract/Controller.js +589 -0
- package/src/modules/{Figure.js → contract/Figure.js} +591 -411
- package/src/modules/{HueSlider.js → contract/HueSlider.js} +125 -86
- package/src/modules/contract/Modal.js +357 -0
- package/src/modules/contract/index.js +9 -0
- package/src/modules/manager/ApiManager.js +197 -0
- package/src/modules/{FileManager.js → manager/FileManager.js} +128 -160
- package/src/modules/manager/index.js +5 -0
- package/src/modules/{ModalAnchorEditor.js → ui/ModalAnchorEditor.js} +108 -138
- package/src/modules/{SelectMenu.js → ui/SelectMenu.js} +119 -120
- package/src/modules/{_DragHandle.js → ui/_DragHandle.js} +1 -1
- package/src/modules/ui/index.js +6 -0
- package/src/plugins/browser/audioGallery.js +23 -26
- package/src/plugins/browser/fileBrowser.js +25 -28
- package/src/plugins/browser/fileGallery.js +20 -23
- package/src/plugins/browser/imageGallery.js +24 -23
- package/src/plugins/browser/videoGallery.js +27 -29
- package/src/plugins/command/blockquote.js +11 -17
- package/src/plugins/command/exportPDF.js +26 -26
- package/src/plugins/command/fileUpload.js +138 -133
- package/src/plugins/command/list_bulleted.js +48 -44
- package/src/plugins/command/list_numbered.js +48 -44
- package/src/plugins/dropdown/align.js +64 -50
- package/src/plugins/dropdown/backgroundColor.js +34 -35
- package/src/plugins/dropdown/{formatBlock.js → blockStyle.js} +43 -37
- package/src/plugins/dropdown/font.js +50 -36
- package/src/plugins/dropdown/fontColor.js +34 -35
- package/src/plugins/dropdown/hr.js +55 -50
- package/src/plugins/dropdown/layout.js +20 -15
- package/src/plugins/dropdown/lineHeight.js +46 -30
- package/src/plugins/dropdown/list.js +32 -33
- package/src/plugins/dropdown/paragraphStyle.js +40 -34
- package/src/plugins/dropdown/table/index.js +915 -0
- package/src/plugins/dropdown/table/render/table.html.js +308 -0
- package/src/plugins/dropdown/table/render/table.menu.js +121 -0
- package/src/plugins/dropdown/table/services/table.cell.js +465 -0
- package/src/plugins/dropdown/table/services/table.clipboard.js +414 -0
- package/src/plugins/dropdown/table/services/table.grid.js +504 -0
- package/src/plugins/dropdown/table/services/table.resize.js +463 -0
- package/src/plugins/dropdown/table/services/table.selection.js +466 -0
- package/src/plugins/dropdown/table/services/table.style.js +844 -0
- package/src/plugins/dropdown/table/shared/table.constants.js +109 -0
- package/src/plugins/dropdown/table/shared/table.utils.js +219 -0
- package/src/plugins/dropdown/template.js +20 -15
- package/src/plugins/dropdown/textStyle.js +28 -22
- package/src/plugins/field/mention.js +54 -49
- package/src/plugins/index.js +5 -5
- package/src/plugins/input/fontSize.js +100 -97
- package/src/plugins/input/pageNavigator.js +13 -10
- package/src/plugins/modal/audio.js +208 -219
- package/src/plugins/modal/drawing.js +99 -104
- package/src/plugins/modal/embed.js +323 -312
- package/src/plugins/modal/image/index.js +942 -0
- package/src/plugins/modal/image/render/image.html.js +150 -0
- package/src/plugins/modal/image/services/image.size.js +198 -0
- package/src/plugins/modal/image/services/image.upload.js +216 -0
- package/src/plugins/modal/image/shared/image.constants.js +20 -0
- package/src/plugins/modal/link.js +74 -54
- package/src/plugins/modal/math.js +126 -119
- package/src/plugins/modal/video/index.js +858 -0
- package/src/plugins/modal/video/render/video.html.js +131 -0
- package/src/plugins/modal/video/services/video.size.js +281 -0
- package/src/plugins/modal/video/services/video.upload.js +92 -0
- package/src/plugins/popup/anchor.js +57 -49
- package/src/suneditor.js +73 -61
- package/src/themes/cobalt.css +155 -0
- package/src/themes/dark.css +143 -120
- package/src/typedef.js +214 -63
- package/types/assets/icons/defaultIcons.d.ts +8 -0
- package/types/assets/suneditor-contents.css.d.ts +1 -0
- package/types/assets/suneditor.css.d.ts +1 -0
- package/types/core/config/contextProvider.d.ts +148 -0
- package/types/core/config/eventManager.d.ts +68 -0
- package/types/core/config/instanceCheck.d.ts +33 -0
- package/types/core/config/optionProvider.d.ts +147 -0
- package/types/core/editor.d.ts +27 -586
- package/types/core/event/actions/index.d.ts +50 -0
- package/types/core/event/effects/common.registry.d.ts +56 -0
- package/types/core/event/effects/keydown.registry.d.ts +80 -0
- package/types/core/event/effects/ruleHelpers.d.ts +36 -0
- package/types/core/event/eventOrchestrator.d.ts +191 -0
- package/types/core/event/executor.d.ts +13 -0
- package/types/core/event/handlers/handler_toolbar.d.ts +38 -0
- package/types/core/event/handlers/handler_ww_clipboard.d.ts +36 -0
- package/types/core/event/handlers/handler_ww_dragDrop.d.ts +26 -0
- package/types/core/event/handlers/handler_ww_input.d.ts +38 -0
- package/types/core/event/handlers/handler_ww_key.d.ts +40 -0
- package/types/core/event/handlers/handler_ww_mouse.d.ts +47 -0
- package/types/core/event/ports.d.ts +256 -0
- package/types/core/event/reducers/keydown.reducer.d.ts +84 -0
- package/types/core/event/rules/keydown.rule.arrow.d.ts +19 -0
- package/types/core/event/rules/keydown.rule.backspace.d.ts +18 -0
- package/types/core/event/rules/keydown.rule.delete.d.ts +18 -0
- package/types/core/event/rules/keydown.rule.enter.d.ts +18 -0
- package/types/core/event/rules/keydown.rule.tab.d.ts +18 -0
- package/types/core/event/support/defaultLineManager.d.ts +22 -0
- package/types/core/event/support/selectionState.d.ts +29 -0
- package/types/core/kernel/coreKernel.d.ts +219 -0
- package/types/core/kernel/kernelInjector.d.ts +16 -0
- package/types/core/kernel/store.d.ts +170 -0
- package/types/core/logic/dom/char.d.ts +46 -0
- package/types/core/logic/dom/format.d.ts +234 -0
- package/types/core/logic/dom/html.d.ts +290 -0
- package/types/core/logic/dom/inline.d.ts +93 -0
- package/types/core/logic/dom/listFormat.d.ts +101 -0
- package/types/core/logic/dom/nodeTransform.d.ts +110 -0
- package/types/core/logic/dom/offset.d.ts +335 -0
- package/types/core/logic/dom/selection.d.ts +165 -0
- package/types/core/logic/panel/menu.d.ts +93 -0
- package/types/core/logic/panel/toolbar.d.ts +128 -0
- package/types/core/logic/panel/viewer.d.ts +89 -0
- package/types/core/logic/shell/_commandExecutor.d.ts +18 -0
- package/types/core/logic/shell/commandDispatcher.d.ts +65 -0
- package/types/core/logic/shell/component.d.ts +182 -0
- package/types/core/logic/shell/focusManager.d.ts +31 -0
- package/types/core/{base → logic/shell}/history.d.ts +13 -12
- package/types/core/logic/shell/pluginManager.d.ts +115 -0
- package/types/core/logic/shell/shortcuts.d.ts +131 -0
- package/types/core/logic/shell/ui.d.ts +261 -0
- package/types/core/schema/context.d.ts +104 -0
- package/types/core/schema/frameContext.d.ts +320 -0
- package/types/core/schema/options.d.ts +1241 -0
- package/types/core/section/constructor.d.ts +117 -652
- package/types/core/section/documentType.d.ts +43 -61
- package/types/events.d.ts +796 -65
- package/types/helper/clipboard.d.ts +5 -4
- package/types/helper/converter.d.ts +55 -43
- package/types/helper/dom/domCheck.d.ts +27 -19
- package/types/helper/dom/domQuery.d.ts +76 -57
- package/types/helper/dom/domUtils.d.ts +62 -39
- package/types/helper/dom/index.d.ts +87 -1
- package/types/helper/env.d.ts +16 -13
- package/types/helper/index.d.ts +8 -2
- package/types/helper/keyCodeMap.d.ts +24 -23
- package/types/helper/numbers.d.ts +4 -6
- package/types/helper/unicode.d.ts +4 -3
- package/types/hooks/base.d.ts +239 -0
- package/types/hooks/params.d.ts +65 -0
- package/types/index.d.ts +20 -117
- package/types/interfaces/contracts.d.ts +183 -0
- package/types/interfaces/index.d.ts +3 -0
- package/types/interfaces/plugins.d.ts +168 -0
- package/types/langs/_Lang.d.ts +2 -2
- package/types/langs/index.d.ts +2 -2
- package/types/modules/contract/Browser.d.ts +262 -0
- package/types/modules/contract/ColorPicker.d.ts +99 -0
- package/types/modules/contract/Controller.d.ts +204 -0
- package/types/modules/contract/Figure.d.ts +529 -0
- package/types/modules/{HueSlider.d.ts → contract/HueSlider.d.ts} +39 -28
- package/types/modules/contract/Modal.d.ts +62 -0
- package/types/modules/contract/index.d.ts +7 -0
- package/types/modules/manager/ApiManager.d.ts +106 -0
- package/types/modules/manager/FileManager.d.ts +124 -0
- package/types/modules/manager/index.d.ts +3 -0
- package/types/modules/ui/ModalAnchorEditor.d.ts +152 -0
- package/types/modules/ui/SelectMenu.d.ts +107 -0
- package/types/modules/{_DragHandle.d.ts → ui/_DragHandle.d.ts} +1 -0
- package/types/modules/ui/index.d.ts +4 -0
- package/types/plugins/browser/audioGallery.d.ts +33 -41
- package/types/plugins/browser/fileBrowser.d.ts +42 -50
- package/types/plugins/browser/fileGallery.d.ts +33 -41
- package/types/plugins/browser/imageGallery.d.ts +30 -37
- package/types/plugins/browser/videoGallery.d.ts +33 -41
- package/types/plugins/command/blockquote.d.ts +4 -21
- package/types/plugins/command/exportPDF.d.ts +23 -33
- package/types/plugins/command/fileUpload.d.ts +80 -100
- package/types/plugins/command/list_bulleted.d.ts +9 -35
- package/types/plugins/command/list_numbered.d.ts +9 -35
- package/types/plugins/dropdown/align.d.ts +23 -46
- package/types/plugins/dropdown/backgroundColor.d.ts +35 -53
- package/types/plugins/dropdown/blockStyle.d.ts +45 -0
- package/types/plugins/dropdown/font.d.ts +18 -41
- package/types/plugins/dropdown/fontColor.d.ts +35 -53
- package/types/plugins/dropdown/hr.d.ts +26 -52
- package/types/plugins/dropdown/layout.d.ts +19 -25
- package/types/plugins/dropdown/lineHeight.d.ts +21 -39
- package/types/plugins/dropdown/list.d.ts +6 -34
- package/types/plugins/dropdown/paragraphStyle.d.ts +34 -45
- package/types/plugins/dropdown/table/index.d.ts +158 -0
- package/types/plugins/dropdown/table/render/table.html.d.ts +71 -0
- package/types/plugins/dropdown/table/render/table.menu.d.ts +59 -0
- package/types/plugins/dropdown/table/services/table.cell.d.ts +76 -0
- package/types/plugins/dropdown/table/services/table.clipboard.d.ts +26 -0
- package/types/plugins/dropdown/table/services/table.grid.d.ts +77 -0
- package/types/plugins/dropdown/table/services/table.resize.d.ts +72 -0
- package/types/plugins/dropdown/table/services/table.selection.d.ts +59 -0
- package/types/plugins/dropdown/table/services/table.style.d.ts +162 -0
- package/types/plugins/dropdown/table/shared/table.constants.d.ts +134 -0
- package/types/plugins/dropdown/table/shared/table.utils.d.ts +91 -0
- package/types/plugins/dropdown/template.d.ts +19 -25
- package/types/plugins/dropdown/textStyle.d.ts +23 -30
- package/types/plugins/field/mention.d.ts +66 -72
- package/types/plugins/index.d.ts +41 -40
- package/types/plugins/input/fontSize.d.ts +57 -96
- package/types/plugins/input/pageNavigator.d.ts +5 -8
- package/types/plugins/modal/audio.d.ts +60 -153
- package/types/plugins/modal/drawing.d.ts +16 -118
- package/types/plugins/modal/embed.d.ts +46 -166
- package/types/plugins/modal/image/index.d.ts +281 -0
- package/types/plugins/modal/image/render/image.html.d.ts +45 -0
- package/types/plugins/modal/image/services/image.size.d.ts +55 -0
- package/types/plugins/modal/image/services/image.upload.d.ts +24 -0
- package/types/plugins/modal/image/shared/image.constants.d.ts +17 -0
- package/types/plugins/modal/link.d.ts +46 -66
- package/types/plugins/modal/math.d.ts +17 -86
- package/types/plugins/modal/{video.d.ts → video/index.d.ts} +89 -221
- package/types/plugins/modal/video/render/video.html.d.ts +37 -0
- package/types/plugins/modal/video/services/video.size.d.ts +74 -0
- package/types/plugins/modal/video/services/video.upload.d.ts +19 -0
- package/types/plugins/popup/anchor.d.ts +8 -38
- package/types/suneditor.d.ts +55 -24
- package/types/typedef.d.ts +344 -228
- package/CONTRIBUTING.md +0 -186
- package/src/core/base/eventHandlers/handler_ww_key_input.js +0 -1200
- package/src/core/base/eventHandlers/handler_ww_mouse.js +0 -194
- package/src/core/base/eventManager.js +0 -1523
- package/src/core/class/component.js +0 -856
- package/src/core/class/format.js +0 -3433
- package/src/core/class/menu.js +0 -346
- package/src/core/class/selection.js +0 -610
- package/src/core/class/shortcuts.js +0 -98
- package/src/core/class/toolbar.js +0 -431
- package/src/core/class/ui.js +0 -424
- package/src/core/class/viewer.js +0 -750
- package/src/core/section/actives.js +0 -266
- package/src/core/section/context.js +0 -102
- package/src/editorInjector/_classes.js +0 -36
- package/src/editorInjector/_core.js +0 -87
- package/src/editorInjector/index.js +0 -73
- package/src/modules/ApiManager.js +0 -191
- package/src/modules/Controller.js +0 -474
- package/src/modules/Modal.js +0 -346
- package/src/modules/index.js +0 -14
- package/src/plugins/dropdown/table.js +0 -4034
- package/src/plugins/modal/image.js +0 -1376
- package/src/plugins/modal/video.js +0 -1226
- package/types/core/base/eventHandlers/handler_toolbar.d.ts +0 -41
- package/types/core/base/eventHandlers/handler_ww_clipboard.d.ts +0 -40
- package/types/core/base/eventHandlers/handler_ww_dragDrop.d.ts +0 -35
- package/types/core/base/eventHandlers/handler_ww_key_input.d.ts +0 -45
- package/types/core/base/eventHandlers/handler_ww_mouse.d.ts +0 -39
- package/types/core/base/eventManager.d.ts +0 -401
- package/types/core/class/char.d.ts +0 -61
- package/types/core/class/component.d.ts +0 -213
- package/types/core/class/format.d.ts +0 -623
- package/types/core/class/html.d.ts +0 -430
- package/types/core/class/menu.d.ts +0 -126
- package/types/core/class/nodeTransform.d.ts +0 -93
- package/types/core/class/offset.d.ts +0 -522
- package/types/core/class/selection.d.ts +0 -188
- package/types/core/class/shortcuts.d.ts +0 -142
- package/types/core/class/toolbar.d.ts +0 -189
- package/types/core/class/ui.d.ts +0 -164
- package/types/core/class/viewer.d.ts +0 -140
- package/types/core/section/actives.d.ts +0 -46
- package/types/core/section/context.d.ts +0 -45
- package/types/editorInjector/_classes.d.ts +0 -41
- package/types/editorInjector/_core.d.ts +0 -87
- package/types/editorInjector/index.d.ts +0 -69
- package/types/modules/ApiManager.d.ts +0 -125
- package/types/modules/Browser.d.ts +0 -326
- package/types/modules/ColorPicker.d.ts +0 -135
- package/types/modules/Controller.d.ts +0 -251
- package/types/modules/Figure.d.ts +0 -517
- package/types/modules/FileManager.d.ts +0 -202
- package/types/modules/Modal.d.ts +0 -111
- package/types/modules/ModalAnchorEditor.d.ts +0 -236
- package/types/modules/SelectMenu.d.ts +0 -194
- package/types/modules/index.d.ts +0 -26
- package/types/plugins/dropdown/formatBlock.d.ts +0 -55
- package/types/plugins/dropdown/table.d.ts +0 -627
- package/types/plugins/modal/image.d.ts +0 -451
- /package/{LICENSE → LICENSE.txt} +0 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { dom } from '../../../helper';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @description Manages editor focus and blur behavior across frames and controllers.
|
|
5
|
+
*/
|
|
6
|
+
export default class FocusManager {
|
|
7
|
+
#kernel;
|
|
8
|
+
#$;
|
|
9
|
+
#store;
|
|
10
|
+
|
|
11
|
+
#options;
|
|
12
|
+
#frameContext;
|
|
13
|
+
#frameOptions;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @constructor
|
|
17
|
+
* @param {SunEditor.Kernel} kernel
|
|
18
|
+
*/
|
|
19
|
+
constructor(kernel) {
|
|
20
|
+
this.#kernel = kernel;
|
|
21
|
+
this.#$ = kernel.$;
|
|
22
|
+
this.#store = kernel.store;
|
|
23
|
+
|
|
24
|
+
this.#options = this.#$.options;
|
|
25
|
+
this.#frameContext = this.#$.frameContext;
|
|
26
|
+
this.#frameOptions = this.#$.frameOptions;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @description Focus to wysiwyg area
|
|
31
|
+
* @param {*} [rootKey] Root frame key.
|
|
32
|
+
*/
|
|
33
|
+
focus(rootKey) {
|
|
34
|
+
if (rootKey) this.#$.facade.changeFrameContext(rootKey);
|
|
35
|
+
if (this.#frameContext.get('wysiwygFrame').style.display === 'none') return;
|
|
36
|
+
this.#store.set('_preventBlur', false);
|
|
37
|
+
|
|
38
|
+
if (this.#frameOptions.get('iframe') || !this.#frameContext.get('wysiwyg').contains(this.#$.selection.getNode())) {
|
|
39
|
+
this.nativeFocus();
|
|
40
|
+
} else {
|
|
41
|
+
try {
|
|
42
|
+
const range = this.#$.selection.getRange();
|
|
43
|
+
if (range.startContainer === range.endContainer && dom.check.isWysiwygFrame(range.startContainer)) {
|
|
44
|
+
const currentNode = /** @type {HTMLElement} */ (range.commonAncestorContainer).children[range.startOffset];
|
|
45
|
+
if (!this.#$.format.isLine(currentNode) && !this.#$.component.is(currentNode)) {
|
|
46
|
+
const br = dom.utils.createElement('BR');
|
|
47
|
+
const format = dom.utils.createElement(this.#options.get('defaultLine'), null, br);
|
|
48
|
+
this.#frameContext.get('wysiwyg').insertBefore(format, currentNode);
|
|
49
|
+
this.#$.selection.setRange(br, 0, br, 0);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
this.#$.selection.setRange(range.startContainer, range.startOffset, range.endContainer, range.endOffset);
|
|
54
|
+
} catch (e) {
|
|
55
|
+
console.warn('[SUNEDITOR.focus.warn] ', e);
|
|
56
|
+
this.nativeFocus();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (this.#store.mode.isBalloon) this.#kernel._eventOrchestrator._toggleToolbarBalloon();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @description If `focusEl` is a component, then that component is selected; if it is a format element, the last text is selected
|
|
65
|
+
* - If `focusEl` is `null`, then selected last element
|
|
66
|
+
* @param {?Node} [focusEl] Focus element
|
|
67
|
+
*/
|
|
68
|
+
focusEdge(focusEl) {
|
|
69
|
+
this.#store.set('_preventBlur', false);
|
|
70
|
+
focusEl ||= this.#frameContext.get('wysiwyg').lastElementChild;
|
|
71
|
+
|
|
72
|
+
const fileComponentInfo = this.#$.component.get(focusEl);
|
|
73
|
+
if (fileComponentInfo) {
|
|
74
|
+
this.#$.component.select(fileComponentInfo.target, fileComponentInfo.pluginName);
|
|
75
|
+
} else if (focusEl) {
|
|
76
|
+
if (focusEl.nodeType !== 3) {
|
|
77
|
+
focusEl = dom.query.getEdgeChild(
|
|
78
|
+
focusEl,
|
|
79
|
+
function (current) {
|
|
80
|
+
return current.childNodes.length === 0 || current.nodeType === 3;
|
|
81
|
+
},
|
|
82
|
+
true,
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
if (!focusEl) this.nativeFocus();
|
|
86
|
+
else this.#$.selection.setRange(focusEl, focusEl.textContent.length, focusEl, focusEl.textContent.length);
|
|
87
|
+
} else {
|
|
88
|
+
this.focus();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* @description Focus to wysiwyg area using native focus function
|
|
94
|
+
*/
|
|
95
|
+
nativeFocus() {
|
|
96
|
+
this.#$.selection.__focus();
|
|
97
|
+
this.#$.selection.init();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* @description Focusout to wysiwyg area (.blur())
|
|
102
|
+
*/
|
|
103
|
+
blur() {
|
|
104
|
+
if (this.#frameOptions.get('iframe')) {
|
|
105
|
+
this.#frameContext.get('wysiwygFrame').blur();
|
|
106
|
+
} else {
|
|
107
|
+
this.#frameContext.get('wysiwyg').blur();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -1,37 +1,50 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import { _w } from '../../helper/env';
|
|
6
|
-
import { getNodeFromPath, getNodePath } from '../../helper/dom/domQuery';
|
|
7
|
-
import { numbers } from '../../helper';
|
|
1
|
+
import { _w } from '../../../helper/env';
|
|
2
|
+
import { getNodeFromPath, getNodePath } from '../../../helper/dom/domQuery';
|
|
3
|
+
import { numbers } from '../../../helper';
|
|
8
4
|
|
|
9
5
|
/**
|
|
10
6
|
* @description History stack closure
|
|
11
|
-
* @param {
|
|
7
|
+
* @param {SunEditor.Kernel} kernel
|
|
12
8
|
*/
|
|
13
|
-
export default function History(
|
|
14
|
-
const
|
|
15
|
-
|
|
9
|
+
export default function History(kernel) {
|
|
10
|
+
const $ = kernel.$;
|
|
11
|
+
const store = kernel.store;
|
|
12
|
+
|
|
13
|
+
const contextProvider = $.contextProvider;
|
|
14
|
+
const eventManager = $.eventManager;
|
|
15
|
+
const frameRoots = contextProvider.frameRoots;
|
|
16
|
+
const context = contextProvider.context;
|
|
17
|
+
const frameContext = contextProvider.frameContext;
|
|
18
|
+
|
|
19
|
+
let delayTime = $.options.get('historyStackDelayTime');
|
|
16
20
|
let pushDelay = null;
|
|
17
21
|
let stackIndex, stack, rootStack, rootInitContents;
|
|
18
22
|
let waiting = false;
|
|
19
23
|
let waitingTime = null;
|
|
20
24
|
|
|
25
|
+
/**
|
|
26
|
+
* @description Triggers onChange event and updates UI after history state changes.
|
|
27
|
+
* @param {SunEditor.FrameContext} fc The frame context.
|
|
28
|
+
* @param {number} index The current history index.
|
|
29
|
+
* @param {boolean} isSetFocus Whether to apply tag effects if editor has focus.
|
|
30
|
+
*/
|
|
21
31
|
function change(fc, index, isSetFocus) {
|
|
22
|
-
if (isSetFocus &&
|
|
23
|
-
|
|
32
|
+
if (isSetFocus && store.get('hasFocus')) kernel._eventOrchestrator.applyTagEffect();
|
|
33
|
+
$.history.resetButtons(fc.get('key'), index);
|
|
24
34
|
|
|
25
35
|
// user event
|
|
26
|
-
|
|
27
|
-
if (
|
|
28
|
-
else if (
|
|
36
|
+
eventManager.triggerEvent('onChange', { frameContext: fc, data: fc.get('wysiwyg').innerHTML });
|
|
37
|
+
if (context.get('toolbar_main').style.display === 'block') $.toolbar._showBalloon();
|
|
38
|
+
else if (store.mode.isSubBalloon && context.get('toolbar_sub_main').style.display === 'block') $.subToolbar._showBalloon();
|
|
29
39
|
}
|
|
30
40
|
|
|
41
|
+
/**
|
|
42
|
+
* @description Restores content from the history stack and updates the editor state.
|
|
43
|
+
* @param {number} increase Direction to move in the stack: -1 for undo, +1 for redo.
|
|
44
|
+
*/
|
|
31
45
|
function setContentFromStack(increase) {
|
|
32
46
|
const prevKey = stack[stackIndex];
|
|
33
47
|
const prevRoot = rootStack[prevKey];
|
|
34
|
-
const fc = editor.frameContext;
|
|
35
48
|
|
|
36
49
|
stackIndex += increase;
|
|
37
50
|
const rootKey = increase < 0 && prevKey !== stack[stackIndex] && prevRoot.index > 0 ? prevKey : stack[stackIndex];
|
|
@@ -39,6 +52,15 @@ export default function History(editor) {
|
|
|
39
52
|
root.index += increase;
|
|
40
53
|
|
|
41
54
|
const item = root.value[root.index];
|
|
55
|
+
|
|
56
|
+
if (!item) {
|
|
57
|
+
console.warn('[SunEditor.history.setContent.fail] History state desynchronized. Aborting undo/redo operation.');
|
|
58
|
+
// Rollback to prevent stuck state
|
|
59
|
+
root.index -= increase;
|
|
60
|
+
stackIndex -= increase;
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
42
64
|
frameRoots.get(rootKey).get('wysiwyg').innerHTML = item.content;
|
|
43
65
|
|
|
44
66
|
if (prevKey !== rootKey && increase < 0 && stackIndex === 1) {
|
|
@@ -60,27 +82,34 @@ export default function History(editor) {
|
|
|
60
82
|
}
|
|
61
83
|
}
|
|
62
84
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
85
|
+
$.facade.changeFrameContext(focusKey);
|
|
86
|
+
$.selection.setRange(getNodeFromPath(focusItem.s.path, focusItem.frame), focusItem.s.offset, getNodeFromPath(focusItem.e.path, focusItem.frame), focusItem.e.offset);
|
|
87
|
+
$.focusManager.focus();
|
|
66
88
|
|
|
67
89
|
if (stackIndex < 0) stackIndex = 0;
|
|
68
90
|
else if (stackIndex >= stack.length) stackIndex = stack.length - 1;
|
|
69
91
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
92
|
+
$.ui.offCurrentController();
|
|
93
|
+
$.pluginManager.checkFileInfo(false);
|
|
94
|
+
$.char.display();
|
|
95
|
+
$.ui._syncFrameState(frameContext);
|
|
74
96
|
|
|
75
97
|
// document type
|
|
76
|
-
if (
|
|
77
|
-
|
|
98
|
+
if (frameContext.has('documentType_use_header')) {
|
|
99
|
+
frameContext.get('documentType').reHeader();
|
|
78
100
|
}
|
|
79
101
|
|
|
80
102
|
// onChange
|
|
81
|
-
change(
|
|
103
|
+
change(frameContext, root.index, true);
|
|
82
104
|
}
|
|
83
105
|
|
|
106
|
+
/**
|
|
107
|
+
* @description Saves content and selection to the history stack.
|
|
108
|
+
* @param {string} content HTML content to save.
|
|
109
|
+
* @param {Range} range Selection range.
|
|
110
|
+
* @param {*} rootKey Root frame key.
|
|
111
|
+
* @param {number} increase Stack index increment.
|
|
112
|
+
*/
|
|
84
113
|
function setStack(content, range, rootKey, increase) {
|
|
85
114
|
let s, e;
|
|
86
115
|
if (!range) {
|
|
@@ -89,11 +118,11 @@ export default function History(editor) {
|
|
|
89
118
|
} else {
|
|
90
119
|
s = {
|
|
91
120
|
path: getNodePath(range.startContainer, null, null),
|
|
92
|
-
offset: range.startOffset
|
|
121
|
+
offset: range.startOffset,
|
|
93
122
|
};
|
|
94
123
|
e = {
|
|
95
124
|
path: getNodePath(range.endContainer, null, null),
|
|
96
|
-
offset: range.endOffset
|
|
125
|
+
offset: range.endOffset,
|
|
97
126
|
};
|
|
98
127
|
}
|
|
99
128
|
|
|
@@ -106,10 +135,14 @@ export default function History(editor) {
|
|
|
106
135
|
content: content,
|
|
107
136
|
s: s,
|
|
108
137
|
e: e,
|
|
109
|
-
frame: frameRoots.get(rootKey).get('wysiwyg')
|
|
138
|
+
frame: frameRoots.get(rootKey).get('wysiwyg'),
|
|
110
139
|
};
|
|
111
140
|
}
|
|
112
141
|
|
|
142
|
+
/**
|
|
143
|
+
* @description Resets a root frame's history stack.
|
|
144
|
+
* @param {*} rootKey Root frame key.
|
|
145
|
+
*/
|
|
113
146
|
function resetRoot(rootKey) {
|
|
114
147
|
stackIndex++;
|
|
115
148
|
stack[stackIndex] = rootKey;
|
|
@@ -119,15 +152,23 @@ export default function History(editor) {
|
|
|
119
152
|
content: rootInitContents[rootKey],
|
|
120
153
|
s: { path: [0, 0], offset: [0, 0] },
|
|
121
154
|
e: { path: 0, offset: 0 },
|
|
122
|
-
frame: frameRoots.get(rootKey).get('wysiwyg')
|
|
155
|
+
frame: frameRoots.get(rootKey).get('wysiwyg'),
|
|
123
156
|
};
|
|
124
157
|
}
|
|
125
158
|
|
|
159
|
+
/**
|
|
160
|
+
* @description Initializes a root frame's history stack.
|
|
161
|
+
* @param {*} rootKey Root frame key.
|
|
162
|
+
*/
|
|
126
163
|
function initRoot(rootKey) {
|
|
127
164
|
rootStack[rootKey] = { value: [], index: -1 };
|
|
128
165
|
rootInitContents[rootKey] = frameRoots.get(rootKey).get('wysiwyg').innerHTML;
|
|
129
166
|
}
|
|
130
167
|
|
|
168
|
+
/**
|
|
169
|
+
* @description Clears future history and reinitializes deleted roots.
|
|
170
|
+
* @param {Object} root Root stack object.
|
|
171
|
+
*/
|
|
131
172
|
function refreshRoots(root) {
|
|
132
173
|
const deleteRoot = [];
|
|
133
174
|
for (let i = stackIndex + 1, len = stack.length; i < len; i++) {
|
|
@@ -136,8 +177,8 @@ export default function History(editor) {
|
|
|
136
177
|
}
|
|
137
178
|
|
|
138
179
|
stack = stack.slice(0, stackIndex + 1);
|
|
139
|
-
root.value.splice(
|
|
140
|
-
|
|
180
|
+
root.value.splice(root.index + 1);
|
|
181
|
+
$.commandDispatcher.applyTargets('redo', (e) => {
|
|
141
182
|
e.disabled = true;
|
|
142
183
|
});
|
|
143
184
|
|
|
@@ -146,8 +187,13 @@ export default function History(editor) {
|
|
|
146
187
|
}
|
|
147
188
|
}
|
|
148
189
|
|
|
190
|
+
/**
|
|
191
|
+
* @description Pushes current content to the history stack.
|
|
192
|
+
* @param {*} rootKey Root frame key.
|
|
193
|
+
* @param {Range} range Selection range.
|
|
194
|
+
*/
|
|
149
195
|
function pushStack(rootKey, range) {
|
|
150
|
-
|
|
196
|
+
$.pluginManager.checkFileInfo(false);
|
|
151
197
|
|
|
152
198
|
const fc = frameRoots.get(rootKey);
|
|
153
199
|
const current = fc.get('wysiwyg').innerHTML;
|
|
@@ -159,31 +205,32 @@ export default function History(editor) {
|
|
|
159
205
|
setStack(current, range, rootKey, 1);
|
|
160
206
|
|
|
161
207
|
if (stackIndex === 1) {
|
|
162
|
-
|
|
208
|
+
$.commandDispatcher.applyTargets('undo', (e) => {
|
|
163
209
|
e.disabled = false;
|
|
164
210
|
});
|
|
165
211
|
}
|
|
166
212
|
|
|
167
|
-
|
|
213
|
+
$.char.display();
|
|
168
214
|
change(fc, root.index, false);
|
|
169
215
|
}
|
|
170
216
|
|
|
171
217
|
return {
|
|
172
218
|
/**
|
|
173
219
|
* @description Saving the current status to the history object stack
|
|
174
|
-
* - If
|
|
175
|
-
* - If the function is called again with the
|
|
220
|
+
* - If `delay` is `true`, it will be saved after (`options.get('historyStackDelayTime')` || 400) milliseconds.
|
|
221
|
+
* - If the function is called again with the `delay` argument `true` before it is saved, the delay time is renewed.
|
|
176
222
|
* - You can specify the delay time by sending a number.
|
|
177
|
-
* @param {boolean|number} delay If true
|
|
178
|
-
* @param {
|
|
223
|
+
* @param {boolean|number} delay If `true`, add stack without delay time.
|
|
224
|
+
* @param {*} [rootKey] The key of the root frame to save history for.
|
|
179
225
|
*/
|
|
180
226
|
push(delay, rootKey) {
|
|
181
227
|
if (waiting) return;
|
|
182
228
|
|
|
183
|
-
rootKey = rootKey ||
|
|
184
|
-
const range =
|
|
229
|
+
rootKey = rootKey || rootKey === null ? rootKey : store.get('rootKey');
|
|
230
|
+
const range = store.get('_range');
|
|
185
231
|
|
|
186
|
-
|
|
232
|
+
// Defer frame sync (code view, page mirror) — DOM updates from the current action must complete first
|
|
233
|
+
_w.setTimeout($.ui._syncFrameState.bind($.ui, frameRoots.get(rootKey)), 0);
|
|
187
234
|
const time = typeof delay === 'number' ? (delay > 0 ? delay : 0) : !delay ? 0 : delayTime;
|
|
188
235
|
|
|
189
236
|
if (!time || pushDelay) {
|
|
@@ -194,6 +241,7 @@ export default function History(editor) {
|
|
|
194
241
|
}
|
|
195
242
|
}
|
|
196
243
|
|
|
244
|
+
// Debounced history save — coalesces rapid edits into a single snapshot (cleared on next push or immediate save)
|
|
197
245
|
pushDelay = _w.setTimeout(() => {
|
|
198
246
|
_w.clearTimeout(pushDelay);
|
|
199
247
|
pushDelay = null;
|
|
@@ -234,10 +282,10 @@ export default function History(editor) {
|
|
|
234
282
|
|
|
235
283
|
/**
|
|
236
284
|
* @description Overwrites the current state in the history stack with the latest content.
|
|
237
|
-
* @param {string
|
|
285
|
+
* @param {string} [rootKey] The key of the root frame to overwrite.
|
|
238
286
|
*/
|
|
239
287
|
overwrite(rootKey) {
|
|
240
|
-
setStack(frameRoots.get(rootKey ||
|
|
288
|
+
setStack(frameRoots.get(rootKey || store.get('rootKey')).get('wysiwyg').innerHTML, null, store.get('rootKey'), 0);
|
|
241
289
|
},
|
|
242
290
|
|
|
243
291
|
/**
|
|
@@ -250,6 +298,7 @@ export default function History(editor) {
|
|
|
250
298
|
_w.clearTimeout(waitingTime);
|
|
251
299
|
waitingTime = null;
|
|
252
300
|
}
|
|
301
|
+
// Safety auto-resume — prevents permanent history freeze if resume() is never called (cleared on resume)
|
|
253
302
|
waitingTime = _w.setTimeout(() => {
|
|
254
303
|
waiting = false;
|
|
255
304
|
}, 5000);
|
|
@@ -270,12 +319,12 @@ export default function History(editor) {
|
|
|
270
319
|
* @description Resets the history stack and disables related UI buttons.
|
|
271
320
|
*/
|
|
272
321
|
reset() {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
322
|
+
$.commandDispatcher.applyTargets('undo', (e) => (e.disabled = true));
|
|
323
|
+
$.commandDispatcher.applyTargets('redo', (e) => (e.disabled = true));
|
|
324
|
+
$.commandDispatcher.applyTargets('save', (e) => (e.disabled = true));
|
|
276
325
|
|
|
277
|
-
|
|
278
|
-
|
|
326
|
+
contextProvider.applyToRoots((e) => e.set('historyIndex', -1));
|
|
327
|
+
contextProvider.applyToRoots((e) => e.set('isChanged', false));
|
|
279
328
|
|
|
280
329
|
stackIndex = -1;
|
|
281
330
|
stack = [];
|
|
@@ -283,7 +332,7 @@ export default function History(editor) {
|
|
|
283
332
|
rootInitContents = {};
|
|
284
333
|
waiting = false;
|
|
285
334
|
|
|
286
|
-
const rootKeys =
|
|
335
|
+
const rootKeys = contextProvider.rootKeys;
|
|
287
336
|
for (let i = 0, len = rootKeys.length; i < len; i++) {
|
|
288
337
|
initRoot(rootKeys[i]);
|
|
289
338
|
}
|
|
@@ -298,14 +347,14 @@ export default function History(editor) {
|
|
|
298
347
|
const isReset = !numbers.is(index);
|
|
299
348
|
const root = rootStack[rootKey === undefined ? stack[stackIndex] : rootKey];
|
|
300
349
|
index = !isReset ? index : root.index;
|
|
301
|
-
const target =
|
|
350
|
+
const target = frameRoots.get(rootKey);
|
|
302
351
|
const rootLen = root.value.length - 1;
|
|
303
352
|
|
|
304
|
-
|
|
353
|
+
$.commandDispatcher.applyTargets('undo', (e) => {
|
|
305
354
|
if (index > 0 && index <= rootLen) e.disabled = false;
|
|
306
355
|
else e.disabled = true;
|
|
307
356
|
});
|
|
308
|
-
|
|
357
|
+
$.commandDispatcher.applyTargets('redo', (e) => {
|
|
309
358
|
if (index > -1 && index < rootLen) e.disabled = false;
|
|
310
359
|
else e.disabled = true;
|
|
311
360
|
});
|
|
@@ -316,20 +365,20 @@ export default function History(editor) {
|
|
|
316
365
|
|
|
317
366
|
target.set('historyIndex', index);
|
|
318
367
|
target.set('isChanged', isChanged);
|
|
319
|
-
|
|
368
|
+
$.commandDispatcher.applyTargets('save', (e) => {
|
|
320
369
|
if (isChanged) e.disabled = false;
|
|
321
370
|
else e.disabled = true;
|
|
322
371
|
});
|
|
323
372
|
|
|
324
|
-
|
|
373
|
+
eventManager.triggerEvent('onResetButtons', { rootKey });
|
|
325
374
|
},
|
|
326
375
|
|
|
327
376
|
/**
|
|
328
377
|
* @description Returns the root stack containing the history of each frame.
|
|
329
378
|
* @returns {{content: string, s: {path: number|number[], offset: number|number[]}, e: {path: number|number[], offset: number|number[]}, frame: HTMLElement}} The root stack object.
|
|
330
379
|
* - content: content html string
|
|
331
|
-
* - s: depth info of the
|
|
332
|
-
* - e: depth info of the
|
|
380
|
+
* - s: depth info of the `start` range
|
|
381
|
+
* - e: depth info of the `end` range
|
|
333
382
|
* - frame: wysiwyg editable element.
|
|
334
383
|
*/
|
|
335
384
|
getRootStack() {
|
|
@@ -347,9 +396,10 @@ export default function History(editor) {
|
|
|
347
396
|
/**
|
|
348
397
|
* @description Clears the entire history stack and cancels any pending save operations.
|
|
349
398
|
*/
|
|
350
|
-
|
|
399
|
+
_destroy() {
|
|
351
400
|
if (pushDelay) _w.clearTimeout(pushDelay);
|
|
401
|
+
if (waitingTime) _w.clearTimeout(waitingTime);
|
|
352
402
|
stackIndex = stack = rootStack = rootInitContents = null;
|
|
353
|
-
}
|
|
403
|
+
},
|
|
354
404
|
};
|
|
355
405
|
}
|