Skip to content

Commit 56a3646

Browse files
authored
Merge pull request #351 from contentstack/VE-5012
fix(VE-5012): add variant classes in case of adding multiple instances
2 parents b817450 + ce50fb7 commit 56a3646

1 file changed

Lines changed: 74 additions & 9 deletions

File tree

src/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.ts

Lines changed: 74 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,17 @@ function updateVariantClasses({
3535
const updateElementClasses = (
3636
element: HTMLElement,
3737
dataCslp: string,
38-
observer: MutationObserver
38+
observer?: MutationObserver
3939
) => {
4040
if (!dataCslp) return;
4141

4242
if (
4343
dataCslp.startsWith("v2:") &&
44-
element.classList.contains("visual-builder__base-field")
44+
!element.classList.contains("visual-builder__variant-field")
4545
) {
46-
element.classList.remove("visual-builder__base-field");
46+
if (element.classList.contains("visual-builder__base-field")) {
47+
element.classList.remove("visual-builder__base-field");
48+
}
4749
if (highlightVariantFields) {
4850
element.classList.add(
4951
visualBuilderStyles()["visual-builder__variant-field"],
@@ -73,7 +75,7 @@ function updateVariantClasses({
7375
);
7476
element.classList.add("visual-builder__disabled-variant-field");
7577
}
76-
78+
if (!observer) return;
7779
// Disconnect this observer after processing
7880
observer.disconnect();
7981
const index = observers.indexOf(observer);
@@ -82,20 +84,79 @@ function updateVariantClasses({
8284
}
8385
};
8486

87+
const addElementClasses = (element: HTMLElement) => {
88+
const dataCslp = element.getAttribute(DATA_CSLP_ATTR_SELECTOR);
89+
90+
if (!dataCslp) {
91+
//recursive call for child nodes
92+
element.childNodes.forEach((child) => {
93+
if (child instanceof HTMLElement) {
94+
addElementClasses(child);
95+
}
96+
});
97+
return;
98+
}
99+
//if element might have been updated by another observer
100+
if (
101+
dataCslp.startsWith("v2:") &&
102+
element.classList.contains("visual-builder__variant-field")
103+
) {
104+
return;
105+
}
106+
// if element has not given variant/base class
107+
if (
108+
dataCslp.startsWith("v2:") &&
109+
!element.classList.contains("visual-builder__variant-field")
110+
) {
111+
if (element.classList.contains("visual-builder__base-field")) {
112+
element.classList.remove("visual-builder__base-field");
113+
}
114+
if (highlightVariantFields) {
115+
element.classList.add(
116+
visualBuilderStyles()["visual-builder__variant-field"],
117+
"visual-builder__variant-field"
118+
);
119+
} else {
120+
element.classList.add("visual-builder__variant-field");
121+
}
122+
} else if (!dataCslp.startsWith("v2:")) {
123+
if (element.classList.contains("visual-builder__variant-field")) {
124+
element.classList.remove(
125+
visualBuilderStyles()["visual-builder__variant-field"],
126+
"visual-builder__variant-field"
127+
);
128+
}
129+
element.classList.add("visual-builder__base-field");
130+
}
131+
132+
//recursive call for child nodes
133+
element.childNodes.forEach((child) => {
134+
if (child instanceof HTMLElement) {
135+
addElementClasses(child);
136+
}
137+
});
138+
};
139+
85140
// Create a separate observer for each element
86141
const elementsWithCslp = document.querySelectorAll(
87142
`[${DATA_CSLP_ATTR_SELECTOR}]`
88143
);
89-
90144
elementsWithCslp.forEach((elementNode) => {
91145
const element = elementNode as HTMLElement;
92-
93146
const observer = new MutationObserver((mutations) => {
94147
mutations.forEach((mutation) => {
95148
if (
96-
mutation.type === "attributes" &&
97-
mutation.attributeName === DATA_CSLP_ATTR_SELECTOR
149+
(mutation.type === "attributes" &&
150+
mutation.attributeName === DATA_CSLP_ATTR_SELECTOR) ||
151+
mutation.type === "childList"
98152
) {
153+
if (mutation.addedNodes.length > 0) {
154+
mutation.addedNodes.forEach((node) => {
155+
if (node instanceof HTMLElement) {
156+
addElementClasses(node);
157+
}
158+
});
159+
}
99160
const dataCslp = element.getAttribute(
100161
DATA_CSLP_ATTR_SELECTOR
101162
);
@@ -105,7 +166,11 @@ function updateVariantClasses({
105166
});
106167

107168
observers.push(observer);
108-
observer.observe(element, { attributes: true });
169+
observer.observe(element, {
170+
attributes: true,
171+
childList: true, // Observe direct children
172+
subtree: true,
173+
});
109174
});
110175

111176
setTimeout(() => {

0 commit comments

Comments
 (0)