Skip to content

Commit d2d6d54

Browse files
fix: set unique ID on element click
1 parent 332cebb commit d2d6d54

3 files changed

Lines changed: 31 additions & 45 deletions

File tree

src/visualBuilder/index.ts

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -268,38 +268,6 @@ 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-
303271
constructor() {
304272
// Handles changes in element positions due to sidebar toggling or window resizing,
305273
// triggering a redraw of the visual builder
@@ -329,11 +297,6 @@ export class VisualBuilder {
329297
return;
330298
}
331299

332-
this.dataCslpMutationObserver.observe(document.body, {
333-
childList: true,
334-
subtree: true,
335-
});
336-
337300
visualBuilderPostMessage
338301
?.send<IVisualBuilderInitEvent>("init", {
339302
isSSR: config.ssr,
@@ -447,7 +410,6 @@ export class VisualBuilder {
447410
this.resizeObserver.disconnect();
448411
this.mutationObserver.disconnect();
449412
this.threadMutationObserver.disconnect();
450-
this.dataCslpMutationObserver.disconnect()
451413

452414
// Clear global state
453415
VisualBuilder.VisualBuilderGlobalState.value = {

src/visualBuilder/listeners/mouseClick.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,22 @@ async function handleBuilderInteraction(
7979
(eventTarget.hasAttribute("data-cslp") ||
8080
eventTarget.closest("[data-cslp]"));
8181

82+
// if multiple elements with the same cslp element are found,
83+
// assign a unique ID to each element which we can use to identify
84+
// them in updateFocussedState and other places where we
85+
// would have queried the element by data-cslp
86+
const duplicates = document.querySelectorAll(
87+
`[data-cslp="${eventTarget?.getAttribute("data-cslp")}"]`
88+
);
89+
if (duplicates.length > 1) {
90+
duplicates.forEach((ele) => {
91+
if (!ele.hasAttribute("data-cslp-unique-id")) {
92+
const uniqueId = `cslp-${window.crypto.randomUUID()}`;
93+
ele.setAttribute("data-cslp-unique-id", uniqueId);
94+
}
95+
});
96+
}
97+
8298
// if the target element is a studio-ui element, return
8399
// this is currently used for the "Edit in Studio" button
84100
if (eventTarget?.getAttribute("data-studio-ui") === "true") {

src/visualBuilder/utils/updateFocussedState.ts

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

108+
// prefer data-cslp-unique-id when available else use data-cslp.
109+
// unique ID is added on click when multiple elements with same
110+
// cslp element are found.
111+
const cslp = editableElement?.getAttribute("data-cslp") || "";
108112
const previousSelectedElementCslpUniqueId =
109113
previousSelectedEditableDOM?.getAttribute("data-cslp-unique-id");
110-
const newPreviousSelectedElement = document.querySelector(
111-
`[data-cslp-unique-id="${previousSelectedElementCslpUniqueId}"]`
112-
);
114+
const newPreviousSelectedElement =
115+
document.querySelector(
116+
`[data-cslp-unique-id="${previousSelectedElementCslpUniqueId}"]`
117+
) || document.querySelector(`[data-cslp="${cslp}"]`);
113118
if (!newPreviousSelectedElement && resizeObserver) {
114119
hideFocusOverlay({
115120
visualBuilderOverlayWrapper: overlayWrapper,
@@ -148,7 +153,6 @@ export function updateFocussedState({
148153
psuedoEditableElement.style.visibility = "visible";
149154
}
150155

151-
const cslp = editableElement?.getAttribute("data-cslp") || "";
152156
const fieldMetadata = extractDetailsFromCslp(cslp);
153157

154158
const targetElementDimension = editableElement.getBoundingClientRect();
@@ -227,10 +231,14 @@ export function updateFocussedStateOnMutation(
227231
.previousSelectedEditableDOM;
228232
if (!selectedElement) return;
229233

230-
const selectedElementCslpUniqueId = selectedElement?.getAttribute("data-cslp-unique-id");
231-
const newSelectedElement = document.querySelector(
232-
`[data-cslp-unique-id="${selectedElementCslpUniqueId}"]`
234+
const cslp = selectedElement.getAttribute("data-cslp");
235+
const selectedElementCslpUniqueId = selectedElement?.getAttribute(
236+
"data-cslp-unique-id"
233237
);
238+
const newSelectedElement =
239+
document.querySelector(
240+
`[data-cslp-unique-id="${selectedElementCslpUniqueId}"]`
241+
) || document.querySelector(`[data-cslp="${cslp}"]`);
234242
if (!newSelectedElement && resizeObserver) {
235243
hideFocusOverlay({
236244
visualBuilderOverlayWrapper: focusOverlayWrapper,

0 commit comments

Comments
 (0)