From cbb0c79f338972fc36edaa830c13e3a844342490 Mon Sep 17 00:00:00 2001 From: Jos de Jong Date: Wed, 22 Sep 2021 10:49:49 +0200 Subject: [PATCH] fix: do not lose focus and fire a focus/blur event when opening a modal inside the editor --- .../components/modes/codemode/CodeMode.svelte | 16 +++++++++++-- .../components/modes/treemode/TreeMode.svelte | 23 ++++++++++++++++--- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/lib/components/modes/codemode/CodeMode.svelte b/src/lib/components/modes/codemode/CodeMode.svelte index 5e04fa6d..3113fd19 100644 --- a/src/lib/components/modes/codemode/CodeMode.svelte +++ b/src/lib/components/modes/codemode/CodeMode.svelte @@ -133,11 +133,15 @@ } } + // modalOpen is true when one of the modals is open. + // This is used to track whether the editor still has focus + let modalOpen = false + createFocusTracker({ onMount, onDestroy, getWindow: () => getWindow(domCodeMode), - hasFocus: () => activeElementIsChildOf(domCodeMode), + hasFocus: () => (modalOpen && document.hasFocus()) || activeElementIsChildOf(domCodeMode), onFocus, onBlur }) @@ -226,6 +230,8 @@ try { const json = JSON.parse(text) + modalOpen = true + open( SortModal, { @@ -239,7 +245,10 @@ }, SORT_MODAL_OPTIONS, { - onClose: focus + onClose: () => { + modalOpen = false + focus() + } } ) } catch (err) { @@ -251,6 +260,8 @@ try { const json = JSON.parse(text) + modalOpen = true + open( TransformModal, { @@ -275,6 +286,7 @@ TRANSFORM_MODAL_OPTIONS, { onClose: () => { + modalOpen = false focus() if (onClose) { onClose() diff --git a/src/lib/components/modes/treemode/TreeMode.svelte b/src/lib/components/modes/treemode/TreeMode.svelte index 56cded5a..47323987 100644 --- a/src/lib/components/modes/treemode/TreeMode.svelte +++ b/src/lib/components/modes/treemode/TreeMode.svelte @@ -121,11 +121,15 @@ export let onFocus export let onBlur + // modalOpen is true when one of the modals is open. + // This is used to track whether the editor still has focus + let modalOpen = false + createFocusTracker({ onMount, onDestroy, getWindow: () => getWindow(refJsonEditor), - hasFocus: () => activeElementIsChildOf(refJsonEditor), + hasFocus: () => (modalOpen && document.hasFocus()) || activeElementIsChildOf(refJsonEditor), onFocus: () => { hasFocus = true if (onFocus) { @@ -973,6 +977,8 @@ return } + modalOpen = true + open( SortModal, { @@ -995,7 +1001,10 @@ }, SORT_MODAL_OPTIONS, { - onClose: () => focus() + onClose: () => { + modalOpen = false + focus() + } } ) } @@ -1019,6 +1028,8 @@ return } + modalOpen = true + open( TransformModal, { @@ -1051,6 +1062,7 @@ TRANSFORM_MODAL_OPTIONS, { onClose: () => { + modalOpen = false focus() if (onClose) { onClose() @@ -1540,6 +1552,8 @@ } } + modalOpen = true + openAbsolutePopup(ContextMenu, props, { left, top, @@ -1549,7 +1563,10 @@ height, anchor, closeOnOuterClick: true, - onClose: focus + onClose: () => { + modalOpen = false + focus() + } }) }