@contentstack/live-preview-utils 4.4.2 → 4.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/README.md +3 -2
  2. package/dist/legacy/configManager/config.default.cjs +6 -0
  3. package/dist/legacy/configManager/config.default.cjs.map +1 -1
  4. package/dist/legacy/configManager/config.default.js +6 -0
  5. package/dist/legacy/configManager/config.default.js.map +1 -1
  6. package/dist/legacy/configManager/handleUserConfig.cjs +6 -3
  7. package/dist/legacy/configManager/handleUserConfig.cjs.map +1 -1
  8. package/dist/legacy/configManager/handleUserConfig.js +6 -3
  9. package/dist/legacy/configManager/handleUserConfig.js.map +1 -1
  10. package/dist/legacy/cslp/cslpdata.cjs +26 -12
  11. package/dist/legacy/cslp/cslpdata.cjs.map +1 -1
  12. package/dist/legacy/cslp/cslpdata.d.cts +0 -5
  13. package/dist/legacy/cslp/cslpdata.d.ts +0 -5
  14. package/dist/legacy/cslp/cslpdata.js +26 -12
  15. package/dist/legacy/cslp/cslpdata.js.map +1 -1
  16. package/dist/legacy/light-sdk.cjs +1 -1
  17. package/dist/legacy/light-sdk.js +1 -1
  18. package/dist/legacy/livePreview/editButton/editButton.cjs +20 -0
  19. package/dist/legacy/livePreview/editButton/editButton.cjs.map +1 -1
  20. package/dist/legacy/livePreview/editButton/editButton.d.cts +1 -0
  21. package/dist/legacy/livePreview/editButton/editButton.d.ts +1 -0
  22. package/dist/legacy/livePreview/editButton/editButton.js +20 -0
  23. package/dist/legacy/livePreview/editButton/editButton.js.map +1 -1
  24. package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.cjs +3 -3
  25. package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.cjs.map +1 -1
  26. package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.js +3 -3
  27. package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.js.map +1 -1
  28. package/dist/legacy/livePreview/live-preview.cjs +2 -0
  29. package/dist/legacy/livePreview/live-preview.cjs.map +1 -1
  30. package/dist/legacy/livePreview/live-preview.js +2 -0
  31. package/dist/legacy/livePreview/live-preview.js.map +1 -1
  32. package/dist/legacy/preview/contentstack-live-preview-HOC.cjs +1 -1
  33. package/dist/legacy/preview/contentstack-live-preview-HOC.js +1 -1
  34. package/dist/legacy/types/types.cjs.map +1 -1
  35. package/dist/legacy/types/types.d.cts +15 -1
  36. package/dist/legacy/types/types.d.ts +15 -1
  37. package/dist/legacy/types/types.js.map +1 -1
  38. package/dist/legacy/visualBuilder/components/FieldToolbar.cjs +32 -1
  39. package/dist/legacy/visualBuilder/components/FieldToolbar.cjs.map +1 -1
  40. package/dist/legacy/visualBuilder/components/FieldToolbar.js +32 -1
  41. package/dist/legacy/visualBuilder/components/FieldToolbar.js.map +1 -1
  42. package/dist/legacy/visualBuilder/eventManager/useCollab.cjs +8 -8
  43. package/dist/legacy/visualBuilder/eventManager/useCollab.cjs.map +1 -1
  44. package/dist/legacy/visualBuilder/eventManager/useCollab.js +8 -8
  45. package/dist/legacy/visualBuilder/eventManager/useCollab.js.map +1 -1
  46. package/dist/legacy/visualBuilder/listeners/mouseClick.cjs +26 -0
  47. package/dist/legacy/visualBuilder/listeners/mouseClick.cjs.map +1 -1
  48. package/dist/legacy/visualBuilder/listeners/mouseClick.js +26 -0
  49. package/dist/legacy/visualBuilder/listeners/mouseClick.js.map +1 -1
  50. package/dist/legacy/visualBuilder/listeners/mouseHover.cjs +29 -0
  51. package/dist/legacy/visualBuilder/listeners/mouseHover.cjs.map +1 -1
  52. package/dist/legacy/visualBuilder/listeners/mouseHover.js +29 -0
  53. package/dist/legacy/visualBuilder/listeners/mouseHover.js.map +1 -1
  54. package/dist/legacy/visualBuilder/utils/getCsDataOfElement.cjs +19 -1
  55. package/dist/legacy/visualBuilder/utils/getCsDataOfElement.cjs.map +1 -1
  56. package/dist/legacy/visualBuilder/utils/getCsDataOfElement.d.cts +8 -1
  57. package/dist/legacy/visualBuilder/utils/getCsDataOfElement.d.ts +8 -1
  58. package/dist/legacy/visualBuilder/utils/getCsDataOfElement.js +9 -1
  59. package/dist/legacy/visualBuilder/utils/getCsDataOfElement.js.map +1 -1
  60. package/dist/legacy/visualBuilder/utils/getWholeFieldElement.cjs +38 -0
  61. package/dist/legacy/visualBuilder/utils/getWholeFieldElement.cjs.map +1 -0
  62. package/dist/legacy/visualBuilder/utils/getWholeFieldElement.d.cts +4 -0
  63. package/dist/legacy/visualBuilder/utils/getWholeFieldElement.d.ts +4 -0
  64. package/dist/legacy/visualBuilder/utils/getWholeFieldElement.js +14 -0
  65. package/dist/legacy/visualBuilder/utils/getWholeFieldElement.js.map +1 -0
  66. package/dist/legacy/visualBuilder/utils/handleIndividualFields.cjs +2 -1
  67. package/dist/legacy/visualBuilder/utils/handleIndividualFields.cjs.map +1 -1
  68. package/dist/legacy/visualBuilder/utils/handleIndividualFields.js +2 -1
  69. package/dist/legacy/visualBuilder/utils/handleIndividualFields.js.map +1 -1
  70. package/dist/legacy/visualBuilder/utils/isCustomFieldMultipleInstance.cjs +38 -0
  71. package/dist/legacy/visualBuilder/utils/isCustomFieldMultipleInstance.cjs.map +1 -0
  72. package/dist/legacy/visualBuilder/utils/isCustomFieldMultipleInstance.d.cts +7 -0
  73. package/dist/legacy/visualBuilder/utils/isCustomFieldMultipleInstance.d.ts +7 -0
  74. package/dist/legacy/visualBuilder/utils/isCustomFieldMultipleInstance.js +15 -0
  75. package/dist/legacy/visualBuilder/utils/isCustomFieldMultipleInstance.js.map +1 -0
  76. package/dist/legacy/visualBuilder/visualBuilder.style.cjs +12 -0
  77. package/dist/legacy/visualBuilder/visualBuilder.style.cjs.map +1 -1
  78. package/dist/legacy/visualBuilder/visualBuilder.style.d.cts +1 -0
  79. package/dist/legacy/visualBuilder/visualBuilder.style.d.ts +1 -0
  80. package/dist/legacy/visualBuilder/visualBuilder.style.js +12 -0
  81. package/dist/legacy/visualBuilder/visualBuilder.style.js.map +1 -1
  82. package/dist/modern/configManager/config.default.cjs +6 -0
  83. package/dist/modern/configManager/config.default.cjs.map +1 -1
  84. package/dist/modern/configManager/config.default.js +6 -0
  85. package/dist/modern/configManager/config.default.js.map +1 -1
  86. package/dist/modern/configManager/handleUserConfig.cjs +3 -0
  87. package/dist/modern/configManager/handleUserConfig.cjs.map +1 -1
  88. package/dist/modern/configManager/handleUserConfig.js +3 -0
  89. package/dist/modern/configManager/handleUserConfig.js.map +1 -1
  90. package/dist/modern/cslp/cslpdata.cjs +25 -12
  91. package/dist/modern/cslp/cslpdata.cjs.map +1 -1
  92. package/dist/modern/cslp/cslpdata.d.cts +0 -5
  93. package/dist/modern/cslp/cslpdata.d.ts +0 -5
  94. package/dist/modern/cslp/cslpdata.js +25 -12
  95. package/dist/modern/cslp/cslpdata.js.map +1 -1
  96. package/dist/modern/light-sdk.cjs +1 -1
  97. package/dist/modern/light-sdk.js +1 -1
  98. package/dist/modern/livePreview/editButton/editButton.cjs +19 -0
  99. package/dist/modern/livePreview/editButton/editButton.cjs.map +1 -1
  100. package/dist/modern/livePreview/editButton/editButton.d.cts +1 -0
  101. package/dist/modern/livePreview/editButton/editButton.d.ts +1 -0
  102. package/dist/modern/livePreview/editButton/editButton.js +19 -0
  103. package/dist/modern/livePreview/editButton/editButton.js.map +1 -1
  104. package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.cjs +3 -3
  105. package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.cjs.map +1 -1
  106. package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.js +3 -3
  107. package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.js.map +1 -1
  108. package/dist/modern/livePreview/live-preview.cjs +1 -0
  109. package/dist/modern/livePreview/live-preview.cjs.map +1 -1
  110. package/dist/modern/livePreview/live-preview.js +1 -0
  111. package/dist/modern/livePreview/live-preview.js.map +1 -1
  112. package/dist/modern/preview/contentstack-live-preview-HOC.cjs +1 -1
  113. package/dist/modern/preview/contentstack-live-preview-HOC.js +1 -1
  114. package/dist/modern/types/types.cjs.map +1 -1
  115. package/dist/modern/types/types.d.cts +15 -1
  116. package/dist/modern/types/types.d.ts +15 -1
  117. package/dist/modern/types/types.js.map +1 -1
  118. package/dist/modern/visualBuilder/components/FieldToolbar.cjs +32 -1
  119. package/dist/modern/visualBuilder/components/FieldToolbar.cjs.map +1 -1
  120. package/dist/modern/visualBuilder/components/FieldToolbar.js +32 -1
  121. package/dist/modern/visualBuilder/components/FieldToolbar.js.map +1 -1
  122. package/dist/modern/visualBuilder/eventManager/useCollab.cjs +5 -5
  123. package/dist/modern/visualBuilder/eventManager/useCollab.cjs.map +1 -1
  124. package/dist/modern/visualBuilder/eventManager/useCollab.js +5 -5
  125. package/dist/modern/visualBuilder/eventManager/useCollab.js.map +1 -1
  126. package/dist/modern/visualBuilder/listeners/mouseClick.cjs +26 -0
  127. package/dist/modern/visualBuilder/listeners/mouseClick.cjs.map +1 -1
  128. package/dist/modern/visualBuilder/listeners/mouseClick.js +26 -0
  129. package/dist/modern/visualBuilder/listeners/mouseClick.js.map +1 -1
  130. package/dist/modern/visualBuilder/listeners/mouseHover.cjs +29 -0
  131. package/dist/modern/visualBuilder/listeners/mouseHover.cjs.map +1 -1
  132. package/dist/modern/visualBuilder/listeners/mouseHover.js +29 -0
  133. package/dist/modern/visualBuilder/listeners/mouseHover.js.map +1 -1
  134. package/dist/modern/visualBuilder/utils/getCsDataOfElement.cjs +19 -1
  135. package/dist/modern/visualBuilder/utils/getCsDataOfElement.cjs.map +1 -1
  136. package/dist/modern/visualBuilder/utils/getCsDataOfElement.d.cts +8 -1
  137. package/dist/modern/visualBuilder/utils/getCsDataOfElement.d.ts +8 -1
  138. package/dist/modern/visualBuilder/utils/getCsDataOfElement.js +9 -1
  139. package/dist/modern/visualBuilder/utils/getCsDataOfElement.js.map +1 -1
  140. package/dist/modern/visualBuilder/utils/getWholeFieldElement.cjs +38 -0
  141. package/dist/modern/visualBuilder/utils/getWholeFieldElement.cjs.map +1 -0
  142. package/dist/modern/visualBuilder/utils/getWholeFieldElement.d.cts +4 -0
  143. package/dist/modern/visualBuilder/utils/getWholeFieldElement.d.ts +4 -0
  144. package/dist/modern/visualBuilder/utils/getWholeFieldElement.js +14 -0
  145. package/dist/modern/visualBuilder/utils/getWholeFieldElement.js.map +1 -0
  146. package/dist/modern/visualBuilder/utils/handleIndividualFields.cjs +2 -1
  147. package/dist/modern/visualBuilder/utils/handleIndividualFields.cjs.map +1 -1
  148. package/dist/modern/visualBuilder/utils/handleIndividualFields.js +2 -1
  149. package/dist/modern/visualBuilder/utils/handleIndividualFields.js.map +1 -1
  150. package/dist/modern/visualBuilder/utils/isCustomFieldMultipleInstance.cjs +37 -0
  151. package/dist/modern/visualBuilder/utils/isCustomFieldMultipleInstance.cjs.map +1 -0
  152. package/dist/modern/visualBuilder/utils/isCustomFieldMultipleInstance.d.cts +7 -0
  153. package/dist/modern/visualBuilder/utils/isCustomFieldMultipleInstance.d.ts +7 -0
  154. package/dist/modern/visualBuilder/utils/isCustomFieldMultipleInstance.js +14 -0
  155. package/dist/modern/visualBuilder/utils/isCustomFieldMultipleInstance.js.map +1 -0
  156. package/dist/modern/visualBuilder/visualBuilder.style.cjs +12 -0
  157. package/dist/modern/visualBuilder/visualBuilder.style.cjs.map +1 -1
  158. package/dist/modern/visualBuilder/visualBuilder.style.d.cts +1 -0
  159. package/dist/modern/visualBuilder/visualBuilder.style.d.ts +1 -0
  160. package/dist/modern/visualBuilder/visualBuilder.style.js +12 -0
  161. package/dist/modern/visualBuilder/visualBuilder.style.js.map +1 -1
  162. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/visualBuilder/listeners/mouseClick.ts"],"sourcesContent":["import {\n cleanIndividualFieldResidual,\n handleIndividualFields,\n} from \"../utils/handleIndividualFields\";\n\nimport {\n getCsDataOfElement,\n getDOMEditStack,\n} from \"../utils/getCsDataOfElement\";\nimport { isValidCslp } from \"../../cslp\";\n\nimport { appendFocusedToolbar } from \"../generators/generateToolbar\";\n\nimport { addFocusOverlay, hideOverlay } from \"../generators/generateOverlay\";\n\nimport visualBuilderPostMessage from \"../utils/visualBuilderPostMessage\";\n\nimport { VisualBuilderPostMessageEvents } from \"../utils/types/postMessage.types\";\n\nimport { VisualBuilder } from \"..\";\nimport { FieldSchemaMap } from \"../utils/fieldSchemaMap\";\nimport { isFieldDisabled } from \"../utils/isFieldDisabled\";\nimport EventListenerHandlerParams from \"./types\";\nimport { toggleHighlightedCommentIconDisplay } from \"../generators/generateHighlightedComment\";\nimport { VB_EmptyBlockParentClass } from \"../..\";\nimport { getFieldVariantStatus } from \"../components/FieldRevert/FieldRevertComponent\";\nimport getXPath from \"get-xpath\";\nimport Config from \"../../configManager/configManager\";\nimport { generateThread } from \"../generators/generateThread\";\nimport { isCollabThread } from \"../generators/generateThread\";\nimport { toggleCollabPopup } from \"../generators/generateThread\";\nimport { fixSvgXPath } from \"../utils/collabUtils\";\nimport { v4 as uuidV4 } from \"uuid\";\nimport { CslpData } from \"../../cslp/types/cslp.types\";\nimport { fetchEntryPermissionsAndStageDetails } from \"../utils/fetchEntryPermissionsAndStageDetails\";\n\nexport type HandleBuilderInteractionParams = Omit<\n EventListenerHandlerParams,\n \"eventDetails\" | \"customCursor\"\n> & { reEvaluate?: boolean };\n\ntype AddFocusOverlayParams = Pick<\n EventListenerHandlerParams,\n \"overlayWrapper\" | \"resizeObserver\"\n> & { editableElement: Element; isFieldDisabled?: boolean };\n\ntype AddFocusedToolbarParams = Pick<\n EventListenerHandlerParams,\n \"eventDetails\" | \"focusedToolbar\"\n> & {\n hideOverlay: () => void;\n isVariant: boolean;\n options?: { isHover?: boolean };\n};\n\nfunction addOverlay(params: AddFocusOverlayParams) {\n if (!params.overlayWrapper || !params.editableElement) return;\n\n addFocusOverlay(\n params.editableElement,\n params.overlayWrapper,\n params.isFieldDisabled\n );\n params.resizeObserver.observe(params.editableElement);\n}\n\nexport function addFocusedToolbar(params: AddFocusedToolbarParams): void {\n const { editableElement } = params.eventDetails;\n\n if (!editableElement || !params.focusedToolbar) return;\n\n appendFocusedToolbar(\n params.eventDetails,\n params.focusedToolbar,\n params.hideOverlay,\n params.isVariant,\n params.options\n );\n}\n\nexport async function handleBuilderInteraction(\n params: HandleBuilderInteractionParams\n): Promise<void> {\n const eventTarget = params.event.target as HTMLElement | null;\n const isAnchorElement = eventTarget instanceof HTMLAnchorElement;\n const elementHasCslp =\n eventTarget &&\n (eventTarget.hasAttribute(\"data-cslp\") ||\n eventTarget.closest(\"[data-cslp]\"));\n\n // if multiple elements with the same cslp element are found,\n // assign a unique ID to each element which we can use to identify\n // them in updateFocussedState and other places where we\n // would have queried the element by data-cslp\n const eventTargetCslp = eventTarget?.getAttribute(\"data-cslp\");\n if (isValidCslp(eventTargetCslp)) {\n const duplicates = document.querySelectorAll(\n `[data-cslp=\"${eventTargetCslp}\"]`\n );\n if (duplicates.length > 1) {\n duplicates.forEach((ele) => {\n if (!ele.hasAttribute(\"data-cslp-unique-id\")) {\n const uniqueId = `cslp-${uuidV4()}`;\n ele.setAttribute(\"data-cslp-unique-id\", uniqueId);\n }\n });\n }\n }\n\n // if the target element is a studio-ui element, return\n // this is currently used for the \"Edit in Studio\" button\n if (eventTarget?.getAttribute(\"data-studio-ui\") === \"true\") {\n return;\n }\n\n if (params.event.altKey) {\n if (isAnchorElement) {\n params.event.preventDefault();\n params.event.stopPropagation();\n }\n return;\n }\n // prevent default behavior for anchor elements and elements with cslp attribute\n if (\n isAnchorElement ||\n (elementHasCslp && !eventTarget.closest(\".visual-builder__empty-block\"))\n ) {\n params.event.preventDefault();\n params.event.stopPropagation();\n }\n\n const config = Config.get();\n\n if (config?.collab.enable === true) {\n if (config?.collab.pauseFeedback) return;\n const xpath = fixSvgXPath(getXPath(eventTarget));\n if (!eventTarget) return;\n\n const rect = eventTarget.getBoundingClientRect();\n const relativeX = (params.event.clientX - rect.left) / rect.width;\n const relativeY = (params.event.clientY - rect.top) / rect.height;\n\n if (!isCollabThread(eventTarget)) {\n params.event.preventDefault();\n params.event.stopPropagation();\n }\n\n if (isCollabThread(eventTarget)) {\n Config.set(\"collab.isFeedbackMode\", false);\n } else if (config?.collab.isFeedbackMode) {\n generateThread(\n { xpath, relativeX, relativeY },\n {\n isNewThread: true,\n updateConfig: true,\n }\n );\n } else {\n toggleCollabPopup({ threadUid: \"\", action: \"close\" });\n Config.set(\"collab.isFeedbackMode\", true);\n }\n return;\n }\n\n const eventDetails = getCsDataOfElement(params.event);\n\n // Send mouse click post message\n sendMouseClickPostMessage(eventDetails);\n\n if (\n !eventDetails ||\n !params.overlayWrapper ||\n !params.visualBuilderContainer\n ) {\n return;\n }\n\n const { editableElement, fieldMetadata } = eventDetails;\n const variantStatus = await getFieldVariantStatus(fieldMetadata);\n const isVariant = variantStatus\n ? Object.values(variantStatus).some((value) => value === true)\n : false;\n\n // Clean residuals if necessary\n cleanResidualsIfNeeded(params, editableElement);\n\n // Return if the selected element is an empty block\n if (isEmptyBlockElement(editableElement)) {\n return;\n }\n\n // when previous and current selected element is same, return.\n // this also avoids inserting psuedo-editable field (field data is\n // not equal to text content in DOM) when performing mouse\n // selections in the content editable\n const previousSelectedElement =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n if (\n isSameSelectedElement(previousSelectedElement, editableElement, params)\n ) {\n return;\n }\n\n VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM =\n editableElement;\n\n // Add overlay and focused toolbar\n addOverlayAndToolbar(params, eventDetails, editableElement, isVariant);\n\n const { cslpValue } = fieldMetadata;\n\n toggleHighlightedCommentIconDisplay(cslpValue, false);\n\n // Handle field schema and individual fields\n await handleFieldSchemaAndIndividualFields(\n params,\n eventDetails,\n fieldMetadata,\n editableElement,\n previousSelectedElement\n );\n\n // Observe changes to the editable element\n observeEditableElementChanges(params, editableElement);\n}\n\nfunction sendMouseClickPostMessage(eventDetails: any) {\n visualBuilderPostMessage\n ?.send(VisualBuilderPostMessageEvents.MOUSE_CLICK, {\n cslpData: eventDetails?.cslpData,\n fieldMetadata: eventDetails?.fieldMetadata,\n })\n .catch((err) => {\n console.warn(\"Error while sending post message\", err);\n });\n}\nfunction cleanResidualsIfNeeded(\n params: HandleBuilderInteractionParams,\n editableElement: Element\n) {\n const previousSelectedElement =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n if (\n (previousSelectedElement &&\n previousSelectedElement !== editableElement) ||\n params.reEvaluate\n ) {\n cleanIndividualFieldResidual({\n overlayWrapper: params.overlayWrapper!,\n visualBuilderContainer: params.visualBuilderContainer,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n });\n }\n}\nfunction isEmptyBlockElement(editableElement: Element): boolean {\n return (\n editableElement.classList.contains(VB_EmptyBlockParentClass) ||\n editableElement.classList.contains(\"visual-builder__empty-block\")\n );\n}\n\nfunction isSameSelectedElement(\n previousSelectedElement: Element | null,\n editableElement: Element,\n params: HandleBuilderInteractionParams\n): boolean {\n return !!(\n previousSelectedElement &&\n previousSelectedElement === editableElement &&\n !params.reEvaluate\n );\n}\n\nfunction addOverlayAndToolbar(\n params: HandleBuilderInteractionParams,\n eventDetails: any,\n editableElement: Element,\n isVariant: boolean\n) {\n VisualBuilder.VisualBuilderGlobalState.value.isFocussed = true;\n addOverlay({\n overlayWrapper: params.overlayWrapper,\n resizeObserver: params.resizeObserver,\n editableElement: editableElement,\n });\n\n addFocusedToolbar({\n eventDetails: eventDetails,\n focusedToolbar: params.focusedToolbar,\n hideOverlay: () => {\n hideOverlay({\n visualBuilderContainer: params.visualBuilderContainer,\n visualBuilderOverlayWrapper: params.overlayWrapper,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n });\n },\n isVariant,\n });\n}\nasync function handleFieldSchemaAndIndividualFields(\n params: HandleBuilderInteractionParams,\n eventDetails: any,\n fieldMetadata: CslpData,\n editableElement: Element,\n previousSelectedElement: Element | null\n) {\n const {\n content_type_uid,\n entry_uid,\n fieldPath,\n locale,\n variant: variantUid,\n fieldPathWithIndex,\n } = fieldMetadata;\n const fieldSchema = await FieldSchemaMap.getFieldSchema(\n content_type_uid,\n fieldPath\n );\n const { acl: entryAcl, workflowStage: entryWorkflowStageDetails, resolvedVariantPermissions } =\n await fetchEntryPermissionsAndStageDetails({\n entryUid: entry_uid,\n contentTypeUid: content_type_uid,\n locale,\n variantUid,\n fieldPathWithIndex,\n });\n\n if (fieldSchema) {\n const { isDisabled } = isFieldDisabled(\n fieldSchema,\n eventDetails,\n resolvedVariantPermissions,\n entryAcl,\n entryWorkflowStageDetails\n );\n if (isDisabled) {\n addOverlay({\n overlayWrapper: params.overlayWrapper,\n resizeObserver: params.resizeObserver,\n editableElement: editableElement,\n isFieldDisabled: true,\n });\n }\n }\n\n visualBuilderPostMessage?.send(VisualBuilderPostMessageEvents.FOCUS_FIELD, {\n DOMEditStack: getDOMEditStack(editableElement),\n });\n\n await handleIndividualFields(eventDetails, {\n visualBuilderContainer: params.visualBuilderContainer!,\n resizeObserver: params.resizeObserver,\n lastEditedField: previousSelectedElement,\n });\n}\nfunction observeEditableElementChanges(\n params: HandleBuilderInteractionParams,\n editableElement: Element\n) {\n const focusElementObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (\n mutation.type === \"attributes\" &&\n mutation.attributeName === \"data-cslp\"\n ) {\n focusElementObserver?.disconnect();\n VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver =\n null;\n handleBuilderInteraction({ ...params, reEvaluate: true });\n }\n });\n });\n\n VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver =\n focusElementObserver;\n focusElementObserver.observe(editableElement, { attributes: true });\n}\n\nexport default handleBuilderInteraction;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/visualBuilder/listeners/mouseClick.ts"],"sourcesContent":["import {\n cleanIndividualFieldResidual,\n handleIndividualFields,\n} from \"../utils/handleIndividualFields\";\n\nimport {\n getCsDataOfElement,\n getDOMEditStack,\n} from \"../utils/getCsDataOfElement\";\nimport { isValidCslp } from \"../../cslp\";\n\nimport { appendFocusedToolbar } from \"../generators/generateToolbar\";\n\nimport { addFocusOverlay, hideOverlay } from \"../generators/generateOverlay\";\n\nimport visualBuilderPostMessage from \"../utils/visualBuilderPostMessage\";\n\nimport { VisualBuilderPostMessageEvents } from \"../utils/types/postMessage.types\";\n\nimport { VisualBuilder } from \"..\";\nimport { FieldSchemaMap } from \"../utils/fieldSchemaMap\";\nimport { isFieldDisabled } from \"../utils/isFieldDisabled\";\nimport EventListenerHandlerParams from \"./types\";\nimport { toggleHighlightedCommentIconDisplay } from \"../generators/generateHighlightedComment\";\nimport { VB_EmptyBlockParentClass } from \"../..\";\nimport { getFieldVariantStatus } from \"../components/FieldRevert/FieldRevertComponent\";\nimport getXPath from \"get-xpath\";\nimport Config from \"../../configManager/configManager\";\nimport { generateThread } from \"../generators/generateThread\";\nimport { isCollabThread } from \"../generators/generateThread\";\nimport { toggleCollabPopup } from \"../generators/generateThread\";\nimport { fixSvgXPath } from \"../utils/collabUtils\";\nimport { v4 as uuidV4 } from \"uuid\";\nimport { CslpData } from \"../../cslp/types/cslp.types\";\nimport { fetchEntryPermissionsAndStageDetails } from \"../utils/fetchEntryPermissionsAndStageDetails\";\nimport { isCustomFieldMultipleInstance } from \"../utils/isCustomFieldMultipleInstance\";\nimport { getParentCslp, getWholeFieldElement } from \"../utils/getWholeFieldElement\";\n\nexport type HandleBuilderInteractionParams = Omit<\n EventListenerHandlerParams,\n \"eventDetails\" | \"customCursor\"\n> & { reEvaluate?: boolean };\n\ntype AddFocusOverlayParams = Pick<\n EventListenerHandlerParams,\n \"overlayWrapper\" | \"resizeObserver\"\n> & { editableElement: Element; isFieldDisabled?: boolean };\n\ntype AddFocusedToolbarParams = Pick<\n EventListenerHandlerParams,\n \"eventDetails\" | \"focusedToolbar\"\n> & {\n hideOverlay: () => void;\n isVariant: boolean;\n options?: { isHover?: boolean };\n};\n\nfunction addOverlay(params: AddFocusOverlayParams) {\n if (!params.overlayWrapper || !params.editableElement) return;\n\n addFocusOverlay(\n params.editableElement,\n params.overlayWrapper,\n params.isFieldDisabled\n );\n params.resizeObserver.observe(params.editableElement);\n}\n\nexport function addFocusedToolbar(params: AddFocusedToolbarParams): void {\n const { editableElement } = params.eventDetails;\n\n if (!editableElement || !params.focusedToolbar) return;\n\n appendFocusedToolbar(\n params.eventDetails,\n params.focusedToolbar,\n params.hideOverlay,\n params.isVariant,\n params.options\n );\n}\n\nexport async function handleBuilderInteraction(\n params: HandleBuilderInteractionParams\n): Promise<void> {\n const eventTarget = params.event.target as HTMLElement | null;\n const isAnchorElement = eventTarget instanceof HTMLAnchorElement;\n const elementHasCslp =\n eventTarget &&\n (eventTarget.hasAttribute(\"data-cslp\") ||\n eventTarget.closest(\"[data-cslp]\"));\n\n // if multiple elements with the same cslp element are found,\n // assign a unique ID to each element which we can use to identify\n // them in updateFocussedState and other places where we\n // would have queried the element by data-cslp\n const eventTargetCslp = eventTarget?.getAttribute(\"data-cslp\");\n if (isValidCslp(eventTargetCslp)) {\n const duplicates = document.querySelectorAll(\n `[data-cslp=\"${eventTargetCslp}\"]`\n );\n if (duplicates.length > 1) {\n duplicates.forEach((ele) => {\n if (!ele.hasAttribute(\"data-cslp-unique-id\")) {\n const uniqueId = `cslp-${uuidV4()}`;\n ele.setAttribute(\"data-cslp-unique-id\", uniqueId);\n }\n });\n }\n }\n\n // if the target element is a studio-ui element, return\n // this is currently used for the \"Edit in Studio\" button\n if (eventTarget?.getAttribute(\"data-studio-ui\") === \"true\") {\n return;\n }\n\n if (params.event.altKey) {\n if (isAnchorElement) {\n params.event.preventDefault();\n params.event.stopPropagation();\n }\n return;\n }\n // prevent default behavior for anchor elements and elements with cslp attribute\n if (\n isAnchorElement ||\n (elementHasCslp && !eventTarget.closest(\".visual-builder__empty-block\"))\n ) {\n params.event.preventDefault();\n params.event.stopPropagation();\n }\n\n const config = Config.get();\n\n if (config?.collab.enable === true) {\n if (config?.collab.pauseFeedback) return;\n const xpath = fixSvgXPath(getXPath(eventTarget));\n if (!eventTarget) return;\n\n const rect = eventTarget.getBoundingClientRect();\n const relativeX = (params.event.clientX - rect.left) / rect.width;\n const relativeY = (params.event.clientY - rect.top) / rect.height;\n\n if (!isCollabThread(eventTarget)) {\n params.event.preventDefault();\n params.event.stopPropagation();\n }\n\n if (isCollabThread(eventTarget)) {\n Config.set(\"collab.isFeedbackMode\", false);\n } else if (config?.collab.isFeedbackMode) {\n generateThread(\n { xpath, relativeX, relativeY },\n {\n isNewThread: true,\n updateConfig: true,\n }\n );\n } else {\n toggleCollabPopup({ threadUid: \"\", action: \"close\" });\n Config.set(\"collab.isFeedbackMode\", true);\n }\n return;\n }\n\n const eventDetails = getCsDataOfElement(params.event);\n\n // Send mouse click post message\n sendMouseClickPostMessage(eventDetails);\n\n if (\n !eventDetails ||\n !params.overlayWrapper ||\n !params.visualBuilderContainer\n ) {\n return;\n }\n\n const { editableElement, fieldMetadata } = eventDetails;\n\n // Redirect click on multiple custom field instance to its whole-field parent (cached schema only)\n const { content_type_uid, fieldPath } = fieldMetadata;\n if (FieldSchemaMap.hasFieldSchema(content_type_uid, fieldPath)) {\n const fieldSchemaForCheck = await FieldSchemaMap.getFieldSchema(content_type_uid, fieldPath);\n if (fieldSchemaForCheck && isCustomFieldMultipleInstance(fieldSchemaForCheck, fieldMetadata)) {\n const parentCslp = getParentCslp(fieldMetadata.cslpValue);\n const wholeFieldElement = getWholeFieldElement(editableElement, parentCslp);\n if (wholeFieldElement) {\n wholeFieldElement.dispatchEvent(\n new MouseEvent(\"click\", {\n bubbles: true,\n cancelable: true,\n clientX: params.event.clientX,\n clientY: params.event.clientY,\n })\n );\n } else if (config.debug) {\n console.debug(\n \"[Visual Builder] Custom field multiple instance: whole-field parent not found in DOM for CSLP\",\n parentCslp\n );\n }\n return;\n }\n }\n\n const variantStatus = await getFieldVariantStatus(fieldMetadata);\n const isVariant = variantStatus\n ? Object.values(variantStatus).some((value) => value === true)\n : false;\n\n // Clean residuals if necessary\n cleanResidualsIfNeeded(params, editableElement);\n\n // Return if the selected element is an empty block\n if (isEmptyBlockElement(editableElement)) {\n return;\n }\n\n // when previous and current selected element is same, return.\n // this also avoids inserting psuedo-editable field (field data is\n // not equal to text content in DOM) when performing mouse\n // selections in the content editable\n const previousSelectedElement =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n if (\n isSameSelectedElement(previousSelectedElement, editableElement, params)\n ) {\n return;\n }\n\n VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM =\n editableElement;\n\n // Add overlay and focused toolbar\n addOverlayAndToolbar(params, eventDetails, editableElement, isVariant);\n\n const { cslpValue } = fieldMetadata;\n\n toggleHighlightedCommentIconDisplay(cslpValue, false);\n\n // Handle field schema and individual fields\n await handleFieldSchemaAndIndividualFields(\n params,\n eventDetails,\n fieldMetadata,\n editableElement,\n previousSelectedElement\n );\n\n // Observe changes to the editable element\n observeEditableElementChanges(params, editableElement);\n}\n\nfunction sendMouseClickPostMessage(eventDetails: any) {\n visualBuilderPostMessage\n ?.send(VisualBuilderPostMessageEvents.MOUSE_CLICK, {\n cslpData: eventDetails?.cslpData,\n fieldMetadata: eventDetails?.fieldMetadata,\n })\n .catch((err) => {\n console.warn(\"Error while sending post message\", err);\n });\n}\nfunction cleanResidualsIfNeeded(\n params: HandleBuilderInteractionParams,\n editableElement: Element\n) {\n const previousSelectedElement =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n if (\n (previousSelectedElement &&\n previousSelectedElement !== editableElement) ||\n params.reEvaluate\n ) {\n cleanIndividualFieldResidual({\n overlayWrapper: params.overlayWrapper!,\n visualBuilderContainer: params.visualBuilderContainer,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n });\n }\n}\nfunction isEmptyBlockElement(editableElement: Element): boolean {\n return (\n editableElement.classList.contains(VB_EmptyBlockParentClass) ||\n editableElement.classList.contains(\"visual-builder__empty-block\")\n );\n}\n\nfunction isSameSelectedElement(\n previousSelectedElement: Element | null,\n editableElement: Element,\n params: HandleBuilderInteractionParams\n): boolean {\n return !!(\n previousSelectedElement &&\n previousSelectedElement === editableElement &&\n !params.reEvaluate\n );\n}\n\nfunction addOverlayAndToolbar(\n params: HandleBuilderInteractionParams,\n eventDetails: any,\n editableElement: Element,\n isVariant: boolean\n) {\n VisualBuilder.VisualBuilderGlobalState.value.isFocussed = true;\n addOverlay({\n overlayWrapper: params.overlayWrapper,\n resizeObserver: params.resizeObserver,\n editableElement: editableElement,\n });\n\n addFocusedToolbar({\n eventDetails: eventDetails,\n focusedToolbar: params.focusedToolbar,\n hideOverlay: () => {\n hideOverlay({\n visualBuilderContainer: params.visualBuilderContainer,\n visualBuilderOverlayWrapper: params.overlayWrapper,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n });\n },\n isVariant,\n });\n}\nasync function handleFieldSchemaAndIndividualFields(\n params: HandleBuilderInteractionParams,\n eventDetails: any,\n fieldMetadata: CslpData,\n editableElement: Element,\n previousSelectedElement: Element | null\n) {\n const {\n content_type_uid,\n entry_uid,\n fieldPath,\n locale,\n variant: variantUid,\n fieldPathWithIndex,\n } = fieldMetadata;\n const fieldSchema = await FieldSchemaMap.getFieldSchema(\n content_type_uid,\n fieldPath\n );\n const { acl: entryAcl, workflowStage: entryWorkflowStageDetails, resolvedVariantPermissions } =\n await fetchEntryPermissionsAndStageDetails({\n entryUid: entry_uid,\n contentTypeUid: content_type_uid,\n locale,\n variantUid,\n fieldPathWithIndex,\n });\n\n if (fieldSchema) {\n const { isDisabled } = isFieldDisabled(\n fieldSchema,\n eventDetails,\n resolvedVariantPermissions,\n entryAcl,\n entryWorkflowStageDetails\n );\n if (isDisabled) {\n addOverlay({\n overlayWrapper: params.overlayWrapper,\n resizeObserver: params.resizeObserver,\n editableElement: editableElement,\n isFieldDisabled: true,\n });\n }\n }\n\n visualBuilderPostMessage?.send(VisualBuilderPostMessageEvents.FOCUS_FIELD, {\n DOMEditStack: getDOMEditStack(editableElement),\n });\n\n await handleIndividualFields(eventDetails, {\n visualBuilderContainer: params.visualBuilderContainer!,\n resizeObserver: params.resizeObserver,\n lastEditedField: previousSelectedElement,\n });\n}\nfunction observeEditableElementChanges(\n params: HandleBuilderInteractionParams,\n editableElement: Element\n) {\n const focusElementObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (\n mutation.type === \"attributes\" &&\n mutation.attributeName === \"data-cslp\"\n ) {\n focusElementObserver?.disconnect();\n VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver =\n null;\n handleBuilderInteraction({ ...params, reEvaluate: true });\n }\n });\n });\n\n VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver =\n focusElementObserver;\n focusElementObserver.observe(editableElement, { attributes: true });\n}\n\nexport default handleBuilderInteraction;\n"],"mappings":"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","names":[]}
@@ -55,6 +55,8 @@ var import_configManager = __toESM(require("../../configManager/configManager.cj
55
55
  var import_generateThread = require("../generators/generateThread.cjs");
56
56
  var import_generateToolbar = require("../generators/generateToolbar.cjs");
57
57
  var import_fetchEntryPermissionsAndStageDetails = require("../utils/fetchEntryPermissionsAndStageDetails.cjs");
58
+ var import_isCustomFieldMultipleInstance = require("../utils/isCustomFieldMultipleInstance.cjs");
59
+ var import_getWholeFieldElement = require("../utils/getWholeFieldElement.cjs");
58
60
  var config = import_configManager.default.get();
59
61
  function resetCustomCursor(customCursor) {
60
62
  if (customCursor) {
@@ -227,6 +229,33 @@ var throttledMouseHover = (0, import_lodash_es.throttle)(async (params) => {
227
229
  }
228
230
  const { editableElement, fieldMetadata } = eventDetails;
229
231
  const { content_type_uid, fieldPath } = fieldMetadata;
232
+ if (import_fieldSchemaMap.FieldSchemaMap.hasFieldSchema(content_type_uid, fieldPath)) {
233
+ const fieldSchema = await import_fieldSchemaMap.FieldSchemaMap.getFieldSchema(content_type_uid, fieldPath);
234
+ if (fieldSchema && (0, import_isCustomFieldMultipleInstance.isCustomFieldMultipleInstance)(fieldSchema, fieldMetadata)) {
235
+ const parentCslp = (0, import_getWholeFieldElement.getParentCslp)(fieldMetadata.cslpValue);
236
+ const wholeFieldElement = (0, import_getWholeFieldElement.getWholeFieldElement)(editableElement, parentCslp);
237
+ if (wholeFieldElement) {
238
+ wholeFieldElement.dispatchEvent(
239
+ new MouseEvent("mousemove", {
240
+ bubbles: true,
241
+ cancelable: true,
242
+ clientX: params.event.clientX,
243
+ clientY: params.event.clientY
244
+ })
245
+ );
246
+ } else {
247
+ if (config.debug) {
248
+ console.debug(
249
+ "[Visual Builder] Custom field multiple instance: whole-field parent not found in DOM for CSLP",
250
+ parentCslp
251
+ );
252
+ }
253
+ resetCustomCursor(params.customCursor);
254
+ handleCursorPosition(params.event, params.customCursor);
255
+ }
256
+ return;
257
+ }
258
+ }
230
259
  if (import__.VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM && import__.VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM.isSameNode(
231
260
  editableElement
232
261
  )) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/visualBuilder/listeners/mouseHover.ts"],"sourcesContent":["import { debounce, throttle } from \"lodash-es\";\nimport { getCsDataOfElement } from \"../utils/getCsDataOfElement\";\nimport { removeAddInstanceButtons } from \"../utils/multipleElementAddButton\";\nimport { generateCustomCursor } from \"../generators/generateCustomCursor\";\nimport { FieldSchemaMap } from \"../utils/fieldSchemaMap\";\nimport { isFieldDisabled } from \"../utils/isFieldDisabled\";\nimport { getFieldType } from \"../utils/getFieldType\";\n\nimport EventListenerHandlerParams from \"./types\";\nimport { VisualBuilder } from \"..\";\nimport { addHoverOutline } from \"../generators/generateHoverOutline\";\nimport { visualBuilderStyles } from \"../visualBuilder.style\";\nimport { VB_EmptyBlockParentClass } from \"../..\";\nimport Config from \"../../configManager/configManager\";\nimport { isCollabThread } from \"../generators/generateThread\";\nimport { HandleBuilderInteractionParams } from \"./mouseClick\";\nimport { appendFieldPathDropdown } from \"../generators/generateToolbar\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport { CslpData } from \"../../cslp/types/cslp.types\";\nimport { fetchEntryPermissionsAndStageDetails } from \"../utils/fetchEntryPermissionsAndStageDetails\";\n\nconst config = Config.get();\nexport interface HandleMouseHoverParams\n extends Pick<\n EventListenerHandlerParams,\n \"event\" | \"overlayWrapper\" | \"visualBuilderContainer\" | \"focusedToolbar\" | \"resizeObserver\"\n > {\n customCursor: HTMLDivElement | null;\n}\n\ninterface AddOutlineParams {\n editableElement: Element;\n eventDetails: VisualBuilderCslpEventDetails;\n content_type_uid: string;\n fieldPath: string;\n fieldDisabled?: boolean;\n fieldMetadata: CslpData;\n}\n\nfunction resetCustomCursor(customCursor: HTMLDivElement | null): void {\n if (customCursor) {\n generateCustomCursor({\n fieldType: \"empty\",\n customCursor: customCursor,\n });\n }\n}\n\nfunction collabCustomCursor(customCursor: HTMLDivElement | null): void {\n if (!customCursor) return;\n\n generateCustomCursor({\n fieldType: \"discussion\",\n customCursor: customCursor,\n });\n}\n\nfunction handleCursorPosition(\n event: MouseEvent,\n customCursor: HTMLDivElement | null\n): void {\n if (customCursor) {\n const mouseY = event.clientY;\n const mouseX = event.clientX;\n\n customCursor.style.left = `${mouseX}px`;\n customCursor.style.top = `${mouseY}px`;\n }\n}\n\nasync function addOutline(params?: AddOutlineParams): Promise<void> {\n if (!params) {\n return;\n }\n const {\n editableElement,\n eventDetails,\n content_type_uid,\n fieldPath,\n fieldMetadata,\n fieldDisabled,\n } = params;\n if (!editableElement) return;\n const isVariant = !!fieldMetadata.variant;\n addHoverOutline(editableElement as HTMLElement, fieldDisabled, isVariant);\n const fieldSchema = await FieldSchemaMap.getFieldSchema(\n content_type_uid,\n fieldPath\n );\n if (!fieldSchema) return;\n const { acl: entryAcl, workflowStage: entryWorkflowStageDetails, resolvedVariantPermissions } =\n await fetchEntryPermissionsAndStageDetails({\n entryUid: fieldMetadata.entry_uid,\n contentTypeUid: fieldMetadata.content_type_uid,\n locale: fieldMetadata.locale,\n variantUid: fieldMetadata.variant,\n fieldPathWithIndex: fieldMetadata.fieldPathWithIndex,\n });\n const { isDisabled } = isFieldDisabled(\n fieldSchema,\n eventDetails,\n resolvedVariantPermissions,\n entryAcl,\n entryWorkflowStageDetails\n );\n addHoverOutline(editableElement, fieldDisabled || isDisabled, isVariant);\n}\n\nconst debouncedAddOutline = debounce(addOutline, 50, { trailing: true });\nexport const cancelPendingAddOutline = () => debouncedAddOutline.cancel();\nconst showOutline = (params?: AddOutlineParams): Promise<void> | undefined => debouncedAddOutline(params);\n\nfunction hideDefaultCursor(): void {\n if (\n document?.body &&\n !document.body.classList.contains(\n visualBuilderStyles()[\"visual-builder__default-cursor--disabled\"]\n )\n )\n document.body.classList.add(\n visualBuilderStyles()[\"visual-builder__default-cursor--disabled\"]\n );\n}\n\nfunction showDefaultCursor(): void {\n if (\n document?.body &&\n document.body.classList.contains(\n visualBuilderStyles()[\"visual-builder__default-cursor--disabled\"]\n )\n )\n document.body.classList.remove(\n visualBuilderStyles()[\"visual-builder__default-cursor--disabled\"]\n );\n}\n\nexport function hideHoverOutline(\n visualBuilderContainer: HTMLDivElement | null\n): void {\n if (!visualBuilderContainer) {\n return;\n }\n const hoverOutline = visualBuilderContainer.querySelector(\n \".visual-builder__hover-outline\"\n );\n if (!hoverOutline) {\n return;\n }\n hoverOutline.classList.add(\n visualBuilderStyles()[\"visual-builder__hover-outline--hidden\"]\n );\n}\n\nexport function hideCustomCursor(customCursor: HTMLDivElement | null): void {\n showDefaultCursor();\n customCursor?.classList.remove(\"visible\");\n}\n\nexport function showCustomCursor(customCursor: HTMLDivElement | null): void {\n hideDefaultCursor();\n if (\n config.collab.enable &&\n (!config.collab.isFeedbackMode || config.collab.pauseFeedback)\n )\n return;\n customCursor?.classList.add(\"visible\");\n}\n\nconst debouncedRenderHoverToolbar = debounce(async (params: HandleBuilderInteractionParams) => {\n const eventDetails = getCsDataOfElement(params.event);\n if (\n !eventDetails ||\n !params.overlayWrapper ||\n !params.visualBuilderContainer ||\n !params.focusedToolbar\n ) {\n return;\n }\n\n appendFieldPathDropdown(eventDetails, params.focusedToolbar, {\n isHover: true\n });\n}, 50, { trailing: true });\n\nexport const showHoverToolbar = async (params: HandleBuilderInteractionParams) => await debouncedRenderHoverToolbar(params);\n\nexport const cancelPendingHoverToolbar = () => debouncedRenderHoverToolbar.cancel();\n\nfunction isOverlay(target: HTMLElement): boolean {\n return target.classList.contains(\"visual-builder__overlay\");\n}\n\nfunction isContentEditable(target: HTMLElement): boolean {\n if (target.hasAttribute(\"contenteditable\"))\n return target.getAttribute(\"contenteditable\") === \"true\";\n return false;\n}\n\nfunction isFieldPathDropdown(target: HTMLElement): boolean {\n return target.classList.contains(\"visual-builder__focused-toolbar__field-label-wrapper\") || target.classList.contains(\"visual-builder__focused-toolbar__field-label-wrapper__current-field\");\n}\n\nfunction isFieldPathParent(target: HTMLElement): boolean {\n return target.classList.contains(\"visual-builder__focused-toolbar__field-label-wrapper__parent-field\");\n}\n\nconst throttledMouseHover = throttle(async (params: HandleMouseHoverParams) => {\n const eventDetails = getCsDataOfElement(params.event);\n const eventTarget = params.event.target as HTMLElement | null;\n\n if (config?.collab.enable && config?.collab.pauseFeedback) {\n hideCustomCursor(params.customCursor);\n return;\n }\n if (!eventDetails) {\n if (\n eventTarget &&\n (isOverlay(eventTarget) ||\n isContentEditable(eventTarget) ||\n isCollabThread(eventTarget))\n ) {\n handleCursorPosition(params.event, params.customCursor);\n hideCustomCursor(params.customCursor);\n return;\n }\n if (\n eventTarget &&\n (isFieldPathDropdown(eventTarget) || isFieldPathParent(eventTarget))\n ) {\n if (params.customCursor) {\n hideCustomCursor(params.customCursor);\n }\n showOutline();\n showHoverToolbar({\n event: params.event,\n overlayWrapper: params.overlayWrapper,\n visualBuilderContainer: params.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n });\n }\n if (!config?.collab.enable) {\n resetCustomCursor(params.customCursor);\n }\n removeAddInstanceButtons({\n eventTarget: params.event.target,\n visualBuilderContainer: params.visualBuilderContainer,\n overlayWrapper: params.overlayWrapper,\n });\n handleCursorPosition(params.event, params.customCursor);\n if (config?.collab.enable && config?.collab.isFeedbackMode) {\n showCustomCursor(params.customCursor);\n collabCustomCursor(params.customCursor);\n }\n return;\n }\n\n const { editableElement, fieldMetadata } = eventDetails;\n const { content_type_uid, fieldPath } = fieldMetadata;\n\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM &&\n VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM.isSameNode(\n editableElement\n )\n ) {\n hideCustomCursor(params.customCursor);\n return;\n }\n\n if (params.customCursor) {\n const elementUnderCursor = document.elementFromPoint(\n params.event.clientX,\n params.event.clientY\n );\n if (elementUnderCursor) {\n if (\n elementUnderCursor.nodeName === \"A\" ||\n elementUnderCursor.nodeName === \"BUTTON\"\n ) {\n elementUnderCursor.classList.add(\n visualBuilderStyles()[\"visual-builder__no-cursor-style\"]\n );\n }\n }\n\n if (config?.collab.enable && config?.collab.isFeedbackMode) {\n collabCustomCursor(params.customCursor);\n handleCursorPosition(params.event, params.customCursor);\n showCustomCursor(params.customCursor);\n return;\n } else if (config?.collab.enable && !config?.collab.isFeedbackMode) {\n hideCustomCursor(params.customCursor);\n return;\n }\n\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousHoveredTargetDOM !== editableElement\n ) {\n resetCustomCursor(params.customCursor);\n removeAddInstanceButtons({\n eventTarget: params.event.target,\n visualBuilderContainer: params.visualBuilderContainer,\n overlayWrapper: params.overlayWrapper,\n });\n }\n\n if (!FieldSchemaMap.hasFieldSchema(content_type_uid, fieldPath)) {\n generateCustomCursor({\n fieldType: \"loading\",\n customCursor: params.customCursor,\n });\n }\n\n // only re-generate cursor when moving onto a new element — avoids\n // firing fetchEntryPermissionsAndStageDetails on every 10ms tick\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousHoveredTargetDOM !== editableElement\n ) {\n generateCursor({\n eventDetails,\n customCursor: params.customCursor,\n });\n }\n\n handleCursorPosition(params.event, params.customCursor);\n showCustomCursor(params.customCursor);\n }\n\n if (\n !editableElement.classList.contains(VB_EmptyBlockParentClass) &&\n !editableElement.classList.contains(\"visual-builder__empty-block\")\n ) {\n showOutline({\n editableElement,\n eventDetails,\n content_type_uid,\n fieldPath,\n fieldMetadata,\n });\n const isFocussed= VisualBuilder.VisualBuilderGlobalState.value.isFocussed;\n if(!isFocussed) {\n showHoverToolbar({\n event: params.event,\n overlayWrapper: params.overlayWrapper,\n visualBuilderContainer: params.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n }\n );\n }\n }\n\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousHoveredTargetDOM === editableElement\n ) {\n return;\n }\n\n VisualBuilder.VisualBuilderGlobalState.value.previousHoveredTargetDOM =\n editableElement;\n}, 10);\n\nasync function generateCursor({\n eventDetails,\n customCursor,\n}: {\n eventDetails: VisualBuilderCslpEventDetails;\n customCursor: HTMLDivElement | null;\n}) {\n if (!customCursor) return;\n const { fieldMetadata } = eventDetails;\n const fieldSchema = await FieldSchemaMap.getFieldSchema(\n fieldMetadata.content_type_uid,\n fieldMetadata.fieldPath\n );\n if (!fieldSchema) {\n return;\n }\n const { acl: entryAcl, workflowStage: entryWorkflowStageDetails, resolvedVariantPermissions } =\n await fetchEntryPermissionsAndStageDetails({\n entryUid: fieldMetadata.entry_uid,\n contentTypeUid: fieldMetadata.content_type_uid,\n locale: fieldMetadata.locale,\n variantUid: fieldMetadata.variant,\n fieldPathWithIndex: fieldMetadata.fieldPathWithIndex,\n });\n const { isDisabled: fieldDisabled } = isFieldDisabled(\n fieldSchema,\n eventDetails,\n resolvedVariantPermissions,\n entryAcl,\n entryWorkflowStageDetails\n );\n const fieldType = getFieldType(fieldSchema);\n generateCustomCursor({\n fieldType,\n customCursor,\n fieldDisabled,\n });\n}\n\nconst handleMouseHover = async (\n params: HandleMouseHoverParams\n): Promise<void> => await throttledMouseHover(params);\n\nexport const cancelPendingMouseHover = () => throttledMouseHover.cancel();\n\nexport default handleMouseHover;\n"],"mappings":"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","names":["import__","Config"]}
1
+ {"version":3,"sources":["../../../../src/visualBuilder/listeners/mouseHover.ts"],"sourcesContent":["import { debounce, throttle } from \"lodash-es\";\nimport { getCsDataOfElement } from \"../utils/getCsDataOfElement\";\nimport { removeAddInstanceButtons } from \"../utils/multipleElementAddButton\";\nimport { generateCustomCursor } from \"../generators/generateCustomCursor\";\nimport { FieldSchemaMap } from \"../utils/fieldSchemaMap\";\nimport { isFieldDisabled } from \"../utils/isFieldDisabled\";\nimport { getFieldType } from \"../utils/getFieldType\";\n\nimport EventListenerHandlerParams from \"./types\";\nimport { VisualBuilder } from \"..\";\nimport { addHoverOutline } from \"../generators/generateHoverOutline\";\nimport { visualBuilderStyles } from \"../visualBuilder.style\";\nimport { VB_EmptyBlockParentClass } from \"../..\";\nimport Config from \"../../configManager/configManager\";\nimport { isCollabThread } from \"../generators/generateThread\";\nimport { HandleBuilderInteractionParams } from \"./mouseClick\";\nimport { appendFieldPathDropdown } from \"../generators/generateToolbar\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport { CslpData } from \"../../cslp/types/cslp.types\";\nimport { fetchEntryPermissionsAndStageDetails } from \"../utils/fetchEntryPermissionsAndStageDetails\";\nimport { isCustomFieldMultipleInstance } from \"../utils/isCustomFieldMultipleInstance\";\nimport { getParentCslp, getWholeFieldElement } from \"../utils/getWholeFieldElement\";\n\nconst config = Config.get();\nexport interface HandleMouseHoverParams\n extends Pick<\n EventListenerHandlerParams,\n \"event\" | \"overlayWrapper\" | \"visualBuilderContainer\" | \"focusedToolbar\" | \"resizeObserver\"\n > {\n customCursor: HTMLDivElement | null;\n}\n\ninterface AddOutlineParams {\n editableElement: Element;\n eventDetails: VisualBuilderCslpEventDetails;\n content_type_uid: string;\n fieldPath: string;\n fieldDisabled?: boolean;\n fieldMetadata: CslpData;\n}\n\nfunction resetCustomCursor(customCursor: HTMLDivElement | null): void {\n if (customCursor) {\n generateCustomCursor({\n fieldType: \"empty\",\n customCursor: customCursor,\n });\n }\n}\n\nfunction collabCustomCursor(customCursor: HTMLDivElement | null): void {\n if (!customCursor) return;\n\n generateCustomCursor({\n fieldType: \"discussion\",\n customCursor: customCursor,\n });\n}\n\nfunction handleCursorPosition(\n event: MouseEvent,\n customCursor: HTMLDivElement | null\n): void {\n if (customCursor) {\n const mouseY = event.clientY;\n const mouseX = event.clientX;\n\n customCursor.style.left = `${mouseX}px`;\n customCursor.style.top = `${mouseY}px`;\n }\n}\n\nasync function addOutline(params?: AddOutlineParams): Promise<void> {\n if (!params) {\n return;\n }\n const {\n editableElement,\n eventDetails,\n content_type_uid,\n fieldPath,\n fieldMetadata,\n fieldDisabled,\n } = params;\n if (!editableElement) return;\n const isVariant = !!fieldMetadata.variant;\n addHoverOutline(editableElement as HTMLElement, fieldDisabled, isVariant);\n const fieldSchema = await FieldSchemaMap.getFieldSchema(\n content_type_uid,\n fieldPath\n );\n if (!fieldSchema) return;\n const { acl: entryAcl, workflowStage: entryWorkflowStageDetails, resolvedVariantPermissions } =\n await fetchEntryPermissionsAndStageDetails({\n entryUid: fieldMetadata.entry_uid,\n contentTypeUid: fieldMetadata.content_type_uid,\n locale: fieldMetadata.locale,\n variantUid: fieldMetadata.variant,\n fieldPathWithIndex: fieldMetadata.fieldPathWithIndex,\n });\n const { isDisabled } = isFieldDisabled(\n fieldSchema,\n eventDetails,\n resolvedVariantPermissions,\n entryAcl,\n entryWorkflowStageDetails\n );\n addHoverOutline(editableElement, fieldDisabled || isDisabled, isVariant);\n}\n\nconst debouncedAddOutline = debounce(addOutline, 50, { trailing: true });\nexport const cancelPendingAddOutline = () => debouncedAddOutline.cancel();\nconst showOutline = (params?: AddOutlineParams): Promise<void> | undefined => debouncedAddOutline(params);\n\nfunction hideDefaultCursor(): void {\n if (\n document?.body &&\n !document.body.classList.contains(\n visualBuilderStyles()[\"visual-builder__default-cursor--disabled\"]\n )\n )\n document.body.classList.add(\n visualBuilderStyles()[\"visual-builder__default-cursor--disabled\"]\n );\n}\n\nfunction showDefaultCursor(): void {\n if (\n document?.body &&\n document.body.classList.contains(\n visualBuilderStyles()[\"visual-builder__default-cursor--disabled\"]\n )\n )\n document.body.classList.remove(\n visualBuilderStyles()[\"visual-builder__default-cursor--disabled\"]\n );\n}\n\nexport function hideHoverOutline(\n visualBuilderContainer: HTMLDivElement | null\n): void {\n if (!visualBuilderContainer) {\n return;\n }\n const hoverOutline = visualBuilderContainer.querySelector(\n \".visual-builder__hover-outline\"\n );\n if (!hoverOutline) {\n return;\n }\n hoverOutline.classList.add(\n visualBuilderStyles()[\"visual-builder__hover-outline--hidden\"]\n );\n}\n\nexport function hideCustomCursor(customCursor: HTMLDivElement | null): void {\n showDefaultCursor();\n customCursor?.classList.remove(\"visible\");\n}\n\nexport function showCustomCursor(customCursor: HTMLDivElement | null): void {\n hideDefaultCursor();\n if (\n config.collab.enable &&\n (!config.collab.isFeedbackMode || config.collab.pauseFeedback)\n )\n return;\n customCursor?.classList.add(\"visible\");\n}\n\nconst debouncedRenderHoverToolbar = debounce(async (params: HandleBuilderInteractionParams) => {\n const eventDetails = getCsDataOfElement(params.event);\n if (\n !eventDetails ||\n !params.overlayWrapper ||\n !params.visualBuilderContainer ||\n !params.focusedToolbar\n ) {\n return;\n }\n\n appendFieldPathDropdown(eventDetails, params.focusedToolbar, {\n isHover: true\n });\n}, 50, { trailing: true });\n\nexport const showHoverToolbar = async (params: HandleBuilderInteractionParams) => await debouncedRenderHoverToolbar(params);\n\nexport const cancelPendingHoverToolbar = () => debouncedRenderHoverToolbar.cancel();\n\nfunction isOverlay(target: HTMLElement): boolean {\n return target.classList.contains(\"visual-builder__overlay\");\n}\n\nfunction isContentEditable(target: HTMLElement): boolean {\n if (target.hasAttribute(\"contenteditable\"))\n return target.getAttribute(\"contenteditable\") === \"true\";\n return false;\n}\n\nfunction isFieldPathDropdown(target: HTMLElement): boolean {\n return target.classList.contains(\"visual-builder__focused-toolbar__field-label-wrapper\") || target.classList.contains(\"visual-builder__focused-toolbar__field-label-wrapper__current-field\");\n}\n\nfunction isFieldPathParent(target: HTMLElement): boolean {\n return target.classList.contains(\"visual-builder__focused-toolbar__field-label-wrapper__parent-field\");\n}\n\nconst throttledMouseHover = throttle(async (params: HandleMouseHoverParams) => {\n const eventDetails = getCsDataOfElement(params.event);\n const eventTarget = params.event.target as HTMLElement | null;\n\n if (config?.collab.enable && config?.collab.pauseFeedback) {\n hideCustomCursor(params.customCursor);\n return;\n }\n if (!eventDetails) {\n if (\n eventTarget &&\n (isOverlay(eventTarget) ||\n isContentEditable(eventTarget) ||\n isCollabThread(eventTarget))\n ) {\n handleCursorPosition(params.event, params.customCursor);\n hideCustomCursor(params.customCursor);\n return;\n }\n if (\n eventTarget &&\n (isFieldPathDropdown(eventTarget) || isFieldPathParent(eventTarget))\n ) {\n if (params.customCursor) {\n hideCustomCursor(params.customCursor);\n }\n showOutline();\n showHoverToolbar({\n event: params.event,\n overlayWrapper: params.overlayWrapper,\n visualBuilderContainer: params.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n });\n }\n if (!config?.collab.enable) {\n resetCustomCursor(params.customCursor);\n }\n removeAddInstanceButtons({\n eventTarget: params.event.target,\n visualBuilderContainer: params.visualBuilderContainer,\n overlayWrapper: params.overlayWrapper,\n });\n handleCursorPosition(params.event, params.customCursor);\n if (config?.collab.enable && config?.collab.isFeedbackMode) {\n showCustomCursor(params.customCursor);\n collabCustomCursor(params.customCursor);\n }\n return;\n }\n\n const { editableElement, fieldMetadata } = eventDetails;\n const { content_type_uid, fieldPath } = fieldMetadata;\n\n if (FieldSchemaMap.hasFieldSchema(content_type_uid, fieldPath)) {\n const fieldSchema = await FieldSchemaMap.getFieldSchema(content_type_uid, fieldPath);\n if (fieldSchema && isCustomFieldMultipleInstance(fieldSchema, fieldMetadata)) {\n const parentCslp = getParentCslp(fieldMetadata.cslpValue);\n const wholeFieldElement = getWholeFieldElement(editableElement, parentCslp);\n if (wholeFieldElement) {\n wholeFieldElement.dispatchEvent(\n new MouseEvent(\"mousemove\", {\n bubbles: true,\n cancelable: true,\n clientX: params.event.clientX,\n clientY: params.event.clientY,\n })\n );\n } else {\n if (config.debug) {\n console.debug(\n \"[Visual Builder] Custom field multiple instance: whole-field parent not found in DOM for CSLP\",\n parentCslp\n );\n }\n resetCustomCursor(params.customCursor);\n handleCursorPosition(params.event, params.customCursor);\n }\n return;\n }\n }\n\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM &&\n VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM.isSameNode(\n editableElement\n )\n ) {\n hideCustomCursor(params.customCursor);\n return;\n }\n\n if (params.customCursor) {\n const elementUnderCursor = document.elementFromPoint(\n params.event.clientX,\n params.event.clientY\n );\n if (elementUnderCursor) {\n if (\n elementUnderCursor.nodeName === \"A\" ||\n elementUnderCursor.nodeName === \"BUTTON\"\n ) {\n elementUnderCursor.classList.add(\n visualBuilderStyles()[\"visual-builder__no-cursor-style\"]\n );\n }\n }\n\n if (config?.collab.enable && config?.collab.isFeedbackMode) {\n collabCustomCursor(params.customCursor);\n handleCursorPosition(params.event, params.customCursor);\n showCustomCursor(params.customCursor);\n return;\n } else if (config?.collab.enable && !config?.collab.isFeedbackMode) {\n hideCustomCursor(params.customCursor);\n return;\n }\n\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousHoveredTargetDOM !== editableElement\n ) {\n resetCustomCursor(params.customCursor);\n removeAddInstanceButtons({\n eventTarget: params.event.target,\n visualBuilderContainer: params.visualBuilderContainer,\n overlayWrapper: params.overlayWrapper,\n });\n }\n\n if (!FieldSchemaMap.hasFieldSchema(content_type_uid, fieldPath)) {\n generateCustomCursor({\n fieldType: \"loading\",\n customCursor: params.customCursor,\n });\n }\n\n // only re-generate cursor when moving onto a new element — avoids\n // firing fetchEntryPermissionsAndStageDetails on every 10ms tick\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousHoveredTargetDOM !== editableElement\n ) {\n generateCursor({\n eventDetails,\n customCursor: params.customCursor,\n });\n }\n\n handleCursorPosition(params.event, params.customCursor);\n showCustomCursor(params.customCursor);\n }\n\n if (\n !editableElement.classList.contains(VB_EmptyBlockParentClass) &&\n !editableElement.classList.contains(\"visual-builder__empty-block\")\n ) {\n showOutline({\n editableElement,\n eventDetails,\n content_type_uid,\n fieldPath,\n fieldMetadata,\n });\n const isFocussed= VisualBuilder.VisualBuilderGlobalState.value.isFocussed;\n if(!isFocussed) {\n showHoverToolbar({\n event: params.event,\n overlayWrapper: params.overlayWrapper,\n visualBuilderContainer: params.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n }\n );\n }\n }\n\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousHoveredTargetDOM === editableElement\n ) {\n return;\n }\n\n VisualBuilder.VisualBuilderGlobalState.value.previousHoveredTargetDOM =\n editableElement;\n}, 10);\n\nasync function generateCursor({\n eventDetails,\n customCursor,\n}: {\n eventDetails: VisualBuilderCslpEventDetails;\n customCursor: HTMLDivElement | null;\n}) {\n if (!customCursor) return;\n const { fieldMetadata } = eventDetails;\n const fieldSchema = await FieldSchemaMap.getFieldSchema(\n fieldMetadata.content_type_uid,\n fieldMetadata.fieldPath\n );\n if (!fieldSchema) {\n return;\n }\n const { acl: entryAcl, workflowStage: entryWorkflowStageDetails, resolvedVariantPermissions } =\n await fetchEntryPermissionsAndStageDetails({\n entryUid: fieldMetadata.entry_uid,\n contentTypeUid: fieldMetadata.content_type_uid,\n locale: fieldMetadata.locale,\n variantUid: fieldMetadata.variant,\n fieldPathWithIndex: fieldMetadata.fieldPathWithIndex,\n });\n const { isDisabled: fieldDisabled } = isFieldDisabled(\n fieldSchema,\n eventDetails,\n resolvedVariantPermissions,\n entryAcl,\n entryWorkflowStageDetails\n );\n const fieldType = getFieldType(fieldSchema);\n generateCustomCursor({\n fieldType,\n customCursor,\n fieldDisabled,\n });\n}\n\nconst handleMouseHover = async (\n params: HandleMouseHoverParams\n): Promise<void> => await throttledMouseHover(params);\n\nexport const cancelPendingMouseHover = () => throttledMouseHover.cancel();\n\nexport default handleMouseHover;\n"],"mappings":"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","names":["import__","Config"]}
@@ -16,6 +16,8 @@ import Config from "../../configManager/configManager.js";
16
16
  import { isCollabThread } from "../generators/generateThread.js";
17
17
  import { appendFieldPathDropdown } from "../generators/generateToolbar.js";
18
18
  import { fetchEntryPermissionsAndStageDetails } from "../utils/fetchEntryPermissionsAndStageDetails.js";
19
+ import { isCustomFieldMultipleInstance } from "../utils/isCustomFieldMultipleInstance.js";
20
+ import { getParentCslp, getWholeFieldElement } from "../utils/getWholeFieldElement.js";
19
21
  var config = Config.get();
20
22
  function resetCustomCursor(customCursor) {
21
23
  if (customCursor) {
@@ -188,6 +190,33 @@ var throttledMouseHover = throttle(async (params) => {
188
190
  }
189
191
  const { editableElement, fieldMetadata } = eventDetails;
190
192
  const { content_type_uid, fieldPath } = fieldMetadata;
193
+ if (FieldSchemaMap.hasFieldSchema(content_type_uid, fieldPath)) {
194
+ const fieldSchema = await FieldSchemaMap.getFieldSchema(content_type_uid, fieldPath);
195
+ if (fieldSchema && isCustomFieldMultipleInstance(fieldSchema, fieldMetadata)) {
196
+ const parentCslp = getParentCslp(fieldMetadata.cslpValue);
197
+ const wholeFieldElement = getWholeFieldElement(editableElement, parentCslp);
198
+ if (wholeFieldElement) {
199
+ wholeFieldElement.dispatchEvent(
200
+ new MouseEvent("mousemove", {
201
+ bubbles: true,
202
+ cancelable: true,
203
+ clientX: params.event.clientX,
204
+ clientY: params.event.clientY
205
+ })
206
+ );
207
+ } else {
208
+ if (config.debug) {
209
+ console.debug(
210
+ "[Visual Builder] Custom field multiple instance: whole-field parent not found in DOM for CSLP",
211
+ parentCslp
212
+ );
213
+ }
214
+ resetCustomCursor(params.customCursor);
215
+ handleCursorPosition(params.event, params.customCursor);
216
+ }
217
+ return;
218
+ }
219
+ }
191
220
  if (VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM && VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM.isSameNode(
192
221
  editableElement
193
222
  )) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/visualBuilder/listeners/mouseHover.ts"],"sourcesContent":["import { debounce, throttle } from \"lodash-es\";\nimport { getCsDataOfElement } from \"../utils/getCsDataOfElement\";\nimport { removeAddInstanceButtons } from \"../utils/multipleElementAddButton\";\nimport { generateCustomCursor } from \"../generators/generateCustomCursor\";\nimport { FieldSchemaMap } from \"../utils/fieldSchemaMap\";\nimport { isFieldDisabled } from \"../utils/isFieldDisabled\";\nimport { getFieldType } from \"../utils/getFieldType\";\n\nimport EventListenerHandlerParams from \"./types\";\nimport { VisualBuilder } from \"..\";\nimport { addHoverOutline } from \"../generators/generateHoverOutline\";\nimport { visualBuilderStyles } from \"../visualBuilder.style\";\nimport { VB_EmptyBlockParentClass } from \"../..\";\nimport Config from \"../../configManager/configManager\";\nimport { isCollabThread } from \"../generators/generateThread\";\nimport { HandleBuilderInteractionParams } from \"./mouseClick\";\nimport { appendFieldPathDropdown } from \"../generators/generateToolbar\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport { CslpData } from \"../../cslp/types/cslp.types\";\nimport { fetchEntryPermissionsAndStageDetails } from \"../utils/fetchEntryPermissionsAndStageDetails\";\n\nconst config = Config.get();\nexport interface HandleMouseHoverParams\n extends Pick<\n EventListenerHandlerParams,\n \"event\" | \"overlayWrapper\" | \"visualBuilderContainer\" | \"focusedToolbar\" | \"resizeObserver\"\n > {\n customCursor: HTMLDivElement | null;\n}\n\ninterface AddOutlineParams {\n editableElement: Element;\n eventDetails: VisualBuilderCslpEventDetails;\n content_type_uid: string;\n fieldPath: string;\n fieldDisabled?: boolean;\n fieldMetadata: CslpData;\n}\n\nfunction resetCustomCursor(customCursor: HTMLDivElement | null): void {\n if (customCursor) {\n generateCustomCursor({\n fieldType: \"empty\",\n customCursor: customCursor,\n });\n }\n}\n\nfunction collabCustomCursor(customCursor: HTMLDivElement | null): void {\n if (!customCursor) return;\n\n generateCustomCursor({\n fieldType: \"discussion\",\n customCursor: customCursor,\n });\n}\n\nfunction handleCursorPosition(\n event: MouseEvent,\n customCursor: HTMLDivElement | null\n): void {\n if (customCursor) {\n const mouseY = event.clientY;\n const mouseX = event.clientX;\n\n customCursor.style.left = `${mouseX}px`;\n customCursor.style.top = `${mouseY}px`;\n }\n}\n\nasync function addOutline(params?: AddOutlineParams): Promise<void> {\n if (!params) {\n return;\n }\n const {\n editableElement,\n eventDetails,\n content_type_uid,\n fieldPath,\n fieldMetadata,\n fieldDisabled,\n } = params;\n if (!editableElement) return;\n const isVariant = !!fieldMetadata.variant;\n addHoverOutline(editableElement as HTMLElement, fieldDisabled, isVariant);\n const fieldSchema = await FieldSchemaMap.getFieldSchema(\n content_type_uid,\n fieldPath\n );\n if (!fieldSchema) return;\n const { acl: entryAcl, workflowStage: entryWorkflowStageDetails, resolvedVariantPermissions } =\n await fetchEntryPermissionsAndStageDetails({\n entryUid: fieldMetadata.entry_uid,\n contentTypeUid: fieldMetadata.content_type_uid,\n locale: fieldMetadata.locale,\n variantUid: fieldMetadata.variant,\n fieldPathWithIndex: fieldMetadata.fieldPathWithIndex,\n });\n const { isDisabled } = isFieldDisabled(\n fieldSchema,\n eventDetails,\n resolvedVariantPermissions,\n entryAcl,\n entryWorkflowStageDetails\n );\n addHoverOutline(editableElement, fieldDisabled || isDisabled, isVariant);\n}\n\nconst debouncedAddOutline = debounce(addOutline, 50, { trailing: true });\nexport const cancelPendingAddOutline = () => debouncedAddOutline.cancel();\nconst showOutline = (params?: AddOutlineParams): Promise<void> | undefined => debouncedAddOutline(params);\n\nfunction hideDefaultCursor(): void {\n if (\n document?.body &&\n !document.body.classList.contains(\n visualBuilderStyles()[\"visual-builder__default-cursor--disabled\"]\n )\n )\n document.body.classList.add(\n visualBuilderStyles()[\"visual-builder__default-cursor--disabled\"]\n );\n}\n\nfunction showDefaultCursor(): void {\n if (\n document?.body &&\n document.body.classList.contains(\n visualBuilderStyles()[\"visual-builder__default-cursor--disabled\"]\n )\n )\n document.body.classList.remove(\n visualBuilderStyles()[\"visual-builder__default-cursor--disabled\"]\n );\n}\n\nexport function hideHoverOutline(\n visualBuilderContainer: HTMLDivElement | null\n): void {\n if (!visualBuilderContainer) {\n return;\n }\n const hoverOutline = visualBuilderContainer.querySelector(\n \".visual-builder__hover-outline\"\n );\n if (!hoverOutline) {\n return;\n }\n hoverOutline.classList.add(\n visualBuilderStyles()[\"visual-builder__hover-outline--hidden\"]\n );\n}\n\nexport function hideCustomCursor(customCursor: HTMLDivElement | null): void {\n showDefaultCursor();\n customCursor?.classList.remove(\"visible\");\n}\n\nexport function showCustomCursor(customCursor: HTMLDivElement | null): void {\n hideDefaultCursor();\n if (\n config.collab.enable &&\n (!config.collab.isFeedbackMode || config.collab.pauseFeedback)\n )\n return;\n customCursor?.classList.add(\"visible\");\n}\n\nconst debouncedRenderHoverToolbar = debounce(async (params: HandleBuilderInteractionParams) => {\n const eventDetails = getCsDataOfElement(params.event);\n if (\n !eventDetails ||\n !params.overlayWrapper ||\n !params.visualBuilderContainer ||\n !params.focusedToolbar\n ) {\n return;\n }\n\n appendFieldPathDropdown(eventDetails, params.focusedToolbar, {\n isHover: true\n });\n}, 50, { trailing: true });\n\nexport const showHoverToolbar = async (params: HandleBuilderInteractionParams) => await debouncedRenderHoverToolbar(params);\n\nexport const cancelPendingHoverToolbar = () => debouncedRenderHoverToolbar.cancel();\n\nfunction isOverlay(target: HTMLElement): boolean {\n return target.classList.contains(\"visual-builder__overlay\");\n}\n\nfunction isContentEditable(target: HTMLElement): boolean {\n if (target.hasAttribute(\"contenteditable\"))\n return target.getAttribute(\"contenteditable\") === \"true\";\n return false;\n}\n\nfunction isFieldPathDropdown(target: HTMLElement): boolean {\n return target.classList.contains(\"visual-builder__focused-toolbar__field-label-wrapper\") || target.classList.contains(\"visual-builder__focused-toolbar__field-label-wrapper__current-field\");\n}\n\nfunction isFieldPathParent(target: HTMLElement): boolean {\n return target.classList.contains(\"visual-builder__focused-toolbar__field-label-wrapper__parent-field\");\n}\n\nconst throttledMouseHover = throttle(async (params: HandleMouseHoverParams) => {\n const eventDetails = getCsDataOfElement(params.event);\n const eventTarget = params.event.target as HTMLElement | null;\n\n if (config?.collab.enable && config?.collab.pauseFeedback) {\n hideCustomCursor(params.customCursor);\n return;\n }\n if (!eventDetails) {\n if (\n eventTarget &&\n (isOverlay(eventTarget) ||\n isContentEditable(eventTarget) ||\n isCollabThread(eventTarget))\n ) {\n handleCursorPosition(params.event, params.customCursor);\n hideCustomCursor(params.customCursor);\n return;\n }\n if (\n eventTarget &&\n (isFieldPathDropdown(eventTarget) || isFieldPathParent(eventTarget))\n ) {\n if (params.customCursor) {\n hideCustomCursor(params.customCursor);\n }\n showOutline();\n showHoverToolbar({\n event: params.event,\n overlayWrapper: params.overlayWrapper,\n visualBuilderContainer: params.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n });\n }\n if (!config?.collab.enable) {\n resetCustomCursor(params.customCursor);\n }\n removeAddInstanceButtons({\n eventTarget: params.event.target,\n visualBuilderContainer: params.visualBuilderContainer,\n overlayWrapper: params.overlayWrapper,\n });\n handleCursorPosition(params.event, params.customCursor);\n if (config?.collab.enable && config?.collab.isFeedbackMode) {\n showCustomCursor(params.customCursor);\n collabCustomCursor(params.customCursor);\n }\n return;\n }\n\n const { editableElement, fieldMetadata } = eventDetails;\n const { content_type_uid, fieldPath } = fieldMetadata;\n\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM &&\n VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM.isSameNode(\n editableElement\n )\n ) {\n hideCustomCursor(params.customCursor);\n return;\n }\n\n if (params.customCursor) {\n const elementUnderCursor = document.elementFromPoint(\n params.event.clientX,\n params.event.clientY\n );\n if (elementUnderCursor) {\n if (\n elementUnderCursor.nodeName === \"A\" ||\n elementUnderCursor.nodeName === \"BUTTON\"\n ) {\n elementUnderCursor.classList.add(\n visualBuilderStyles()[\"visual-builder__no-cursor-style\"]\n );\n }\n }\n\n if (config?.collab.enable && config?.collab.isFeedbackMode) {\n collabCustomCursor(params.customCursor);\n handleCursorPosition(params.event, params.customCursor);\n showCustomCursor(params.customCursor);\n return;\n } else if (config?.collab.enable && !config?.collab.isFeedbackMode) {\n hideCustomCursor(params.customCursor);\n return;\n }\n\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousHoveredTargetDOM !== editableElement\n ) {\n resetCustomCursor(params.customCursor);\n removeAddInstanceButtons({\n eventTarget: params.event.target,\n visualBuilderContainer: params.visualBuilderContainer,\n overlayWrapper: params.overlayWrapper,\n });\n }\n\n if (!FieldSchemaMap.hasFieldSchema(content_type_uid, fieldPath)) {\n generateCustomCursor({\n fieldType: \"loading\",\n customCursor: params.customCursor,\n });\n }\n\n // only re-generate cursor when moving onto a new element — avoids\n // firing fetchEntryPermissionsAndStageDetails on every 10ms tick\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousHoveredTargetDOM !== editableElement\n ) {\n generateCursor({\n eventDetails,\n customCursor: params.customCursor,\n });\n }\n\n handleCursorPosition(params.event, params.customCursor);\n showCustomCursor(params.customCursor);\n }\n\n if (\n !editableElement.classList.contains(VB_EmptyBlockParentClass) &&\n !editableElement.classList.contains(\"visual-builder__empty-block\")\n ) {\n showOutline({\n editableElement,\n eventDetails,\n content_type_uid,\n fieldPath,\n fieldMetadata,\n });\n const isFocussed= VisualBuilder.VisualBuilderGlobalState.value.isFocussed;\n if(!isFocussed) {\n showHoverToolbar({\n event: params.event,\n overlayWrapper: params.overlayWrapper,\n visualBuilderContainer: params.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n }\n );\n }\n }\n\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousHoveredTargetDOM === editableElement\n ) {\n return;\n }\n\n VisualBuilder.VisualBuilderGlobalState.value.previousHoveredTargetDOM =\n editableElement;\n}, 10);\n\nasync function generateCursor({\n eventDetails,\n customCursor,\n}: {\n eventDetails: VisualBuilderCslpEventDetails;\n customCursor: HTMLDivElement | null;\n}) {\n if (!customCursor) return;\n const { fieldMetadata } = eventDetails;\n const fieldSchema = await FieldSchemaMap.getFieldSchema(\n fieldMetadata.content_type_uid,\n fieldMetadata.fieldPath\n );\n if (!fieldSchema) {\n return;\n }\n const { acl: entryAcl, workflowStage: entryWorkflowStageDetails, resolvedVariantPermissions } =\n await fetchEntryPermissionsAndStageDetails({\n entryUid: fieldMetadata.entry_uid,\n contentTypeUid: fieldMetadata.content_type_uid,\n locale: fieldMetadata.locale,\n variantUid: fieldMetadata.variant,\n fieldPathWithIndex: fieldMetadata.fieldPathWithIndex,\n });\n const { isDisabled: fieldDisabled } = isFieldDisabled(\n fieldSchema,\n eventDetails,\n resolvedVariantPermissions,\n entryAcl,\n entryWorkflowStageDetails\n );\n const fieldType = getFieldType(fieldSchema);\n generateCustomCursor({\n fieldType,\n customCursor,\n fieldDisabled,\n });\n}\n\nconst handleMouseHover = async (\n params: HandleMouseHoverParams\n): Promise<void> => await throttledMouseHover(params);\n\nexport const cancelPendingMouseHover = () => throttledMouseHover.cancel();\n\nexport default handleMouseHover;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/visualBuilder/listeners/mouseHover.ts"],"sourcesContent":["import { debounce, throttle } from \"lodash-es\";\nimport { getCsDataOfElement } from \"../utils/getCsDataOfElement\";\nimport { removeAddInstanceButtons } from \"../utils/multipleElementAddButton\";\nimport { generateCustomCursor } from \"../generators/generateCustomCursor\";\nimport { FieldSchemaMap } from \"../utils/fieldSchemaMap\";\nimport { isFieldDisabled } from \"../utils/isFieldDisabled\";\nimport { getFieldType } from \"../utils/getFieldType\";\n\nimport EventListenerHandlerParams from \"./types\";\nimport { VisualBuilder } from \"..\";\nimport { addHoverOutline } from \"../generators/generateHoverOutline\";\nimport { visualBuilderStyles } from \"../visualBuilder.style\";\nimport { VB_EmptyBlockParentClass } from \"../..\";\nimport Config from \"../../configManager/configManager\";\nimport { isCollabThread } from \"../generators/generateThread\";\nimport { HandleBuilderInteractionParams } from \"./mouseClick\";\nimport { appendFieldPathDropdown } from \"../generators/generateToolbar\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport { CslpData } from \"../../cslp/types/cslp.types\";\nimport { fetchEntryPermissionsAndStageDetails } from \"../utils/fetchEntryPermissionsAndStageDetails\";\nimport { isCustomFieldMultipleInstance } from \"../utils/isCustomFieldMultipleInstance\";\nimport { getParentCslp, getWholeFieldElement } from \"../utils/getWholeFieldElement\";\n\nconst config = Config.get();\nexport interface HandleMouseHoverParams\n extends Pick<\n EventListenerHandlerParams,\n \"event\" | \"overlayWrapper\" | \"visualBuilderContainer\" | \"focusedToolbar\" | \"resizeObserver\"\n > {\n customCursor: HTMLDivElement | null;\n}\n\ninterface AddOutlineParams {\n editableElement: Element;\n eventDetails: VisualBuilderCslpEventDetails;\n content_type_uid: string;\n fieldPath: string;\n fieldDisabled?: boolean;\n fieldMetadata: CslpData;\n}\n\nfunction resetCustomCursor(customCursor: HTMLDivElement | null): void {\n if (customCursor) {\n generateCustomCursor({\n fieldType: \"empty\",\n customCursor: customCursor,\n });\n }\n}\n\nfunction collabCustomCursor(customCursor: HTMLDivElement | null): void {\n if (!customCursor) return;\n\n generateCustomCursor({\n fieldType: \"discussion\",\n customCursor: customCursor,\n });\n}\n\nfunction handleCursorPosition(\n event: MouseEvent,\n customCursor: HTMLDivElement | null\n): void {\n if (customCursor) {\n const mouseY = event.clientY;\n const mouseX = event.clientX;\n\n customCursor.style.left = `${mouseX}px`;\n customCursor.style.top = `${mouseY}px`;\n }\n}\n\nasync function addOutline(params?: AddOutlineParams): Promise<void> {\n if (!params) {\n return;\n }\n const {\n editableElement,\n eventDetails,\n content_type_uid,\n fieldPath,\n fieldMetadata,\n fieldDisabled,\n } = params;\n if (!editableElement) return;\n const isVariant = !!fieldMetadata.variant;\n addHoverOutline(editableElement as HTMLElement, fieldDisabled, isVariant);\n const fieldSchema = await FieldSchemaMap.getFieldSchema(\n content_type_uid,\n fieldPath\n );\n if (!fieldSchema) return;\n const { acl: entryAcl, workflowStage: entryWorkflowStageDetails, resolvedVariantPermissions } =\n await fetchEntryPermissionsAndStageDetails({\n entryUid: fieldMetadata.entry_uid,\n contentTypeUid: fieldMetadata.content_type_uid,\n locale: fieldMetadata.locale,\n variantUid: fieldMetadata.variant,\n fieldPathWithIndex: fieldMetadata.fieldPathWithIndex,\n });\n const { isDisabled } = isFieldDisabled(\n fieldSchema,\n eventDetails,\n resolvedVariantPermissions,\n entryAcl,\n entryWorkflowStageDetails\n );\n addHoverOutline(editableElement, fieldDisabled || isDisabled, isVariant);\n}\n\nconst debouncedAddOutline = debounce(addOutline, 50, { trailing: true });\nexport const cancelPendingAddOutline = () => debouncedAddOutline.cancel();\nconst showOutline = (params?: AddOutlineParams): Promise<void> | undefined => debouncedAddOutline(params);\n\nfunction hideDefaultCursor(): void {\n if (\n document?.body &&\n !document.body.classList.contains(\n visualBuilderStyles()[\"visual-builder__default-cursor--disabled\"]\n )\n )\n document.body.classList.add(\n visualBuilderStyles()[\"visual-builder__default-cursor--disabled\"]\n );\n}\n\nfunction showDefaultCursor(): void {\n if (\n document?.body &&\n document.body.classList.contains(\n visualBuilderStyles()[\"visual-builder__default-cursor--disabled\"]\n )\n )\n document.body.classList.remove(\n visualBuilderStyles()[\"visual-builder__default-cursor--disabled\"]\n );\n}\n\nexport function hideHoverOutline(\n visualBuilderContainer: HTMLDivElement | null\n): void {\n if (!visualBuilderContainer) {\n return;\n }\n const hoverOutline = visualBuilderContainer.querySelector(\n \".visual-builder__hover-outline\"\n );\n if (!hoverOutline) {\n return;\n }\n hoverOutline.classList.add(\n visualBuilderStyles()[\"visual-builder__hover-outline--hidden\"]\n );\n}\n\nexport function hideCustomCursor(customCursor: HTMLDivElement | null): void {\n showDefaultCursor();\n customCursor?.classList.remove(\"visible\");\n}\n\nexport function showCustomCursor(customCursor: HTMLDivElement | null): void {\n hideDefaultCursor();\n if (\n config.collab.enable &&\n (!config.collab.isFeedbackMode || config.collab.pauseFeedback)\n )\n return;\n customCursor?.classList.add(\"visible\");\n}\n\nconst debouncedRenderHoverToolbar = debounce(async (params: HandleBuilderInteractionParams) => {\n const eventDetails = getCsDataOfElement(params.event);\n if (\n !eventDetails ||\n !params.overlayWrapper ||\n !params.visualBuilderContainer ||\n !params.focusedToolbar\n ) {\n return;\n }\n\n appendFieldPathDropdown(eventDetails, params.focusedToolbar, {\n isHover: true\n });\n}, 50, { trailing: true });\n\nexport const showHoverToolbar = async (params: HandleBuilderInteractionParams) => await debouncedRenderHoverToolbar(params);\n\nexport const cancelPendingHoverToolbar = () => debouncedRenderHoverToolbar.cancel();\n\nfunction isOverlay(target: HTMLElement): boolean {\n return target.classList.contains(\"visual-builder__overlay\");\n}\n\nfunction isContentEditable(target: HTMLElement): boolean {\n if (target.hasAttribute(\"contenteditable\"))\n return target.getAttribute(\"contenteditable\") === \"true\";\n return false;\n}\n\nfunction isFieldPathDropdown(target: HTMLElement): boolean {\n return target.classList.contains(\"visual-builder__focused-toolbar__field-label-wrapper\") || target.classList.contains(\"visual-builder__focused-toolbar__field-label-wrapper__current-field\");\n}\n\nfunction isFieldPathParent(target: HTMLElement): boolean {\n return target.classList.contains(\"visual-builder__focused-toolbar__field-label-wrapper__parent-field\");\n}\n\nconst throttledMouseHover = throttle(async (params: HandleMouseHoverParams) => {\n const eventDetails = getCsDataOfElement(params.event);\n const eventTarget = params.event.target as HTMLElement | null;\n\n if (config?.collab.enable && config?.collab.pauseFeedback) {\n hideCustomCursor(params.customCursor);\n return;\n }\n if (!eventDetails) {\n if (\n eventTarget &&\n (isOverlay(eventTarget) ||\n isContentEditable(eventTarget) ||\n isCollabThread(eventTarget))\n ) {\n handleCursorPosition(params.event, params.customCursor);\n hideCustomCursor(params.customCursor);\n return;\n }\n if (\n eventTarget &&\n (isFieldPathDropdown(eventTarget) || isFieldPathParent(eventTarget))\n ) {\n if (params.customCursor) {\n hideCustomCursor(params.customCursor);\n }\n showOutline();\n showHoverToolbar({\n event: params.event,\n overlayWrapper: params.overlayWrapper,\n visualBuilderContainer: params.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n });\n }\n if (!config?.collab.enable) {\n resetCustomCursor(params.customCursor);\n }\n removeAddInstanceButtons({\n eventTarget: params.event.target,\n visualBuilderContainer: params.visualBuilderContainer,\n overlayWrapper: params.overlayWrapper,\n });\n handleCursorPosition(params.event, params.customCursor);\n if (config?.collab.enable && config?.collab.isFeedbackMode) {\n showCustomCursor(params.customCursor);\n collabCustomCursor(params.customCursor);\n }\n return;\n }\n\n const { editableElement, fieldMetadata } = eventDetails;\n const { content_type_uid, fieldPath } = fieldMetadata;\n\n if (FieldSchemaMap.hasFieldSchema(content_type_uid, fieldPath)) {\n const fieldSchema = await FieldSchemaMap.getFieldSchema(content_type_uid, fieldPath);\n if (fieldSchema && isCustomFieldMultipleInstance(fieldSchema, fieldMetadata)) {\n const parentCslp = getParentCslp(fieldMetadata.cslpValue);\n const wholeFieldElement = getWholeFieldElement(editableElement, parentCslp);\n if (wholeFieldElement) {\n wholeFieldElement.dispatchEvent(\n new MouseEvent(\"mousemove\", {\n bubbles: true,\n cancelable: true,\n clientX: params.event.clientX,\n clientY: params.event.clientY,\n })\n );\n } else {\n if (config.debug) {\n console.debug(\n \"[Visual Builder] Custom field multiple instance: whole-field parent not found in DOM for CSLP\",\n parentCslp\n );\n }\n resetCustomCursor(params.customCursor);\n handleCursorPosition(params.event, params.customCursor);\n }\n return;\n }\n }\n\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM &&\n VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM.isSameNode(\n editableElement\n )\n ) {\n hideCustomCursor(params.customCursor);\n return;\n }\n\n if (params.customCursor) {\n const elementUnderCursor = document.elementFromPoint(\n params.event.clientX,\n params.event.clientY\n );\n if (elementUnderCursor) {\n if (\n elementUnderCursor.nodeName === \"A\" ||\n elementUnderCursor.nodeName === \"BUTTON\"\n ) {\n elementUnderCursor.classList.add(\n visualBuilderStyles()[\"visual-builder__no-cursor-style\"]\n );\n }\n }\n\n if (config?.collab.enable && config?.collab.isFeedbackMode) {\n collabCustomCursor(params.customCursor);\n handleCursorPosition(params.event, params.customCursor);\n showCustomCursor(params.customCursor);\n return;\n } else if (config?.collab.enable && !config?.collab.isFeedbackMode) {\n hideCustomCursor(params.customCursor);\n return;\n }\n\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousHoveredTargetDOM !== editableElement\n ) {\n resetCustomCursor(params.customCursor);\n removeAddInstanceButtons({\n eventTarget: params.event.target,\n visualBuilderContainer: params.visualBuilderContainer,\n overlayWrapper: params.overlayWrapper,\n });\n }\n\n if (!FieldSchemaMap.hasFieldSchema(content_type_uid, fieldPath)) {\n generateCustomCursor({\n fieldType: \"loading\",\n customCursor: params.customCursor,\n });\n }\n\n // only re-generate cursor when moving onto a new element — avoids\n // firing fetchEntryPermissionsAndStageDetails on every 10ms tick\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousHoveredTargetDOM !== editableElement\n ) {\n generateCursor({\n eventDetails,\n customCursor: params.customCursor,\n });\n }\n\n handleCursorPosition(params.event, params.customCursor);\n showCustomCursor(params.customCursor);\n }\n\n if (\n !editableElement.classList.contains(VB_EmptyBlockParentClass) &&\n !editableElement.classList.contains(\"visual-builder__empty-block\")\n ) {\n showOutline({\n editableElement,\n eventDetails,\n content_type_uid,\n fieldPath,\n fieldMetadata,\n });\n const isFocussed= VisualBuilder.VisualBuilderGlobalState.value.isFocussed;\n if(!isFocussed) {\n showHoverToolbar({\n event: params.event,\n overlayWrapper: params.overlayWrapper,\n visualBuilderContainer: params.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n }\n );\n }\n }\n\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousHoveredTargetDOM === editableElement\n ) {\n return;\n }\n\n VisualBuilder.VisualBuilderGlobalState.value.previousHoveredTargetDOM =\n editableElement;\n}, 10);\n\nasync function generateCursor({\n eventDetails,\n customCursor,\n}: {\n eventDetails: VisualBuilderCslpEventDetails;\n customCursor: HTMLDivElement | null;\n}) {\n if (!customCursor) return;\n const { fieldMetadata } = eventDetails;\n const fieldSchema = await FieldSchemaMap.getFieldSchema(\n fieldMetadata.content_type_uid,\n fieldMetadata.fieldPath\n );\n if (!fieldSchema) {\n return;\n }\n const { acl: entryAcl, workflowStage: entryWorkflowStageDetails, resolvedVariantPermissions } =\n await fetchEntryPermissionsAndStageDetails({\n entryUid: fieldMetadata.entry_uid,\n contentTypeUid: fieldMetadata.content_type_uid,\n locale: fieldMetadata.locale,\n variantUid: fieldMetadata.variant,\n fieldPathWithIndex: fieldMetadata.fieldPathWithIndex,\n });\n const { isDisabled: fieldDisabled } = isFieldDisabled(\n fieldSchema,\n eventDetails,\n resolvedVariantPermissions,\n entryAcl,\n entryWorkflowStageDetails\n );\n const fieldType = getFieldType(fieldSchema);\n generateCustomCursor({\n fieldType,\n customCursor,\n fieldDisabled,\n });\n}\n\nconst handleMouseHover = async (\n params: HandleMouseHoverParams\n): Promise<void> => await throttledMouseHover(params);\n\nexport const cancelPendingMouseHover = () => throttledMouseHover.cancel();\n\nexport default handleMouseHover;\n"],"mappings":"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","names":[]}
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
 
20
30
  // src/visualBuilder/utils/getCsDataOfElement.ts
@@ -26,12 +36,20 @@ __export(getCsDataOfElement_exports, {
26
36
  module.exports = __toCommonJS(getCsDataOfElement_exports);
27
37
  var import_cslpdata = require("../../cslp/cslpdata.cjs");
28
38
  var import_constants = require("./constants.cjs");
39
+ var import_configManager = __toESM(require("../../configManager/configManager.cjs"), 1);
29
40
  function getCsDataOfElement(event) {
30
41
  const targetElement = event.target;
31
42
  if (!targetElement) {
32
43
  return;
33
44
  }
34
- const editableElement = targetElement.closest("[data-cslp]");
45
+ let editableElement = targetElement.closest("[data-cslp]");
46
+ if (!editableElement && import_configManager.default.get().overlayPropagation.enable) {
47
+ const stack = document.elementsFromPoint(
48
+ event.clientX,
49
+ event.clientY
50
+ );
51
+ editableElement = stack.find((el) => el.hasAttribute("data-cslp")) ?? null;
52
+ }
35
53
  if (!editableElement) {
36
54
  return;
37
55
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/visualBuilder/utils/getCsDataOfElement.ts"],"sourcesContent":["import { CslpData } from \"../../cslp/types/cslp.types\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport { extractDetailsFromCslp, isValidCslp } from \"../../cslp/cslpdata\";\nimport { DATA_CSLP_ATTR_SELECTOR } from \"./constants\";\n\n/**\n * Returns the CSLP data of the closest ancestor element with a `data-cslp` attribute\n * to the target element of a mouse event.\n * @param event - The mouse event.\n * @returns The CSLP data of the closest ancestor element with a `data-cslp` attribute,\n * along with metadata and schema information for the corresponding field.\n */\nexport function getCsDataOfElement(\n event: MouseEvent\n): VisualBuilderCslpEventDetails | undefined {\n const targetElement = event.target as HTMLElement;\n if (!targetElement) {\n return;\n }\n const editableElement = targetElement.closest(\"[data-cslp]\");\n\n if (!editableElement) {\n return;\n }\n const cslpData = editableElement.getAttribute(\"data-cslp\");\n if (!isValidCslp(cslpData)) {\n return;\n }\n const fieldMetadata = extractDetailsFromCslp(cslpData);\n\n return {\n editableElement: editableElement,\n cslpData,\n fieldMetadata,\n };\n}\n\nfunction getPrefix(cslp: string): string {\n let prefix;\n if (cslp.startsWith(\"v2:\")) {\n // v2: prefix is added to cslp in variant cases\n const variantPrefix = cslp.split(\":\")[1];\n const content_type_uid = variantPrefix.split(\".\")[0];\n const euid = variantPrefix.split(\".\")[1].split(\"_\")[0]; //page.blt7a1e5b297a97bd12_cs8171e34d92207334.en-us\n const locale = variantPrefix.split(\".\")[2];\n prefix = `${content_type_uid}.${euid}.${locale}`;\n } else {\n prefix = cslp;\n }\n return prefix.split(\".\").slice(0, 3).join(\".\");\n}\n\nexport function getDOMEditStack(ele: Element): CslpData[] {\n const cslpSet: string[] = [];\n let curr: any = ele.closest(`[${DATA_CSLP_ATTR_SELECTOR}]`);\n while (curr) {\n const cslp = curr.getAttribute(DATA_CSLP_ATTR_SELECTOR);\n if (!isValidCslp(cslp)) {\n curr = curr.parentElement?.closest(`[${DATA_CSLP_ATTR_SELECTOR}]`);\n continue;\n }\n const entryPrefix = getPrefix(cslp);\n const hasSamePrevPrefix = getPrefix(cslpSet.at(0) || \"\").startsWith(\n entryPrefix\n );\n if (!hasSamePrevPrefix) {\n cslpSet.unshift(cslp);\n }\n curr = curr.parentElement?.closest(`[${DATA_CSLP_ATTR_SELECTOR}]`);\n }\n return cslpSet.filter(isValidCslp).map((cslp) => extractDetailsFromCslp(cslp));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,sBAAoD;AACpD,uBAAwC;AASjC,SAAS,mBACZ,OACyC;AACzC,QAAM,gBAAgB,MAAM;AAC5B,MAAI,CAAC,eAAe;AAChB;AAAA,EACJ;AACA,QAAM,kBAAkB,cAAc,QAAQ,aAAa;AAE3D,MAAI,CAAC,iBAAiB;AAClB;AAAA,EACJ;AACA,QAAM,WAAW,gBAAgB,aAAa,WAAW;AACzD,MAAI,KAAC,6BAAY,QAAQ,GAAG;AACxB;AAAA,EACJ;AACA,QAAM,oBAAgB,wCAAuB,QAAQ;AAErD,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AAEA,SAAS,UAAU,MAAsB;AACrC,MAAI;AACJ,MAAI,KAAK,WAAW,KAAK,GAAG;AAExB,UAAM,gBAAgB,KAAK,MAAM,GAAG,EAAE,CAAC;AACvC,UAAM,mBAAmB,cAAc,MAAM,GAAG,EAAE,CAAC;AACnD,UAAM,OAAO,cAAc,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AACrD,UAAM,SAAS,cAAc,MAAM,GAAG,EAAE,CAAC;AACzC,aAAS,GAAG,gBAAgB,IAAI,IAAI,IAAI,MAAM;AAAA,EAClD,OAAO;AACH,aAAS;AAAA,EACb;AACA,SAAO,OAAO,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AACjD;AAEO,SAAS,gBAAgB,KAA0B;AApD1D;AAqDI,QAAM,UAAoB,CAAC;AAC3B,MAAI,OAAY,IAAI,QAAQ,IAAI,wCAAuB,GAAG;AAC1D,SAAO,MAAM;AACT,UAAM,OAAO,KAAK,aAAa,wCAAuB;AACtD,QAAI,KAAC,6BAAY,IAAI,GAAG;AACpB,cAAO,UAAK,kBAAL,mBAAoB,QAAQ,IAAI,wCAAuB;AAC9D;AAAA,IACJ;AACA,UAAM,cAAc,UAAU,IAAI;AAClC,UAAM,oBAAoB,UAAU,QAAQ,GAAG,CAAC,KAAK,EAAE,EAAE;AAAA,MACrD;AAAA,IACJ;AACA,QAAI,CAAC,mBAAmB;AACpB,cAAQ,QAAQ,IAAI;AAAA,IACxB;AACA,YAAO,UAAK,kBAAL,mBAAoB,QAAQ,IAAI,wCAAuB;AAAA,EAClE;AACA,SAAO,QAAQ,OAAO,2BAAW,EAAE,IAAI,CAAC,aAAS,wCAAuB,IAAI,CAAC;AACjF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/visualBuilder/utils/getCsDataOfElement.ts"],"sourcesContent":["import { CslpData } from \"../../cslp/types/cslp.types\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport { extractDetailsFromCslp, isValidCslp } from \"../../cslp/cslpdata\";\nimport { DATA_CSLP_ATTR_SELECTOR } from \"./constants\";\nimport Config from \"../../configManager/configManager\";\n\n/**\n * Returns the CSLP data of the closest ancestor element with a `data-cslp` attribute\n * to the target element of a mouse event.\n *\n * When `overlayPropagation.enable` is `true` and the target element has no\n * `data-cslp` ancestor, falls back to `document.elementsFromPoint()` so the\n * lookup can pierce sibling elements (e.g. empty CSS-grid spacer cells) that\n * visually overlap a `data-cslp` field but would otherwise intercept the\n * mouse event.\n *\n * @param event - The mouse event.\n * @returns The CSLP data of the resolved element with a `data-cslp` attribute,\n * along with metadata and schema information for the corresponding field.\n */\nexport function getCsDataOfElement(\n event: MouseEvent\n): VisualBuilderCslpEventDetails | undefined {\n const targetElement = event.target as HTMLElement;\n if (!targetElement) {\n return;\n }\n let editableElement: Element | null =\n targetElement.closest(\"[data-cslp]\");\n\n if (!editableElement && Config.get().overlayPropagation.enable) {\n const stack = document.elementsFromPoint(\n event.clientX,\n event.clientY\n );\n editableElement =\n stack.find((el) => el.hasAttribute(\"data-cslp\")) ?? null;\n }\n\n if (!editableElement) {\n return;\n }\n const cslpData = editableElement.getAttribute(\"data-cslp\");\n if (!isValidCslp(cslpData)) {\n return;\n }\n const fieldMetadata = extractDetailsFromCslp(cslpData);\n\n return {\n editableElement: editableElement,\n cslpData,\n fieldMetadata,\n };\n}\n\nfunction getPrefix(cslp: string): string {\n let prefix;\n if (cslp.startsWith(\"v2:\")) {\n // v2: prefix is added to cslp in variant cases\n const variantPrefix = cslp.split(\":\")[1];\n const content_type_uid = variantPrefix.split(\".\")[0];\n const euid = variantPrefix.split(\".\")[1].split(\"_\")[0]; //page.blt7a1e5b297a97bd12_cs8171e34d92207334.en-us\n const locale = variantPrefix.split(\".\")[2];\n prefix = `${content_type_uid}.${euid}.${locale}`;\n } else {\n prefix = cslp;\n }\n return prefix.split(\".\").slice(0, 3).join(\".\");\n}\n\nexport function getDOMEditStack(ele: Element): CslpData[] {\n const cslpSet: string[] = [];\n let curr: any = ele.closest(`[${DATA_CSLP_ATTR_SELECTOR}]`);\n while (curr) {\n const cslp = curr.getAttribute(DATA_CSLP_ATTR_SELECTOR);\n if (!isValidCslp(cslp)) {\n curr = curr.parentElement?.closest(`[${DATA_CSLP_ATTR_SELECTOR}]`);\n continue;\n }\n const entryPrefix = getPrefix(cslp);\n const hasSamePrevPrefix = getPrefix(cslpSet.at(0) || \"\").startsWith(\n entryPrefix\n );\n if (!hasSamePrevPrefix) {\n cslpSet.unshift(cslp);\n }\n curr = curr.parentElement?.closest(`[${DATA_CSLP_ATTR_SELECTOR}]`);\n }\n return cslpSet.filter(isValidCslp).map((cslp) => extractDetailsFromCslp(cslp));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,sBAAoD;AACpD,uBAAwC;AACxC,2BAAmB;AAgBZ,SAAS,mBACZ,OACyC;AACzC,QAAM,gBAAgB,MAAM;AAC5B,MAAI,CAAC,eAAe;AAChB;AAAA,EACJ;AACA,MAAI,kBACA,cAAc,QAAQ,aAAa;AAEvC,MAAI,CAAC,mBAAmB,qBAAAA,QAAO,IAAI,EAAE,mBAAmB,QAAQ;AAC5D,UAAM,QAAQ,SAAS;AAAA,MACnB,MAAM;AAAA,MACN,MAAM;AAAA,IACV;AACA,sBACI,MAAM,KAAK,CAAC,OAAO,GAAG,aAAa,WAAW,CAAC,KAAK;AAAA,EAC5D;AAEA,MAAI,CAAC,iBAAiB;AAClB;AAAA,EACJ;AACA,QAAM,WAAW,gBAAgB,aAAa,WAAW;AACzD,MAAI,KAAC,6BAAY,QAAQ,GAAG;AACxB;AAAA,EACJ;AACA,QAAM,oBAAgB,wCAAuB,QAAQ;AAErD,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AAEA,SAAS,UAAU,MAAsB;AACrC,MAAI;AACJ,MAAI,KAAK,WAAW,KAAK,GAAG;AAExB,UAAM,gBAAgB,KAAK,MAAM,GAAG,EAAE,CAAC;AACvC,UAAM,mBAAmB,cAAc,MAAM,GAAG,EAAE,CAAC;AACnD,UAAM,OAAO,cAAc,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AACrD,UAAM,SAAS,cAAc,MAAM,GAAG,EAAE,CAAC;AACzC,aAAS,GAAG,gBAAgB,IAAI,IAAI,IAAI,MAAM;AAAA,EAClD,OAAO;AACH,aAAS;AAAA,EACb;AACA,SAAO,OAAO,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AACjD;AAEO,SAAS,gBAAgB,KAA0B;AAtE1D;AAuEI,QAAM,UAAoB,CAAC;AAC3B,MAAI,OAAY,IAAI,QAAQ,IAAI,wCAAuB,GAAG;AAC1D,SAAO,MAAM;AACT,UAAM,OAAO,KAAK,aAAa,wCAAuB;AACtD,QAAI,KAAC,6BAAY,IAAI,GAAG;AACpB,cAAO,UAAK,kBAAL,mBAAoB,QAAQ,IAAI,wCAAuB;AAC9D;AAAA,IACJ;AACA,UAAM,cAAc,UAAU,IAAI;AAClC,UAAM,oBAAoB,UAAU,QAAQ,GAAG,CAAC,KAAK,EAAE,EAAE;AAAA,MACrD;AAAA,IACJ;AACA,QAAI,CAAC,mBAAmB;AACpB,cAAQ,QAAQ,IAAI;AAAA,IACxB;AACA,YAAO,UAAK,kBAAL,mBAAoB,QAAQ,IAAI,wCAAuB;AAAA,EAClE;AACA,SAAO,QAAQ,OAAO,2BAAW,EAAE,IAAI,CAAC,aAAS,wCAAuB,IAAI,CAAC;AACjF;","names":["Config"]}
@@ -4,8 +4,15 @@ import { VisualBuilderCslpEventDetails } from '../types/visualBuilder.types.cjs'
4
4
  /**
5
5
  * Returns the CSLP data of the closest ancestor element with a `data-cslp` attribute
6
6
  * to the target element of a mouse event.
7
+ *
8
+ * When `overlayPropagation.enable` is `true` and the target element has no
9
+ * `data-cslp` ancestor, falls back to `document.elementsFromPoint()` so the
10
+ * lookup can pierce sibling elements (e.g. empty CSS-grid spacer cells) that
11
+ * visually overlap a `data-cslp` field but would otherwise intercept the
12
+ * mouse event.
13
+ *
7
14
  * @param event - The mouse event.
8
- * @returns The CSLP data of the closest ancestor element with a `data-cslp` attribute,
15
+ * @returns The CSLP data of the resolved element with a `data-cslp` attribute,
9
16
  * along with metadata and schema information for the corresponding field.
10
17
  */
11
18
  declare function getCsDataOfElement(event: MouseEvent): VisualBuilderCslpEventDetails | undefined;
@@ -4,8 +4,15 @@ import { VisualBuilderCslpEventDetails } from '../types/visualBuilder.types.js';
4
4
  /**
5
5
  * Returns the CSLP data of the closest ancestor element with a `data-cslp` attribute
6
6
  * to the target element of a mouse event.
7
+ *
8
+ * When `overlayPropagation.enable` is `true` and the target element has no
9
+ * `data-cslp` ancestor, falls back to `document.elementsFromPoint()` so the
10
+ * lookup can pierce sibling elements (e.g. empty CSS-grid spacer cells) that
11
+ * visually overlap a `data-cslp` field but would otherwise intercept the
12
+ * mouse event.
13
+ *
7
14
  * @param event - The mouse event.
8
- * @returns The CSLP data of the closest ancestor element with a `data-cslp` attribute,
15
+ * @returns The CSLP data of the resolved element with a `data-cslp` attribute,
9
16
  * along with metadata and schema information for the corresponding field.
10
17
  */
11
18
  declare function getCsDataOfElement(event: MouseEvent): VisualBuilderCslpEventDetails | undefined;
@@ -3,12 +3,20 @@ import "../../chunk-5WRI5ZAA.js";
3
3
  // src/visualBuilder/utils/getCsDataOfElement.ts
4
4
  import { extractDetailsFromCslp, isValidCslp } from "../../cslp/cslpdata.js";
5
5
  import { DATA_CSLP_ATTR_SELECTOR } from "./constants.js";
6
+ import Config from "../../configManager/configManager.js";
6
7
  function getCsDataOfElement(event) {
7
8
  const targetElement = event.target;
8
9
  if (!targetElement) {
9
10
  return;
10
11
  }
11
- const editableElement = targetElement.closest("[data-cslp]");
12
+ let editableElement = targetElement.closest("[data-cslp]");
13
+ if (!editableElement && Config.get().overlayPropagation.enable) {
14
+ const stack = document.elementsFromPoint(
15
+ event.clientX,
16
+ event.clientY
17
+ );
18
+ editableElement = stack.find((el) => el.hasAttribute("data-cslp")) ?? null;
19
+ }
12
20
  if (!editableElement) {
13
21
  return;
14
22
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/visualBuilder/utils/getCsDataOfElement.ts"],"sourcesContent":["import { CslpData } from \"../../cslp/types/cslp.types\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport { extractDetailsFromCslp, isValidCslp } from \"../../cslp/cslpdata\";\nimport { DATA_CSLP_ATTR_SELECTOR } from \"./constants\";\n\n/**\n * Returns the CSLP data of the closest ancestor element with a `data-cslp` attribute\n * to the target element of a mouse event.\n * @param event - The mouse event.\n * @returns The CSLP data of the closest ancestor element with a `data-cslp` attribute,\n * along with metadata and schema information for the corresponding field.\n */\nexport function getCsDataOfElement(\n event: MouseEvent\n): VisualBuilderCslpEventDetails | undefined {\n const targetElement = event.target as HTMLElement;\n if (!targetElement) {\n return;\n }\n const editableElement = targetElement.closest(\"[data-cslp]\");\n\n if (!editableElement) {\n return;\n }\n const cslpData = editableElement.getAttribute(\"data-cslp\");\n if (!isValidCslp(cslpData)) {\n return;\n }\n const fieldMetadata = extractDetailsFromCslp(cslpData);\n\n return {\n editableElement: editableElement,\n cslpData,\n fieldMetadata,\n };\n}\n\nfunction getPrefix(cslp: string): string {\n let prefix;\n if (cslp.startsWith(\"v2:\")) {\n // v2: prefix is added to cslp in variant cases\n const variantPrefix = cslp.split(\":\")[1];\n const content_type_uid = variantPrefix.split(\".\")[0];\n const euid = variantPrefix.split(\".\")[1].split(\"_\")[0]; //page.blt7a1e5b297a97bd12_cs8171e34d92207334.en-us\n const locale = variantPrefix.split(\".\")[2];\n prefix = `${content_type_uid}.${euid}.${locale}`;\n } else {\n prefix = cslp;\n }\n return prefix.split(\".\").slice(0, 3).join(\".\");\n}\n\nexport function getDOMEditStack(ele: Element): CslpData[] {\n const cslpSet: string[] = [];\n let curr: any = ele.closest(`[${DATA_CSLP_ATTR_SELECTOR}]`);\n while (curr) {\n const cslp = curr.getAttribute(DATA_CSLP_ATTR_SELECTOR);\n if (!isValidCslp(cslp)) {\n curr = curr.parentElement?.closest(`[${DATA_CSLP_ATTR_SELECTOR}]`);\n continue;\n }\n const entryPrefix = getPrefix(cslp);\n const hasSamePrevPrefix = getPrefix(cslpSet.at(0) || \"\").startsWith(\n entryPrefix\n );\n if (!hasSamePrevPrefix) {\n cslpSet.unshift(cslp);\n }\n curr = curr.parentElement?.closest(`[${DATA_CSLP_ATTR_SELECTOR}]`);\n }\n return cslpSet.filter(isValidCslp).map((cslp) => extractDetailsFromCslp(cslp));\n}\n"],"mappings":";;;AAEA,SAAS,wBAAwB,mBAAmB;AACpD,SAAS,+BAA+B;AASjC,SAAS,mBACZ,OACyC;AACzC,QAAM,gBAAgB,MAAM;AAC5B,MAAI,CAAC,eAAe;AAChB;AAAA,EACJ;AACA,QAAM,kBAAkB,cAAc,QAAQ,aAAa;AAE3D,MAAI,CAAC,iBAAiB;AAClB;AAAA,EACJ;AACA,QAAM,WAAW,gBAAgB,aAAa,WAAW;AACzD,MAAI,CAAC,YAAY,QAAQ,GAAG;AACxB;AAAA,EACJ;AACA,QAAM,gBAAgB,uBAAuB,QAAQ;AAErD,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AAEA,SAAS,UAAU,MAAsB;AACrC,MAAI;AACJ,MAAI,KAAK,WAAW,KAAK,GAAG;AAExB,UAAM,gBAAgB,KAAK,MAAM,GAAG,EAAE,CAAC;AACvC,UAAM,mBAAmB,cAAc,MAAM,GAAG,EAAE,CAAC;AACnD,UAAM,OAAO,cAAc,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AACrD,UAAM,SAAS,cAAc,MAAM,GAAG,EAAE,CAAC;AACzC,aAAS,GAAG,gBAAgB,IAAI,IAAI,IAAI,MAAM;AAAA,EAClD,OAAO;AACH,aAAS;AAAA,EACb;AACA,SAAO,OAAO,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AACjD;AAEO,SAAS,gBAAgB,KAA0B;AApD1D;AAqDI,QAAM,UAAoB,CAAC;AAC3B,MAAI,OAAY,IAAI,QAAQ,IAAI,uBAAuB,GAAG;AAC1D,SAAO,MAAM;AACT,UAAM,OAAO,KAAK,aAAa,uBAAuB;AACtD,QAAI,CAAC,YAAY,IAAI,GAAG;AACpB,cAAO,UAAK,kBAAL,mBAAoB,QAAQ,IAAI,uBAAuB;AAC9D;AAAA,IACJ;AACA,UAAM,cAAc,UAAU,IAAI;AAClC,UAAM,oBAAoB,UAAU,QAAQ,GAAG,CAAC,KAAK,EAAE,EAAE;AAAA,MACrD;AAAA,IACJ;AACA,QAAI,CAAC,mBAAmB;AACpB,cAAQ,QAAQ,IAAI;AAAA,IACxB;AACA,YAAO,UAAK,kBAAL,mBAAoB,QAAQ,IAAI,uBAAuB;AAAA,EAClE;AACA,SAAO,QAAQ,OAAO,WAAW,EAAE,IAAI,CAAC,SAAS,uBAAuB,IAAI,CAAC;AACjF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/visualBuilder/utils/getCsDataOfElement.ts"],"sourcesContent":["import { CslpData } from \"../../cslp/types/cslp.types\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport { extractDetailsFromCslp, isValidCslp } from \"../../cslp/cslpdata\";\nimport { DATA_CSLP_ATTR_SELECTOR } from \"./constants\";\nimport Config from \"../../configManager/configManager\";\n\n/**\n * Returns the CSLP data of the closest ancestor element with a `data-cslp` attribute\n * to the target element of a mouse event.\n *\n * When `overlayPropagation.enable` is `true` and the target element has no\n * `data-cslp` ancestor, falls back to `document.elementsFromPoint()` so the\n * lookup can pierce sibling elements (e.g. empty CSS-grid spacer cells) that\n * visually overlap a `data-cslp` field but would otherwise intercept the\n * mouse event.\n *\n * @param event - The mouse event.\n * @returns The CSLP data of the resolved element with a `data-cslp` attribute,\n * along with metadata and schema information for the corresponding field.\n */\nexport function getCsDataOfElement(\n event: MouseEvent\n): VisualBuilderCslpEventDetails | undefined {\n const targetElement = event.target as HTMLElement;\n if (!targetElement) {\n return;\n }\n let editableElement: Element | null =\n targetElement.closest(\"[data-cslp]\");\n\n if (!editableElement && Config.get().overlayPropagation.enable) {\n const stack = document.elementsFromPoint(\n event.clientX,\n event.clientY\n );\n editableElement =\n stack.find((el) => el.hasAttribute(\"data-cslp\")) ?? null;\n }\n\n if (!editableElement) {\n return;\n }\n const cslpData = editableElement.getAttribute(\"data-cslp\");\n if (!isValidCslp(cslpData)) {\n return;\n }\n const fieldMetadata = extractDetailsFromCslp(cslpData);\n\n return {\n editableElement: editableElement,\n cslpData,\n fieldMetadata,\n };\n}\n\nfunction getPrefix(cslp: string): string {\n let prefix;\n if (cslp.startsWith(\"v2:\")) {\n // v2: prefix is added to cslp in variant cases\n const variantPrefix = cslp.split(\":\")[1];\n const content_type_uid = variantPrefix.split(\".\")[0];\n const euid = variantPrefix.split(\".\")[1].split(\"_\")[0]; //page.blt7a1e5b297a97bd12_cs8171e34d92207334.en-us\n const locale = variantPrefix.split(\".\")[2];\n prefix = `${content_type_uid}.${euid}.${locale}`;\n } else {\n prefix = cslp;\n }\n return prefix.split(\".\").slice(0, 3).join(\".\");\n}\n\nexport function getDOMEditStack(ele: Element): CslpData[] {\n const cslpSet: string[] = [];\n let curr: any = ele.closest(`[${DATA_CSLP_ATTR_SELECTOR}]`);\n while (curr) {\n const cslp = curr.getAttribute(DATA_CSLP_ATTR_SELECTOR);\n if (!isValidCslp(cslp)) {\n curr = curr.parentElement?.closest(`[${DATA_CSLP_ATTR_SELECTOR}]`);\n continue;\n }\n const entryPrefix = getPrefix(cslp);\n const hasSamePrevPrefix = getPrefix(cslpSet.at(0) || \"\").startsWith(\n entryPrefix\n );\n if (!hasSamePrevPrefix) {\n cslpSet.unshift(cslp);\n }\n curr = curr.parentElement?.closest(`[${DATA_CSLP_ATTR_SELECTOR}]`);\n }\n return cslpSet.filter(isValidCslp).map((cslp) => extractDetailsFromCslp(cslp));\n}\n"],"mappings":";;;AAEA,SAAS,wBAAwB,mBAAmB;AACpD,SAAS,+BAA+B;AACxC,OAAO,YAAY;AAgBZ,SAAS,mBACZ,OACyC;AACzC,QAAM,gBAAgB,MAAM;AAC5B,MAAI,CAAC,eAAe;AAChB;AAAA,EACJ;AACA,MAAI,kBACA,cAAc,QAAQ,aAAa;AAEvC,MAAI,CAAC,mBAAmB,OAAO,IAAI,EAAE,mBAAmB,QAAQ;AAC5D,UAAM,QAAQ,SAAS;AAAA,MACnB,MAAM;AAAA,MACN,MAAM;AAAA,IACV;AACA,sBACI,MAAM,KAAK,CAAC,OAAO,GAAG,aAAa,WAAW,CAAC,KAAK;AAAA,EAC5D;AAEA,MAAI,CAAC,iBAAiB;AAClB;AAAA,EACJ;AACA,QAAM,WAAW,gBAAgB,aAAa,WAAW;AACzD,MAAI,CAAC,YAAY,QAAQ,GAAG;AACxB;AAAA,EACJ;AACA,QAAM,gBAAgB,uBAAuB,QAAQ;AAErD,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AAEA,SAAS,UAAU,MAAsB;AACrC,MAAI;AACJ,MAAI,KAAK,WAAW,KAAK,GAAG;AAExB,UAAM,gBAAgB,KAAK,MAAM,GAAG,EAAE,CAAC;AACvC,UAAM,mBAAmB,cAAc,MAAM,GAAG,EAAE,CAAC;AACnD,UAAM,OAAO,cAAc,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AACrD,UAAM,SAAS,cAAc,MAAM,GAAG,EAAE,CAAC;AACzC,aAAS,GAAG,gBAAgB,IAAI,IAAI,IAAI,MAAM;AAAA,EAClD,OAAO;AACH,aAAS;AAAA,EACb;AACA,SAAO,OAAO,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AACjD;AAEO,SAAS,gBAAgB,KAA0B;AAtE1D;AAuEI,QAAM,UAAoB,CAAC;AAC3B,MAAI,OAAY,IAAI,QAAQ,IAAI,uBAAuB,GAAG;AAC1D,SAAO,MAAM;AACT,UAAM,OAAO,KAAK,aAAa,uBAAuB;AACtD,QAAI,CAAC,YAAY,IAAI,GAAG;AACpB,cAAO,UAAK,kBAAL,mBAAoB,QAAQ,IAAI,uBAAuB;AAC9D;AAAA,IACJ;AACA,UAAM,cAAc,UAAU,IAAI;AAClC,UAAM,oBAAoB,UAAU,QAAQ,GAAG,CAAC,KAAK,EAAE,EAAE;AAAA,MACrD;AAAA,IACJ;AACA,QAAI,CAAC,mBAAmB;AACpB,cAAQ,QAAQ,IAAI;AAAA,IACxB;AACA,YAAO,UAAK,kBAAL,mBAAoB,QAAQ,IAAI,uBAAuB;AAAA,EAClE;AACA,SAAO,QAAQ,OAAO,WAAW,EAAE,IAAI,CAAC,SAAS,uBAAuB,IAAI,CAAC;AACjF;","names":[]}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/visualBuilder/utils/getWholeFieldElement.ts
21
+ var getWholeFieldElement_exports = {};
22
+ __export(getWholeFieldElement_exports, {
23
+ getParentCslp: () => getParentCslp,
24
+ getWholeFieldElement: () => getWholeFieldElement
25
+ });
26
+ module.exports = __toCommonJS(getWholeFieldElement_exports);
27
+ function getParentCslp(cslpValue) {
28
+ return cslpValue.split(".").slice(0, -1).join(".");
29
+ }
30
+ function getWholeFieldElement(instanceElement, parentCslp) {
31
+ return instanceElement.closest(`[data-cslp="${parentCslp}"]`);
32
+ }
33
+ // Annotate the CommonJS export names for ESM import in node:
34
+ 0 && (module.exports = {
35
+ getParentCslp,
36
+ getWholeFieldElement
37
+ });
38
+ //# sourceMappingURL=getWholeFieldElement.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/visualBuilder/utils/getWholeFieldElement.ts"],"sourcesContent":["// Strips the trailing index segment to derive the whole-field CSLP.\n// Works for both V1 (ct.entry.locale.field.0) and V2 (v2:ct.entry.locale.field.0) formats.\nexport function getParentCslp(cslpValue: string): string {\n return cslpValue.split(\".\").slice(0, -1).join(\".\");\n}\n\n// Finds the nearest ancestor whose data-cslp matches parentCslp via DOM traversal.\nexport function getWholeFieldElement(\n instanceElement: Element,\n parentCslp: string\n): Element | null {\n return instanceElement.closest(`[data-cslp=\"${parentCslp}\"]`);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,SAAS,cAAc,WAA2B;AACrD,SAAO,UAAU,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AACrD;AAGO,SAAS,qBACZ,iBACA,YACc;AACd,SAAO,gBAAgB,QAAQ,eAAe,UAAU,IAAI;AAChE;","names":[]}
@@ -0,0 +1,4 @@
1
+ declare function getParentCslp(cslpValue: string): string;
2
+ declare function getWholeFieldElement(instanceElement: Element, parentCslp: string): Element | null;
3
+
4
+ export { getParentCslp, getWholeFieldElement };
@@ -0,0 +1,4 @@
1
+ declare function getParentCslp(cslpValue: string): string;
2
+ declare function getWholeFieldElement(instanceElement: Element, parentCslp: string): Element | null;
3
+
4
+ export { getParentCslp, getWholeFieldElement };