@contentstack/live-preview-utils 4.2.1 → 4.3.0
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.
- package/README.md +1 -1
- package/dist/legacy/configManager/config.default.cjs +4 -2
- package/dist/legacy/configManager/config.default.cjs.map +1 -1
- package/dist/legacy/configManager/config.default.d.cts +1 -1
- package/dist/legacy/configManager/config.default.d.ts +1 -1
- package/dist/legacy/configManager/config.default.js +4 -2
- package/dist/legacy/configManager/config.default.js.map +1 -1
- package/dist/legacy/configManager/handleUserConfig.cjs +4 -0
- package/dist/legacy/configManager/handleUserConfig.cjs.map +1 -1
- package/dist/legacy/configManager/handleUserConfig.js +4 -0
- package/dist/legacy/configManager/handleUserConfig.js.map +1 -1
- package/dist/legacy/cslp/cslpdata.cjs +28 -3
- package/dist/legacy/cslp/cslpdata.cjs.map +1 -1
- package/dist/legacy/cslp/cslpdata.d.cts +27 -1
- package/dist/legacy/cslp/cslpdata.d.ts +27 -1
- package/dist/legacy/cslp/cslpdata.js +26 -2
- package/dist/legacy/cslp/cslpdata.js.map +1 -1
- package/dist/legacy/cslp/index.d.cts +1 -1
- package/dist/legacy/cslp/index.d.ts +1 -1
- package/dist/legacy/light-sdk.cjs +1 -1
- package/dist/legacy/light-sdk.js +1 -1
- package/dist/legacy/livePreview/editButton/editButton.cjs +1 -1
- package/dist/legacy/livePreview/editButton/editButton.cjs.map +1 -1
- package/dist/legacy/livePreview/editButton/editButton.js +2 -2
- package/dist/legacy/livePreview/editButton/editButton.js.map +1 -1
- package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.cjs +11 -6
- package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.cjs.map +1 -1
- package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.js +11 -6
- package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.js.map +1 -1
- package/dist/legacy/preview/contentstack-live-preview-HOC.cjs +1 -1
- package/dist/legacy/preview/contentstack-live-preview-HOC.js +1 -1
- package/dist/legacy/timeline/compare/compare.cjs +3 -1
- package/dist/legacy/timeline/compare/compare.cjs.map +1 -1
- package/dist/legacy/timeline/compare/compare.js +3 -1
- package/dist/legacy/timeline/compare/compare.js.map +1 -1
- package/dist/legacy/types/types.cjs.map +1 -1
- package/dist/legacy/types/types.d.cts +2 -0
- package/dist/legacy/types/types.d.ts +2 -0
- package/dist/legacy/types/types.js.map +1 -1
- package/dist/legacy/visualBuilder/components/fieldLabelWrapper.cjs +1 -1
- package/dist/legacy/visualBuilder/components/fieldLabelWrapper.cjs.map +1 -1
- package/dist/legacy/visualBuilder/components/fieldLabelWrapper.js +2 -2
- package/dist/legacy/visualBuilder/components/fieldLabelWrapper.js.map +1 -1
- package/dist/legacy/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.cjs +3 -2
- package/dist/legacy/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.cjs.map +1 -1
- package/dist/legacy/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.js +3 -2
- package/dist/legacy/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.js.map +1 -1
- package/dist/legacy/visualBuilder/eventManager/useRevalidateFieldDataPostMessageEvent.cjs +2 -2
- package/dist/legacy/visualBuilder/eventManager/useRevalidateFieldDataPostMessageEvent.cjs.map +1 -1
- package/dist/legacy/visualBuilder/eventManager/useRevalidateFieldDataPostMessageEvent.js +3 -3
- package/dist/legacy/visualBuilder/eventManager/useRevalidateFieldDataPostMessageEvent.js.map +1 -1
- package/dist/legacy/visualBuilder/eventManager/useVariantsPostMessageEvent.cjs +1 -1
- package/dist/legacy/visualBuilder/eventManager/useVariantsPostMessageEvent.cjs.map +1 -1
- package/dist/legacy/visualBuilder/eventManager/useVariantsPostMessageEvent.js +2 -2
- package/dist/legacy/visualBuilder/eventManager/useVariantsPostMessageEvent.js.map +1 -1
- package/dist/legacy/visualBuilder/generators/generateEmptyBlock.cjs +1 -1
- package/dist/legacy/visualBuilder/generators/generateEmptyBlock.cjs.map +1 -1
- package/dist/legacy/visualBuilder/generators/generateEmptyBlock.js +2 -2
- package/dist/legacy/visualBuilder/generators/generateEmptyBlock.js.map +1 -1
- package/dist/legacy/visualBuilder/generators/generateHighlightedComment.cjs +2 -1
- package/dist/legacy/visualBuilder/generators/generateHighlightedComment.cjs.map +1 -1
- package/dist/legacy/visualBuilder/generators/generateHighlightedComment.js +2 -1
- package/dist/legacy/visualBuilder/generators/generateHighlightedComment.js.map +1 -1
- package/dist/legacy/visualBuilder/generators/generateOverlay.cjs +1 -1
- package/dist/legacy/visualBuilder/generators/generateOverlay.cjs.map +1 -1
- package/dist/legacy/visualBuilder/generators/generateOverlay.js +2 -2
- package/dist/legacy/visualBuilder/generators/generateOverlay.js.map +1 -1
- package/dist/legacy/visualBuilder/generators/generateThread.d.cts +1 -1
- package/dist/legacy/visualBuilder/generators/generateThread.d.ts +1 -1
- package/dist/legacy/visualBuilder/index.cjs +1 -1
- package/dist/legacy/visualBuilder/index.cjs.map +1 -1
- package/dist/legacy/visualBuilder/index.js +2 -2
- package/dist/legacy/visualBuilder/index.js.map +1 -1
- package/dist/legacy/visualBuilder/listeners/mouseClick.cjs +14 -10
- package/dist/legacy/visualBuilder/listeners/mouseClick.cjs.map +1 -1
- package/dist/legacy/visualBuilder/listeners/mouseClick.js +14 -10
- package/dist/legacy/visualBuilder/listeners/mouseClick.js.map +1 -1
- package/dist/legacy/visualBuilder/utils/collabUtils.d.cts +1 -1
- package/dist/legacy/visualBuilder/utils/collabUtils.d.ts +1 -1
- package/dist/legacy/visualBuilder/utils/getCsDataOfElement.cjs +3 -3
- package/dist/legacy/visualBuilder/utils/getCsDataOfElement.cjs.map +1 -1
- package/dist/legacy/visualBuilder/utils/getCsDataOfElement.js +4 -4
- package/dist/legacy/visualBuilder/utils/getCsDataOfElement.js.map +1 -1
- package/dist/legacy/visualBuilder/utils/getEntryIdentifiersInCurrentPage.cjs +1 -1
- package/dist/legacy/visualBuilder/utils/getEntryIdentifiersInCurrentPage.cjs.map +1 -1
- package/dist/legacy/visualBuilder/utils/getEntryIdentifiersInCurrentPage.js +2 -2
- package/dist/legacy/visualBuilder/utils/getEntryIdentifiersInCurrentPage.js.map +1 -1
- package/dist/legacy/visualBuilder/utils/getVisualBuilderRedirectionUrl.cjs +2 -2
- package/dist/legacy/visualBuilder/utils/getVisualBuilderRedirectionUrl.cjs.map +1 -1
- package/dist/legacy/visualBuilder/utils/getVisualBuilderRedirectionUrl.js +3 -3
- package/dist/legacy/visualBuilder/utils/getVisualBuilderRedirectionUrl.js.map +1 -1
- package/dist/legacy/visualBuilder/utils/updateFocussedState.cjs +1 -1
- package/dist/legacy/visualBuilder/utils/updateFocussedState.cjs.map +1 -1
- package/dist/legacy/visualBuilder/utils/updateFocussedState.js +2 -2
- package/dist/legacy/visualBuilder/utils/updateFocussedState.js.map +1 -1
- package/dist/modern/configManager/config.default.cjs +4 -2
- package/dist/modern/configManager/config.default.cjs.map +1 -1
- package/dist/modern/configManager/config.default.d.cts +1 -1
- package/dist/modern/configManager/config.default.d.ts +1 -1
- package/dist/modern/configManager/config.default.js +4 -2
- package/dist/modern/configManager/config.default.js.map +1 -1
- package/dist/modern/configManager/handleUserConfig.cjs +4 -0
- package/dist/modern/configManager/handleUserConfig.cjs.map +1 -1
- package/dist/modern/configManager/handleUserConfig.js +4 -0
- package/dist/modern/configManager/handleUserConfig.js.map +1 -1
- package/dist/modern/cslp/cslpdata.cjs +28 -3
- package/dist/modern/cslp/cslpdata.cjs.map +1 -1
- package/dist/modern/cslp/cslpdata.d.cts +27 -1
- package/dist/modern/cslp/cslpdata.d.ts +27 -1
- package/dist/modern/cslp/cslpdata.js +26 -2
- package/dist/modern/cslp/cslpdata.js.map +1 -1
- package/dist/modern/cslp/index.d.cts +1 -1
- package/dist/modern/cslp/index.d.ts +1 -1
- package/dist/modern/light-sdk.cjs +1 -1
- package/dist/modern/light-sdk.js +1 -1
- package/dist/modern/livePreview/editButton/editButton.cjs +1 -1
- package/dist/modern/livePreview/editButton/editButton.cjs.map +1 -1
- package/dist/modern/livePreview/editButton/editButton.js +2 -2
- package/dist/modern/livePreview/editButton/editButton.js.map +1 -1
- package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.cjs +11 -6
- package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.cjs.map +1 -1
- package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.js +11 -6
- package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.js.map +1 -1
- package/dist/modern/preview/contentstack-live-preview-HOC.cjs +1 -1
- package/dist/modern/preview/contentstack-live-preview-HOC.js +1 -1
- package/dist/modern/timeline/compare/compare.cjs +3 -1
- package/dist/modern/timeline/compare/compare.cjs.map +1 -1
- package/dist/modern/timeline/compare/compare.js +3 -1
- package/dist/modern/timeline/compare/compare.js.map +1 -1
- package/dist/modern/types/types.cjs.map +1 -1
- package/dist/modern/types/types.d.cts +2 -0
- package/dist/modern/types/types.d.ts +2 -0
- package/dist/modern/types/types.js.map +1 -1
- package/dist/modern/visualBuilder/components/fieldLabelWrapper.cjs +1 -1
- package/dist/modern/visualBuilder/components/fieldLabelWrapper.cjs.map +1 -1
- package/dist/modern/visualBuilder/components/fieldLabelWrapper.js +2 -2
- package/dist/modern/visualBuilder/components/fieldLabelWrapper.js.map +1 -1
- package/dist/modern/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.cjs +3 -2
- package/dist/modern/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.cjs.map +1 -1
- package/dist/modern/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.js +3 -2
- package/dist/modern/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.js.map +1 -1
- package/dist/modern/visualBuilder/eventManager/useRevalidateFieldDataPostMessageEvent.cjs +2 -2
- package/dist/modern/visualBuilder/eventManager/useRevalidateFieldDataPostMessageEvent.cjs.map +1 -1
- package/dist/modern/visualBuilder/eventManager/useRevalidateFieldDataPostMessageEvent.js +3 -3
- package/dist/modern/visualBuilder/eventManager/useRevalidateFieldDataPostMessageEvent.js.map +1 -1
- package/dist/modern/visualBuilder/eventManager/useVariantsPostMessageEvent.cjs +1 -1
- package/dist/modern/visualBuilder/eventManager/useVariantsPostMessageEvent.cjs.map +1 -1
- package/dist/modern/visualBuilder/eventManager/useVariantsPostMessageEvent.js +2 -2
- package/dist/modern/visualBuilder/eventManager/useVariantsPostMessageEvent.js.map +1 -1
- package/dist/modern/visualBuilder/generators/generateEmptyBlock.cjs +1 -1
- package/dist/modern/visualBuilder/generators/generateEmptyBlock.cjs.map +1 -1
- package/dist/modern/visualBuilder/generators/generateEmptyBlock.js +2 -2
- package/dist/modern/visualBuilder/generators/generateEmptyBlock.js.map +1 -1
- package/dist/modern/visualBuilder/generators/generateHighlightedComment.cjs +2 -1
- package/dist/modern/visualBuilder/generators/generateHighlightedComment.cjs.map +1 -1
- package/dist/modern/visualBuilder/generators/generateHighlightedComment.js +2 -1
- package/dist/modern/visualBuilder/generators/generateHighlightedComment.js.map +1 -1
- package/dist/modern/visualBuilder/generators/generateOverlay.cjs +1 -1
- package/dist/modern/visualBuilder/generators/generateOverlay.cjs.map +1 -1
- package/dist/modern/visualBuilder/generators/generateOverlay.js +2 -2
- package/dist/modern/visualBuilder/generators/generateOverlay.js.map +1 -1
- package/dist/modern/visualBuilder/generators/generateThread.d.cts +1 -1
- package/dist/modern/visualBuilder/generators/generateThread.d.ts +1 -1
- package/dist/modern/visualBuilder/index.cjs +1 -1
- package/dist/modern/visualBuilder/index.cjs.map +1 -1
- package/dist/modern/visualBuilder/index.js +2 -2
- package/dist/modern/visualBuilder/index.js.map +1 -1
- package/dist/modern/visualBuilder/listeners/mouseClick.cjs +14 -10
- package/dist/modern/visualBuilder/listeners/mouseClick.cjs.map +1 -1
- package/dist/modern/visualBuilder/listeners/mouseClick.js +14 -10
- package/dist/modern/visualBuilder/listeners/mouseClick.js.map +1 -1
- package/dist/modern/visualBuilder/utils/collabUtils.d.cts +1 -1
- package/dist/modern/visualBuilder/utils/collabUtils.d.ts +1 -1
- package/dist/modern/visualBuilder/utils/getCsDataOfElement.cjs +3 -3
- package/dist/modern/visualBuilder/utils/getCsDataOfElement.cjs.map +1 -1
- package/dist/modern/visualBuilder/utils/getCsDataOfElement.js +4 -4
- package/dist/modern/visualBuilder/utils/getCsDataOfElement.js.map +1 -1
- package/dist/modern/visualBuilder/utils/getEntryIdentifiersInCurrentPage.cjs +1 -1
- package/dist/modern/visualBuilder/utils/getEntryIdentifiersInCurrentPage.cjs.map +1 -1
- package/dist/modern/visualBuilder/utils/getEntryIdentifiersInCurrentPage.js +2 -2
- package/dist/modern/visualBuilder/utils/getEntryIdentifiersInCurrentPage.js.map +1 -1
- package/dist/modern/visualBuilder/utils/getVisualBuilderRedirectionUrl.cjs +2 -2
- package/dist/modern/visualBuilder/utils/getVisualBuilderRedirectionUrl.cjs.map +1 -1
- package/dist/modern/visualBuilder/utils/getVisualBuilderRedirectionUrl.js +3 -3
- package/dist/modern/visualBuilder/utils/getVisualBuilderRedirectionUrl.js.map +1 -1
- package/dist/modern/visualBuilder/utils/updateFocussedState.cjs +1 -1
- package/dist/modern/visualBuilder/utils/updateFocussedState.cjs.map +1 -1
- package/dist/modern/visualBuilder/utils/updateFocussedState.js +2 -2
- package/dist/modern/visualBuilder/utils/updateFocussedState.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/visualBuilder/generators/generateOverlay.tsx"],"sourcesContent":["import { extractDetailsFromCslp } from \"../../cslp/cslpdata\";\nimport { cleanIndividualFieldResidual } from \"../utils/handleIndividualFields\";\nimport visualBuilderPostMessage from \"../utils/visualBuilderPostMessage\";\nimport { VisualBuilderPostMessageEvents } from \"../utils/types/postMessage.types\";\n\nimport { VisualBuilder } from \"..\";\nimport EventListenerHandlerParams from \"../listeners/types\";\nimport { FieldSchemaMap } from \"../utils/fieldSchemaMap\";\nimport { FieldDataType } from \"../utils/types/index.types\";\nimport { getFieldType } from \"../utils/getFieldType\";\nimport { getMultilinePlaintext } from \"../utils/getMultilinePlaintext\";\nimport { showAllHiddenHighlightedCommentIcons } from \"./generateHighlightedComment\";\n\n/**\n * Adds a focus overlay to the target element.\n * @param targetElement - The element to add the focus overlay to.\n * @param focusOverlayWrapper - The HTMLDivElement that contains the focus overlay.\n * @returns void\n */\nexport function addFocusOverlay(\n targetElement: Element,\n focusOverlayWrapper: HTMLDivElement,\n disabled?: boolean\n): void {\n const targetElementDimension = targetElement.getBoundingClientRect();\n if (\n targetElementDimension.width === 0 ||\n targetElementDimension.height === 0\n )\n return;\n focusOverlayWrapper.classList.add(\"visible\");\n\n const distanceFromTop = targetElementDimension.top + window.scrollY;\n const topOverlayDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--top\"\n );\n\n if (topOverlayDOM) {\n topOverlayDOM.style.top = \"0\";\n topOverlayDOM.style.left = \"0\";\n topOverlayDOM.style.width = \"100%\";\n topOverlayDOM.style.height = `calc(${distanceFromTop}px)`;\n }\n\n const bottomOverlayDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--bottom\"\n );\n if (bottomOverlayDOM) {\n bottomOverlayDOM.style.top = `${\n targetElementDimension.bottom + window.scrollY\n }px`;\n bottomOverlayDOM.style.height = `${\n window.document.body.scrollHeight -\n targetElementDimension.bottom -\n window.scrollY\n }px`;\n bottomOverlayDOM.style.left = \"0\";\n bottomOverlayDOM.style.width = \"100%\";\n }\n\n const leftOverlayDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--left\"\n );\n if (leftOverlayDOM) {\n leftOverlayDOM.style.left = \"0\";\n leftOverlayDOM.style.top = `${distanceFromTop}px`;\n leftOverlayDOM.style.height = `${targetElementDimension.height}px`;\n leftOverlayDOM.style.width = `${targetElementDimension.left}px`;\n }\n\n const rightOverlayDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--right\"\n );\n if (rightOverlayDOM) {\n rightOverlayDOM.style.left = `${targetElementDimension.right}px`;\n rightOverlayDOM.style.top = `${distanceFromTop}px`;\n rightOverlayDOM.style.height = `${targetElementDimension.height}px`;\n rightOverlayDOM.style.width = `${\n document.documentElement.clientWidth - targetElementDimension.right\n }px`;\n }\n\n const outlineDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--outline\"\n );\n if (outlineDOM) {\n outlineDOM.style.top = `${\n targetElementDimension.top + window.scrollY\n }px`;\n outlineDOM.style.height = `${targetElementDimension.height}px`;\n outlineDOM.style.width = `${targetElementDimension.width}px`;\n outlineDOM.style.left = `${targetElementDimension.left}px`;\n outlineDOM.style.outlineColor = disabled ? \"#909090\" : \"#715cdd\";\n }\n}\n\n/**\n * Hides the focus overlay and performs necessary cleanup actions when the user clicks outside of the focused element.\n * @param event - The mouse event that triggered the function.\n * @param elements - An object containing references to the focus overlay wrapper, the previously selected editable DOM element, and the visual builder wrapper.\n */\nexport function hideFocusOverlay(elements: HideOverlayParams): void {\n const {\n visualBuilderContainer,\n visualBuilderOverlayWrapper,\n focusedToolbar,\n resizeObserver,\n noTrigger,\n } = elements;\n\n if (visualBuilderOverlayWrapper) {\n visualBuilderOverlayWrapper.classList.remove(\"visible\");\n\n // Cleanup overlay styles: Top, Right, Bottom, Left & Outline\n visualBuilderOverlayWrapper.childNodes.forEach((childNode) => {\n if (childNode instanceof Element) {\n childNode.removeAttribute(\"style\");\n }\n });\n\n if (\n !noTrigger &&\n // send update when focussed field has received input\n VisualBuilder.VisualBuilderGlobalState.value.focusFieldReceivedInput\n ) {\n sendFieldEvent({\n visualBuilderContainer,\n eventType: VisualBuilderPostMessageEvents.UPDATE_FIELD,\n });\n } else if (noTrigger) {\n const { previousSelectedEditableDOM, focusFieldValue } =\n VisualBuilder.VisualBuilderGlobalState.value || {};\n if (\n previousSelectedEditableDOM &&\n \"innerText\" in previousSelectedEditableDOM &&\n focusFieldValue != null\n ) {\n previousSelectedEditableDOM.innerText = focusFieldValue;\n }\n }\n VisualBuilder.VisualBuilderGlobalState.value.focusFieldValue = null;\n VisualBuilder.VisualBuilderGlobalState.value.focusFieldReceivedInput =\n false;\n cleanIndividualFieldResidual({\n overlayWrapper: visualBuilderOverlayWrapper,\n visualBuilderContainer: visualBuilderContainer,\n focusedToolbar: focusedToolbar,\n resizeObserver: resizeObserver,\n });\n }\n}\ninterface ISendFieldEventParams {\n visualBuilderContainer: HTMLElement | null;\n eventType:\n | VisualBuilderPostMessageEvents.UPDATE_FIELD\n | VisualBuilderPostMessageEvents.SYNC_FIELD;\n}\nexport function sendFieldEvent(options: ISendFieldEventParams): void {\n const { visualBuilderContainer, eventType } = options;\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n const pseudoEditableElement = visualBuilderContainer?.querySelector(\n \"div.visual-builder__pseudo-editable-element\"\n );\n if (\n previousSelectedEditableDOM &&\n (previousSelectedEditableDOM.hasAttribute(\"contenteditable\") ||\n pseudoEditableElement)\n ) {\n const actualEditedElement =\n pseudoEditableElement ||\n (previousSelectedEditableDOM as HTMLElement);\n\n let data =\n \"innerText\" in actualEditedElement\n ? actualEditedElement.innerText\n : actualEditedElement.textContent;\n\n const cslpData = previousSelectedEditableDOM.getAttribute(\"data-cslp\");\n if (!cslpData) {\n return;\n }\n\n const fieldMetadata = extractDetailsFromCslp(cslpData);\n\n FieldSchemaMap.getFieldSchema(\n fieldMetadata.content_type_uid,\n fieldMetadata.fieldPath\n )\n .then((fieldSchema) => {\n if (\n fieldSchema &&\n eventType === VisualBuilderPostMessageEvents.UPDATE_FIELD\n ) {\n const fieldType = getFieldType(fieldSchema);\n if (fieldType && fieldType === FieldDataType.MULTILINE) {\n data = getMultilinePlaintext(actualEditedElement);\n (actualEditedElement as HTMLElement).innerText =\n data as string;\n }\n }\n })\n .finally(() => {\n visualBuilderPostMessage?.send(eventType, {\n data,\n fieldMetadata,\n });\n });\n }\n}\ninterface HideOverlayParams\n extends Pick<\n EventListenerHandlerParams,\n \"visualBuilderContainer\" | \"focusedToolbar\" | \"resizeObserver\"\n > {\n visualBuilderOverlayWrapper: HTMLDivElement | null;\n noTrigger?: boolean;\n}\n\nexport function hideOverlay(params: HideOverlayParams): void {\n VisualBuilder.VisualBuilderGlobalState.value.isFocussed = false;\n const focusElementObserver =\n VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver;\n if (focusElementObserver) {\n focusElementObserver.disconnect();\n VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver =\n null;\n }\n hideFocusOverlay({\n visualBuilderContainer: params.visualBuilderContainer,\n visualBuilderOverlayWrapper: params.visualBuilderOverlayWrapper,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n noTrigger: Boolean(params.noTrigger),\n });\n showAllHiddenHighlightedCommentIcons();\n if (\n !VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM\n )\n return;\n params.resizeObserver.unobserve(\n VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM\n );\n VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM =\n null;\n}\n"],"mappings":"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","names":["visualBuilderPostMessage"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/visualBuilder/generators/generateOverlay.tsx"],"sourcesContent":["import { extractDetailsFromCslp, isValidCslp } from \"../../cslp/cslpdata\";\nimport { cleanIndividualFieldResidual } from \"../utils/handleIndividualFields\";\nimport visualBuilderPostMessage from \"../utils/visualBuilderPostMessage\";\nimport { VisualBuilderPostMessageEvents } from \"../utils/types/postMessage.types\";\n\nimport { VisualBuilder } from \"..\";\nimport EventListenerHandlerParams from \"../listeners/types\";\nimport { FieldSchemaMap } from \"../utils/fieldSchemaMap\";\nimport { FieldDataType } from \"../utils/types/index.types\";\nimport { getFieldType } from \"../utils/getFieldType\";\nimport { getMultilinePlaintext } from \"../utils/getMultilinePlaintext\";\nimport { showAllHiddenHighlightedCommentIcons } from \"./generateHighlightedComment\";\n\n/**\n * Adds a focus overlay to the target element.\n * @param targetElement - The element to add the focus overlay to.\n * @param focusOverlayWrapper - The HTMLDivElement that contains the focus overlay.\n * @returns void\n */\nexport function addFocusOverlay(\n targetElement: Element,\n focusOverlayWrapper: HTMLDivElement,\n disabled?: boolean\n): void {\n const targetElementDimension = targetElement.getBoundingClientRect();\n if (\n targetElementDimension.width === 0 ||\n targetElementDimension.height === 0\n )\n return;\n focusOverlayWrapper.classList.add(\"visible\");\n\n const distanceFromTop = targetElementDimension.top + window.scrollY;\n const topOverlayDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--top\"\n );\n\n if (topOverlayDOM) {\n topOverlayDOM.style.top = \"0\";\n topOverlayDOM.style.left = \"0\";\n topOverlayDOM.style.width = \"100%\";\n topOverlayDOM.style.height = `calc(${distanceFromTop}px)`;\n }\n\n const bottomOverlayDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--bottom\"\n );\n if (bottomOverlayDOM) {\n bottomOverlayDOM.style.top = `${\n targetElementDimension.bottom + window.scrollY\n }px`;\n bottomOverlayDOM.style.height = `${\n window.document.body.scrollHeight -\n targetElementDimension.bottom -\n window.scrollY\n }px`;\n bottomOverlayDOM.style.left = \"0\";\n bottomOverlayDOM.style.width = \"100%\";\n }\n\n const leftOverlayDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--left\"\n );\n if (leftOverlayDOM) {\n leftOverlayDOM.style.left = \"0\";\n leftOverlayDOM.style.top = `${distanceFromTop}px`;\n leftOverlayDOM.style.height = `${targetElementDimension.height}px`;\n leftOverlayDOM.style.width = `${targetElementDimension.left}px`;\n }\n\n const rightOverlayDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--right\"\n );\n if (rightOverlayDOM) {\n rightOverlayDOM.style.left = `${targetElementDimension.right}px`;\n rightOverlayDOM.style.top = `${distanceFromTop}px`;\n rightOverlayDOM.style.height = `${targetElementDimension.height}px`;\n rightOverlayDOM.style.width = `${\n document.documentElement.clientWidth - targetElementDimension.right\n }px`;\n }\n\n const outlineDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--outline\"\n );\n if (outlineDOM) {\n outlineDOM.style.top = `${\n targetElementDimension.top + window.scrollY\n }px`;\n outlineDOM.style.height = `${targetElementDimension.height}px`;\n outlineDOM.style.width = `${targetElementDimension.width}px`;\n outlineDOM.style.left = `${targetElementDimension.left}px`;\n outlineDOM.style.outlineColor = disabled ? \"#909090\" : \"#715cdd\";\n }\n}\n\n/**\n * Hides the focus overlay and performs necessary cleanup actions when the user clicks outside of the focused element.\n * @param event - The mouse event that triggered the function.\n * @param elements - An object containing references to the focus overlay wrapper, the previously selected editable DOM element, and the visual builder wrapper.\n */\nexport function hideFocusOverlay(elements: HideOverlayParams): void {\n const {\n visualBuilderContainer,\n visualBuilderOverlayWrapper,\n focusedToolbar,\n resizeObserver,\n noTrigger,\n } = elements;\n\n if (visualBuilderOverlayWrapper) {\n visualBuilderOverlayWrapper.classList.remove(\"visible\");\n\n // Cleanup overlay styles: Top, Right, Bottom, Left & Outline\n visualBuilderOverlayWrapper.childNodes.forEach((childNode) => {\n if (childNode instanceof Element) {\n childNode.removeAttribute(\"style\");\n }\n });\n\n if (\n !noTrigger &&\n // send update when focussed field has received input\n VisualBuilder.VisualBuilderGlobalState.value.focusFieldReceivedInput\n ) {\n sendFieldEvent({\n visualBuilderContainer,\n eventType: VisualBuilderPostMessageEvents.UPDATE_FIELD,\n });\n } else if (noTrigger) {\n const { previousSelectedEditableDOM, focusFieldValue } =\n VisualBuilder.VisualBuilderGlobalState.value || {};\n if (\n previousSelectedEditableDOM &&\n \"innerText\" in previousSelectedEditableDOM &&\n focusFieldValue != null\n ) {\n previousSelectedEditableDOM.innerText = focusFieldValue;\n }\n }\n VisualBuilder.VisualBuilderGlobalState.value.focusFieldValue = null;\n VisualBuilder.VisualBuilderGlobalState.value.focusFieldReceivedInput =\n false;\n cleanIndividualFieldResidual({\n overlayWrapper: visualBuilderOverlayWrapper,\n visualBuilderContainer: visualBuilderContainer,\n focusedToolbar: focusedToolbar,\n resizeObserver: resizeObserver,\n });\n }\n}\ninterface ISendFieldEventParams {\n visualBuilderContainer: HTMLElement | null;\n eventType:\n | VisualBuilderPostMessageEvents.UPDATE_FIELD\n | VisualBuilderPostMessageEvents.SYNC_FIELD;\n}\nexport function sendFieldEvent(options: ISendFieldEventParams): void {\n const { visualBuilderContainer, eventType } = options;\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n const pseudoEditableElement = visualBuilderContainer?.querySelector(\n \"div.visual-builder__pseudo-editable-element\"\n );\n if (\n previousSelectedEditableDOM &&\n (previousSelectedEditableDOM.hasAttribute(\"contenteditable\") ||\n pseudoEditableElement)\n ) {\n const actualEditedElement =\n pseudoEditableElement ||\n (previousSelectedEditableDOM as HTMLElement);\n\n let data =\n \"innerText\" in actualEditedElement\n ? actualEditedElement.innerText\n : actualEditedElement.textContent;\n\n const cslpData = previousSelectedEditableDOM.getAttribute(\"data-cslp\");\n if (!isValidCslp(cslpData)) {\n return;\n }\n\n const fieldMetadata = extractDetailsFromCslp(cslpData);\n\n FieldSchemaMap.getFieldSchema(\n fieldMetadata.content_type_uid,\n fieldMetadata.fieldPath\n )\n .then((fieldSchema) => {\n if (\n fieldSchema &&\n eventType === VisualBuilderPostMessageEvents.UPDATE_FIELD\n ) {\n const fieldType = getFieldType(fieldSchema);\n if (fieldType && fieldType === FieldDataType.MULTILINE) {\n data = getMultilinePlaintext(actualEditedElement);\n (actualEditedElement as HTMLElement).innerText =\n data as string;\n }\n }\n })\n .finally(() => {\n visualBuilderPostMessage?.send(eventType, {\n data,\n fieldMetadata,\n });\n });\n }\n}\ninterface HideOverlayParams\n extends Pick<\n EventListenerHandlerParams,\n \"visualBuilderContainer\" | \"focusedToolbar\" | \"resizeObserver\"\n > {\n visualBuilderOverlayWrapper: HTMLDivElement | null;\n noTrigger?: boolean;\n}\n\nexport function hideOverlay(params: HideOverlayParams): void {\n VisualBuilder.VisualBuilderGlobalState.value.isFocussed = false;\n const focusElementObserver =\n VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver;\n if (focusElementObserver) {\n focusElementObserver.disconnect();\n VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver =\n null;\n }\n hideFocusOverlay({\n visualBuilderContainer: params.visualBuilderContainer,\n visualBuilderOverlayWrapper: params.visualBuilderOverlayWrapper,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n noTrigger: Boolean(params.noTrigger),\n });\n showAllHiddenHighlightedCommentIcons();\n if (\n !VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM\n )\n return;\n params.resizeObserver.unobserve(\n VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM\n );\n VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM =\n null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAoD;AACpD,oCAA6C;AAC7C,sCAAqC;AACrC,yBAA+C;AAE/C,eAA8B;AAE9B,4BAA+B;AAC/B,mBAA8B;AAC9B,0BAA6B;AAC7B,mCAAsC;AACtC,wCAAqD;AAQ9C,SAAS,gBACZ,eACA,qBACA,UACI;AACJ,QAAM,yBAAyB,cAAc,sBAAsB;AACnE,MACI,uBAAuB,UAAU,KACjC,uBAAuB,WAAW;AAElC;AACJ,sBAAoB,UAAU,IAAI,SAAS;AAE3C,QAAM,kBAAkB,uBAAuB,MAAM,OAAO;AAC5D,QAAM,gBAAgB,oBAAoB;AAAA,IACtC;AAAA,EACJ;AAEA,MAAI,eAAe;AACf,kBAAc,MAAM,MAAM;AAC1B,kBAAc,MAAM,OAAO;AAC3B,kBAAc,MAAM,QAAQ;AAC5B,kBAAc,MAAM,SAAS,QAAQ,eAAe;AAAA,EACxD;AAEA,QAAM,mBAAmB,oBAAoB;AAAA,IACzC;AAAA,EACJ;AACA,MAAI,kBAAkB;AAClB,qBAAiB,MAAM,MAAM,GACzB,uBAAuB,SAAS,OAAO,OAC3C;AACA,qBAAiB,MAAM,SAAS,GAC5B,OAAO,SAAS,KAAK,eACrB,uBAAuB,SACvB,OAAO,OACX;AACA,qBAAiB,MAAM,OAAO;AAC9B,qBAAiB,MAAM,QAAQ;AAAA,EACnC;AAEA,QAAM,iBAAiB,oBAAoB;AAAA,IACvC;AAAA,EACJ;AACA,MAAI,gBAAgB;AAChB,mBAAe,MAAM,OAAO;AAC5B,mBAAe,MAAM,MAAM,GAAG,eAAe;AAC7C,mBAAe,MAAM,SAAS,GAAG,uBAAuB,MAAM;AAC9D,mBAAe,MAAM,QAAQ,GAAG,uBAAuB,IAAI;AAAA,EAC/D;AAEA,QAAM,kBAAkB,oBAAoB;AAAA,IACxC;AAAA,EACJ;AACA,MAAI,iBAAiB;AACjB,oBAAgB,MAAM,OAAO,GAAG,uBAAuB,KAAK;AAC5D,oBAAgB,MAAM,MAAM,GAAG,eAAe;AAC9C,oBAAgB,MAAM,SAAS,GAAG,uBAAuB,MAAM;AAC/D,oBAAgB,MAAM,QAAQ,GAC1B,SAAS,gBAAgB,cAAc,uBAAuB,KAClE;AAAA,EACJ;AAEA,QAAM,aAAa,oBAAoB;AAAA,IACnC;AAAA,EACJ;AACA,MAAI,YAAY;AACZ,eAAW,MAAM,MAAM,GACnB,uBAAuB,MAAM,OAAO,OACxC;AACA,eAAW,MAAM,SAAS,GAAG,uBAAuB,MAAM;AAC1D,eAAW,MAAM,QAAQ,GAAG,uBAAuB,KAAK;AACxD,eAAW,MAAM,OAAO,GAAG,uBAAuB,IAAI;AACtD,eAAW,MAAM,eAAe,WAAW,YAAY;AAAA,EAC3D;AACJ;AAOO,SAAS,iBAAiB,UAAmC;AAChE,QAAM;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AAEJ,MAAI,6BAA6B;AAC7B,gCAA4B,UAAU,OAAO,SAAS;AAGtD,gCAA4B,WAAW,QAAQ,CAAC,cAAc;AAC1D,UAAI,qBAAqB,SAAS;AAC9B,kBAAU,gBAAgB,OAAO;AAAA,MACrC;AAAA,IACJ,CAAC;AAED,QACI,CAAC;AAAA,IAED,uBAAc,yBAAyB,MAAM,yBAC/C;AACE,qBAAe;AAAA,QACX;AAAA,QACA,WAAW,kDAA+B;AAAA,MAC9C,CAAC;AAAA,IACL,WAAW,WAAW;AAClB,YAAM,EAAE,6BAA6B,gBAAgB,IACjD,uBAAc,yBAAyB,SAAS,CAAC;AACrD,UACI,+BACA,eAAe,+BACf,mBAAmB,MACrB;AACE,oCAA4B,YAAY;AAAA,MAC5C;AAAA,IACJ;AACA,2BAAc,yBAAyB,MAAM,kBAAkB;AAC/D,2BAAc,yBAAyB,MAAM,0BACzC;AACJ,oEAA6B;AAAA,MACzB,gBAAgB;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;AAOO,SAAS,eAAe,SAAsC;AACjE,QAAM,EAAE,wBAAwB,UAAU,IAAI;AAC9C,QAAM,8BACF,uBAAc,yBAAyB,MAClC;AACT,QAAM,wBAAwB,iEAAwB;AAAA,IAClD;AAAA;AAEJ,MACI,gCACC,4BAA4B,aAAa,iBAAiB,KACvD,wBACN;AACE,UAAM,sBACF,yBACC;AAEL,QAAI,OACA,eAAe,sBACT,oBAAoB,YACpB,oBAAoB;AAE9B,UAAM,WAAW,4BAA4B,aAAa,WAAW;AACrE,QAAI,KAAC,6BAAY,QAAQ,GAAG;AACxB;AAAA,IACJ;AAEA,UAAM,oBAAgB,wCAAuB,QAAQ;AAErD,yCAAe;AAAA,MACX,cAAc;AAAA,MACd,cAAc;AAAA,IAClB,EACK,KAAK,CAAC,gBAAgB;AACnB,UACI,eACA,cAAc,kDAA+B,cAC/C;AACE,cAAM,gBAAY,kCAAa,WAAW;AAC1C,YAAI,aAAa,cAAc,2BAAc,WAAW;AACpD,qBAAO,oDAAsB,mBAAmB;AAChD,UAAC,oBAAoC,YACjC;AAAA,QACR;AAAA,MACJ;AAAA,IACJ,CAAC,EACA,QAAQ,MAAM;AA3M3B;AA4MgB,4CAAAA,YAAA,mBAA0B,KAAK,WAAW;AAAA,QACtC;AAAA,QACA;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACT;AACJ;AAUO,SAAS,YAAY,QAAiC;AACzD,yBAAc,yBAAyB,MAAM,aAAa;AAC1D,QAAM,uBACF,uBAAc,yBAAyB,MAAM;AACjD,MAAI,sBAAsB;AACtB,yBAAqB,WAAW;AAChC,2BAAc,yBAAyB,MAAM,uBACzC;AAAA,EACR;AACA,mBAAiB;AAAA,IACb,wBAAwB,OAAO;AAAA,IAC/B,6BAA6B,OAAO;AAAA,IACpC,gBAAgB,OAAO;AAAA,IACvB,gBAAgB,OAAO;AAAA,IACvB,WAAW,QAAQ,OAAO,SAAS;AAAA,EACvC,CAAC;AACD,8EAAqC;AACrC,MACI,CAAC,uBAAc,yBAAyB,MACnC;AAEL;AACJ,SAAO,eAAe;AAAA,IAClB,uBAAc,yBAAyB,MAAM;AAAA,EACjD;AACA,yBAAc,yBAAyB,MAAM,8BACzC;AACR;","names":["visualBuilderPostMessage"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "../../chunk-5WRI5ZAA.js";
|
|
2
2
|
|
|
3
3
|
// src/visualBuilder/generators/generateOverlay.tsx
|
|
4
|
-
import { extractDetailsFromCslp } from "../../cslp/cslpdata.js";
|
|
4
|
+
import { extractDetailsFromCslp, isValidCslp } from "../../cslp/cslpdata.js";
|
|
5
5
|
import { cleanIndividualFieldResidual } from "../utils/handleIndividualFields.js";
|
|
6
6
|
import visualBuilderPostMessage from "../utils/visualBuilderPostMessage.js";
|
|
7
7
|
import { VisualBuilderPostMessageEvents } from "../utils/types/postMessage.types.js";
|
|
@@ -111,7 +111,7 @@ function sendFieldEvent(options) {
|
|
|
111
111
|
const actualEditedElement = pseudoEditableElement || previousSelectedEditableDOM;
|
|
112
112
|
let data = "innerText" in actualEditedElement ? actualEditedElement.innerText : actualEditedElement.textContent;
|
|
113
113
|
const cslpData = previousSelectedEditableDOM.getAttribute("data-cslp");
|
|
114
|
-
if (!cslpData) {
|
|
114
|
+
if (!isValidCslp(cslpData)) {
|
|
115
115
|
return;
|
|
116
116
|
}
|
|
117
117
|
const fieldMetadata = extractDetailsFromCslp(cslpData);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/visualBuilder/generators/generateOverlay.tsx"],"sourcesContent":["import { extractDetailsFromCslp } from \"../../cslp/cslpdata\";\nimport { cleanIndividualFieldResidual } from \"../utils/handleIndividualFields\";\nimport visualBuilderPostMessage from \"../utils/visualBuilderPostMessage\";\nimport { VisualBuilderPostMessageEvents } from \"../utils/types/postMessage.types\";\n\nimport { VisualBuilder } from \"..\";\nimport EventListenerHandlerParams from \"../listeners/types\";\nimport { FieldSchemaMap } from \"../utils/fieldSchemaMap\";\nimport { FieldDataType } from \"../utils/types/index.types\";\nimport { getFieldType } from \"../utils/getFieldType\";\nimport { getMultilinePlaintext } from \"../utils/getMultilinePlaintext\";\nimport { showAllHiddenHighlightedCommentIcons } from \"./generateHighlightedComment\";\n\n/**\n * Adds a focus overlay to the target element.\n * @param targetElement - The element to add the focus overlay to.\n * @param focusOverlayWrapper - The HTMLDivElement that contains the focus overlay.\n * @returns void\n */\nexport function addFocusOverlay(\n targetElement: Element,\n focusOverlayWrapper: HTMLDivElement,\n disabled?: boolean\n): void {\n const targetElementDimension = targetElement.getBoundingClientRect();\n if (\n targetElementDimension.width === 0 ||\n targetElementDimension.height === 0\n )\n return;\n focusOverlayWrapper.classList.add(\"visible\");\n\n const distanceFromTop = targetElementDimension.top + window.scrollY;\n const topOverlayDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--top\"\n );\n\n if (topOverlayDOM) {\n topOverlayDOM.style.top = \"0\";\n topOverlayDOM.style.left = \"0\";\n topOverlayDOM.style.width = \"100%\";\n topOverlayDOM.style.height = `calc(${distanceFromTop}px)`;\n }\n\n const bottomOverlayDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--bottom\"\n );\n if (bottomOverlayDOM) {\n bottomOverlayDOM.style.top = `${\n targetElementDimension.bottom + window.scrollY\n }px`;\n bottomOverlayDOM.style.height = `${\n window.document.body.scrollHeight -\n targetElementDimension.bottom -\n window.scrollY\n }px`;\n bottomOverlayDOM.style.left = \"0\";\n bottomOverlayDOM.style.width = \"100%\";\n }\n\n const leftOverlayDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--left\"\n );\n if (leftOverlayDOM) {\n leftOverlayDOM.style.left = \"0\";\n leftOverlayDOM.style.top = `${distanceFromTop}px`;\n leftOverlayDOM.style.height = `${targetElementDimension.height}px`;\n leftOverlayDOM.style.width = `${targetElementDimension.left}px`;\n }\n\n const rightOverlayDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--right\"\n );\n if (rightOverlayDOM) {\n rightOverlayDOM.style.left = `${targetElementDimension.right}px`;\n rightOverlayDOM.style.top = `${distanceFromTop}px`;\n rightOverlayDOM.style.height = `${targetElementDimension.height}px`;\n rightOverlayDOM.style.width = `${\n document.documentElement.clientWidth - targetElementDimension.right\n }px`;\n }\n\n const outlineDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--outline\"\n );\n if (outlineDOM) {\n outlineDOM.style.top = `${\n targetElementDimension.top + window.scrollY\n }px`;\n outlineDOM.style.height = `${targetElementDimension.height}px`;\n outlineDOM.style.width = `${targetElementDimension.width}px`;\n outlineDOM.style.left = `${targetElementDimension.left}px`;\n outlineDOM.style.outlineColor = disabled ? \"#909090\" : \"#715cdd\";\n }\n}\n\n/**\n * Hides the focus overlay and performs necessary cleanup actions when the user clicks outside of the focused element.\n * @param event - The mouse event that triggered the function.\n * @param elements - An object containing references to the focus overlay wrapper, the previously selected editable DOM element, and the visual builder wrapper.\n */\nexport function hideFocusOverlay(elements: HideOverlayParams): void {\n const {\n visualBuilderContainer,\n visualBuilderOverlayWrapper,\n focusedToolbar,\n resizeObserver,\n noTrigger,\n } = elements;\n\n if (visualBuilderOverlayWrapper) {\n visualBuilderOverlayWrapper.classList.remove(\"visible\");\n\n // Cleanup overlay styles: Top, Right, Bottom, Left & Outline\n visualBuilderOverlayWrapper.childNodes.forEach((childNode) => {\n if (childNode instanceof Element) {\n childNode.removeAttribute(\"style\");\n }\n });\n\n if (\n !noTrigger &&\n // send update when focussed field has received input\n VisualBuilder.VisualBuilderGlobalState.value.focusFieldReceivedInput\n ) {\n sendFieldEvent({\n visualBuilderContainer,\n eventType: VisualBuilderPostMessageEvents.UPDATE_FIELD,\n });\n } else if (noTrigger) {\n const { previousSelectedEditableDOM, focusFieldValue } =\n VisualBuilder.VisualBuilderGlobalState.value || {};\n if (\n previousSelectedEditableDOM &&\n \"innerText\" in previousSelectedEditableDOM &&\n focusFieldValue != null\n ) {\n previousSelectedEditableDOM.innerText = focusFieldValue;\n }\n }\n VisualBuilder.VisualBuilderGlobalState.value.focusFieldValue = null;\n VisualBuilder.VisualBuilderGlobalState.value.focusFieldReceivedInput =\n false;\n cleanIndividualFieldResidual({\n overlayWrapper: visualBuilderOverlayWrapper,\n visualBuilderContainer: visualBuilderContainer,\n focusedToolbar: focusedToolbar,\n resizeObserver: resizeObserver,\n });\n }\n}\ninterface ISendFieldEventParams {\n visualBuilderContainer: HTMLElement | null;\n eventType:\n | VisualBuilderPostMessageEvents.UPDATE_FIELD\n | VisualBuilderPostMessageEvents.SYNC_FIELD;\n}\nexport function sendFieldEvent(options: ISendFieldEventParams): void {\n const { visualBuilderContainer, eventType } = options;\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n const pseudoEditableElement = visualBuilderContainer?.querySelector(\n \"div.visual-builder__pseudo-editable-element\"\n );\n if (\n previousSelectedEditableDOM &&\n (previousSelectedEditableDOM.hasAttribute(\"contenteditable\") ||\n pseudoEditableElement)\n ) {\n const actualEditedElement =\n pseudoEditableElement ||\n (previousSelectedEditableDOM as HTMLElement);\n\n let data =\n \"innerText\" in actualEditedElement\n ? actualEditedElement.innerText\n : actualEditedElement.textContent;\n\n const cslpData = previousSelectedEditableDOM.getAttribute(\"data-cslp\");\n if (!cslpData) {\n return;\n }\n\n const fieldMetadata = extractDetailsFromCslp(cslpData);\n\n FieldSchemaMap.getFieldSchema(\n fieldMetadata.content_type_uid,\n fieldMetadata.fieldPath\n )\n .then((fieldSchema) => {\n if (\n fieldSchema &&\n eventType === VisualBuilderPostMessageEvents.UPDATE_FIELD\n ) {\n const fieldType = getFieldType(fieldSchema);\n if (fieldType && fieldType === FieldDataType.MULTILINE) {\n data = getMultilinePlaintext(actualEditedElement);\n (actualEditedElement as HTMLElement).innerText =\n data as string;\n }\n }\n })\n .finally(() => {\n visualBuilderPostMessage?.send(eventType, {\n data,\n fieldMetadata,\n });\n });\n }\n}\ninterface HideOverlayParams\n extends Pick<\n EventListenerHandlerParams,\n \"visualBuilderContainer\" | \"focusedToolbar\" | \"resizeObserver\"\n > {\n visualBuilderOverlayWrapper: HTMLDivElement | null;\n noTrigger?: boolean;\n}\n\nexport function hideOverlay(params: HideOverlayParams): void {\n VisualBuilder.VisualBuilderGlobalState.value.isFocussed = false;\n const focusElementObserver =\n VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver;\n if (focusElementObserver) {\n focusElementObserver.disconnect();\n VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver =\n null;\n }\n hideFocusOverlay({\n visualBuilderContainer: params.visualBuilderContainer,\n visualBuilderOverlayWrapper: params.visualBuilderOverlayWrapper,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n noTrigger: Boolean(params.noTrigger),\n });\n showAllHiddenHighlightedCommentIcons();\n if (\n !VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM\n )\n return;\n params.resizeObserver.unobserve(\n VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM\n );\n VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM =\n null;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/visualBuilder/generators/generateOverlay.tsx"],"sourcesContent":["import { extractDetailsFromCslp, isValidCslp } from \"../../cslp/cslpdata\";\nimport { cleanIndividualFieldResidual } from \"../utils/handleIndividualFields\";\nimport visualBuilderPostMessage from \"../utils/visualBuilderPostMessage\";\nimport { VisualBuilderPostMessageEvents } from \"../utils/types/postMessage.types\";\n\nimport { VisualBuilder } from \"..\";\nimport EventListenerHandlerParams from \"../listeners/types\";\nimport { FieldSchemaMap } from \"../utils/fieldSchemaMap\";\nimport { FieldDataType } from \"../utils/types/index.types\";\nimport { getFieldType } from \"../utils/getFieldType\";\nimport { getMultilinePlaintext } from \"../utils/getMultilinePlaintext\";\nimport { showAllHiddenHighlightedCommentIcons } from \"./generateHighlightedComment\";\n\n/**\n * Adds a focus overlay to the target element.\n * @param targetElement - The element to add the focus overlay to.\n * @param focusOverlayWrapper - The HTMLDivElement that contains the focus overlay.\n * @returns void\n */\nexport function addFocusOverlay(\n targetElement: Element,\n focusOverlayWrapper: HTMLDivElement,\n disabled?: boolean\n): void {\n const targetElementDimension = targetElement.getBoundingClientRect();\n if (\n targetElementDimension.width === 0 ||\n targetElementDimension.height === 0\n )\n return;\n focusOverlayWrapper.classList.add(\"visible\");\n\n const distanceFromTop = targetElementDimension.top + window.scrollY;\n const topOverlayDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--top\"\n );\n\n if (topOverlayDOM) {\n topOverlayDOM.style.top = \"0\";\n topOverlayDOM.style.left = \"0\";\n topOverlayDOM.style.width = \"100%\";\n topOverlayDOM.style.height = `calc(${distanceFromTop}px)`;\n }\n\n const bottomOverlayDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--bottom\"\n );\n if (bottomOverlayDOM) {\n bottomOverlayDOM.style.top = `${\n targetElementDimension.bottom + window.scrollY\n }px`;\n bottomOverlayDOM.style.height = `${\n window.document.body.scrollHeight -\n targetElementDimension.bottom -\n window.scrollY\n }px`;\n bottomOverlayDOM.style.left = \"0\";\n bottomOverlayDOM.style.width = \"100%\";\n }\n\n const leftOverlayDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--left\"\n );\n if (leftOverlayDOM) {\n leftOverlayDOM.style.left = \"0\";\n leftOverlayDOM.style.top = `${distanceFromTop}px`;\n leftOverlayDOM.style.height = `${targetElementDimension.height}px`;\n leftOverlayDOM.style.width = `${targetElementDimension.left}px`;\n }\n\n const rightOverlayDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--right\"\n );\n if (rightOverlayDOM) {\n rightOverlayDOM.style.left = `${targetElementDimension.right}px`;\n rightOverlayDOM.style.top = `${distanceFromTop}px`;\n rightOverlayDOM.style.height = `${targetElementDimension.height}px`;\n rightOverlayDOM.style.width = `${\n document.documentElement.clientWidth - targetElementDimension.right\n }px`;\n }\n\n const outlineDOM = focusOverlayWrapper.querySelector<HTMLDivElement>(\n \".visual-builder__overlay--outline\"\n );\n if (outlineDOM) {\n outlineDOM.style.top = `${\n targetElementDimension.top + window.scrollY\n }px`;\n outlineDOM.style.height = `${targetElementDimension.height}px`;\n outlineDOM.style.width = `${targetElementDimension.width}px`;\n outlineDOM.style.left = `${targetElementDimension.left}px`;\n outlineDOM.style.outlineColor = disabled ? \"#909090\" : \"#715cdd\";\n }\n}\n\n/**\n * Hides the focus overlay and performs necessary cleanup actions when the user clicks outside of the focused element.\n * @param event - The mouse event that triggered the function.\n * @param elements - An object containing references to the focus overlay wrapper, the previously selected editable DOM element, and the visual builder wrapper.\n */\nexport function hideFocusOverlay(elements: HideOverlayParams): void {\n const {\n visualBuilderContainer,\n visualBuilderOverlayWrapper,\n focusedToolbar,\n resizeObserver,\n noTrigger,\n } = elements;\n\n if (visualBuilderOverlayWrapper) {\n visualBuilderOverlayWrapper.classList.remove(\"visible\");\n\n // Cleanup overlay styles: Top, Right, Bottom, Left & Outline\n visualBuilderOverlayWrapper.childNodes.forEach((childNode) => {\n if (childNode instanceof Element) {\n childNode.removeAttribute(\"style\");\n }\n });\n\n if (\n !noTrigger &&\n // send update when focussed field has received input\n VisualBuilder.VisualBuilderGlobalState.value.focusFieldReceivedInput\n ) {\n sendFieldEvent({\n visualBuilderContainer,\n eventType: VisualBuilderPostMessageEvents.UPDATE_FIELD,\n });\n } else if (noTrigger) {\n const { previousSelectedEditableDOM, focusFieldValue } =\n VisualBuilder.VisualBuilderGlobalState.value || {};\n if (\n previousSelectedEditableDOM &&\n \"innerText\" in previousSelectedEditableDOM &&\n focusFieldValue != null\n ) {\n previousSelectedEditableDOM.innerText = focusFieldValue;\n }\n }\n VisualBuilder.VisualBuilderGlobalState.value.focusFieldValue = null;\n VisualBuilder.VisualBuilderGlobalState.value.focusFieldReceivedInput =\n false;\n cleanIndividualFieldResidual({\n overlayWrapper: visualBuilderOverlayWrapper,\n visualBuilderContainer: visualBuilderContainer,\n focusedToolbar: focusedToolbar,\n resizeObserver: resizeObserver,\n });\n }\n}\ninterface ISendFieldEventParams {\n visualBuilderContainer: HTMLElement | null;\n eventType:\n | VisualBuilderPostMessageEvents.UPDATE_FIELD\n | VisualBuilderPostMessageEvents.SYNC_FIELD;\n}\nexport function sendFieldEvent(options: ISendFieldEventParams): void {\n const { visualBuilderContainer, eventType } = options;\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n const pseudoEditableElement = visualBuilderContainer?.querySelector(\n \"div.visual-builder__pseudo-editable-element\"\n );\n if (\n previousSelectedEditableDOM &&\n (previousSelectedEditableDOM.hasAttribute(\"contenteditable\") ||\n pseudoEditableElement)\n ) {\n const actualEditedElement =\n pseudoEditableElement ||\n (previousSelectedEditableDOM as HTMLElement);\n\n let data =\n \"innerText\" in actualEditedElement\n ? actualEditedElement.innerText\n : actualEditedElement.textContent;\n\n const cslpData = previousSelectedEditableDOM.getAttribute(\"data-cslp\");\n if (!isValidCslp(cslpData)) {\n return;\n }\n\n const fieldMetadata = extractDetailsFromCslp(cslpData);\n\n FieldSchemaMap.getFieldSchema(\n fieldMetadata.content_type_uid,\n fieldMetadata.fieldPath\n )\n .then((fieldSchema) => {\n if (\n fieldSchema &&\n eventType === VisualBuilderPostMessageEvents.UPDATE_FIELD\n ) {\n const fieldType = getFieldType(fieldSchema);\n if (fieldType && fieldType === FieldDataType.MULTILINE) {\n data = getMultilinePlaintext(actualEditedElement);\n (actualEditedElement as HTMLElement).innerText =\n data as string;\n }\n }\n })\n .finally(() => {\n visualBuilderPostMessage?.send(eventType, {\n data,\n fieldMetadata,\n });\n });\n }\n}\ninterface HideOverlayParams\n extends Pick<\n EventListenerHandlerParams,\n \"visualBuilderContainer\" | \"focusedToolbar\" | \"resizeObserver\"\n > {\n visualBuilderOverlayWrapper: HTMLDivElement | null;\n noTrigger?: boolean;\n}\n\nexport function hideOverlay(params: HideOverlayParams): void {\n VisualBuilder.VisualBuilderGlobalState.value.isFocussed = false;\n const focusElementObserver =\n VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver;\n if (focusElementObserver) {\n focusElementObserver.disconnect();\n VisualBuilder.VisualBuilderGlobalState.value.focusElementObserver =\n null;\n }\n hideFocusOverlay({\n visualBuilderContainer: params.visualBuilderContainer,\n visualBuilderOverlayWrapper: params.visualBuilderOverlayWrapper,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n noTrigger: Boolean(params.noTrigger),\n });\n showAllHiddenHighlightedCommentIcons();\n if (\n !VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM\n )\n return;\n params.resizeObserver.unobserve(\n VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM\n );\n VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM =\n null;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IThreadDTO,
|
|
1
|
+
import { IThreadDTO, MissingThreadsInfo, IThreadRenderStatus, toggleCollabPopupEvent } from '../types/collab.types.cjs';
|
|
2
2
|
|
|
3
3
|
declare function generateThread(payload: IThreadDTO | any, options?: {
|
|
4
4
|
isNewThread?: boolean;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IThreadDTO,
|
|
1
|
+
import { IThreadDTO, MissingThreadsInfo, IThreadRenderStatus, toggleCollabPopupEvent } from '../types/collab.types.js';
|
|
2
2
|
|
|
3
3
|
declare function generateThread(payload: IThreadDTO | any, options?: {
|
|
4
4
|
isNewThread?: boolean;
|
|
@@ -110,7 +110,7 @@ var _VisualBuilder = class _VisualBuilder {
|
|
|
110
110
|
this.handlePositionChange(editableElement);
|
|
111
111
|
}
|
|
112
112
|
const cslpData = editableElement && editableElement.getAttribute("data-cslp");
|
|
113
|
-
if (!editableElement || !cslpData) {
|
|
113
|
+
if (!editableElement || !(0, import_cslp.isValidCslp)(cslpData)) {
|
|
114
114
|
return;
|
|
115
115
|
}
|
|
116
116
|
const fieldMetadata = (0, import_cslp.extractDetailsFromCslp)(cslpData);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/visualBuilder/index.ts"],"sourcesContent":["import { Signal, signal } from \"@preact/signals\";\n\nimport { inIframe } from \"../common/inIframe\";\nimport Config from \"../configManager/configManager\";\nimport {\n useHistoryPostMessageEvent,\n useOnEntryUpdatePostMessageEvent,\n} from \"../livePreview/eventManager/postMessageEvent.hooks\";\nimport {\n ILivePreviewModeConfig,\n ILivePreviewWindowType,\n IVisualBuilderInitEvent,\n} from \"../types/types\";\nimport { generateStartEditingButton } from \"./generators/generateStartEditingButton\";\n\nimport { addFocusOverlay } from \"./generators/generateOverlay\";\nimport { getEntryIdentifiersInCurrentPage } from \"./utils/getEntryIdentifiersInCurrentPage\";\nimport visualBuilderPostMessage from \"./utils/visualBuilderPostMessage\";\nimport { VisualBuilderPostMessageEvents } from \"./utils/types/postMessage.types\";\n\nimport { setup } from \"goober\";\nimport { debounce, isEqual } from \"lodash-es\";\nimport { h } from \"preact\";\nimport { extractDetailsFromCslp } from \"../cslp\";\nimport initUI from \"./components\";\nimport { useDraftFieldsPostMessageEvent } from \"./eventManager/useDraftFieldsPostMessageEvent\";\nimport { useHideFocusOverlayPostMessageEvent } from \"./eventManager/useHideFocusOverlayPostMessageEvent\";\nimport { useScrollToField } from \"./eventManager/useScrollToField\";\nimport { debounceAddVariantFieldClass, getHighlightVariantFieldsStatus, setHighlightVariantFields, useVariantFieldsPostMessageEvent } from \"./eventManager/useVariantsPostMessageEvent\";\nimport {\n generateEmptyBlocks,\n removeEmptyBlocks,\n} from \"./generators/generateEmptyBlock\";\nimport { addEventListeners, removeEventListeners } from \"./listeners\";\nimport { addKeyboardShortcuts } from \"./listeners/keyboardShortcuts\";\nimport { FieldSchemaMap } from \"./utils/fieldSchemaMap\";\nimport { isFieldDisabled } from \"./utils/isFieldDisabled\";\nimport {\n updateFocussedState,\n updateFocussedStateOnMutation,\n} from \"./utils/updateFocussedState\";\nimport { useHighlightCommentIcon } from \"./eventManager/useHighlightCommentIcon\";\nimport { updateHighlightedCommentIconPosition } from \"./generators/generateHighlightedComment\";\nimport {\n updateCollabIconPosition,\n updatePopupPositions,\n updateSuggestionListPosition,\n} from \"./generators/generateThread\";\nimport { useRecalculateVariantDataCSLPValues } from \"./eventManager/useRecalculateVariantDataCSLPValues\";\nimport { VB_EmptyBlockParentClass } from \"..\";\nimport { useCollab } from \"./eventManager/useCollab\";\nimport {\n handleMissingThreads,\n processThreadsBatch,\n filterUnrenderedThreads,\n clearThreadStatus,\n} from \"./generators/generateThread\";\nimport { IThreadDTO } from \"./types/collab.types\";\n\ninterface VisualBuilderGlobalStateImpl {\n previousSelectedEditableDOM: HTMLElement | Element | null;\n previousHoveredTargetDOM: Element | null;\n previousEmptyBlockParents: Element[] | [];\n focusFieldValue: string | null;\n focusFieldReceivedInput: boolean;\n audienceMode: boolean;\n locale: string;\n variant: string | null;\n highlightVariantFields: boolean;\n variantOrder: string[];\n focusElementObserver: MutationObserver | null;\n referenceParentMap: Record<string, string>;\n isFocussed: boolean;\n}\n\nlet threadsPayload: IThreadDTO[] = [];\n\nexport class VisualBuilder {\n private customCursor: HTMLDivElement | null = null;\n private overlayWrapper: HTMLDivElement | null = null;\n private visualBuilderContainer: HTMLDivElement | null = null;\n private focusedToolbar: HTMLDivElement | null = null;\n\n static VisualBuilderGlobalState: Signal<VisualBuilderGlobalStateImpl> =\n signal({\n previousSelectedEditableDOM: null,\n previousHoveredTargetDOM: null,\n previousEmptyBlockParents: [],\n focusFieldValue: null,\n focusFieldReceivedInput: false,\n audienceMode: false,\n locale: Config.get().stackDetails.masterLocale || \"en-us\",\n variant: null,\n highlightVariantFields: false,\n variantOrder: [],\n focusElementObserver: null,\n referenceParentMap: {},\n isFocussed: false,\n });\n\n private handlePositionChange(editableElement: HTMLElement) {\n updateFocussedState({\n editableElement,\n visualBuilderContainer: this.visualBuilderContainer,\n overlayWrapper: this.overlayWrapper,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n }\n\n private scrollEventHandler = () => {\n updateCollabIconPosition();\n updatePopupPositions();\n updateSuggestionListPosition();\n updateHighlightedCommentIconPosition(); // Update icons position\n };\n\n private resizeEventHandler = () => {\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n updateHighlightedCommentIconPosition();\n updateCollabIconPosition();\n updatePopupPositions();\n updateSuggestionListPosition();\n if (previousSelectedEditableDOM) {\n this.handlePositionChange(\n previousSelectedEditableDOM as HTMLElement\n );\n }\n };\n\n private resizeObserver = new ResizeObserver(([entry]) => {\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n\n if (!this.overlayWrapper || !previousSelectedEditableDOM) {\n return;\n }\n\n // if previous selected editable element is not same as the current\n // target and the target is also not psuedo-editable then return\n if (\n !entry.target.isSameNode(previousSelectedEditableDOM) &&\n !entry.target.classList.contains(\n \"visual-builder__pseudo-editable-element\"\n )\n ) {\n return;\n }\n\n const isPsuedoEditableElement = entry.target.classList.contains(\n \"visual-builder__pseudo-editable-element\"\n );\n\n // the \"actual\" editable element when the current target is psuedo-editable\n // is the previous selected editable element instead of the closest data-cslp element\n // (cant use closest because the psuedo editable is absolute positioned)\n // (Note - why do we even need the closest? we do an early exit if entry.target\n // is not the previous selected editable element, needs more investigation)\n const editableElement = (\n isPsuedoEditableElement\n ? previousSelectedEditableDOM\n : entry.target.closest(\"[data-cslp]\")\n ) as HTMLElement | null;\n\n if (isPsuedoEditableElement) {\n // if the current target is psuedo-editable, then the resizing occurred by typing\n // into the psuedo editable, simply update the focus overlay\n addFocusOverlay(entry.target, this.overlayWrapper);\n\n // TODO check if we can now resize the actual editable element\n // when psuedo editable element is resized, avoid infinite loops\n } else if (editableElement) {\n this.handlePositionChange(editableElement);\n }\n\n // update the overlay if field is disabled\n const cslpData =\n editableElement && editableElement.getAttribute(\"data-cslp\");\n\n if (!editableElement || !cslpData) {\n return;\n }\n\n const fieldMetadata = extractDetailsFromCslp(cslpData);\n\n FieldSchemaMap.getFieldSchema(\n fieldMetadata.content_type_uid,\n fieldMetadata.fieldPath\n ).then((fieldSchema) => {\n if (!fieldSchema) {\n return;\n }\n const { isDisabled } = isFieldDisabled(fieldSchema, {\n editableElement,\n fieldMetadata,\n });\n if (isDisabled) {\n addFocusOverlay(\n editableElement,\n this.overlayWrapper as HTMLDivElement,\n isDisabled\n );\n }\n });\n });\n\n private mutationObserver = new MutationObserver(\n debounce(\n async () => {\n updateFocussedStateOnMutation(\n this.overlayWrapper,\n this.focusedToolbar,\n this.visualBuilderContainer,\n this.resizeObserver\n );\n\n const emptyBlockParents = Array.from(\n document.querySelectorAll(`.${VB_EmptyBlockParentClass}`)\n );\n\n const previousEmptyBlockParents = VisualBuilder\n .VisualBuilderGlobalState.value\n .previousEmptyBlockParents as Element[];\n\n if (!isEqual(emptyBlockParents, previousEmptyBlockParents)) {\n const noMoreEmptyBlockParent =\n previousEmptyBlockParents.filter(\n (x) => !emptyBlockParents.includes(x)\n );\n const newEmptyBlockParent = emptyBlockParents.filter(\n (x) => !previousEmptyBlockParents.includes(x)\n );\n\n removeEmptyBlocks(noMoreEmptyBlockParent);\n await generateEmptyBlocks(newEmptyBlockParent);\n\n VisualBuilder.VisualBuilderGlobalState.value = {\n ...VisualBuilder.VisualBuilderGlobalState.value,\n previousEmptyBlockParents: emptyBlockParents,\n };\n }\n if (VisualBuilder.VisualBuilderGlobalState.value.variant && VisualBuilder.VisualBuilderGlobalState.value.highlightVariantFields) {\n debounceAddVariantFieldClass(VisualBuilder.VisualBuilderGlobalState.value.variant);\n }\n },\n 100,\n { trailing: true }\n )\n );\n\n private threadMutationObserver = new MutationObserver(\n debounce(() => {\n const container = document.querySelector(\n \".visual-builder__container\"\n );\n if (container && threadsPayload) {\n const unrenderedThreads =\n filterUnrenderedThreads(threadsPayload);\n\n if (unrenderedThreads.length > 0) {\n processThreadsBatch(threadsPayload).then(\n (missingThreadIds) => {\n missingThreadIds.forEach(clearThreadStatus);\n if (missingThreadIds.length > 0) {\n handleMissingThreads({\n payload: { isElementPresent: false },\n threadUids: missingThreadIds,\n });\n }\n }\n );\n }\n\n threadsPayload = [];\n }\n }, 1000)\n );\n\n constructor() {\n // Handles changes in element positions due to sidebar toggling or window resizing,\n // triggering a redraw of the visual builder\n window.addEventListener(\"resize\", this.resizeEventHandler);\n window.addEventListener(\"scroll\", this.scrollEventHandler);\n initUI({\n resizeObserver: this.resizeObserver,\n });\n\n // Initializing goober for css-in-js\n setup(h);\n\n this.visualBuilderContainer = document.querySelector(\n \".visual-builder__container\"\n );\n this.overlayWrapper = document.querySelector(\n \".visual-builder__overlay__wrapper\"\n );\n this.customCursor = document.querySelector(\".visual-builder__cursor\");\n this.focusedToolbar = document.querySelector(\n \".visual-builder__focused-toolbar\"\n );\n\n const config = Config.get();\n\n if (!config.enable || config.mode < ILivePreviewModeConfig.BUILDER) {\n return;\n }\n\n visualBuilderPostMessage\n ?.send<IVisualBuilderInitEvent>(\"init\", {\n isSSR: config.ssr,\n href: window.location.href,\n })\n .then((data) => {\n const {\n windowType = ILivePreviewWindowType.BUILDER,\n stackDetails,\n collab,\n } = data || {};\n Config.set(\"windowType\", windowType);\n Config.set(\n \"stackDetails.masterLocale\",\n stackDetails?.masterLocale || \"en-us\"\n );\n\n if (collab) {\n Config.set(\"collab.enable\", collab.enable);\n Config.set(\"collab.isFeedbackMode\", collab.isFeedbackMode);\n Config.set(\"collab.inviteMetadata\", collab.inviteMetadata);\n }\n\n if (collab?.payload) {\n threadsPayload = collab?.payload;\n }\n\n addEventListeners({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n customCursor: this.customCursor,\n });\n\n this.threadMutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: false,\n });\n\n useHistoryPostMessageEvent();\n useCollab();\n\n if (windowType === ILivePreviewWindowType.BUILDER) {\n addKeyboardShortcuts({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n useScrollToField();\n useHighlightCommentIcon();\n\n this.mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n getHighlightVariantFieldsStatus().then((result) => {\n setHighlightVariantFields(result.highlightVariantFields);\n });\n visualBuilderPostMessage?.on(\n VisualBuilderPostMessageEvents.GET_ALL_ENTRIES_IN_CURRENT_PAGE,\n getEntryIdentifiersInCurrentPage\n );\n visualBuilderPostMessage?.send(\n VisualBuilderPostMessageEvents.SEND_VARIANT_AND_LOCALE\n );\n\n visualBuilderPostMessage?.on<{\n scroll: boolean;\n }>(\n VisualBuilderPostMessageEvents.TOGGLE_SCROLL,\n (event) => {\n if (!event.data.scroll) {\n document.body.style.overflow = \"hidden\";\n } else {\n document.body.style.overflow = \"auto\";\n\n }\n }\n );\n\n\n \n useHideFocusOverlayPostMessageEvent({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n\n // These events are used to sync the data when we made some changes in the entry without invoking live preview module.\n useOnEntryUpdatePostMessageEvent();\n useRecalculateVariantDataCSLPValues();\n useDraftFieldsPostMessageEvent();\n useVariantFieldsPostMessageEvent({ isSSR: config.ssr ?? false });\n }\n })\n .catch(() => {\n if (!inIframe()) {\n generateStartEditingButton();\n }\n });\n }\n\n // TODO: write test cases\n destroy = (): void => {\n // Remove event listeners\n window.removeEventListener(\"resize\", this.resizeEventHandler);\n window.removeEventListener(\"scroll\", this.scrollEventHandler);\n\n // Remove custom event listeners\n removeEventListeners({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n customCursor: this.customCursor,\n });\n\n // Disconnect observers\n this.resizeObserver.disconnect();\n this.mutationObserver.disconnect();\n this.threadMutationObserver.disconnect();\n\n // Clear global state\n VisualBuilder.VisualBuilderGlobalState.value = {\n previousSelectedEditableDOM: null,\n previousHoveredTargetDOM: null,\n previousEmptyBlockParents: [],\n focusFieldValue: null,\n focusFieldReceivedInput: false,\n audienceMode: false,\n locale: \"en-us\",\n variant: null,\n highlightVariantFields: false,\n variantOrder: [],\n focusElementObserver: null,\n referenceParentMap: {},\n isFocussed: false,\n };\n\n // Remove DOM elements\n if (this.visualBuilderContainer) {\n window.document.body.removeChild(this.visualBuilderContainer);\n }\n if (this.customCursor) {\n this.customCursor.remove();\n }\n if (this.overlayWrapper) {\n this.overlayWrapper.remove();\n }\n if (this.focusedToolbar) {\n this.focusedToolbar.remove();\n }\n\n // Nullify references\n this.customCursor = null;\n this.overlayWrapper = null;\n this.visualBuilderContainer = null;\n this.focusedToolbar = null;\n };\n}\n"],"mappings":"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","names":["import_generateThread","initUI","Config","visualBuilderPostMessage","_a"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/visualBuilder/index.ts"],"sourcesContent":["import { Signal, signal } from \"@preact/signals\";\n\nimport { inIframe } from \"../common/inIframe\";\nimport Config from \"../configManager/configManager\";\nimport {\n useHistoryPostMessageEvent,\n useOnEntryUpdatePostMessageEvent,\n} from \"../livePreview/eventManager/postMessageEvent.hooks\";\nimport {\n ILivePreviewModeConfig,\n ILivePreviewWindowType,\n IVisualBuilderInitEvent,\n} from \"../types/types\";\nimport { generateStartEditingButton } from \"./generators/generateStartEditingButton\";\n\nimport { addFocusOverlay } from \"./generators/generateOverlay\";\nimport { getEntryIdentifiersInCurrentPage } from \"./utils/getEntryIdentifiersInCurrentPage\";\nimport visualBuilderPostMessage from \"./utils/visualBuilderPostMessage\";\nimport { VisualBuilderPostMessageEvents } from \"./utils/types/postMessage.types\";\n\nimport { setup } from \"goober\";\nimport { debounce, isEqual } from \"lodash-es\";\nimport { h } from \"preact\";\nimport { extractDetailsFromCslp, isValidCslp } from \"../cslp\";\nimport initUI from \"./components\";\nimport { useDraftFieldsPostMessageEvent } from \"./eventManager/useDraftFieldsPostMessageEvent\";\nimport { useHideFocusOverlayPostMessageEvent } from \"./eventManager/useHideFocusOverlayPostMessageEvent\";\nimport { useScrollToField } from \"./eventManager/useScrollToField\";\nimport { debounceAddVariantFieldClass, getHighlightVariantFieldsStatus, setHighlightVariantFields, useVariantFieldsPostMessageEvent } from \"./eventManager/useVariantsPostMessageEvent\";\nimport {\n generateEmptyBlocks,\n removeEmptyBlocks,\n} from \"./generators/generateEmptyBlock\";\nimport { addEventListeners, removeEventListeners } from \"./listeners\";\nimport { addKeyboardShortcuts } from \"./listeners/keyboardShortcuts\";\nimport { FieldSchemaMap } from \"./utils/fieldSchemaMap\";\nimport { isFieldDisabled } from \"./utils/isFieldDisabled\";\nimport {\n updateFocussedState,\n updateFocussedStateOnMutation,\n} from \"./utils/updateFocussedState\";\nimport { useHighlightCommentIcon } from \"./eventManager/useHighlightCommentIcon\";\nimport { updateHighlightedCommentIconPosition } from \"./generators/generateHighlightedComment\";\nimport {\n updateCollabIconPosition,\n updatePopupPositions,\n updateSuggestionListPosition,\n} from \"./generators/generateThread\";\nimport { useRecalculateVariantDataCSLPValues } from \"./eventManager/useRecalculateVariantDataCSLPValues\";\nimport { VB_EmptyBlockParentClass } from \"..\";\nimport { useCollab } from \"./eventManager/useCollab\";\nimport {\n handleMissingThreads,\n processThreadsBatch,\n filterUnrenderedThreads,\n clearThreadStatus,\n} from \"./generators/generateThread\";\nimport { IThreadDTO } from \"./types/collab.types\";\n\ninterface VisualBuilderGlobalStateImpl {\n previousSelectedEditableDOM: HTMLElement | Element | null;\n previousHoveredTargetDOM: Element | null;\n previousEmptyBlockParents: Element[] | [];\n focusFieldValue: string | null;\n focusFieldReceivedInput: boolean;\n audienceMode: boolean;\n locale: string;\n variant: string | null;\n highlightVariantFields: boolean;\n variantOrder: string[];\n focusElementObserver: MutationObserver | null;\n referenceParentMap: Record<string, string>;\n isFocussed: boolean;\n}\n\nlet threadsPayload: IThreadDTO[] = [];\n\nexport class VisualBuilder {\n private customCursor: HTMLDivElement | null = null;\n private overlayWrapper: HTMLDivElement | null = null;\n private visualBuilderContainer: HTMLDivElement | null = null;\n private focusedToolbar: HTMLDivElement | null = null;\n\n static VisualBuilderGlobalState: Signal<VisualBuilderGlobalStateImpl> =\n signal({\n previousSelectedEditableDOM: null,\n previousHoveredTargetDOM: null,\n previousEmptyBlockParents: [],\n focusFieldValue: null,\n focusFieldReceivedInput: false,\n audienceMode: false,\n locale: Config.get().stackDetails.masterLocale || \"en-us\",\n variant: null,\n highlightVariantFields: false,\n variantOrder: [],\n focusElementObserver: null,\n referenceParentMap: {},\n isFocussed: false,\n });\n\n private handlePositionChange(editableElement: HTMLElement) {\n updateFocussedState({\n editableElement,\n visualBuilderContainer: this.visualBuilderContainer,\n overlayWrapper: this.overlayWrapper,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n }\n\n private scrollEventHandler = () => {\n updateCollabIconPosition();\n updatePopupPositions();\n updateSuggestionListPosition();\n updateHighlightedCommentIconPosition(); // Update icons position\n };\n\n private resizeEventHandler = () => {\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n updateHighlightedCommentIconPosition();\n updateCollabIconPosition();\n updatePopupPositions();\n updateSuggestionListPosition();\n if (previousSelectedEditableDOM) {\n this.handlePositionChange(\n previousSelectedEditableDOM as HTMLElement\n );\n }\n };\n\n private resizeObserver = new ResizeObserver(([entry]) => {\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n\n if (!this.overlayWrapper || !previousSelectedEditableDOM) {\n return;\n }\n\n // if previous selected editable element is not same as the current\n // target and the target is also not psuedo-editable then return\n if (\n !entry.target.isSameNode(previousSelectedEditableDOM) &&\n !entry.target.classList.contains(\n \"visual-builder__pseudo-editable-element\"\n )\n ) {\n return;\n }\n\n const isPsuedoEditableElement = entry.target.classList.contains(\n \"visual-builder__pseudo-editable-element\"\n );\n\n // the \"actual\" editable element when the current target is psuedo-editable\n // is the previous selected editable element instead of the closest data-cslp element\n // (cant use closest because the psuedo editable is absolute positioned)\n // (Note - why do we even need the closest? we do an early exit if entry.target\n // is not the previous selected editable element, needs more investigation)\n const editableElement = (\n isPsuedoEditableElement\n ? previousSelectedEditableDOM\n : entry.target.closest(\"[data-cslp]\")\n ) as HTMLElement | null;\n\n if (isPsuedoEditableElement) {\n // if the current target is psuedo-editable, then the resizing occurred by typing\n // into the psuedo editable, simply update the focus overlay\n addFocusOverlay(entry.target, this.overlayWrapper);\n\n // TODO check if we can now resize the actual editable element\n // when psuedo editable element is resized, avoid infinite loops\n } else if (editableElement) {\n this.handlePositionChange(editableElement);\n }\n\n // update the overlay if field is disabled\n const cslpData =\n editableElement && editableElement.getAttribute(\"data-cslp\");\n\n if (!editableElement || !isValidCslp(cslpData)) {\n return;\n }\n\n const fieldMetadata = extractDetailsFromCslp(cslpData);\n\n FieldSchemaMap.getFieldSchema(\n fieldMetadata.content_type_uid,\n fieldMetadata.fieldPath\n ).then((fieldSchema) => {\n if (!fieldSchema) {\n return;\n }\n const { isDisabled } = isFieldDisabled(fieldSchema, {\n editableElement,\n fieldMetadata,\n });\n if (isDisabled) {\n addFocusOverlay(\n editableElement,\n this.overlayWrapper as HTMLDivElement,\n isDisabled\n );\n }\n });\n });\n\n private mutationObserver = new MutationObserver(\n debounce(\n async () => {\n updateFocussedStateOnMutation(\n this.overlayWrapper,\n this.focusedToolbar,\n this.visualBuilderContainer,\n this.resizeObserver\n );\n\n const emptyBlockParents = Array.from(\n document.querySelectorAll(`.${VB_EmptyBlockParentClass}`)\n );\n\n const previousEmptyBlockParents = VisualBuilder\n .VisualBuilderGlobalState.value\n .previousEmptyBlockParents as Element[];\n\n if (!isEqual(emptyBlockParents, previousEmptyBlockParents)) {\n const noMoreEmptyBlockParent =\n previousEmptyBlockParents.filter(\n (x) => !emptyBlockParents.includes(x)\n );\n const newEmptyBlockParent = emptyBlockParents.filter(\n (x) => !previousEmptyBlockParents.includes(x)\n );\n\n removeEmptyBlocks(noMoreEmptyBlockParent);\n await generateEmptyBlocks(newEmptyBlockParent);\n\n VisualBuilder.VisualBuilderGlobalState.value = {\n ...VisualBuilder.VisualBuilderGlobalState.value,\n previousEmptyBlockParents: emptyBlockParents,\n };\n }\n if (VisualBuilder.VisualBuilderGlobalState.value.variant && VisualBuilder.VisualBuilderGlobalState.value.highlightVariantFields) {\n debounceAddVariantFieldClass(VisualBuilder.VisualBuilderGlobalState.value.variant);\n }\n },\n 100,\n { trailing: true }\n )\n );\n\n private threadMutationObserver = new MutationObserver(\n debounce(() => {\n const container = document.querySelector(\n \".visual-builder__container\"\n );\n if (container && threadsPayload) {\n const unrenderedThreads =\n filterUnrenderedThreads(threadsPayload);\n\n if (unrenderedThreads.length > 0) {\n processThreadsBatch(threadsPayload).then(\n (missingThreadIds) => {\n missingThreadIds.forEach(clearThreadStatus);\n if (missingThreadIds.length > 0) {\n handleMissingThreads({\n payload: { isElementPresent: false },\n threadUids: missingThreadIds,\n });\n }\n }\n );\n }\n\n threadsPayload = [];\n }\n }, 1000)\n );\n\n constructor() {\n // Handles changes in element positions due to sidebar toggling or window resizing,\n // triggering a redraw of the visual builder\n window.addEventListener(\"resize\", this.resizeEventHandler);\n window.addEventListener(\"scroll\", this.scrollEventHandler);\n initUI({\n resizeObserver: this.resizeObserver,\n });\n\n // Initializing goober for css-in-js\n setup(h);\n\n this.visualBuilderContainer = document.querySelector(\n \".visual-builder__container\"\n );\n this.overlayWrapper = document.querySelector(\n \".visual-builder__overlay__wrapper\"\n );\n this.customCursor = document.querySelector(\".visual-builder__cursor\");\n this.focusedToolbar = document.querySelector(\n \".visual-builder__focused-toolbar\"\n );\n\n const config = Config.get();\n\n if (!config.enable || config.mode < ILivePreviewModeConfig.BUILDER) {\n return;\n }\n\n visualBuilderPostMessage\n ?.send<IVisualBuilderInitEvent>(\"init\", {\n isSSR: config.ssr,\n href: window.location.href,\n })\n .then((data) => {\n const {\n windowType = ILivePreviewWindowType.BUILDER,\n stackDetails,\n collab,\n } = data || {};\n Config.set(\"windowType\", windowType);\n Config.set(\n \"stackDetails.masterLocale\",\n stackDetails?.masterLocale || \"en-us\"\n );\n\n if (collab) {\n Config.set(\"collab.enable\", collab.enable);\n Config.set(\"collab.isFeedbackMode\", collab.isFeedbackMode);\n Config.set(\"collab.inviteMetadata\", collab.inviteMetadata);\n }\n\n if (collab?.payload) {\n threadsPayload = collab?.payload;\n }\n\n addEventListeners({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n customCursor: this.customCursor,\n });\n\n this.threadMutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: false,\n });\n\n useHistoryPostMessageEvent();\n useCollab();\n\n if (windowType === ILivePreviewWindowType.BUILDER) {\n addKeyboardShortcuts({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n useScrollToField();\n useHighlightCommentIcon();\n\n this.mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n getHighlightVariantFieldsStatus().then((result) => {\n setHighlightVariantFields(result.highlightVariantFields);\n });\n visualBuilderPostMessage?.on(\n VisualBuilderPostMessageEvents.GET_ALL_ENTRIES_IN_CURRENT_PAGE,\n getEntryIdentifiersInCurrentPage\n );\n visualBuilderPostMessage?.send(\n VisualBuilderPostMessageEvents.SEND_VARIANT_AND_LOCALE\n );\n\n visualBuilderPostMessage?.on<{\n scroll: boolean;\n }>(\n VisualBuilderPostMessageEvents.TOGGLE_SCROLL,\n (event) => {\n if (!event.data.scroll) {\n document.body.style.overflow = \"hidden\";\n } else {\n document.body.style.overflow = \"auto\";\n\n }\n }\n );\n\n\n \n useHideFocusOverlayPostMessageEvent({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n\n // These events are used to sync the data when we made some changes in the entry without invoking live preview module.\n useOnEntryUpdatePostMessageEvent();\n useRecalculateVariantDataCSLPValues();\n useDraftFieldsPostMessageEvent();\n useVariantFieldsPostMessageEvent({ isSSR: config.ssr ?? false });\n }\n })\n .catch(() => {\n if (!inIframe()) {\n generateStartEditingButton();\n }\n });\n }\n\n // TODO: write test cases\n destroy = (): void => {\n // Remove event listeners\n window.removeEventListener(\"resize\", this.resizeEventHandler);\n window.removeEventListener(\"scroll\", this.scrollEventHandler);\n\n // Remove custom event listeners\n removeEventListeners({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n customCursor: this.customCursor,\n });\n\n // Disconnect observers\n this.resizeObserver.disconnect();\n this.mutationObserver.disconnect();\n this.threadMutationObserver.disconnect();\n\n // Clear global state\n VisualBuilder.VisualBuilderGlobalState.value = {\n previousSelectedEditableDOM: null,\n previousHoveredTargetDOM: null,\n previousEmptyBlockParents: [],\n focusFieldValue: null,\n focusFieldReceivedInput: false,\n audienceMode: false,\n locale: \"en-us\",\n variant: null,\n highlightVariantFields: false,\n variantOrder: [],\n focusElementObserver: null,\n referenceParentMap: {},\n isFocussed: false,\n };\n\n // Remove DOM elements\n if (this.visualBuilderContainer) {\n window.document.body.removeChild(this.visualBuilderContainer);\n }\n if (this.customCursor) {\n this.customCursor.remove();\n }\n if (this.overlayWrapper) {\n this.overlayWrapper.remove();\n }\n if (this.focusedToolbar) {\n this.focusedToolbar.remove();\n }\n\n // Nullify references\n this.customCursor = null;\n this.overlayWrapper = null;\n this.visualBuilderContainer = null;\n this.focusedToolbar = null;\n };\n}\n"],"mappings":"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","names":["import_generateThread","initUI","Config","visualBuilderPostMessage","_a"]}
|
|
@@ -20,7 +20,7 @@ import { VisualBuilderPostMessageEvents } from "./utils/types/postMessage.types.
|
|
|
20
20
|
import { setup } from "goober";
|
|
21
21
|
import { debounce, isEqual } from "lodash-es";
|
|
22
22
|
import { h } from "preact";
|
|
23
|
-
import { extractDetailsFromCslp } from "../cslp/index.js";
|
|
23
|
+
import { extractDetailsFromCslp, isValidCslp } from "../cslp/index.js";
|
|
24
24
|
import initUI from "./components/index.js";
|
|
25
25
|
import { useDraftFieldsPostMessageEvent } from "./eventManager/useDraftFieldsPostMessageEvent.js";
|
|
26
26
|
import { useHideFocusOverlayPostMessageEvent } from "./eventManager/useHideFocusOverlayPostMessageEvent.js";
|
|
@@ -99,7 +99,7 @@ var _VisualBuilder = class _VisualBuilder {
|
|
|
99
99
|
this.handlePositionChange(editableElement);
|
|
100
100
|
}
|
|
101
101
|
const cslpData = editableElement && editableElement.getAttribute("data-cslp");
|
|
102
|
-
if (!editableElement || !cslpData) {
|
|
102
|
+
if (!editableElement || !isValidCslp(cslpData)) {
|
|
103
103
|
return;
|
|
104
104
|
}
|
|
105
105
|
const fieldMetadata = extractDetailsFromCslp(cslpData);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/visualBuilder/index.ts"],"sourcesContent":["import { Signal, signal } from \"@preact/signals\";\n\nimport { inIframe } from \"../common/inIframe\";\nimport Config from \"../configManager/configManager\";\nimport {\n useHistoryPostMessageEvent,\n useOnEntryUpdatePostMessageEvent,\n} from \"../livePreview/eventManager/postMessageEvent.hooks\";\nimport {\n ILivePreviewModeConfig,\n ILivePreviewWindowType,\n IVisualBuilderInitEvent,\n} from \"../types/types\";\nimport { generateStartEditingButton } from \"./generators/generateStartEditingButton\";\n\nimport { addFocusOverlay } from \"./generators/generateOverlay\";\nimport { getEntryIdentifiersInCurrentPage } from \"./utils/getEntryIdentifiersInCurrentPage\";\nimport visualBuilderPostMessage from \"./utils/visualBuilderPostMessage\";\nimport { VisualBuilderPostMessageEvents } from \"./utils/types/postMessage.types\";\n\nimport { setup } from \"goober\";\nimport { debounce, isEqual } from \"lodash-es\";\nimport { h } from \"preact\";\nimport { extractDetailsFromCslp } from \"../cslp\";\nimport initUI from \"./components\";\nimport { useDraftFieldsPostMessageEvent } from \"./eventManager/useDraftFieldsPostMessageEvent\";\nimport { useHideFocusOverlayPostMessageEvent } from \"./eventManager/useHideFocusOverlayPostMessageEvent\";\nimport { useScrollToField } from \"./eventManager/useScrollToField\";\nimport { debounceAddVariantFieldClass, getHighlightVariantFieldsStatus, setHighlightVariantFields, useVariantFieldsPostMessageEvent } from \"./eventManager/useVariantsPostMessageEvent\";\nimport {\n generateEmptyBlocks,\n removeEmptyBlocks,\n} from \"./generators/generateEmptyBlock\";\nimport { addEventListeners, removeEventListeners } from \"./listeners\";\nimport { addKeyboardShortcuts } from \"./listeners/keyboardShortcuts\";\nimport { FieldSchemaMap } from \"./utils/fieldSchemaMap\";\nimport { isFieldDisabled } from \"./utils/isFieldDisabled\";\nimport {\n updateFocussedState,\n updateFocussedStateOnMutation,\n} from \"./utils/updateFocussedState\";\nimport { useHighlightCommentIcon } from \"./eventManager/useHighlightCommentIcon\";\nimport { updateHighlightedCommentIconPosition } from \"./generators/generateHighlightedComment\";\nimport {\n updateCollabIconPosition,\n updatePopupPositions,\n updateSuggestionListPosition,\n} from \"./generators/generateThread\";\nimport { useRecalculateVariantDataCSLPValues } from \"./eventManager/useRecalculateVariantDataCSLPValues\";\nimport { VB_EmptyBlockParentClass } from \"..\";\nimport { useCollab } from \"./eventManager/useCollab\";\nimport {\n handleMissingThreads,\n processThreadsBatch,\n filterUnrenderedThreads,\n clearThreadStatus,\n} from \"./generators/generateThread\";\nimport { IThreadDTO } from \"./types/collab.types\";\n\ninterface VisualBuilderGlobalStateImpl {\n previousSelectedEditableDOM: HTMLElement | Element | null;\n previousHoveredTargetDOM: Element | null;\n previousEmptyBlockParents: Element[] | [];\n focusFieldValue: string | null;\n focusFieldReceivedInput: boolean;\n audienceMode: boolean;\n locale: string;\n variant: string | null;\n highlightVariantFields: boolean;\n variantOrder: string[];\n focusElementObserver: MutationObserver | null;\n referenceParentMap: Record<string, string>;\n isFocussed: boolean;\n}\n\nlet threadsPayload: IThreadDTO[] = [];\n\nexport class VisualBuilder {\n private customCursor: HTMLDivElement | null = null;\n private overlayWrapper: HTMLDivElement | null = null;\n private visualBuilderContainer: HTMLDivElement | null = null;\n private focusedToolbar: HTMLDivElement | null = null;\n\n static VisualBuilderGlobalState: Signal<VisualBuilderGlobalStateImpl> =\n signal({\n previousSelectedEditableDOM: null,\n previousHoveredTargetDOM: null,\n previousEmptyBlockParents: [],\n focusFieldValue: null,\n focusFieldReceivedInput: false,\n audienceMode: false,\n locale: Config.get().stackDetails.masterLocale || \"en-us\",\n variant: null,\n highlightVariantFields: false,\n variantOrder: [],\n focusElementObserver: null,\n referenceParentMap: {},\n isFocussed: false,\n });\n\n private handlePositionChange(editableElement: HTMLElement) {\n updateFocussedState({\n editableElement,\n visualBuilderContainer: this.visualBuilderContainer,\n overlayWrapper: this.overlayWrapper,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n }\n\n private scrollEventHandler = () => {\n updateCollabIconPosition();\n updatePopupPositions();\n updateSuggestionListPosition();\n updateHighlightedCommentIconPosition(); // Update icons position\n };\n\n private resizeEventHandler = () => {\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n updateHighlightedCommentIconPosition();\n updateCollabIconPosition();\n updatePopupPositions();\n updateSuggestionListPosition();\n if (previousSelectedEditableDOM) {\n this.handlePositionChange(\n previousSelectedEditableDOM as HTMLElement\n );\n }\n };\n\n private resizeObserver = new ResizeObserver(([entry]) => {\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n\n if (!this.overlayWrapper || !previousSelectedEditableDOM) {\n return;\n }\n\n // if previous selected editable element is not same as the current\n // target and the target is also not psuedo-editable then return\n if (\n !entry.target.isSameNode(previousSelectedEditableDOM) &&\n !entry.target.classList.contains(\n \"visual-builder__pseudo-editable-element\"\n )\n ) {\n return;\n }\n\n const isPsuedoEditableElement = entry.target.classList.contains(\n \"visual-builder__pseudo-editable-element\"\n );\n\n // the \"actual\" editable element when the current target is psuedo-editable\n // is the previous selected editable element instead of the closest data-cslp element\n // (cant use closest because the psuedo editable is absolute positioned)\n // (Note - why do we even need the closest? we do an early exit if entry.target\n // is not the previous selected editable element, needs more investigation)\n const editableElement = (\n isPsuedoEditableElement\n ? previousSelectedEditableDOM\n : entry.target.closest(\"[data-cslp]\")\n ) as HTMLElement | null;\n\n if (isPsuedoEditableElement) {\n // if the current target is psuedo-editable, then the resizing occurred by typing\n // into the psuedo editable, simply update the focus overlay\n addFocusOverlay(entry.target, this.overlayWrapper);\n\n // TODO check if we can now resize the actual editable element\n // when psuedo editable element is resized, avoid infinite loops\n } else if (editableElement) {\n this.handlePositionChange(editableElement);\n }\n\n // update the overlay if field is disabled\n const cslpData =\n editableElement && editableElement.getAttribute(\"data-cslp\");\n\n if (!editableElement || !cslpData) {\n return;\n }\n\n const fieldMetadata = extractDetailsFromCslp(cslpData);\n\n FieldSchemaMap.getFieldSchema(\n fieldMetadata.content_type_uid,\n fieldMetadata.fieldPath\n ).then((fieldSchema) => {\n if (!fieldSchema) {\n return;\n }\n const { isDisabled } = isFieldDisabled(fieldSchema, {\n editableElement,\n fieldMetadata,\n });\n if (isDisabled) {\n addFocusOverlay(\n editableElement,\n this.overlayWrapper as HTMLDivElement,\n isDisabled\n );\n }\n });\n });\n\n private mutationObserver = new MutationObserver(\n debounce(\n async () => {\n updateFocussedStateOnMutation(\n this.overlayWrapper,\n this.focusedToolbar,\n this.visualBuilderContainer,\n this.resizeObserver\n );\n\n const emptyBlockParents = Array.from(\n document.querySelectorAll(`.${VB_EmptyBlockParentClass}`)\n );\n\n const previousEmptyBlockParents = VisualBuilder\n .VisualBuilderGlobalState.value\n .previousEmptyBlockParents as Element[];\n\n if (!isEqual(emptyBlockParents, previousEmptyBlockParents)) {\n const noMoreEmptyBlockParent =\n previousEmptyBlockParents.filter(\n (x) => !emptyBlockParents.includes(x)\n );\n const newEmptyBlockParent = emptyBlockParents.filter(\n (x) => !previousEmptyBlockParents.includes(x)\n );\n\n removeEmptyBlocks(noMoreEmptyBlockParent);\n await generateEmptyBlocks(newEmptyBlockParent);\n\n VisualBuilder.VisualBuilderGlobalState.value = {\n ...VisualBuilder.VisualBuilderGlobalState.value,\n previousEmptyBlockParents: emptyBlockParents,\n };\n }\n if (VisualBuilder.VisualBuilderGlobalState.value.variant && VisualBuilder.VisualBuilderGlobalState.value.highlightVariantFields) {\n debounceAddVariantFieldClass(VisualBuilder.VisualBuilderGlobalState.value.variant);\n }\n },\n 100,\n { trailing: true }\n )\n );\n\n private threadMutationObserver = new MutationObserver(\n debounce(() => {\n const container = document.querySelector(\n \".visual-builder__container\"\n );\n if (container && threadsPayload) {\n const unrenderedThreads =\n filterUnrenderedThreads(threadsPayload);\n\n if (unrenderedThreads.length > 0) {\n processThreadsBatch(threadsPayload).then(\n (missingThreadIds) => {\n missingThreadIds.forEach(clearThreadStatus);\n if (missingThreadIds.length > 0) {\n handleMissingThreads({\n payload: { isElementPresent: false },\n threadUids: missingThreadIds,\n });\n }\n }\n );\n }\n\n threadsPayload = [];\n }\n }, 1000)\n );\n\n constructor() {\n // Handles changes in element positions due to sidebar toggling or window resizing,\n // triggering a redraw of the visual builder\n window.addEventListener(\"resize\", this.resizeEventHandler);\n window.addEventListener(\"scroll\", this.scrollEventHandler);\n initUI({\n resizeObserver: this.resizeObserver,\n });\n\n // Initializing goober for css-in-js\n setup(h);\n\n this.visualBuilderContainer = document.querySelector(\n \".visual-builder__container\"\n );\n this.overlayWrapper = document.querySelector(\n \".visual-builder__overlay__wrapper\"\n );\n this.customCursor = document.querySelector(\".visual-builder__cursor\");\n this.focusedToolbar = document.querySelector(\n \".visual-builder__focused-toolbar\"\n );\n\n const config = Config.get();\n\n if (!config.enable || config.mode < ILivePreviewModeConfig.BUILDER) {\n return;\n }\n\n visualBuilderPostMessage\n ?.send<IVisualBuilderInitEvent>(\"init\", {\n isSSR: config.ssr,\n href: window.location.href,\n })\n .then((data) => {\n const {\n windowType = ILivePreviewWindowType.BUILDER,\n stackDetails,\n collab,\n } = data || {};\n Config.set(\"windowType\", windowType);\n Config.set(\n \"stackDetails.masterLocale\",\n stackDetails?.masterLocale || \"en-us\"\n );\n\n if (collab) {\n Config.set(\"collab.enable\", collab.enable);\n Config.set(\"collab.isFeedbackMode\", collab.isFeedbackMode);\n Config.set(\"collab.inviteMetadata\", collab.inviteMetadata);\n }\n\n if (collab?.payload) {\n threadsPayload = collab?.payload;\n }\n\n addEventListeners({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n customCursor: this.customCursor,\n });\n\n this.threadMutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: false,\n });\n\n useHistoryPostMessageEvent();\n useCollab();\n\n if (windowType === ILivePreviewWindowType.BUILDER) {\n addKeyboardShortcuts({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n useScrollToField();\n useHighlightCommentIcon();\n\n this.mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n getHighlightVariantFieldsStatus().then((result) => {\n setHighlightVariantFields(result.highlightVariantFields);\n });\n visualBuilderPostMessage?.on(\n VisualBuilderPostMessageEvents.GET_ALL_ENTRIES_IN_CURRENT_PAGE,\n getEntryIdentifiersInCurrentPage\n );\n visualBuilderPostMessage?.send(\n VisualBuilderPostMessageEvents.SEND_VARIANT_AND_LOCALE\n );\n\n visualBuilderPostMessage?.on<{\n scroll: boolean;\n }>(\n VisualBuilderPostMessageEvents.TOGGLE_SCROLL,\n (event) => {\n if (!event.data.scroll) {\n document.body.style.overflow = \"hidden\";\n } else {\n document.body.style.overflow = \"auto\";\n\n }\n }\n );\n\n\n \n useHideFocusOverlayPostMessageEvent({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n\n // These events are used to sync the data when we made some changes in the entry without invoking live preview module.\n useOnEntryUpdatePostMessageEvent();\n useRecalculateVariantDataCSLPValues();\n useDraftFieldsPostMessageEvent();\n useVariantFieldsPostMessageEvent({ isSSR: config.ssr ?? false });\n }\n })\n .catch(() => {\n if (!inIframe()) {\n generateStartEditingButton();\n }\n });\n }\n\n // TODO: write test cases\n destroy = (): void => {\n // Remove event listeners\n window.removeEventListener(\"resize\", this.resizeEventHandler);\n window.removeEventListener(\"scroll\", this.scrollEventHandler);\n\n // Remove custom event listeners\n removeEventListeners({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n customCursor: this.customCursor,\n });\n\n // Disconnect observers\n this.resizeObserver.disconnect();\n this.mutationObserver.disconnect();\n this.threadMutationObserver.disconnect();\n\n // Clear global state\n VisualBuilder.VisualBuilderGlobalState.value = {\n previousSelectedEditableDOM: null,\n previousHoveredTargetDOM: null,\n previousEmptyBlockParents: [],\n focusFieldValue: null,\n focusFieldReceivedInput: false,\n audienceMode: false,\n locale: \"en-us\",\n variant: null,\n highlightVariantFields: false,\n variantOrder: [],\n focusElementObserver: null,\n referenceParentMap: {},\n isFocussed: false,\n };\n\n // Remove DOM elements\n if (this.visualBuilderContainer) {\n window.document.body.removeChild(this.visualBuilderContainer);\n }\n if (this.customCursor) {\n this.customCursor.remove();\n }\n if (this.overlayWrapper) {\n this.overlayWrapper.remove();\n }\n if (this.focusedToolbar) {\n this.focusedToolbar.remove();\n }\n\n // Nullify references\n this.customCursor = null;\n this.overlayWrapper = null;\n this.visualBuilderContainer = null;\n this.focusedToolbar = null;\n };\n}\n"],"mappings":"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","names":["_a"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/visualBuilder/index.ts"],"sourcesContent":["import { Signal, signal } from \"@preact/signals\";\n\nimport { inIframe } from \"../common/inIframe\";\nimport Config from \"../configManager/configManager\";\nimport {\n useHistoryPostMessageEvent,\n useOnEntryUpdatePostMessageEvent,\n} from \"../livePreview/eventManager/postMessageEvent.hooks\";\nimport {\n ILivePreviewModeConfig,\n ILivePreviewWindowType,\n IVisualBuilderInitEvent,\n} from \"../types/types\";\nimport { generateStartEditingButton } from \"./generators/generateStartEditingButton\";\n\nimport { addFocusOverlay } from \"./generators/generateOverlay\";\nimport { getEntryIdentifiersInCurrentPage } from \"./utils/getEntryIdentifiersInCurrentPage\";\nimport visualBuilderPostMessage from \"./utils/visualBuilderPostMessage\";\nimport { VisualBuilderPostMessageEvents } from \"./utils/types/postMessage.types\";\n\nimport { setup } from \"goober\";\nimport { debounce, isEqual } from \"lodash-es\";\nimport { h } from \"preact\";\nimport { extractDetailsFromCslp, isValidCslp } from \"../cslp\";\nimport initUI from \"./components\";\nimport { useDraftFieldsPostMessageEvent } from \"./eventManager/useDraftFieldsPostMessageEvent\";\nimport { useHideFocusOverlayPostMessageEvent } from \"./eventManager/useHideFocusOverlayPostMessageEvent\";\nimport { useScrollToField } from \"./eventManager/useScrollToField\";\nimport { debounceAddVariantFieldClass, getHighlightVariantFieldsStatus, setHighlightVariantFields, useVariantFieldsPostMessageEvent } from \"./eventManager/useVariantsPostMessageEvent\";\nimport {\n generateEmptyBlocks,\n removeEmptyBlocks,\n} from \"./generators/generateEmptyBlock\";\nimport { addEventListeners, removeEventListeners } from \"./listeners\";\nimport { addKeyboardShortcuts } from \"./listeners/keyboardShortcuts\";\nimport { FieldSchemaMap } from \"./utils/fieldSchemaMap\";\nimport { isFieldDisabled } from \"./utils/isFieldDisabled\";\nimport {\n updateFocussedState,\n updateFocussedStateOnMutation,\n} from \"./utils/updateFocussedState\";\nimport { useHighlightCommentIcon } from \"./eventManager/useHighlightCommentIcon\";\nimport { updateHighlightedCommentIconPosition } from \"./generators/generateHighlightedComment\";\nimport {\n updateCollabIconPosition,\n updatePopupPositions,\n updateSuggestionListPosition,\n} from \"./generators/generateThread\";\nimport { useRecalculateVariantDataCSLPValues } from \"./eventManager/useRecalculateVariantDataCSLPValues\";\nimport { VB_EmptyBlockParentClass } from \"..\";\nimport { useCollab } from \"./eventManager/useCollab\";\nimport {\n handleMissingThreads,\n processThreadsBatch,\n filterUnrenderedThreads,\n clearThreadStatus,\n} from \"./generators/generateThread\";\nimport { IThreadDTO } from \"./types/collab.types\";\n\ninterface VisualBuilderGlobalStateImpl {\n previousSelectedEditableDOM: HTMLElement | Element | null;\n previousHoveredTargetDOM: Element | null;\n previousEmptyBlockParents: Element[] | [];\n focusFieldValue: string | null;\n focusFieldReceivedInput: boolean;\n audienceMode: boolean;\n locale: string;\n variant: string | null;\n highlightVariantFields: boolean;\n variantOrder: string[];\n focusElementObserver: MutationObserver | null;\n referenceParentMap: Record<string, string>;\n isFocussed: boolean;\n}\n\nlet threadsPayload: IThreadDTO[] = [];\n\nexport class VisualBuilder {\n private customCursor: HTMLDivElement | null = null;\n private overlayWrapper: HTMLDivElement | null = null;\n private visualBuilderContainer: HTMLDivElement | null = null;\n private focusedToolbar: HTMLDivElement | null = null;\n\n static VisualBuilderGlobalState: Signal<VisualBuilderGlobalStateImpl> =\n signal({\n previousSelectedEditableDOM: null,\n previousHoveredTargetDOM: null,\n previousEmptyBlockParents: [],\n focusFieldValue: null,\n focusFieldReceivedInput: false,\n audienceMode: false,\n locale: Config.get().stackDetails.masterLocale || \"en-us\",\n variant: null,\n highlightVariantFields: false,\n variantOrder: [],\n focusElementObserver: null,\n referenceParentMap: {},\n isFocussed: false,\n });\n\n private handlePositionChange(editableElement: HTMLElement) {\n updateFocussedState({\n editableElement,\n visualBuilderContainer: this.visualBuilderContainer,\n overlayWrapper: this.overlayWrapper,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n }\n\n private scrollEventHandler = () => {\n updateCollabIconPosition();\n updatePopupPositions();\n updateSuggestionListPosition();\n updateHighlightedCommentIconPosition(); // Update icons position\n };\n\n private resizeEventHandler = () => {\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n updateHighlightedCommentIconPosition();\n updateCollabIconPosition();\n updatePopupPositions();\n updateSuggestionListPosition();\n if (previousSelectedEditableDOM) {\n this.handlePositionChange(\n previousSelectedEditableDOM as HTMLElement\n );\n }\n };\n\n private resizeObserver = new ResizeObserver(([entry]) => {\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n\n if (!this.overlayWrapper || !previousSelectedEditableDOM) {\n return;\n }\n\n // if previous selected editable element is not same as the current\n // target and the target is also not psuedo-editable then return\n if (\n !entry.target.isSameNode(previousSelectedEditableDOM) &&\n !entry.target.classList.contains(\n \"visual-builder__pseudo-editable-element\"\n )\n ) {\n return;\n }\n\n const isPsuedoEditableElement = entry.target.classList.contains(\n \"visual-builder__pseudo-editable-element\"\n );\n\n // the \"actual\" editable element when the current target is psuedo-editable\n // is the previous selected editable element instead of the closest data-cslp element\n // (cant use closest because the psuedo editable is absolute positioned)\n // (Note - why do we even need the closest? we do an early exit if entry.target\n // is not the previous selected editable element, needs more investigation)\n const editableElement = (\n isPsuedoEditableElement\n ? previousSelectedEditableDOM\n : entry.target.closest(\"[data-cslp]\")\n ) as HTMLElement | null;\n\n if (isPsuedoEditableElement) {\n // if the current target is psuedo-editable, then the resizing occurred by typing\n // into the psuedo editable, simply update the focus overlay\n addFocusOverlay(entry.target, this.overlayWrapper);\n\n // TODO check if we can now resize the actual editable element\n // when psuedo editable element is resized, avoid infinite loops\n } else if (editableElement) {\n this.handlePositionChange(editableElement);\n }\n\n // update the overlay if field is disabled\n const cslpData =\n editableElement && editableElement.getAttribute(\"data-cslp\");\n\n if (!editableElement || !isValidCslp(cslpData)) {\n return;\n }\n\n const fieldMetadata = extractDetailsFromCslp(cslpData);\n\n FieldSchemaMap.getFieldSchema(\n fieldMetadata.content_type_uid,\n fieldMetadata.fieldPath\n ).then((fieldSchema) => {\n if (!fieldSchema) {\n return;\n }\n const { isDisabled } = isFieldDisabled(fieldSchema, {\n editableElement,\n fieldMetadata,\n });\n if (isDisabled) {\n addFocusOverlay(\n editableElement,\n this.overlayWrapper as HTMLDivElement,\n isDisabled\n );\n }\n });\n });\n\n private mutationObserver = new MutationObserver(\n debounce(\n async () => {\n updateFocussedStateOnMutation(\n this.overlayWrapper,\n this.focusedToolbar,\n this.visualBuilderContainer,\n this.resizeObserver\n );\n\n const emptyBlockParents = Array.from(\n document.querySelectorAll(`.${VB_EmptyBlockParentClass}`)\n );\n\n const previousEmptyBlockParents = VisualBuilder\n .VisualBuilderGlobalState.value\n .previousEmptyBlockParents as Element[];\n\n if (!isEqual(emptyBlockParents, previousEmptyBlockParents)) {\n const noMoreEmptyBlockParent =\n previousEmptyBlockParents.filter(\n (x) => !emptyBlockParents.includes(x)\n );\n const newEmptyBlockParent = emptyBlockParents.filter(\n (x) => !previousEmptyBlockParents.includes(x)\n );\n\n removeEmptyBlocks(noMoreEmptyBlockParent);\n await generateEmptyBlocks(newEmptyBlockParent);\n\n VisualBuilder.VisualBuilderGlobalState.value = {\n ...VisualBuilder.VisualBuilderGlobalState.value,\n previousEmptyBlockParents: emptyBlockParents,\n };\n }\n if (VisualBuilder.VisualBuilderGlobalState.value.variant && VisualBuilder.VisualBuilderGlobalState.value.highlightVariantFields) {\n debounceAddVariantFieldClass(VisualBuilder.VisualBuilderGlobalState.value.variant);\n }\n },\n 100,\n { trailing: true }\n )\n );\n\n private threadMutationObserver = new MutationObserver(\n debounce(() => {\n const container = document.querySelector(\n \".visual-builder__container\"\n );\n if (container && threadsPayload) {\n const unrenderedThreads =\n filterUnrenderedThreads(threadsPayload);\n\n if (unrenderedThreads.length > 0) {\n processThreadsBatch(threadsPayload).then(\n (missingThreadIds) => {\n missingThreadIds.forEach(clearThreadStatus);\n if (missingThreadIds.length > 0) {\n handleMissingThreads({\n payload: { isElementPresent: false },\n threadUids: missingThreadIds,\n });\n }\n }\n );\n }\n\n threadsPayload = [];\n }\n }, 1000)\n );\n\n constructor() {\n // Handles changes in element positions due to sidebar toggling or window resizing,\n // triggering a redraw of the visual builder\n window.addEventListener(\"resize\", this.resizeEventHandler);\n window.addEventListener(\"scroll\", this.scrollEventHandler);\n initUI({\n resizeObserver: this.resizeObserver,\n });\n\n // Initializing goober for css-in-js\n setup(h);\n\n this.visualBuilderContainer = document.querySelector(\n \".visual-builder__container\"\n );\n this.overlayWrapper = document.querySelector(\n \".visual-builder__overlay__wrapper\"\n );\n this.customCursor = document.querySelector(\".visual-builder__cursor\");\n this.focusedToolbar = document.querySelector(\n \".visual-builder__focused-toolbar\"\n );\n\n const config = Config.get();\n\n if (!config.enable || config.mode < ILivePreviewModeConfig.BUILDER) {\n return;\n }\n\n visualBuilderPostMessage\n ?.send<IVisualBuilderInitEvent>(\"init\", {\n isSSR: config.ssr,\n href: window.location.href,\n })\n .then((data) => {\n const {\n windowType = ILivePreviewWindowType.BUILDER,\n stackDetails,\n collab,\n } = data || {};\n Config.set(\"windowType\", windowType);\n Config.set(\n \"stackDetails.masterLocale\",\n stackDetails?.masterLocale || \"en-us\"\n );\n\n if (collab) {\n Config.set(\"collab.enable\", collab.enable);\n Config.set(\"collab.isFeedbackMode\", collab.isFeedbackMode);\n Config.set(\"collab.inviteMetadata\", collab.inviteMetadata);\n }\n\n if (collab?.payload) {\n threadsPayload = collab?.payload;\n }\n\n addEventListeners({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n customCursor: this.customCursor,\n });\n\n this.threadMutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: false,\n });\n\n useHistoryPostMessageEvent();\n useCollab();\n\n if (windowType === ILivePreviewWindowType.BUILDER) {\n addKeyboardShortcuts({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n useScrollToField();\n useHighlightCommentIcon();\n\n this.mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n getHighlightVariantFieldsStatus().then((result) => {\n setHighlightVariantFields(result.highlightVariantFields);\n });\n visualBuilderPostMessage?.on(\n VisualBuilderPostMessageEvents.GET_ALL_ENTRIES_IN_CURRENT_PAGE,\n getEntryIdentifiersInCurrentPage\n );\n visualBuilderPostMessage?.send(\n VisualBuilderPostMessageEvents.SEND_VARIANT_AND_LOCALE\n );\n\n visualBuilderPostMessage?.on<{\n scroll: boolean;\n }>(\n VisualBuilderPostMessageEvents.TOGGLE_SCROLL,\n (event) => {\n if (!event.data.scroll) {\n document.body.style.overflow = \"hidden\";\n } else {\n document.body.style.overflow = \"auto\";\n\n }\n }\n );\n\n\n \n useHideFocusOverlayPostMessageEvent({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n });\n\n // These events are used to sync the data when we made some changes in the entry without invoking live preview module.\n useOnEntryUpdatePostMessageEvent();\n useRecalculateVariantDataCSLPValues();\n useDraftFieldsPostMessageEvent();\n useVariantFieldsPostMessageEvent({ isSSR: config.ssr ?? false });\n }\n })\n .catch(() => {\n if (!inIframe()) {\n generateStartEditingButton();\n }\n });\n }\n\n // TODO: write test cases\n destroy = (): void => {\n // Remove event listeners\n window.removeEventListener(\"resize\", this.resizeEventHandler);\n window.removeEventListener(\"scroll\", this.scrollEventHandler);\n\n // Remove custom event listeners\n removeEventListeners({\n overlayWrapper: this.overlayWrapper,\n visualBuilderContainer: this.visualBuilderContainer,\n previousSelectedEditableDOM:\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM,\n focusedToolbar: this.focusedToolbar,\n resizeObserver: this.resizeObserver,\n customCursor: this.customCursor,\n });\n\n // Disconnect observers\n this.resizeObserver.disconnect();\n this.mutationObserver.disconnect();\n this.threadMutationObserver.disconnect();\n\n // Clear global state\n VisualBuilder.VisualBuilderGlobalState.value = {\n previousSelectedEditableDOM: null,\n previousHoveredTargetDOM: null,\n previousEmptyBlockParents: [],\n focusFieldValue: null,\n focusFieldReceivedInput: false,\n audienceMode: false,\n locale: \"en-us\",\n variant: null,\n highlightVariantFields: false,\n variantOrder: [],\n focusElementObserver: null,\n referenceParentMap: {},\n isFocussed: false,\n };\n\n // Remove DOM elements\n if (this.visualBuilderContainer) {\n window.document.body.removeChild(this.visualBuilderContainer);\n }\n if (this.customCursor) {\n this.customCursor.remove();\n }\n if (this.overlayWrapper) {\n this.overlayWrapper.remove();\n }\n if (this.focusedToolbar) {\n this.focusedToolbar.remove();\n }\n\n // Nullify references\n this.customCursor = null;\n this.overlayWrapper = null;\n this.visualBuilderContainer = null;\n this.focusedToolbar = null;\n };\n}\n"],"mappings":"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","names":["_a"]}
|
|
@@ -37,6 +37,7 @@ __export(mouseClick_exports, {
|
|
|
37
37
|
module.exports = __toCommonJS(mouseClick_exports);
|
|
38
38
|
var import_handleIndividualFields = require("../utils/handleIndividualFields.cjs");
|
|
39
39
|
var import_getCsDataOfElement = require("../utils/getCsDataOfElement.cjs");
|
|
40
|
+
var import_cslp = require("../../cslp/index.cjs");
|
|
40
41
|
var import_generateToolbar = require("../generators/generateToolbar.cjs");
|
|
41
42
|
var import_generateOverlay = require("../generators/generateOverlay.cjs");
|
|
42
43
|
var import_visualBuilderPostMessage = __toESM(require("../utils/visualBuilderPostMessage.cjs"), 1);
|
|
@@ -79,16 +80,19 @@ async function handleBuilderInteraction(params) {
|
|
|
79
80
|
const eventTarget = params.event.target;
|
|
80
81
|
const isAnchorElement = eventTarget instanceof HTMLAnchorElement;
|
|
81
82
|
const elementHasCslp = eventTarget && (eventTarget.hasAttribute("data-cslp") || eventTarget.closest("[data-cslp]"));
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
ele.
|
|
90
|
-
|
|
91
|
-
|
|
83
|
+
const eventTargetCslp = eventTarget == null ? void 0 : eventTarget.getAttribute("data-cslp");
|
|
84
|
+
if ((0, import_cslp.isValidCslp)(eventTargetCslp)) {
|
|
85
|
+
const duplicates = document.querySelectorAll(
|
|
86
|
+
`[data-cslp="${eventTargetCslp}"]`
|
|
87
|
+
);
|
|
88
|
+
if (duplicates.length > 1) {
|
|
89
|
+
duplicates.forEach((ele) => {
|
|
90
|
+
if (!ele.hasAttribute("data-cslp-unique-id")) {
|
|
91
|
+
const uniqueId = `cslp-${(0, import_uuid.v4)()}`;
|
|
92
|
+
ele.setAttribute("data-cslp-unique-id", uniqueId);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
92
96
|
}
|
|
93
97
|
if ((eventTarget == null ? void 0 : eventTarget.getAttribute("data-studio-ui")) === "true") {
|
|
94
98
|
return;
|
|
@@ -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\";\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 duplicates = document.querySelectorAll(\n `[data-cslp=\"${eventTarget?.getAttribute(\"data-cslp\")}\"]`\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 // 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":["import__","import_generateThread","uuidV4","Config","getXPath","visualBuilderPostMessage"]}
|
|
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":["import__","import_generateThread","uuidV4","Config","getXPath","visualBuilderPostMessage"]}
|