Skip to content

Commit 0a569cb

Browse files
authored
Merge pull request #684 from Harbour-Enterprises/custom-selection-fix
fix: selections is lost when toolbar dropdown item is clicked
2 parents 05c79d5 + 539b49b commit 0a569cb

3 files changed

Lines changed: 22 additions & 2 deletions

File tree

packages/super-editor/src/components/SuperEditor.vue

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<script setup>
22
import 'tippy.js/dist/tippy.css';
33
import { NSkeleton } from 'naive-ui';
4-
import { ref, onMounted, onBeforeUnmount, computed, shallowRef, reactive, nextTick, markRaw } from 'vue';
4+
import { ref, onMounted, onBeforeUnmount, shallowRef, reactive, markRaw, onDeactivated } from 'vue';
55
import { Editor } from '@/index.js';
66
import { getStarterExtensions } from '@extensions/index.js';
77
import SlashMenu from './slash-menu/SlashMenu.vue';
@@ -223,9 +223,26 @@ const handleSuperEditorClick = (event) => {
223223
}
224224
};
225225
226+
const handleClickOutside = (event) => {
227+
const pmElement = editorElem.value?.querySelector('.ProseMirror');
228+
const isInsideEditor = pmElement?.contains(event.target);
229+
230+
if (!isInsideEditor) {
231+
editor.value.setOptions({
232+
focusTarget: event.target,
233+
});
234+
}
235+
};
236+
226237
onMounted(() => {
227238
initializeData();
228239
if (props.options?.suppressSkeletonLoader || !props.options?.collaborationProvider) editorReady.value = true;
240+
241+
document.addEventListener('mousedown', handleClickOutside);
242+
});
243+
244+
onDeactivated(() => {
245+
document.removeEventListener('mousedown', handleClickOutside);
229246
});
230247
231248
const handleMarginClick = (event) => {

packages/super-editor/src/core/Editor.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,8 @@ export class Editor extends EventEmitter {
240240

241241
isHeaderFooterChanged: false,
242242
isCustomXmlChanged: false,
243+
244+
focusTarget: null,
243245
};
244246

245247
/**

packages/super-editor/src/extensions/custom-selection/custom-selection.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ export const CustomSelection = Extension.create({
3434
props: {
3535
handleDOMEvents: {
3636
focusout: (view, event) => {
37-
if (document.activeElement && !event.relatedTarget) {
37+
const isDropDownOption = this.editor.options.focusTarget.getAttribute('data-dropdown-option');
38+
if (document.activeElement && !event.relatedTarget && !view.state.selection.empty && !isDropDownOption) {
3839
this.editor.setOptions({
3940
lastSelection: view.state.selection,
4041
});

0 commit comments

Comments
 (0)