@@ -26,7 +26,7 @@ import { VB_EmptyBlockParentClass } from "../..";
2626type HandleBuilderInteractionParams = Omit <
2727 EventListenerHandlerParams ,
2828 "eventDetails" | "customCursor"
29- > ;
29+ > & { reEvaluate ?: boolean } ;
3030
3131type 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
6064async 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
212233export default handleBuilderInteraction ;
0 commit comments