Skip to content

Commit 781d7ec

Browse files
authored
Merge pull request #421 from contentstack/VE-4232
fix(VE-4232): implement data-cslp mutation observer to manage unique IDs for elements
2 parents dcc3a10 + f513fe5 commit 781d7ec

2 files changed

Lines changed: 44 additions & 5 deletions

File tree

src/visualBuilder/index.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,38 @@ export class VisualBuilder {
268268
}, 1000)
269269
);
270270

271+
private dataCslpMutationObserver = new MutationObserver((mutations) => {
272+
let shouldCheck = false;
273+
274+
mutations.forEach((mutation) => {
275+
if (
276+
mutation.type === "childList" &&
277+
mutation.addedNodes.length > 0
278+
) {
279+
for (const node of mutation.addedNodes) {
280+
if (node.nodeType === Node.ELEMENT_NODE) {
281+
if ((node as Element).hasAttribute("data-cslp")) {
282+
shouldCheck = true;
283+
break;
284+
}
285+
}
286+
}
287+
}
288+
});
289+
290+
if (shouldCheck) {
291+
const dataCslpElements = document.querySelectorAll("[data-cslp]");
292+
if (dataCslpElements.length > 0) {
293+
dataCslpElements.forEach((element) => {
294+
if (!element.hasAttribute("data-cslp-unique-id")) {
295+
const uniqueId = `cslp-${window.crypto.randomUUID()}`;
296+
element.setAttribute("data-cslp-unique-id", uniqueId);
297+
}
298+
});
299+
}
300+
}
301+
});
302+
271303
constructor() {
272304
// Handles changes in element positions due to sidebar toggling or window resizing,
273305
// triggering a redraw of the visual builder
@@ -296,6 +328,12 @@ export class VisualBuilder {
296328
if (!config.enable || config.mode < ILivePreviewModeConfig.BUILDER) {
297329
return;
298330
}
331+
332+
this.dataCslpMutationObserver.observe(document.body, {
333+
childList: true,
334+
subtree: true,
335+
});
336+
299337
visualBuilderPostMessage
300338
?.send<IVisualBuilderInitEvent>("init", {
301339
isSSR: config.ssr,
@@ -409,6 +447,7 @@ export class VisualBuilder {
409447
this.resizeObserver.disconnect();
410448
this.mutationObserver.disconnect();
411449
this.threadMutationObserver.disconnect();
450+
this.dataCslpMutationObserver.disconnect()
412451

413452
// Clear global state
414453
VisualBuilder.VisualBuilderGlobalState.value = {

src/visualBuilder/utils/updateFocussedState.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,10 @@ export function updateFocussedState({
105105
return;
106106
}
107107

108-
const previousSelectedElementCslp =
109-
previousSelectedEditableDOM?.getAttribute("data-cslp");
108+
const previousSelectedElementCslpUniqueId =
109+
previousSelectedEditableDOM?.getAttribute("data-cslp-unique-id");
110110
const newPreviousSelectedElement = document.querySelector(
111-
`[data-cslp="${previousSelectedElementCslp}"]`
111+
`[data-cslp-unique-id="${previousSelectedElementCslpUniqueId}"]`
112112
);
113113
if (!newPreviousSelectedElement && resizeObserver) {
114114
hideFocusOverlay({
@@ -227,9 +227,9 @@ export function updateFocussedStateOnMutation(
227227
.previousSelectedEditableDOM;
228228
if (!selectedElement) return;
229229

230-
const selectedElementCslp = selectedElement?.getAttribute("data-cslp");
230+
const selectedElementCslpUniqueId = selectedElement?.getAttribute("data-cslp-unique-id");
231231
const newSelectedElement = document.querySelector(
232-
`[data-cslp="${selectedElementCslp}"]`
232+
`[data-cslp-unique-id="${selectedElementCslpUniqueId}"]`
233233
);
234234
if (!newSelectedElement && resizeObserver) {
235235
hideFocusOverlay({

0 commit comments

Comments
 (0)