@@ -10,7 +10,11 @@ import {
1010
1111import { appendFocusedToolbar } from "../generators/generateToolbar" ;
1212
13- import { addFocusOverlay , hideOverlay } from "../generators/generateOverlay" ;
13+ import {
14+ addFocusOverlay ,
15+ hideOverlay ,
16+ sendUnlockFieldEvent ,
17+ } from "../generators/generateOverlay" ;
1418
1519import visualBuilderPostMessage from "../utils/visualBuilderPostMessage" ;
1620
@@ -32,6 +36,7 @@ import { fixSvgXPath } from "../utils/collabUtils";
3236import { v4 as uuidV4 } from "uuid" ;
3337import { CslpData } from "../../cslp/types/cslp.types" ;
3438import { fetchEntryPermissionsAndStageDetails } from "../utils/fetchEntryPermissionsAndStageDetails" ;
39+ import { checkAndApplyFieldLockStatus } from "./mouseHover" ;
3540
3641export type HandleBuilderInteractionParams = Omit <
3742 EventListenerHandlerParams ,
@@ -172,6 +177,28 @@ export async function handleBuilderInteraction(
172177 }
173178
174179 const { editableElement, fieldMetadata } = eventDetails ;
180+
181+ const previousSelectedEditableDOM =
182+ VisualBuilder . VisualBuilderGlobalState . value
183+ . previousSelectedEditableDOM ;
184+
185+ if (
186+ previousSelectedEditableDOM &&
187+ previousSelectedEditableDOM !== editableElement
188+ ) {
189+ sendUnlockFieldEvent ( previousSelectedEditableDOM ) ;
190+ }
191+
192+ const isFieldLocked = await checkFieldLockStatus ( fieldMetadata ) ;
193+ if ( isFieldLocked ) {
194+ await checkAndApplyFieldLockStatus (
195+ editableElement ,
196+ fieldMetadata ,
197+ "click"
198+ ) ;
199+ return ;
200+ }
201+
175202 const variantStatus = await getFieldVariantStatus ( fieldMetadata ) ;
176203 const isVariant = variantStatus
177204 ? Object . values ( variantStatus ) . some ( ( value ) => value === true )
@@ -316,14 +343,17 @@ async function handleFieldSchemaAndIndividualFields(
316343 content_type_uid ,
317344 fieldPath
318345 ) ;
319- const { acl : entryAcl , workflowStage : entryWorkflowStageDetails , resolvedVariantPermissions } =
320- await fetchEntryPermissionsAndStageDetails ( {
321- entryUid : entry_uid ,
322- contentTypeUid : content_type_uid ,
323- locale,
324- variantUid,
325- fieldPathWithIndex,
326- } ) ;
346+ const {
347+ acl : entryAcl ,
348+ workflowStage : entryWorkflowStageDetails ,
349+ resolvedVariantPermissions,
350+ } = await fetchEntryPermissionsAndStageDetails ( {
351+ entryUid : entry_uid ,
352+ contentTypeUid : content_type_uid ,
353+ locale,
354+ variantUid,
355+ fieldPathWithIndex,
356+ } ) ;
327357
328358 if ( fieldSchema ) {
329359 const { isDisabled } = isFieldDisabled (
@@ -376,4 +406,27 @@ function observeEditableElementChanges(
376406 focusElementObserver . observe ( editableElement , { attributes : true } ) ;
377407}
378408
409+ async function checkFieldLockStatus ( fieldMetadata : CslpData ) : Promise < boolean > {
410+ try {
411+ const response = ( await visualBuilderPostMessage ?. send (
412+ VisualBuilderPostMessageEvents . CHECK_OR_ACQUIRE_FIELD_LOCK ,
413+ {
414+ fieldMetadata : {
415+ content_type_uid : fieldMetadata . content_type_uid ,
416+ entry_uid : fieldMetadata . entry_uid ,
417+ fieldPath : fieldMetadata . fieldPath ,
418+ locale : fieldMetadata . locale ,
419+ variant : fieldMetadata . variant ,
420+ } ,
421+ type : "click" ,
422+ }
423+ ) ) as { isLocked ?: boolean } | undefined ;
424+
425+ return response ?. isLocked || false ;
426+ } catch ( error ) {
427+ console . warn ( "Failed to check field lock status:" , error ) ;
428+ return false ;
429+ }
430+ }
431+
379432export default handleBuilderInteraction ;
0 commit comments