Skip to content

Commit 372b865

Browse files
authored
Merge pull request #298 from contentstack/VE-3967
remove focus event if selected element is not in dom
2 parents 7a5edf5 + 0d79f4d commit 372b865

3 files changed

Lines changed: 57 additions & 6 deletions

File tree

src/visualBuilder/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ export class VisualBuilder {
7676
visualBuilderContainer: this.visualBuilderContainer,
7777
overlayWrapper: this.overlayWrapper,
7878
focusedToolbar: this.focusedToolbar,
79+
resizeObserver: this.resizeObserver,
7980
});
8081
}
8182

@@ -178,7 +179,8 @@ export class VisualBuilder {
178179
updateFocussedStateOnMutation(
179180
this.overlayWrapper,
180181
this.focusedToolbar,
181-
this.visualBuilderContainer
182+
this.visualBuilderContainer,
183+
this.resizeObserver
182184
);
183185
const emptyBlockParents = Array.from(
184186
document.querySelectorAll(

src/visualBuilder/utils/handleIndividualFields.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ export async function handleIndividualFields(
201201
visualBuilderContainer,
202202
overlayWrapper,
203203
focusedToolbar,
204+
resizeObserver,
204205
});
205206
}, 200);
206207
actualEditableField.addEventListener(

src/visualBuilder/utils/updateFocussedState.ts

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { VisualBuilder } from "..";
22
import { extractDetailsFromCslp } from "../../cslp";
33
import { getAddInstanceButtons } from "../generators/generateAddInstanceButtons";
4-
import { addFocusOverlay } from "../generators/generateOverlay";
4+
import {
5+
addFocusOverlay,
6+
hideFocusOverlay,
7+
} from "../generators/generateOverlay";
58
import { hideHoverOutline } from "../listeners/mouseHover";
69
import {
710
LIVE_PREVIEW_OUTLINE_WIDTH_IN_PX,
@@ -82,13 +85,15 @@ export function updateFocussedState({
8285
visualBuilderContainer,
8386
overlayWrapper,
8487
focusedToolbar,
88+
resizeObserver,
8589
}: {
8690
editableElement: HTMLElement | null;
8791
visualBuilderContainer: HTMLDivElement | null;
8892
overlayWrapper: HTMLDivElement | null;
8993
focusedToolbar: HTMLDivElement | null;
94+
resizeObserver: ResizeObserver | null;
9095
}): void {
91-
const previousSelectedEditableDOM =
96+
let previousSelectedEditableDOM =
9297
VisualBuilder.VisualBuilderGlobalState.value
9398
.previousSelectedEditableDOM;
9499
if (
@@ -99,6 +104,28 @@ export function updateFocussedState({
99104
) {
100105
return;
101106
}
107+
108+
const previousSelectedElementCslp =
109+
previousSelectedEditableDOM?.getAttribute("data-cslp");
110+
const newPreviousSelectedElement = document.querySelector(
111+
`[data-cslp="${previousSelectedElementCslp}"]`
112+
);
113+
if (!newPreviousSelectedElement && resizeObserver) {
114+
hideFocusOverlay({
115+
visualBuilderOverlayWrapper: overlayWrapper,
116+
focusedToolbar,
117+
visualBuilderContainer,
118+
resizeObserver,
119+
noTrigger: true,
120+
});
121+
return;
122+
}
123+
if (newPreviousSelectedElement !== previousSelectedEditableDOM) {
124+
previousSelectedEditableDOM = newPreviousSelectedElement as HTMLElement;
125+
VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM =
126+
previousSelectedEditableDOM;
127+
}
128+
102129
hideHoverOutline(visualBuilderContainer);
103130
addFocusOverlay(previousSelectedEditableDOM, overlayWrapper);
104131

@@ -190,16 +217,37 @@ export function updateFocussedState({
190217
export function updateFocussedStateOnMutation(
191218
focusOverlayWrapper: HTMLDivElement | null,
192219
focusedToolbar: HTMLDivElement | null,
193-
visualBuilderContainer: HTMLDivElement | null
220+
visualBuilderContainer: HTMLDivElement | null,
221+
resizeObserver: ResizeObserver | null
194222
) {
195223
if (!focusOverlayWrapper) return;
196224

197-
const selectedElement =
225+
let selectedElement =
198226
VisualBuilder.VisualBuilderGlobalState.value
199227
.previousSelectedEditableDOM;
200-
201228
if (!selectedElement) return;
202229

230+
const selectedElementCslp = selectedElement?.getAttribute("data-cslp");
231+
const newSelectedElement = document.querySelector(
232+
`[data-cslp="${selectedElementCslp}"]`
233+
);
234+
if (!newSelectedElement && resizeObserver) {
235+
hideFocusOverlay({
236+
visualBuilderOverlayWrapper: focusOverlayWrapper,
237+
focusedToolbar,
238+
visualBuilderContainer,
239+
resizeObserver,
240+
noTrigger: true,
241+
});
242+
return;
243+
}
244+
245+
if (newSelectedElement !== selectedElement) {
246+
selectedElement = newSelectedElement as HTMLElement;
247+
VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM =
248+
selectedElement;
249+
}
250+
203251
const selectedElementDimension = selectedElement.getBoundingClientRect();
204252

205253
/**

0 commit comments

Comments
 (0)