Skip to content

Commit e0869b5

Browse files
committed
fix(VE-5061): add observer to observe cslp of selected element
1 parent af6cefa commit e0869b5

3 files changed

Lines changed: 42 additions & 11 deletions

File tree

src/visualBuilder/generators/generateOverlay.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,13 @@ interface HideOverlayParams
211211
}
212212

213213
export function hideOverlay(params: HideOverlayParams): void {
214+
const focusElementObserver =
215+
VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver;
216+
if (focusElementObserver) {
217+
focusElementObserver.disconnect();
218+
VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver =
219+
null;
220+
}
214221
hideFocusOverlay({
215222
visualBuilderContainer: params.visualBuilderContainer,
216223
visualBuilderOverlayWrapper: params.visualBuilderOverlayWrapper,

src/visualBuilder/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ interface VisualBuilderGlobalStateImpl {
5252
audienceMode: boolean;
5353
locale: string;
5454
variant: string | null;
55+
focusElementObserver: MutationObserver | null;
5556
}
5657

5758
export class VisualBuilder {
@@ -69,6 +70,7 @@ export class VisualBuilder {
6970
audienceMode: false,
7071
locale: Config.get().stackDetails.masterLocale || "en-us",
7172
variant: null,
73+
focusElementObserver: null,
7274
});
7375

7476
private handlePositionChange(editableElement: HTMLElement) {
@@ -344,6 +346,7 @@ export class VisualBuilder {
344346
audienceMode: false,
345347
locale: "en-us",
346348
variant: null,
349+
focusElementObserver: null,
347350
};
348351

349352
// Remove DOM elements

src/visualBuilder/listeners/mouseClick.ts

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import { VB_EmptyBlockParentClass } from "../..";
2626
type HandleBuilderInteractionParams = Omit<
2727
EventListenerHandlerParams,
2828
"eventDetails" | "customCursor"
29-
>;
29+
> & { reEvaluate?: boolean };
3030

3131
type AddFocusOverlayParams = Pick<
3232
EventListenerHandlerParams,
@@ -54,7 +54,11 @@ export function addFocusedToolbar(params: AddFocusedToolbarParams): void {
5454

5555
if (!editableElement || !params.focusedToolbar) return;
5656

57-
appendFocusedToolbar(params.eventDetails, params.focusedToolbar, params.hideOverlay);
57+
appendFocusedToolbar(
58+
params.eventDetails,
59+
params.focusedToolbar,
60+
params.hideOverlay
61+
);
5862
}
5963

6064
async function handleBuilderInteraction(
@@ -95,10 +99,11 @@ async function handleBuilderInteraction(
9599
const { editableElement, fieldMetadata } = eventDetails;
96100

97101
if (
98-
VisualBuilder.VisualBuilderGlobalState.value
102+
(VisualBuilder.VisualBuilderGlobalState.value
99103
.previousSelectedEditableDOM &&
100-
VisualBuilder.VisualBuilderGlobalState.value
101-
.previousSelectedEditableDOM !== editableElement
104+
VisualBuilder.VisualBuilderGlobalState.value
105+
.previousSelectedEditableDOM !== editableElement) ||
106+
params.reEvaluate
102107
) {
103108
cleanIndividualFieldResidual({
104109
overlayWrapper: params.overlayWrapper,
@@ -110,9 +115,7 @@ async function handleBuilderInteraction(
110115

111116
// if the selected element is our empty block element, return
112117
if (
113-
editableElement.classList.contains(
114-
VB_EmptyBlockParentClass
115-
) ||
118+
editableElement.classList.contains(VB_EmptyBlockParentClass) ||
116119
editableElement.classList.contains("visual-builder__empty-block")
117120
) {
118121
return;
@@ -127,14 +130,14 @@ async function handleBuilderInteraction(
127130
.previousSelectedEditableDOM;
128131
if (
129132
previousSelectedElement &&
130-
previousSelectedElement === editableElement
133+
previousSelectedElement === editableElement &&
134+
!params.reEvaluate
131135
) {
132136
return;
133137
}
134138

135139
VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM =
136140
editableElement;
137-
138141
addOverlay({
139142
overlayWrapper: params.overlayWrapper,
140143
resizeObserver: params.resizeObserver,
@@ -151,7 +154,7 @@ async function handleBuilderInteraction(
151154
focusedToolbar: params.focusedToolbar,
152155
resizeObserver: params.resizeObserver,
153156
});
154-
}
157+
},
155158
});
156159

157160
const { content_type_uid, fieldPath, cslpValue } = fieldMetadata;
@@ -207,6 +210,24 @@ async function handleBuilderInteraction(
207210
resizeObserver: params.resizeObserver,
208211
lastEditedField: previousSelectedElement,
209212
});
213+
214+
const focusElementObserver = new MutationObserver((mutations) => {
215+
mutations.forEach((mutation) => {
216+
if (
217+
mutation.type === "attributes" &&
218+
mutation.attributeName === "data-cslp"
219+
) {
220+
focusElementObserver?.disconnect();
221+
VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver =
222+
null;
223+
handleBuilderInteraction({ ...params, reEvaluate: true });
224+
}
225+
});
226+
});
227+
//store it in global state
228+
VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver =
229+
focusElementObserver;
230+
focusElementObserver.observe(editableElement, { attributes: true });
210231
}
211232

212233
export default handleBuilderInteraction;

0 commit comments

Comments
 (0)