@@ -81,43 +81,24 @@ async function handleBuilderInteraction(
8181 }
8282
8383 const eventDetails = getCsDataOfElement ( params . event ) ;
84- visualBuilderPostMessage
85- ?. send ( VisualBuilderPostMessageEvents . MOUSE_CLICK , {
86- cslpData : eventDetails ?. cslpData ,
87- fieldMetadata : eventDetails ?. fieldMetadata ,
88- } )
89- . catch ( ( err ) => {
90- console . warn ( "Error while sending post message" , err ) ;
91- } ) ;
84+
85+ // Send mouse click post message
86+ sendMouseClickPostMessage ( eventDetails ) ;
87+
9288 if (
9389 ! eventDetails ||
9490 ! params . overlayWrapper ||
9591 ! params . visualBuilderContainer
9692 ) {
9793 return ;
9894 }
99- const { editableElement, fieldMetadata } = eventDetails ;
10095
101- if (
102- ( VisualBuilder . VisualBuilderGlobalState . value
103- . previousSelectedEditableDOM &&
104- VisualBuilder . VisualBuilderGlobalState . value
105- . previousSelectedEditableDOM !== editableElement ) ||
106- params . reEvaluate
107- ) {
108- cleanIndividualFieldResidual ( {
109- overlayWrapper : params . overlayWrapper ,
110- visualBuilderContainer : params . visualBuilderContainer ,
111- focusedToolbar : params . focusedToolbar ,
112- resizeObserver : params . resizeObserver ,
113- } ) ;
114- }
96+ const { editableElement, fieldMetadata } = eventDetails ;
97+ // Clean residuals if necessary
98+ cleanResidualsIfNeeded ( params , editableElement ) ;
11599
116- // if the selected element is our empty block element, return
117- if (
118- editableElement . classList . contains ( VB_EmptyBlockParentClass ) ||
119- editableElement . classList . contains ( "visual-builder__empty-block" )
120- ) {
100+ // Return if the selected element is an empty block
101+ if ( isEmptyBlockElement ( editableElement ) ) {
121102 return ;
122103 }
123104
@@ -129,15 +110,87 @@ async function handleBuilderInteraction(
129110 VisualBuilder . VisualBuilderGlobalState . value
130111 . previousSelectedEditableDOM ;
131112 if (
132- previousSelectedElement &&
133- previousSelectedElement === editableElement &&
134- ! params . reEvaluate
113+ isSameSelectedElement ( previousSelectedElement , editableElement , params )
135114 ) {
136115 return ;
137116 }
138117
139118 VisualBuilder . VisualBuilderGlobalState . value . previousSelectedEditableDOM =
140119 editableElement ;
120+
121+ // Add overlay and focused toolbar
122+ addOverlayAndToolbar ( params , eventDetails , editableElement ) ;
123+
124+ const { cslpValue } = fieldMetadata ;
125+
126+ toggleHighlightedCommentIconDisplay ( cslpValue , false ) ;
127+
128+ // Handle field schema and individual fields
129+ await handleFieldSchemaAndIndividualFields (
130+ params ,
131+ eventDetails ,
132+ fieldMetadata ,
133+ editableElement
134+ ) ;
135+
136+ // Observe changes to the editable element
137+ observeEditableElementChanges ( params , editableElement ) ;
138+ }
139+
140+ function sendMouseClickPostMessage ( eventDetails : any ) {
141+ visualBuilderPostMessage
142+ ?. send ( VisualBuilderPostMessageEvents . MOUSE_CLICK , {
143+ cslpData : eventDetails ?. cslpData ,
144+ fieldMetadata : eventDetails ?. fieldMetadata ,
145+ } )
146+ . catch ( ( err ) => {
147+ console . warn ( "Error while sending post message" , err ) ;
148+ } ) ;
149+ }
150+ function cleanResidualsIfNeeded (
151+ params : HandleBuilderInteractionParams ,
152+ editableElement : Element
153+ ) {
154+ const previousSelectedElement =
155+ VisualBuilder . VisualBuilderGlobalState . value
156+ . previousSelectedEditableDOM ;
157+ if (
158+ ( previousSelectedElement &&
159+ previousSelectedElement !== editableElement ) ||
160+ params . reEvaluate
161+ ) {
162+ cleanIndividualFieldResidual ( {
163+ overlayWrapper : params . overlayWrapper ! ,
164+ visualBuilderContainer : params . visualBuilderContainer ,
165+ focusedToolbar : params . focusedToolbar ,
166+ resizeObserver : params . resizeObserver ,
167+ } ) ;
168+ }
169+ }
170+ function isEmptyBlockElement ( editableElement : Element ) : boolean {
171+ return (
172+ editableElement . classList . contains ( VB_EmptyBlockParentClass ) ||
173+ editableElement . classList . contains ( "visual-builder__empty-block" )
174+ ) ;
175+ }
176+
177+ function isSameSelectedElement (
178+ previousSelectedElement : Element | null ,
179+ editableElement : Element ,
180+ params : HandleBuilderInteractionParams
181+ ) : boolean {
182+ return ! ! (
183+ previousSelectedElement &&
184+ previousSelectedElement === editableElement &&
185+ ! params . reEvaluate
186+ ) ;
187+ }
188+
189+ function addOverlayAndToolbar (
190+ params : HandleBuilderInteractionParams ,
191+ eventDetails : any ,
192+ editableElement : Element
193+ ) {
141194 addOverlay ( {
142195 overlayWrapper : params . overlayWrapper ,
143196 resizeObserver : params . resizeObserver ,
@@ -156,18 +209,20 @@ async function handleBuilderInteraction(
156209 } ) ;
157210 } ,
158211 } ) ;
159-
160- const { content_type_uid, fieldPath, cslpValue } = fieldMetadata ;
161-
162- toggleHighlightedCommentIconDisplay ( cslpValue , false ) ;
163-
212+ }
213+ async function handleFieldSchemaAndIndividualFields (
214+ params : HandleBuilderInteractionParams ,
215+ eventDetails : any ,
216+ fieldMetadata : any ,
217+ editableElement : Element
218+ ) {
219+ const { content_type_uid, fieldPath } = fieldMetadata ;
164220 const fieldSchema = await FieldSchemaMap . getFieldSchema (
165221 content_type_uid ,
166222 fieldPath
167223 ) ;
168224
169225 if ( fieldSchema ) {
170- // after field schema is available re-add disabled overlay
171226 const { isDisabled } = isFieldDisabled ( fieldSchema , eventDetails ) ;
172227 if ( isDisabled ) {
173228 addOverlay ( {
@@ -179,38 +234,22 @@ async function handleBuilderInteraction(
179234 }
180235 }
181236
182- // This is most probably redundant code, as the handleIndividualFields function
183- // takes care of this
184- // TODO: Remove this
185- // if (
186- // fieldSchema.data_type === "block" ||
187- // fieldSchema.multiple ||
188- // (fieldSchema.data_type === "reference" &&
189- // // @ts -ignore
190- // fieldSchema.field_metadata.ref_multiple)
191- // ) {
192- // handleAddButtonsForMultiple(eventDetails, {
193- // editableElement: editableElement,
194- // visualBuilderContainer: params.visualBuilderContainer,
195- // resizeObserver: params.resizeObserver,
196- // });
197- // } else {
198- // removeAddInstanceButtons({
199- // eventTarget: params.event.target,
200- // visualBuilderContainer: params.visualBuilderContainer,
201- // overlayWrapper: params.overlayWrapper,
202- // });
203- // }
204237 visualBuilderPostMessage ?. send ( VisualBuilderPostMessageEvents . FOCUS_FIELD , {
205238 DOMEditStack : getDOMEditStack ( editableElement ) ,
206239 } ) ;
207240
208241 await handleIndividualFields ( eventDetails , {
209- visualBuilderContainer : params . visualBuilderContainer ,
242+ visualBuilderContainer : params . visualBuilderContainer ! ,
210243 resizeObserver : params . resizeObserver ,
211- lastEditedField : previousSelectedElement ,
244+ lastEditedField :
245+ VisualBuilder . VisualBuilderGlobalState . value
246+ . previousSelectedEditableDOM ,
212247 } ) ;
213-
248+ }
249+ function observeEditableElementChanges (
250+ params : HandleBuilderInteractionParams ,
251+ editableElement : Element
252+ ) {
214253 const focusElementObserver = new MutationObserver ( ( mutations ) => {
215254 mutations . forEach ( ( mutation ) => {
216255 if (
@@ -224,7 +263,7 @@ async function handleBuilderInteraction(
224263 }
225264 } ) ;
226265 } ) ;
227- //store it in global state
266+
228267 VisualBuilder . VisualBuilderGlobalState . value . focusElementObserver =
229268 focusElementObserver ;
230269 focusElementObserver . observe ( editableElement , { attributes : true } ) ;
0 commit comments