@contentstack/live-preview-utils 3.0.0 → 3.0.1
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/livePreview/editButton/editButton.style.cjs +0 -1
- package/dist/legacy/livePreview/editButton/editButton.style.cjs.map +1 -1
- package/dist/legacy/livePreview/editButton/editButton.style.js +0 -1
- package/dist/legacy/livePreview/editButton/editButton.style.js.map +1 -1
- package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.cjs +1 -1
- package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.js +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/visualBuilder/components/FieldToolbar.cjs +9 -0
- package/dist/legacy/visualBuilder/components/FieldToolbar.cjs.map +1 -1
- package/dist/legacy/visualBuilder/components/FieldToolbar.d.cts +1 -0
- package/dist/legacy/visualBuilder/components/FieldToolbar.d.ts +1 -0
- package/dist/legacy/visualBuilder/components/FieldToolbar.js +9 -0
- package/dist/legacy/visualBuilder/components/FieldToolbar.js.map +1 -1
- package/dist/legacy/visualBuilder/components/pseudoEditableField.cjs +6 -13
- package/dist/legacy/visualBuilder/components/pseudoEditableField.cjs.map +1 -1
- package/dist/legacy/visualBuilder/components/pseudoEditableField.js +6 -13
- package/dist/legacy/visualBuilder/components/pseudoEditableField.js.map +1 -1
- package/dist/legacy/visualBuilder/eventManager/useVariantsPostMessageEvent.cjs +25 -13
- package/dist/legacy/visualBuilder/eventManager/useVariantsPostMessageEvent.cjs.map +1 -1
- package/dist/legacy/visualBuilder/eventManager/useVariantsPostMessageEvent.js +25 -13
- package/dist/legacy/visualBuilder/eventManager/useVariantsPostMessageEvent.js.map +1 -1
- package/dist/legacy/visualBuilder/generators/generateToolbar.cjs +5 -4
- package/dist/legacy/visualBuilder/generators/generateToolbar.cjs.map +1 -1
- package/dist/legacy/visualBuilder/generators/generateToolbar.d.cts +2 -2
- package/dist/legacy/visualBuilder/generators/generateToolbar.d.ts +2 -2
- package/dist/legacy/visualBuilder/generators/generateToolbar.js +5 -4
- package/dist/legacy/visualBuilder/generators/generateToolbar.js.map +1 -1
- package/dist/legacy/visualBuilder/index.cjs +2 -1
- package/dist/legacy/visualBuilder/index.cjs.map +1 -1
- package/dist/legacy/visualBuilder/index.js +2 -1
- package/dist/legacy/visualBuilder/index.js.map +1 -1
- package/dist/legacy/visualBuilder/listeners/mouseClick.cjs +10 -2
- package/dist/legacy/visualBuilder/listeners/mouseClick.cjs.map +1 -1
- package/dist/legacy/visualBuilder/listeners/mouseClick.d.cts +3 -1
- package/dist/legacy/visualBuilder/listeners/mouseClick.d.ts +3 -1
- package/dist/legacy/visualBuilder/listeners/mouseClick.js +11 -3
- package/dist/legacy/visualBuilder/listeners/mouseClick.js.map +1 -1
- package/dist/legacy/visualBuilder/utils/getPsuedoEditableStylesElement.cjs +56 -0
- package/dist/legacy/visualBuilder/utils/getPsuedoEditableStylesElement.cjs.map +1 -0
- package/dist/legacy/visualBuilder/utils/getPsuedoEditableStylesElement.d.cts +5 -0
- package/dist/legacy/visualBuilder/utils/getPsuedoEditableStylesElement.d.ts +5 -0
- package/dist/legacy/visualBuilder/utils/getPsuedoEditableStylesElement.js +23 -0
- package/dist/legacy/visualBuilder/utils/getPsuedoEditableStylesElement.js.map +1 -0
- package/dist/legacy/visualBuilder/utils/getStyleOfAnElement.cjs +2 -0
- package/dist/legacy/visualBuilder/utils/getStyleOfAnElement.cjs.map +1 -1
- package/dist/legacy/visualBuilder/utils/getStyleOfAnElement.js +2 -0
- package/dist/legacy/visualBuilder/utils/getStyleOfAnElement.js.map +1 -1
- package/dist/legacy/visualBuilder/utils/handleIndividualFields.cjs +2 -2
- package/dist/legacy/visualBuilder/utils/handleIndividualFields.cjs.map +1 -1
- package/dist/legacy/visualBuilder/utils/handleIndividualFields.js +2 -2
- package/dist/legacy/visualBuilder/utils/handleIndividualFields.js.map +1 -1
- package/dist/legacy/visualBuilder/utils/updateFocussedState.cjs +48 -17
- package/dist/legacy/visualBuilder/utils/updateFocussedState.cjs.map +1 -1
- package/dist/legacy/visualBuilder/utils/updateFocussedState.d.cts +2 -2
- package/dist/legacy/visualBuilder/utils/updateFocussedState.d.ts +2 -2
- package/dist/legacy/visualBuilder/utils/updateFocussedState.js +58 -19
- package/dist/legacy/visualBuilder/utils/updateFocussedState.js.map +1 -1
- package/dist/modern/livePreview/editButton/editButton.style.cjs +0 -1
- package/dist/modern/livePreview/editButton/editButton.style.cjs.map +1 -1
- package/dist/modern/livePreview/editButton/editButton.style.js +0 -1
- package/dist/modern/livePreview/editButton/editButton.style.js.map +1 -1
- package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.cjs +1 -1
- package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.js +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/visualBuilder/components/FieldToolbar.cjs +7 -0
- package/dist/modern/visualBuilder/components/FieldToolbar.cjs.map +1 -1
- package/dist/modern/visualBuilder/components/FieldToolbar.d.cts +1 -0
- package/dist/modern/visualBuilder/components/FieldToolbar.d.ts +1 -0
- package/dist/modern/visualBuilder/components/FieldToolbar.js +7 -0
- package/dist/modern/visualBuilder/components/FieldToolbar.js.map +1 -1
- package/dist/modern/visualBuilder/components/pseudoEditableField.cjs +6 -13
- package/dist/modern/visualBuilder/components/pseudoEditableField.cjs.map +1 -1
- package/dist/modern/visualBuilder/components/pseudoEditableField.js +6 -13
- package/dist/modern/visualBuilder/components/pseudoEditableField.js.map +1 -1
- package/dist/modern/visualBuilder/eventManager/useVariantsPostMessageEvent.cjs +24 -13
- package/dist/modern/visualBuilder/eventManager/useVariantsPostMessageEvent.cjs.map +1 -1
- package/dist/modern/visualBuilder/eventManager/useVariantsPostMessageEvent.js +24 -13
- package/dist/modern/visualBuilder/eventManager/useVariantsPostMessageEvent.js.map +1 -1
- package/dist/modern/visualBuilder/generators/generateToolbar.cjs +5 -4
- package/dist/modern/visualBuilder/generators/generateToolbar.cjs.map +1 -1
- package/dist/modern/visualBuilder/generators/generateToolbar.d.cts +2 -2
- package/dist/modern/visualBuilder/generators/generateToolbar.d.ts +2 -2
- package/dist/modern/visualBuilder/generators/generateToolbar.js +5 -4
- package/dist/modern/visualBuilder/generators/generateToolbar.js.map +1 -1
- package/dist/modern/visualBuilder/index.cjs +2 -1
- package/dist/modern/visualBuilder/index.cjs.map +1 -1
- package/dist/modern/visualBuilder/index.js +2 -1
- package/dist/modern/visualBuilder/index.js.map +1 -1
- package/dist/modern/visualBuilder/listeners/mouseClick.cjs +10 -2
- package/dist/modern/visualBuilder/listeners/mouseClick.cjs.map +1 -1
- package/dist/modern/visualBuilder/listeners/mouseClick.d.cts +3 -1
- package/dist/modern/visualBuilder/listeners/mouseClick.d.ts +3 -1
- package/dist/modern/visualBuilder/listeners/mouseClick.js +11 -3
- package/dist/modern/visualBuilder/listeners/mouseClick.js.map +1 -1
- package/dist/modern/visualBuilder/utils/getPsuedoEditableStylesElement.cjs +56 -0
- package/dist/modern/visualBuilder/utils/getPsuedoEditableStylesElement.cjs.map +1 -0
- package/dist/modern/visualBuilder/utils/getPsuedoEditableStylesElement.d.cts +5 -0
- package/dist/modern/visualBuilder/utils/getPsuedoEditableStylesElement.d.ts +5 -0
- package/dist/modern/visualBuilder/utils/getPsuedoEditableStylesElement.js +23 -0
- package/dist/modern/visualBuilder/utils/getPsuedoEditableStylesElement.js.map +1 -0
- package/dist/modern/visualBuilder/utils/getStyleOfAnElement.cjs +2 -0
- package/dist/modern/visualBuilder/utils/getStyleOfAnElement.cjs.map +1 -1
- package/dist/modern/visualBuilder/utils/getStyleOfAnElement.js +2 -0
- package/dist/modern/visualBuilder/utils/getStyleOfAnElement.js.map +1 -1
- package/dist/modern/visualBuilder/utils/handleIndividualFields.cjs +2 -2
- package/dist/modern/visualBuilder/utils/handleIndividualFields.cjs.map +1 -1
- package/dist/modern/visualBuilder/utils/handleIndividualFields.js +2 -2
- package/dist/modern/visualBuilder/utils/handleIndividualFields.js.map +1 -1
- package/dist/modern/visualBuilder/utils/updateFocussedState.cjs +48 -17
- package/dist/modern/visualBuilder/utils/updateFocussedState.cjs.map +1 -1
- package/dist/modern/visualBuilder/utils/updateFocussedState.d.cts +2 -2
- package/dist/modern/visualBuilder/utils/updateFocussedState.d.ts +2 -2
- package/dist/modern/visualBuilder/utils/updateFocussedState.js +58 -19
- package/dist/modern/visualBuilder/utils/updateFocussedState.js.map +1 -1
- package/package.json +1 -1
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
getDOMEditStack
|
|
11
11
|
} from "../utils/getCsDataOfElement.js";
|
|
12
12
|
import { appendFocusedToolbar } from "../generators/generateToolbar.js";
|
|
13
|
-
import { addFocusOverlay } from "../generators/generateOverlay.js";
|
|
13
|
+
import { addFocusOverlay, hideOverlay } from "../generators/generateOverlay.js";
|
|
14
14
|
import visualBuilderPostMessage from "../utils/visualBuilderPostMessage.js";
|
|
15
15
|
import { VisualBuilderPostMessageEvents } from "../utils/types/postMessage.types.js";
|
|
16
16
|
import { VisualBuilder } from "../index.js";
|
|
@@ -29,7 +29,7 @@ function addOverlay(params) {
|
|
|
29
29
|
function addFocusedToolbar(params) {
|
|
30
30
|
const { editableElement } = params.eventDetails;
|
|
31
31
|
if (!editableElement || !params.focusedToolbar) return;
|
|
32
|
-
appendFocusedToolbar(params.eventDetails, params.focusedToolbar);
|
|
32
|
+
appendFocusedToolbar(params.eventDetails, params.focusedToolbar, params.hideOverlay);
|
|
33
33
|
}
|
|
34
34
|
async function handleBuilderInteraction(params) {
|
|
35
35
|
var _a, _b;
|
|
@@ -76,7 +76,15 @@ async function handleBuilderInteraction(params) {
|
|
|
76
76
|
});
|
|
77
77
|
addFocusedToolbar({
|
|
78
78
|
eventDetails,
|
|
79
|
-
focusedToolbar: params.focusedToolbar
|
|
79
|
+
focusedToolbar: params.focusedToolbar,
|
|
80
|
+
hideOverlay: () => {
|
|
81
|
+
hideOverlay({
|
|
82
|
+
visualBuilderContainer: params.visualBuilderContainer,
|
|
83
|
+
visualBuilderOverlayWrapper: params.overlayWrapper,
|
|
84
|
+
focusedToolbar: params.focusedToolbar,
|
|
85
|
+
resizeObserver: params.resizeObserver
|
|
86
|
+
});
|
|
87
|
+
}
|
|
80
88
|
});
|
|
81
89
|
const { content_type_uid, fieldPath, cslpValue } = fieldMetadata;
|
|
82
90
|
toggleHighlightedCommentIconDisplay(cslpValue, false);
|
|
@@ -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\";\n\ntype HandleBuilderInteractionParams = Omit<\n EventListenerHandlerParams,\n \"eventDetails\" | \"customCursor\"\n>;\n\ntype AddFocusOverlayParams = Pick<\n EventListenerHandlerParams,\n \"overlayWrapper\" | \"resizeObserver\"\n> & { editableElement: Element; isFieldDisabled?: boolean };\n\ntype AddFocusedToolbarParams = Pick<\n EventListenerHandlerParams,\n \"eventDetails\" | \"focusedToolbar\"\n
|
|
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\";\n\ntype HandleBuilderInteractionParams = Omit<\n EventListenerHandlerParams,\n \"eventDetails\" | \"customCursor\"\n>;\n\ntype AddFocusOverlayParams = Pick<\n EventListenerHandlerParams,\n \"overlayWrapper\" | \"resizeObserver\"\n> & { editableElement: Element; isFieldDisabled?: boolean };\n\ntype AddFocusedToolbarParams = Pick<\n EventListenerHandlerParams,\n \"eventDetails\" | \"focusedToolbar\"\n> & { hideOverlay: () => void };\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(params.eventDetails, params.focusedToolbar, params.hideOverlay);\n}\n\nasync 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 // 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 eventDetails = getCsDataOfElement(params.event);\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 if (\n !eventDetails ||\n !params.overlayWrapper ||\n !params.visualBuilderContainer\n ) {\n return;\n }\n const { editableElement, fieldMetadata } = eventDetails;\n\n if (\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM &&\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM !== editableElement\n ) {\n cleanIndividualFieldResidual({\n overlayWrapper: params.overlayWrapper,\n visualBuilderContainer: params.visualBuilderContainer,\n focusedToolbar: params.focusedToolbar,\n resizeObserver: params.resizeObserver,\n });\n }\n\n // if the selected element is our empty block element, return\n if (\n editableElement.classList.contains(\n \"visual-builder__empty-block-parent\"\n ) ||\n editableElement.classList.contains(\"visual-builder__empty-block\")\n ) {\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 previousSelectedElement &&\n previousSelectedElement === editableElement\n ) {\n return;\n }\n\n VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM =\n editableElement;\n\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 });\n\n const { content_type_uid, fieldPath, cslpValue } = fieldMetadata;\n\n toggleHighlightedCommentIconDisplay(cslpValue, false);\n\n const fieldSchema = await FieldSchemaMap.getFieldSchema(\n content_type_uid,\n fieldPath\n );\n\n if (fieldSchema) {\n // after field schema is available re-add disabled overlay\n const { isDisabled } = isFieldDisabled(fieldSchema, eventDetails);\n if (isDisabled) {\n addOverlay({\n overlayWrapper: params.overlayWrapper,\n resizeObserver: params.resizeObserver,\n editableElement: editableElement,\n isFieldDisabled: true,\n });\n }\n }\n\n // This is most probably redundant code, as the handleIndividualFields function\n // takes care of this\n // TODO: Remove this\n // if (\n // fieldSchema.data_type === \"block\" ||\n // fieldSchema.multiple ||\n // (fieldSchema.data_type === \"reference\" &&\n // // @ts-ignore\n // fieldSchema.field_metadata.ref_multiple)\n // ) {\n // handleAddButtonsForMultiple(eventDetails, {\n // editableElement: editableElement,\n // visualBuilderContainer: params.visualBuilderContainer,\n // resizeObserver: params.resizeObserver,\n // });\n // } else {\n // removeAddInstanceButtons({\n // eventTarget: params.event.target,\n // visualBuilderContainer: params.visualBuilderContainer,\n // overlayWrapper: params.overlayWrapper,\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}\n\nexport default handleBuilderInteraction;\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/visualBuilder/utils/getPsuedoEditableStylesElement.ts
|
|
31
|
+
var getPsuedoEditableStylesElement_exports = {};
|
|
32
|
+
__export(getPsuedoEditableStylesElement_exports, {
|
|
33
|
+
getPsuedoEditableElementStyles: () => getPsuedoEditableElementStyles
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(getPsuedoEditableStylesElement_exports);
|
|
36
|
+
var import_getCamelCaseStyles = __toESM(require("./getCamelCaseStyles.cjs"), 1);
|
|
37
|
+
var import_getStyleOfAnElement = __toESM(require("./getStyleOfAnElement.cjs"), 1);
|
|
38
|
+
function getPsuedoEditableElementStyles(psuedoEditableElement, camelCase) {
|
|
39
|
+
let styles = (0, import_getStyleOfAnElement.default)(psuedoEditableElement);
|
|
40
|
+
if (camelCase) {
|
|
41
|
+
styles = (0, import_getCamelCaseStyles.default)(styles);
|
|
42
|
+
}
|
|
43
|
+
const rect = psuedoEditableElement.getBoundingClientRect();
|
|
44
|
+
styles.position = "absolute";
|
|
45
|
+
styles.top = `${rect.top + window.scrollY}px`;
|
|
46
|
+
styles.left = `${rect.left + window.scrollX}px`;
|
|
47
|
+
styles.height = "auto";
|
|
48
|
+
styles.whiteSpace = "pre-line";
|
|
49
|
+
styles.textTransform = "none";
|
|
50
|
+
return styles;
|
|
51
|
+
}
|
|
52
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
53
|
+
0 && (module.exports = {
|
|
54
|
+
getPsuedoEditableElementStyles
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=getPsuedoEditableStylesElement.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/visualBuilder/utils/getPsuedoEditableStylesElement.ts"],"sourcesContent":["import getCamelCaseStyles from \"./getCamelCaseStyles\";\nimport getStyleOfAnElement from \"./getStyleOfAnElement\";\n\nexport function getPsuedoEditableElementStyles(\n psuedoEditableElement: HTMLElement,\n camelCase?: boolean\n): { [key: string]: string } {\n let styles = getStyleOfAnElement(psuedoEditableElement);\n if (camelCase) {\n styles = getCamelCaseStyles(styles);\n }\n // Get the offsetTop and offsetLeft of the editable element and set the position of the pseudo editable element\n // The pseudo editable element is positioned absolutely at the same location as the editable element\n const rect = psuedoEditableElement.getBoundingClientRect();\n\n styles.position = \"absolute\";\n styles.top = `${rect.top + window.scrollY}px`;\n styles.left = `${rect.left + window.scrollX}px`;\n // setting height to auto so that the element can grow based on the content\n // and the resize observer can detect the change in height\n styles.height = \"auto\";\n styles.whiteSpace = \"pre-line\";\n styles.textTransform = \"none\";\n\n return styles;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAA+B;AAC/B,iCAAgC;AAEzB,SAAS,+BACZ,uBACA,WACyB;AACzB,MAAI,aAAS,2BAAAA,SAAoB,qBAAqB;AACtD,MAAI,WAAW;AACX,iBAAS,0BAAAC,SAAmB,MAAM;AAAA,EACtC;AAGA,QAAM,OAAO,sBAAsB,sBAAsB;AAEzD,SAAO,WAAW;AAClB,SAAO,MAAM,GAAG,KAAK,MAAM,OAAO,OAAO;AACzC,SAAO,OAAO,GAAG,KAAK,OAAO,OAAO,OAAO;AAG3C,SAAO,SAAS;AAChB,SAAO,aAAa;AACpB,SAAO,gBAAgB;AAEvB,SAAO;AACX;","names":["getStyleOfAnElement","getCamelCaseStyles"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import "../../chunk-5WRI5ZAA.js";
|
|
2
|
+
|
|
3
|
+
// src/visualBuilder/utils/getPsuedoEditableStylesElement.ts
|
|
4
|
+
import getCamelCaseStyles from "./getCamelCaseStyles.js";
|
|
5
|
+
import getStyleOfAnElement from "./getStyleOfAnElement.js";
|
|
6
|
+
function getPsuedoEditableElementStyles(psuedoEditableElement, camelCase) {
|
|
7
|
+
let styles = getStyleOfAnElement(psuedoEditableElement);
|
|
8
|
+
if (camelCase) {
|
|
9
|
+
styles = getCamelCaseStyles(styles);
|
|
10
|
+
}
|
|
11
|
+
const rect = psuedoEditableElement.getBoundingClientRect();
|
|
12
|
+
styles.position = "absolute";
|
|
13
|
+
styles.top = `${rect.top + window.scrollY}px`;
|
|
14
|
+
styles.left = `${rect.left + window.scrollX}px`;
|
|
15
|
+
styles.height = "auto";
|
|
16
|
+
styles.whiteSpace = "pre-line";
|
|
17
|
+
styles.textTransform = "none";
|
|
18
|
+
return styles;
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
getPsuedoEditableElementStyles
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=getPsuedoEditableStylesElement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/visualBuilder/utils/getPsuedoEditableStylesElement.ts"],"sourcesContent":["import getCamelCaseStyles from \"./getCamelCaseStyles\";\nimport getStyleOfAnElement from \"./getStyleOfAnElement\";\n\nexport function getPsuedoEditableElementStyles(\n psuedoEditableElement: HTMLElement,\n camelCase?: boolean\n): { [key: string]: string } {\n let styles = getStyleOfAnElement(psuedoEditableElement);\n if (camelCase) {\n styles = getCamelCaseStyles(styles);\n }\n // Get the offsetTop and offsetLeft of the editable element and set the position of the pseudo editable element\n // The pseudo editable element is positioned absolutely at the same location as the editable element\n const rect = psuedoEditableElement.getBoundingClientRect();\n\n styles.position = \"absolute\";\n styles.top = `${rect.top + window.scrollY}px`;\n styles.left = `${rect.left + window.scrollX}px`;\n // setting height to auto so that the element can grow based on the content\n // and the resize observer can detect the change in height\n styles.height = \"auto\";\n styles.whiteSpace = \"pre-line\";\n styles.textTransform = \"none\";\n\n return styles;\n}\n"],"mappings":";;;AAAA,OAAO,wBAAwB;AAC/B,OAAO,yBAAyB;AAEzB,SAAS,+BACZ,uBACA,WACyB;AACzB,MAAI,SAAS,oBAAoB,qBAAqB;AACtD,MAAI,WAAW;AACX,aAAS,mBAAmB,MAAM;AAAA,EACtC;AAGA,QAAM,OAAO,sBAAsB,sBAAsB;AAEzD,SAAO,WAAW;AAClB,SAAO,MAAM,GAAG,KAAK,MAAM,OAAO,OAAO;AACzC,SAAO,OAAO,GAAG,KAAK,OAAO,OAAO,OAAO;AAG3C,SAAO,SAAS;AAChB,SAAO,aAAa;AACpB,SAAO,gBAAgB;AAEvB,SAAO;AACX;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/visualBuilder/utils/getStyleOfAnElement.ts"],"sourcesContent":["/**\n * Retrieves the computed style of an HTML element.\n *\n * @param element - The HTML element to retrieve the style from.\n * @returns An object representing the computed style of the element.\n */\nexport default function getStyleOfAnElement(element: HTMLElement): {\n [key: string]: string;\n} {\n const styleSheetDeclaration = window.getComputedStyle(element);\n const styleSheetArray = Array.from(styleSheetDeclaration);\n\n const FILTER_STYLES = [\n \"position\",\n \"left\",\n \"top\",\n \"right\",\n \"bottom\",\n \"text-overflow\",\n \"margin\",\n \"margin-block-end\",\n \"margin-block-start\",\n \"margin-inline-end\",\n \"margin-inline-start\",\n \"margin-left\",\n \"margin-right\",\n \"margin-top\",\n \"margin-bottom\",\n \"-webkit-user-modify\",\n \"cursor\",\n ];\n\n const styles: { [key: string]: string } = {};\n styleSheetArray.forEach((style: string) => {\n if (!FILTER_STYLES.includes(style)) {\n const styleValue = styleSheetDeclaration.getPropertyValue(style);\n styles[style] = styleValue;\n }\n });\n\n return styles;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMe,SAAR,oBAAqC,SAE1C;AACE,QAAM,wBAAwB,OAAO,iBAAiB,OAAO;AAC7D,QAAM,kBAAkB,MAAM,KAAK,qBAAqB;AAExD,QAAM,gBAAgB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,SAAoC,CAAC;AAC3C,kBAAgB,QAAQ,CAAC,UAAkB;AACvC,QAAI,CAAC,cAAc,SAAS,KAAK,GAAG;AAChC,YAAM,aAAa,sBAAsB,iBAAiB,KAAK;AAC/D,aAAO,KAAK,IAAI;AAAA,IACpB;AAAA,EACJ,CAAC;AAED,SAAO;AACX;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/visualBuilder/utils/getStyleOfAnElement.ts"],"sourcesContent":["/**\n * Retrieves the computed style of an HTML element.\n *\n * @param element - The HTML element to retrieve the style from.\n * @returns An object representing the computed style of the element.\n */\nexport default function getStyleOfAnElement(element: HTMLElement): {\n [key: string]: string;\n} {\n const styleSheetDeclaration = window.getComputedStyle(element);\n const styleSheetArray = Array.from(styleSheetDeclaration);\n\n const FILTER_STYLES = [\n \"position\",\n \"left\",\n \"top\",\n \"right\",\n \"bottom\",\n \"text-overflow\",\n // allows seeing the text from CMS field as-is\n \"text-transform\",\n \"margin\",\n \"margin-block-end\",\n \"margin-block-start\",\n \"margin-inline-end\",\n \"margin-inline-start\",\n \"margin-left\",\n \"margin-right\",\n \"margin-top\",\n \"margin-bottom\",\n \"-webkit-user-modify\",\n \"cursor\",\n ];\n\n const styles: { [key: string]: string } = {};\n styleSheetArray.forEach((style: string) => {\n if (!FILTER_STYLES.includes(style)) {\n const styleValue = styleSheetDeclaration.getPropertyValue(style);\n styles[style] = styleValue;\n }\n });\n\n return styles;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMe,SAAR,oBAAqC,SAE1C;AACE,QAAM,wBAAwB,OAAO,iBAAiB,OAAO;AAC7D,QAAM,kBAAkB,MAAM,KAAK,qBAAqB;AAExD,QAAM,gBAAgB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,SAAoC,CAAC;AAC3C,kBAAgB,QAAQ,CAAC,UAAkB;AACvC,QAAI,CAAC,cAAc,SAAS,KAAK,GAAG;AAChC,YAAM,aAAa,sBAAsB,iBAAiB,KAAK;AAC/D,aAAO,KAAK,IAAI;AAAA,IACpB;AAAA,EACJ,CAAC;AAED,SAAO;AACX;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/visualBuilder/utils/getStyleOfAnElement.ts"],"sourcesContent":["/**\n * Retrieves the computed style of an HTML element.\n *\n * @param element - The HTML element to retrieve the style from.\n * @returns An object representing the computed style of the element.\n */\nexport default function getStyleOfAnElement(element: HTMLElement): {\n [key: string]: string;\n} {\n const styleSheetDeclaration = window.getComputedStyle(element);\n const styleSheetArray = Array.from(styleSheetDeclaration);\n\n const FILTER_STYLES = [\n \"position\",\n \"left\",\n \"top\",\n \"right\",\n \"bottom\",\n \"text-overflow\",\n \"margin\",\n \"margin-block-end\",\n \"margin-block-start\",\n \"margin-inline-end\",\n \"margin-inline-start\",\n \"margin-left\",\n \"margin-right\",\n \"margin-top\",\n \"margin-bottom\",\n \"-webkit-user-modify\",\n \"cursor\",\n ];\n\n const styles: { [key: string]: string } = {};\n styleSheetArray.forEach((style: string) => {\n if (!FILTER_STYLES.includes(style)) {\n const styleValue = styleSheetDeclaration.getPropertyValue(style);\n styles[style] = styleValue;\n }\n });\n\n return styles;\n}\n"],"mappings":";;;AAMe,SAAR,oBAAqC,SAE1C;AACE,QAAM,wBAAwB,OAAO,iBAAiB,OAAO;AAC7D,QAAM,kBAAkB,MAAM,KAAK,qBAAqB;AAExD,QAAM,gBAAgB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,SAAoC,CAAC;AAC3C,kBAAgB,QAAQ,CAAC,UAAkB;AACvC,QAAI,CAAC,cAAc,SAAS,KAAK,GAAG;AAChC,YAAM,aAAa,sBAAsB,iBAAiB,KAAK;AAC/D,aAAO,KAAK,IAAI;AAAA,IACpB;AAAA,EACJ,CAAC;AAED,SAAO;AACX;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/visualBuilder/utils/getStyleOfAnElement.ts"],"sourcesContent":["/**\n * Retrieves the computed style of an HTML element.\n *\n * @param element - The HTML element to retrieve the style from.\n * @returns An object representing the computed style of the element.\n */\nexport default function getStyleOfAnElement(element: HTMLElement): {\n [key: string]: string;\n} {\n const styleSheetDeclaration = window.getComputedStyle(element);\n const styleSheetArray = Array.from(styleSheetDeclaration);\n\n const FILTER_STYLES = [\n \"position\",\n \"left\",\n \"top\",\n \"right\",\n \"bottom\",\n \"text-overflow\",\n // allows seeing the text from CMS field as-is\n \"text-transform\",\n \"margin\",\n \"margin-block-end\",\n \"margin-block-start\",\n \"margin-inline-end\",\n \"margin-inline-start\",\n \"margin-left\",\n \"margin-right\",\n \"margin-top\",\n \"margin-bottom\",\n \"-webkit-user-modify\",\n \"cursor\",\n ];\n\n const styles: { [key: string]: string } = {};\n styleSheetArray.forEach((style: string) => {\n if (!FILTER_STYLES.includes(style)) {\n const styleValue = styleSheetDeclaration.getPropertyValue(style);\n styles[style] = styleValue;\n }\n });\n\n return styles;\n}\n"],"mappings":";;;AAMe,SAAR,oBAAqC,SAE1C;AACE,QAAM,wBAAwB,OAAO,iBAAiB,OAAO;AAC7D,QAAM,kBAAkB,MAAM,KAAK,qBAAqB;AAExD,QAAM,gBAAgB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,SAAoC,CAAC;AAC3C,kBAAgB,QAAQ,CAAC,UAAkB;AACvC,QAAI,CAAC,cAAc,SAAS,KAAK,GAAG;AAChC,YAAM,aAAa,sBAAsB,iBAAiB,KAAK;AAC/D,aAAO,KAAK,IAAI;AAAA,IACpB;AAAA,EACJ,CAAC;AAED,SAAO;AACX;","names":[]}
|
|
@@ -148,8 +148,8 @@ async function handleIndividualFields(eventDetails, elements) {
|
|
|
148
148
|
editableElement: actualEditableField,
|
|
149
149
|
visualBuilderContainer: visualBuilderContainer2,
|
|
150
150
|
overlayWrapper,
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
focusedToolbar,
|
|
152
|
+
resizeObserver
|
|
153
153
|
});
|
|
154
154
|
}, 200);
|
|
155
155
|
actualEditableField.addEventListener(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/visualBuilder/utils/handleIndividualFields.ts"],"sourcesContent":["import { debounce, throttle } from \"lodash-es\";\nimport { VisualBuilder } from \"..\";\nimport {\n generatePseudoEditableElement,\n isEllipsisActive,\n} from \"../generators/generatePseudoEditableField\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport {\n ALLOWED_INLINE_EDITABLE_FIELD,\n VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY,\n} from \"./constants\";\nimport { FieldSchemaMap } from \"./fieldSchemaMap\";\nimport { getFieldData } from \"./getFieldData\";\nimport { getFieldType } from \"./getFieldType\";\nimport { handleFieldInput, handleFieldKeyDown } from \"./handleFieldMouseDown\";\nimport { isFieldDisabled } from \"./isFieldDisabled\";\nimport visualBuilderPostMessage from \"./visualBuilderPostMessage\";\nimport {\n handleAddButtonsForMultiple,\n removeAddInstanceButtons,\n} from \"./multipleElementAddButton\";\nimport { VisualBuilderPostMessageEvents } from \"./types/postMessage.types\";\nimport { updateFocussedState } from \"./updateFocussedState\";\nimport { FieldDataType } from \"./types/index.types\";\nimport { getMultilinePlaintext } from \"./getMultilinePlaintext\";\n\n/**\n * It handles all the fields based on their data type and its \"multiple\" property.\n * @param eventDetails The event details object that contain cslp and field metadata.\n * @param elements The elements object that contain the visual builder wrapper.\n */\nexport async function handleIndividualFields(\n eventDetails: VisualBuilderCslpEventDetails,\n elements: {\n visualBuilderContainer: HTMLDivElement;\n resizeObserver: ResizeObserver;\n lastEditedField: Element | null;\n }\n): Promise<void> {\n const { fieldMetadata, editableElement } = eventDetails;\n const { visualBuilderContainer, lastEditedField, resizeObserver } =\n elements;\n const {\n content_type_uid,\n entry_uid,\n locale,\n fieldPath,\n fieldPathWithIndex,\n } = fieldMetadata;\n\n const [fieldSchema, expectedFieldData] = await Promise.all([\n FieldSchemaMap.getFieldSchema(content_type_uid, fieldPath),\n getFieldData(\n { content_type_uid, entry_uid, locale },\n fieldPathWithIndex\n ),\n ]);\n // if value is an array, get the value for the instance\n const expectedFieldInstanceData = Array.isArray(expectedFieldData)\n ? expectedFieldData.at(fieldMetadata.multipleFieldMetadata.index)\n : undefined;\n\n const fieldType = getFieldType(fieldSchema);\n\n const { isDisabled: disabled } = isFieldDisabled(fieldSchema, eventDetails);\n\n editableElement.setAttribute(\n VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY,\n fieldType\n );\n\n if (\n fieldSchema &&\n (fieldSchema?.multiple ||\n (fieldSchema?.data_type === \"reference\" &&\n // @ts-ignore\n fieldSchema?.field_metadata.ref_multiple))\n ) {\n if (lastEditedField !== editableElement) {\n const addButtonLabel =\n fieldSchema.data_type === \"blocks\"\n ? // ? `Add ${fieldSchema.display_name ?? \"Modular Block\"}`\n \"Add Section\"\n : undefined;\n\n handleAddButtonsForMultiple(\n eventDetails,\n {\n editableElement: eventDetails.editableElement,\n visualBuilderContainer: visualBuilderContainer,\n resizeObserver: resizeObserver,\n },\n {\n fieldSchema,\n expectedFieldData,\n disabled,\n label: addButtonLabel,\n }\n );\n }\n\n // * fields could be handled as they are in a single instance\n if (eventDetails.fieldMetadata.multipleFieldMetadata.index > -1) {\n handleSingleField(\n {\n editableElement,\n visualBuilderContainer,\n resizeObserver: elements.resizeObserver,\n },\n { expectedFieldData: expectedFieldInstanceData, disabled }\n );\n }\n } else {\n handleSingleField(\n {\n editableElement,\n visualBuilderContainer,\n resizeObserver: elements.resizeObserver,\n },\n { expectedFieldData, disabled }\n );\n }\n\n /**\n * Handles all the fields based on their data type.\n */\n function handleSingleField(\n elements: {\n editableElement: Element;\n visualBuilderContainer: HTMLDivElement;\n resizeObserver: ResizeObserver;\n },\n config: { expectedFieldData: string; disabled?: boolean }\n ) {\n const { editableElement, visualBuilderContainer } = elements;\n\n if (config.disabled) {\n return;\n }\n\n // * title, single single_line, single multi_line, single number\n if (ALLOWED_INLINE_EDITABLE_FIELD.includes(fieldType)) {\n let actualEditableField = editableElement as HTMLElement;\n\n VisualBuilder.VisualBuilderGlobalState.value.focusFieldValue =\n actualEditableField?.innerText;\n\n const elementComputedDisplay =\n window.getComputedStyle(actualEditableField).display;\n\n let textContent =\n (editableElement as HTMLElement).innerText ||\n editableElement.textContent ||\n \"\";\n\n if (fieldType === FieldDataType.MULTILINE) {\n textContent = getMultilinePlaintext(actualEditableField);\n actualEditableField.addEventListener(\"paste\", pasteAsPlainText);\n }\n const expectedTextContent = config.expectedFieldData;\n if (\n textContent !== expectedTextContent ||\n isEllipsisActive(editableElement as HTMLElement)\n ) {\n // TODO: Testing will be don in the E2E.\n const pseudoEditableField = generatePseudoEditableElement(\n { editableElement: editableElement as HTMLElement },\n { textContent: config.expectedFieldData }\n );\n\n (editableElement as HTMLElement).style.visibility = \"hidden\";\n\n // set field type attribute to the pseudo editable field\n // ensures proper keydown handling similar to the actual editable field\n pseudoEditableField.setAttribute(\n VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY,\n fieldType\n );\n visualBuilderContainer.appendChild(pseudoEditableField);\n actualEditableField = pseudoEditableField;\n\n if (fieldType === FieldDataType.MULTILINE)\n actualEditableField.addEventListener(\n \"paste\",\n pasteAsPlainText\n );\n\n // we will unobserve this in hideOverlay\n elements.resizeObserver.observe(pseudoEditableField);\n } else if (elementComputedDisplay === \"inline\") {\n // if the editable field is inline\n const onInlineElementInput = throttle(() => {\n const overlayWrapper = visualBuilderContainer.querySelector(\n \".visual-builder__overlay__wrapper\"\n ) as HTMLDivElement;\n const focusedToolbar = visualBuilderContainer.querySelector(\n \".visual-builder__focused-toolbar\"\n ) as HTMLDivElement;\n updateFocussedState({\n editableElement: actualEditableField,\n visualBuilderContainer,\n overlayWrapper,\n resizeObserver,\n focusedToolbar,\n });\n }, 200);\n actualEditableField.addEventListener(\n \"input\",\n onInlineElementInput\n );\n }\n\n actualEditableField.setAttribute(\"contenteditable\", \"true\");\n actualEditableField.addEventListener(\"input\", handleFieldInput);\n actualEditableField.addEventListener(\"keydown\", handleFieldKeyDown);\n // focus on the contenteditable element to start accepting input\n actualEditableField.focus();\n\n return;\n }\n }\n}\n\nexport function cleanIndividualFieldResidual(elements: {\n overlayWrapper: HTMLDivElement;\n visualBuilderContainer: HTMLDivElement | null;\n focusedToolbar: HTMLDivElement | null;\n resizeObserver: ResizeObserver;\n}): void {\n const { overlayWrapper, visualBuilderContainer, focusedToolbar } = elements;\n\n removeAddInstanceButtons(\n {\n eventTarget: null,\n visualBuilderContainer: visualBuilderContainer,\n overlayWrapper: overlayWrapper,\n },\n true\n );\n\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n if (previousSelectedEditableDOM) {\n previousSelectedEditableDOM.removeAttribute(\n VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY\n );\n previousSelectedEditableDOM.removeAttribute(\"contenteditable\");\n previousSelectedEditableDOM.removeEventListener(\n \"input\",\n handleFieldInput\n );\n previousSelectedEditableDOM.removeEventListener(\n \"keydown\",\n handleFieldKeyDown\n );\n\n previousSelectedEditableDOM.removeEventListener(\n \"paste\",\n pasteAsPlainText\n );\n // Note - this happens in two places, 1. hideOverlay and 2. here\n // TODO maybe see all usages of both functions and try to do it in one place\n elements.resizeObserver.unobserve(previousSelectedEditableDOM);\n }\n\n const pseudoEditableElement = visualBuilderContainer?.querySelector(\n \".visual-builder__pseudo-editable-element\"\n );\n if (pseudoEditableElement) {\n elements.resizeObserver.unobserve(pseudoEditableElement);\n pseudoEditableElement.removeEventListener(\"paste\", pasteAsPlainText);\n pseudoEditableElement.remove();\n if (previousSelectedEditableDOM) {\n (previousSelectedEditableDOM as HTMLElement).style.removeProperty(\n \"visibility\"\n );\n }\n }\n\n if (focusedToolbar) {\n focusedToolbar.innerHTML = \"\";\n }\n}\n\nconst pasteAsPlainText = debounce(\n (e: Event) => {\n e.preventDefault();\n const clipboardData = (e as ClipboardEvent).clipboardData;\n document.execCommand(\n \"inserttext\",\n false,\n clipboardData?.getData(\"text/plain\")\n );\n },\n 100,\n { leading: true }\n);\n"],"mappings":"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","names":["elements","editableElement","visualBuilderContainer"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/visualBuilder/utils/handleIndividualFields.ts"],"sourcesContent":["import { debounce, throttle } from \"lodash-es\";\nimport { VisualBuilder } from \"..\";\nimport {\n generatePseudoEditableElement,\n isEllipsisActive,\n} from \"../generators/generatePseudoEditableField\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport {\n ALLOWED_INLINE_EDITABLE_FIELD,\n VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY,\n} from \"./constants\";\nimport { FieldSchemaMap } from \"./fieldSchemaMap\";\nimport { getFieldData } from \"./getFieldData\";\nimport { getFieldType } from \"./getFieldType\";\nimport { handleFieldInput, handleFieldKeyDown } from \"./handleFieldMouseDown\";\nimport { isFieldDisabled } from \"./isFieldDisabled\";\nimport visualBuilderPostMessage from \"./visualBuilderPostMessage\";\nimport {\n handleAddButtonsForMultiple,\n removeAddInstanceButtons,\n} from \"./multipleElementAddButton\";\nimport { VisualBuilderPostMessageEvents } from \"./types/postMessage.types\";\nimport { updateFocussedState } from \"./updateFocussedState\";\nimport { FieldDataType } from \"./types/index.types\";\nimport { getMultilinePlaintext } from \"./getMultilinePlaintext\";\n\n/**\n * It handles all the fields based on their data type and its \"multiple\" property.\n * @param eventDetails The event details object that contain cslp and field metadata.\n * @param elements The elements object that contain the visual builder wrapper.\n */\nexport async function handleIndividualFields(\n eventDetails: VisualBuilderCslpEventDetails,\n elements: {\n visualBuilderContainer: HTMLDivElement;\n resizeObserver: ResizeObserver;\n lastEditedField: Element | null;\n }\n): Promise<void> {\n const { fieldMetadata, editableElement } = eventDetails;\n const { visualBuilderContainer, lastEditedField, resizeObserver } =\n elements;\n const {\n content_type_uid,\n entry_uid,\n locale,\n fieldPath,\n fieldPathWithIndex,\n } = fieldMetadata;\n\n const [fieldSchema, expectedFieldData] = await Promise.all([\n FieldSchemaMap.getFieldSchema(content_type_uid, fieldPath),\n getFieldData(\n { content_type_uid, entry_uid, locale },\n fieldPathWithIndex\n ),\n ]);\n // if value is an array, get the value for the instance\n const expectedFieldInstanceData = Array.isArray(expectedFieldData)\n ? expectedFieldData.at(fieldMetadata.multipleFieldMetadata.index)\n : undefined;\n\n const fieldType = getFieldType(fieldSchema);\n\n const { isDisabled: disabled } = isFieldDisabled(fieldSchema, eventDetails);\n\n editableElement.setAttribute(\n VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY,\n fieldType\n );\n\n if (\n fieldSchema &&\n (fieldSchema?.multiple ||\n (fieldSchema?.data_type === \"reference\" &&\n // @ts-ignore\n fieldSchema?.field_metadata.ref_multiple))\n ) {\n if (lastEditedField !== editableElement) {\n const addButtonLabel =\n fieldSchema.data_type === \"blocks\"\n ? // ? `Add ${fieldSchema.display_name ?? \"Modular Block\"}`\n \"Add Section\"\n : undefined;\n\n handleAddButtonsForMultiple(\n eventDetails,\n {\n editableElement: eventDetails.editableElement,\n visualBuilderContainer: visualBuilderContainer,\n resizeObserver: resizeObserver,\n },\n {\n fieldSchema,\n expectedFieldData,\n disabled,\n label: addButtonLabel,\n }\n );\n }\n\n // * fields could be handled as they are in a single instance\n if (eventDetails.fieldMetadata.multipleFieldMetadata.index > -1) {\n handleSingleField(\n {\n editableElement,\n visualBuilderContainer,\n resizeObserver: elements.resizeObserver,\n },\n { expectedFieldData: expectedFieldInstanceData, disabled }\n );\n }\n } else {\n handleSingleField(\n {\n editableElement,\n visualBuilderContainer,\n resizeObserver: elements.resizeObserver,\n },\n { expectedFieldData, disabled }\n );\n }\n\n /**\n * Handles all the fields based on their data type.\n */\n function handleSingleField(\n elements: {\n editableElement: Element;\n visualBuilderContainer: HTMLDivElement;\n resizeObserver: ResizeObserver;\n },\n config: { expectedFieldData: string; disabled?: boolean }\n ) {\n const { editableElement, visualBuilderContainer } = elements;\n\n if (config.disabled) {\n return;\n }\n\n // * title, single single_line, single multi_line, single number\n if (ALLOWED_INLINE_EDITABLE_FIELD.includes(fieldType)) {\n let actualEditableField = editableElement as HTMLElement;\n\n VisualBuilder.VisualBuilderGlobalState.value.focusFieldValue =\n actualEditableField?.innerText;\n\n const elementComputedDisplay =\n window.getComputedStyle(actualEditableField).display;\n\n let textContent =\n (editableElement as HTMLElement).innerText ||\n editableElement.textContent ||\n \"\";\n\n if (fieldType === FieldDataType.MULTILINE) {\n textContent = getMultilinePlaintext(actualEditableField);\n actualEditableField.addEventListener(\"paste\", pasteAsPlainText);\n }\n const expectedTextContent = config.expectedFieldData;\n if (\n textContent !== expectedTextContent ||\n isEllipsisActive(editableElement as HTMLElement)\n ) {\n // TODO: Testing will be don in the E2E.\n const pseudoEditableField = generatePseudoEditableElement(\n { editableElement: editableElement as HTMLElement },\n { textContent: config.expectedFieldData }\n );\n\n (editableElement as HTMLElement).style.visibility = \"hidden\";\n\n // set field type attribute to the pseudo editable field\n // ensures proper keydown handling similar to the actual editable field\n pseudoEditableField.setAttribute(\n VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY,\n fieldType\n );\n visualBuilderContainer.appendChild(pseudoEditableField);\n actualEditableField = pseudoEditableField;\n\n if (fieldType === FieldDataType.MULTILINE)\n actualEditableField.addEventListener(\n \"paste\",\n pasteAsPlainText\n );\n\n // we will unobserve this in hideOverlay\n elements.resizeObserver.observe(pseudoEditableField);\n } else if (elementComputedDisplay === \"inline\") {\n // if the editable field is inline\n const onInlineElementInput = throttle(() => {\n const overlayWrapper = visualBuilderContainer.querySelector(\n \".visual-builder__overlay__wrapper\"\n ) as HTMLDivElement;\n const focusedToolbar = visualBuilderContainer.querySelector(\n \".visual-builder__focused-toolbar\"\n ) as HTMLDivElement;\n updateFocussedState({\n editableElement: actualEditableField,\n visualBuilderContainer,\n overlayWrapper,\n focusedToolbar,\n resizeObserver,\n });\n }, 200);\n actualEditableField.addEventListener(\n \"input\",\n onInlineElementInput\n );\n }\n\n actualEditableField.setAttribute(\"contenteditable\", \"true\");\n actualEditableField.addEventListener(\"input\", handleFieldInput);\n actualEditableField.addEventListener(\"keydown\", handleFieldKeyDown);\n // focus on the contenteditable element to start accepting input\n actualEditableField.focus();\n\n return;\n }\n }\n}\n\nexport function cleanIndividualFieldResidual(elements: {\n overlayWrapper: HTMLDivElement;\n visualBuilderContainer: HTMLDivElement | null;\n focusedToolbar: HTMLDivElement | null;\n resizeObserver: ResizeObserver;\n}): void {\n const { overlayWrapper, visualBuilderContainer, focusedToolbar } = elements;\n\n removeAddInstanceButtons(\n {\n eventTarget: null,\n visualBuilderContainer: visualBuilderContainer,\n overlayWrapper: overlayWrapper,\n },\n true\n );\n\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n if (previousSelectedEditableDOM) {\n previousSelectedEditableDOM.removeAttribute(\n VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY\n );\n previousSelectedEditableDOM.removeAttribute(\"contenteditable\");\n previousSelectedEditableDOM.removeEventListener(\n \"input\",\n handleFieldInput\n );\n previousSelectedEditableDOM.removeEventListener(\n \"keydown\",\n handleFieldKeyDown\n );\n\n previousSelectedEditableDOM.removeEventListener(\n \"paste\",\n pasteAsPlainText\n );\n // Note - this happens in two places, 1. hideOverlay and 2. here\n // TODO maybe see all usages of both functions and try to do it in one place\n elements.resizeObserver.unobserve(previousSelectedEditableDOM);\n }\n\n const pseudoEditableElement = visualBuilderContainer?.querySelector(\n \".visual-builder__pseudo-editable-element\"\n );\n if (pseudoEditableElement) {\n elements.resizeObserver.unobserve(pseudoEditableElement);\n pseudoEditableElement.removeEventListener(\"paste\", pasteAsPlainText);\n pseudoEditableElement.remove();\n if (previousSelectedEditableDOM) {\n (previousSelectedEditableDOM as HTMLElement).style.removeProperty(\n \"visibility\"\n );\n }\n }\n\n if (focusedToolbar) {\n focusedToolbar.innerHTML = \"\";\n }\n}\n\nconst pasteAsPlainText = debounce(\n (e: Event) => {\n e.preventDefault();\n const clipboardData = (e as ClipboardEvent).clipboardData;\n document.execCommand(\n \"inserttext\",\n false,\n clipboardData?.getData(\"text/plain\")\n );\n },\n 100,\n { leading: true }\n);\n"],"mappings":"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","names":["elements","editableElement","visualBuilderContainer"]}
|
|
@@ -134,8 +134,8 @@ async function handleIndividualFields(eventDetails, elements) {
|
|
|
134
134
|
editableElement: actualEditableField,
|
|
135
135
|
visualBuilderContainer: visualBuilderContainer2,
|
|
136
136
|
overlayWrapper,
|
|
137
|
-
|
|
138
|
-
|
|
137
|
+
focusedToolbar,
|
|
138
|
+
resizeObserver
|
|
139
139
|
});
|
|
140
140
|
}, 200);
|
|
141
141
|
actualEditableField.addEventListener(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/visualBuilder/utils/handleIndividualFields.ts"],"sourcesContent":["import { debounce, throttle } from \"lodash-es\";\nimport { VisualBuilder } from \"..\";\nimport {\n generatePseudoEditableElement,\n isEllipsisActive,\n} from \"../generators/generatePseudoEditableField\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport {\n ALLOWED_INLINE_EDITABLE_FIELD,\n VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY,\n} from \"./constants\";\nimport { FieldSchemaMap } from \"./fieldSchemaMap\";\nimport { getFieldData } from \"./getFieldData\";\nimport { getFieldType } from \"./getFieldType\";\nimport { handleFieldInput, handleFieldKeyDown } from \"./handleFieldMouseDown\";\nimport { isFieldDisabled } from \"./isFieldDisabled\";\nimport visualBuilderPostMessage from \"./visualBuilderPostMessage\";\nimport {\n handleAddButtonsForMultiple,\n removeAddInstanceButtons,\n} from \"./multipleElementAddButton\";\nimport { VisualBuilderPostMessageEvents } from \"./types/postMessage.types\";\nimport { updateFocussedState } from \"./updateFocussedState\";\nimport { FieldDataType } from \"./types/index.types\";\nimport { getMultilinePlaintext } from \"./getMultilinePlaintext\";\n\n/**\n * It handles all the fields based on their data type and its \"multiple\" property.\n * @param eventDetails The event details object that contain cslp and field metadata.\n * @param elements The elements object that contain the visual builder wrapper.\n */\nexport async function handleIndividualFields(\n eventDetails: VisualBuilderCslpEventDetails,\n elements: {\n visualBuilderContainer: HTMLDivElement;\n resizeObserver: ResizeObserver;\n lastEditedField: Element | null;\n }\n): Promise<void> {\n const { fieldMetadata, editableElement } = eventDetails;\n const { visualBuilderContainer, lastEditedField, resizeObserver } =\n elements;\n const {\n content_type_uid,\n entry_uid,\n locale,\n fieldPath,\n fieldPathWithIndex,\n } = fieldMetadata;\n\n const [fieldSchema, expectedFieldData] = await Promise.all([\n FieldSchemaMap.getFieldSchema(content_type_uid, fieldPath),\n getFieldData(\n { content_type_uid, entry_uid, locale },\n fieldPathWithIndex\n ),\n ]);\n // if value is an array, get the value for the instance\n const expectedFieldInstanceData = Array.isArray(expectedFieldData)\n ? expectedFieldData.at(fieldMetadata.multipleFieldMetadata.index)\n : undefined;\n\n const fieldType = getFieldType(fieldSchema);\n\n const { isDisabled: disabled } = isFieldDisabled(fieldSchema, eventDetails);\n\n editableElement.setAttribute(\n VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY,\n fieldType\n );\n\n if (\n fieldSchema &&\n (fieldSchema?.multiple ||\n (fieldSchema?.data_type === \"reference\" &&\n // @ts-ignore\n fieldSchema?.field_metadata.ref_multiple))\n ) {\n if (lastEditedField !== editableElement) {\n const addButtonLabel =\n fieldSchema.data_type === \"blocks\"\n ? // ? `Add ${fieldSchema.display_name ?? \"Modular Block\"}`\n \"Add Section\"\n : undefined;\n\n handleAddButtonsForMultiple(\n eventDetails,\n {\n editableElement: eventDetails.editableElement,\n visualBuilderContainer: visualBuilderContainer,\n resizeObserver: resizeObserver,\n },\n {\n fieldSchema,\n expectedFieldData,\n disabled,\n label: addButtonLabel,\n }\n );\n }\n\n // * fields could be handled as they are in a single instance\n if (eventDetails.fieldMetadata.multipleFieldMetadata.index > -1) {\n handleSingleField(\n {\n editableElement,\n visualBuilderContainer,\n resizeObserver: elements.resizeObserver,\n },\n { expectedFieldData: expectedFieldInstanceData, disabled }\n );\n }\n } else {\n handleSingleField(\n {\n editableElement,\n visualBuilderContainer,\n resizeObserver: elements.resizeObserver,\n },\n { expectedFieldData, disabled }\n );\n }\n\n /**\n * Handles all the fields based on their data type.\n */\n function handleSingleField(\n elements: {\n editableElement: Element;\n visualBuilderContainer: HTMLDivElement;\n resizeObserver: ResizeObserver;\n },\n config: { expectedFieldData: string; disabled?: boolean }\n ) {\n const { editableElement, visualBuilderContainer } = elements;\n\n if (config.disabled) {\n return;\n }\n\n // * title, single single_line, single multi_line, single number\n if (ALLOWED_INLINE_EDITABLE_FIELD.includes(fieldType)) {\n let actualEditableField = editableElement as HTMLElement;\n\n VisualBuilder.VisualBuilderGlobalState.value.focusFieldValue =\n actualEditableField?.innerText;\n\n const elementComputedDisplay =\n window.getComputedStyle(actualEditableField).display;\n\n let textContent =\n (editableElement as HTMLElement).innerText ||\n editableElement.textContent ||\n \"\";\n\n if (fieldType === FieldDataType.MULTILINE) {\n textContent = getMultilinePlaintext(actualEditableField);\n actualEditableField.addEventListener(\"paste\", pasteAsPlainText);\n }\n const expectedTextContent = config.expectedFieldData;\n if (\n textContent !== expectedTextContent ||\n isEllipsisActive(editableElement as HTMLElement)\n ) {\n // TODO: Testing will be don in the E2E.\n const pseudoEditableField = generatePseudoEditableElement(\n { editableElement: editableElement as HTMLElement },\n { textContent: config.expectedFieldData }\n );\n\n (editableElement as HTMLElement).style.visibility = \"hidden\";\n\n // set field type attribute to the pseudo editable field\n // ensures proper keydown handling similar to the actual editable field\n pseudoEditableField.setAttribute(\n VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY,\n fieldType\n );\n visualBuilderContainer.appendChild(pseudoEditableField);\n actualEditableField = pseudoEditableField;\n\n if (fieldType === FieldDataType.MULTILINE)\n actualEditableField.addEventListener(\n \"paste\",\n pasteAsPlainText\n );\n\n // we will unobserve this in hideOverlay\n elements.resizeObserver.observe(pseudoEditableField);\n } else if (elementComputedDisplay === \"inline\") {\n // if the editable field is inline\n const onInlineElementInput = throttle(() => {\n const overlayWrapper = visualBuilderContainer.querySelector(\n \".visual-builder__overlay__wrapper\"\n ) as HTMLDivElement;\n const focusedToolbar = visualBuilderContainer.querySelector(\n \".visual-builder__focused-toolbar\"\n ) as HTMLDivElement;\n updateFocussedState({\n editableElement: actualEditableField,\n visualBuilderContainer,\n overlayWrapper,\n resizeObserver,\n focusedToolbar,\n });\n }, 200);\n actualEditableField.addEventListener(\n \"input\",\n onInlineElementInput\n );\n }\n\n actualEditableField.setAttribute(\"contenteditable\", \"true\");\n actualEditableField.addEventListener(\"input\", handleFieldInput);\n actualEditableField.addEventListener(\"keydown\", handleFieldKeyDown);\n // focus on the contenteditable element to start accepting input\n actualEditableField.focus();\n\n return;\n }\n }\n}\n\nexport function cleanIndividualFieldResidual(elements: {\n overlayWrapper: HTMLDivElement;\n visualBuilderContainer: HTMLDivElement | null;\n focusedToolbar: HTMLDivElement | null;\n resizeObserver: ResizeObserver;\n}): void {\n const { overlayWrapper, visualBuilderContainer, focusedToolbar } = elements;\n\n removeAddInstanceButtons(\n {\n eventTarget: null,\n visualBuilderContainer: visualBuilderContainer,\n overlayWrapper: overlayWrapper,\n },\n true\n );\n\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n if (previousSelectedEditableDOM) {\n previousSelectedEditableDOM.removeAttribute(\n VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY\n );\n previousSelectedEditableDOM.removeAttribute(\"contenteditable\");\n previousSelectedEditableDOM.removeEventListener(\n \"input\",\n handleFieldInput\n );\n previousSelectedEditableDOM.removeEventListener(\n \"keydown\",\n handleFieldKeyDown\n );\n\n previousSelectedEditableDOM.removeEventListener(\n \"paste\",\n pasteAsPlainText\n );\n // Note - this happens in two places, 1. hideOverlay and 2. here\n // TODO maybe see all usages of both functions and try to do it in one place\n elements.resizeObserver.unobserve(previousSelectedEditableDOM);\n }\n\n const pseudoEditableElement = visualBuilderContainer?.querySelector(\n \".visual-builder__pseudo-editable-element\"\n );\n if (pseudoEditableElement) {\n elements.resizeObserver.unobserve(pseudoEditableElement);\n pseudoEditableElement.removeEventListener(\"paste\", pasteAsPlainText);\n pseudoEditableElement.remove();\n if (previousSelectedEditableDOM) {\n (previousSelectedEditableDOM as HTMLElement).style.removeProperty(\n \"visibility\"\n );\n }\n }\n\n if (focusedToolbar) {\n focusedToolbar.innerHTML = \"\";\n }\n}\n\nconst pasteAsPlainText = debounce(\n (e: Event) => {\n e.preventDefault();\n const clipboardData = (e as ClipboardEvent).clipboardData;\n document.execCommand(\n \"inserttext\",\n false,\n clipboardData?.getData(\"text/plain\")\n );\n },\n 100,\n { leading: true }\n);\n"],"mappings":"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","names":["elements","editableElement","visualBuilderContainer"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/visualBuilder/utils/handleIndividualFields.ts"],"sourcesContent":["import { debounce, throttle } from \"lodash-es\";\nimport { VisualBuilder } from \"..\";\nimport {\n generatePseudoEditableElement,\n isEllipsisActive,\n} from \"../generators/generatePseudoEditableField\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport {\n ALLOWED_INLINE_EDITABLE_FIELD,\n VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY,\n} from \"./constants\";\nimport { FieldSchemaMap } from \"./fieldSchemaMap\";\nimport { getFieldData } from \"./getFieldData\";\nimport { getFieldType } from \"./getFieldType\";\nimport { handleFieldInput, handleFieldKeyDown } from \"./handleFieldMouseDown\";\nimport { isFieldDisabled } from \"./isFieldDisabled\";\nimport visualBuilderPostMessage from \"./visualBuilderPostMessage\";\nimport {\n handleAddButtonsForMultiple,\n removeAddInstanceButtons,\n} from \"./multipleElementAddButton\";\nimport { VisualBuilderPostMessageEvents } from \"./types/postMessage.types\";\nimport { updateFocussedState } from \"./updateFocussedState\";\nimport { FieldDataType } from \"./types/index.types\";\nimport { getMultilinePlaintext } from \"./getMultilinePlaintext\";\n\n/**\n * It handles all the fields based on their data type and its \"multiple\" property.\n * @param eventDetails The event details object that contain cslp and field metadata.\n * @param elements The elements object that contain the visual builder wrapper.\n */\nexport async function handleIndividualFields(\n eventDetails: VisualBuilderCslpEventDetails,\n elements: {\n visualBuilderContainer: HTMLDivElement;\n resizeObserver: ResizeObserver;\n lastEditedField: Element | null;\n }\n): Promise<void> {\n const { fieldMetadata, editableElement } = eventDetails;\n const { visualBuilderContainer, lastEditedField, resizeObserver } =\n elements;\n const {\n content_type_uid,\n entry_uid,\n locale,\n fieldPath,\n fieldPathWithIndex,\n } = fieldMetadata;\n\n const [fieldSchema, expectedFieldData] = await Promise.all([\n FieldSchemaMap.getFieldSchema(content_type_uid, fieldPath),\n getFieldData(\n { content_type_uid, entry_uid, locale },\n fieldPathWithIndex\n ),\n ]);\n // if value is an array, get the value for the instance\n const expectedFieldInstanceData = Array.isArray(expectedFieldData)\n ? expectedFieldData.at(fieldMetadata.multipleFieldMetadata.index)\n : undefined;\n\n const fieldType = getFieldType(fieldSchema);\n\n const { isDisabled: disabled } = isFieldDisabled(fieldSchema, eventDetails);\n\n editableElement.setAttribute(\n VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY,\n fieldType\n );\n\n if (\n fieldSchema &&\n (fieldSchema?.multiple ||\n (fieldSchema?.data_type === \"reference\" &&\n // @ts-ignore\n fieldSchema?.field_metadata.ref_multiple))\n ) {\n if (lastEditedField !== editableElement) {\n const addButtonLabel =\n fieldSchema.data_type === \"blocks\"\n ? // ? `Add ${fieldSchema.display_name ?? \"Modular Block\"}`\n \"Add Section\"\n : undefined;\n\n handleAddButtonsForMultiple(\n eventDetails,\n {\n editableElement: eventDetails.editableElement,\n visualBuilderContainer: visualBuilderContainer,\n resizeObserver: resizeObserver,\n },\n {\n fieldSchema,\n expectedFieldData,\n disabled,\n label: addButtonLabel,\n }\n );\n }\n\n // * fields could be handled as they are in a single instance\n if (eventDetails.fieldMetadata.multipleFieldMetadata.index > -1) {\n handleSingleField(\n {\n editableElement,\n visualBuilderContainer,\n resizeObserver: elements.resizeObserver,\n },\n { expectedFieldData: expectedFieldInstanceData, disabled }\n );\n }\n } else {\n handleSingleField(\n {\n editableElement,\n visualBuilderContainer,\n resizeObserver: elements.resizeObserver,\n },\n { expectedFieldData, disabled }\n );\n }\n\n /**\n * Handles all the fields based on their data type.\n */\n function handleSingleField(\n elements: {\n editableElement: Element;\n visualBuilderContainer: HTMLDivElement;\n resizeObserver: ResizeObserver;\n },\n config: { expectedFieldData: string; disabled?: boolean }\n ) {\n const { editableElement, visualBuilderContainer } = elements;\n\n if (config.disabled) {\n return;\n }\n\n // * title, single single_line, single multi_line, single number\n if (ALLOWED_INLINE_EDITABLE_FIELD.includes(fieldType)) {\n let actualEditableField = editableElement as HTMLElement;\n\n VisualBuilder.VisualBuilderGlobalState.value.focusFieldValue =\n actualEditableField?.innerText;\n\n const elementComputedDisplay =\n window.getComputedStyle(actualEditableField).display;\n\n let textContent =\n (editableElement as HTMLElement).innerText ||\n editableElement.textContent ||\n \"\";\n\n if (fieldType === FieldDataType.MULTILINE) {\n textContent = getMultilinePlaintext(actualEditableField);\n actualEditableField.addEventListener(\"paste\", pasteAsPlainText);\n }\n const expectedTextContent = config.expectedFieldData;\n if (\n textContent !== expectedTextContent ||\n isEllipsisActive(editableElement as HTMLElement)\n ) {\n // TODO: Testing will be don in the E2E.\n const pseudoEditableField = generatePseudoEditableElement(\n { editableElement: editableElement as HTMLElement },\n { textContent: config.expectedFieldData }\n );\n\n (editableElement as HTMLElement).style.visibility = \"hidden\";\n\n // set field type attribute to the pseudo editable field\n // ensures proper keydown handling similar to the actual editable field\n pseudoEditableField.setAttribute(\n VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY,\n fieldType\n );\n visualBuilderContainer.appendChild(pseudoEditableField);\n actualEditableField = pseudoEditableField;\n\n if (fieldType === FieldDataType.MULTILINE)\n actualEditableField.addEventListener(\n \"paste\",\n pasteAsPlainText\n );\n\n // we will unobserve this in hideOverlay\n elements.resizeObserver.observe(pseudoEditableField);\n } else if (elementComputedDisplay === \"inline\") {\n // if the editable field is inline\n const onInlineElementInput = throttle(() => {\n const overlayWrapper = visualBuilderContainer.querySelector(\n \".visual-builder__overlay__wrapper\"\n ) as HTMLDivElement;\n const focusedToolbar = visualBuilderContainer.querySelector(\n \".visual-builder__focused-toolbar\"\n ) as HTMLDivElement;\n updateFocussedState({\n editableElement: actualEditableField,\n visualBuilderContainer,\n overlayWrapper,\n focusedToolbar,\n resizeObserver,\n });\n }, 200);\n actualEditableField.addEventListener(\n \"input\",\n onInlineElementInput\n );\n }\n\n actualEditableField.setAttribute(\"contenteditable\", \"true\");\n actualEditableField.addEventListener(\"input\", handleFieldInput);\n actualEditableField.addEventListener(\"keydown\", handleFieldKeyDown);\n // focus on the contenteditable element to start accepting input\n actualEditableField.focus();\n\n return;\n }\n }\n}\n\nexport function cleanIndividualFieldResidual(elements: {\n overlayWrapper: HTMLDivElement;\n visualBuilderContainer: HTMLDivElement | null;\n focusedToolbar: HTMLDivElement | null;\n resizeObserver: ResizeObserver;\n}): void {\n const { overlayWrapper, visualBuilderContainer, focusedToolbar } = elements;\n\n removeAddInstanceButtons(\n {\n eventTarget: null,\n visualBuilderContainer: visualBuilderContainer,\n overlayWrapper: overlayWrapper,\n },\n true\n );\n\n const previousSelectedEditableDOM =\n VisualBuilder.VisualBuilderGlobalState.value\n .previousSelectedEditableDOM;\n if (previousSelectedEditableDOM) {\n previousSelectedEditableDOM.removeAttribute(\n VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY\n );\n previousSelectedEditableDOM.removeAttribute(\"contenteditable\");\n previousSelectedEditableDOM.removeEventListener(\n \"input\",\n handleFieldInput\n );\n previousSelectedEditableDOM.removeEventListener(\n \"keydown\",\n handleFieldKeyDown\n );\n\n previousSelectedEditableDOM.removeEventListener(\n \"paste\",\n pasteAsPlainText\n );\n // Note - this happens in two places, 1. hideOverlay and 2. here\n // TODO maybe see all usages of both functions and try to do it in one place\n elements.resizeObserver.unobserve(previousSelectedEditableDOM);\n }\n\n const pseudoEditableElement = visualBuilderContainer?.querySelector(\n \".visual-builder__pseudo-editable-element\"\n );\n if (pseudoEditableElement) {\n elements.resizeObserver.unobserve(pseudoEditableElement);\n pseudoEditableElement.removeEventListener(\"paste\", pasteAsPlainText);\n pseudoEditableElement.remove();\n if (previousSelectedEditableDOM) {\n (previousSelectedEditableDOM as HTMLElement).style.removeProperty(\n \"visibility\"\n );\n }\n }\n\n if (focusedToolbar) {\n focusedToolbar.innerHTML = \"\";\n }\n}\n\nconst pasteAsPlainText = debounce(\n (e: Event) => {\n e.preventDefault();\n const clipboardData = (e as ClipboardEvent).clipboardData;\n document.execCommand(\n \"inserttext\",\n false,\n clipboardData?.getData(\"text/plain\")\n );\n },\n 100,\n { leading: true }\n);\n"],"mappings":"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","names":["elements","editableElement","visualBuilderContainer"]}
|
|
@@ -41,7 +41,7 @@ var import_generateOverlay = require("../generators/generateOverlay.cjs");
|
|
|
41
41
|
var import_mouseHover = require("../listeners/mouseHover.cjs");
|
|
42
42
|
var import_constants = require("./constants.cjs");
|
|
43
43
|
var import_getChildrenDirection = __toESM(require("./getChildrenDirection.cjs"), 1);
|
|
44
|
-
var
|
|
44
|
+
var import_getPsuedoEditableStylesElement = require("./getPsuedoEditableStylesElement.cjs");
|
|
45
45
|
function positionToolbar({
|
|
46
46
|
focusedToolbar,
|
|
47
47
|
selectedElementDimension
|
|
@@ -51,7 +51,10 @@ function positionToolbar({
|
|
|
51
51
|
const distanceFromTop = selectedElementDimension.top + window.scrollY - import_constants.TOOLBAR_EDGE_BUFFER;
|
|
52
52
|
const adjustedDistanceFromTop = selectedElementDimension.top + window.scrollY < import_constants.TOP_EDGE_BUFFER ? distanceFromTop + selectedElementDimension.height + import_constants.TOP_EDGE_BUFFER : distanceFromTop;
|
|
53
53
|
const distanceFromLeft = selectedElementDimension.left - import_constants.LIVE_PREVIEW_OUTLINE_WIDTH_IN_PX;
|
|
54
|
-
const adjustedDistanceFromLeft = Math.max(
|
|
54
|
+
const adjustedDistanceFromLeft = Math.max(
|
|
55
|
+
distanceFromLeft,
|
|
56
|
+
import_constants.TOOLBAR_EDGE_BUFFER
|
|
57
|
+
);
|
|
55
58
|
if (targetElementRightEdgeOffset < import_constants.RIGHT_EDGE_BUFFER && (focusedToolbar.style.justifyContent !== "flex-end" || focusedToolbar.style.left !== `${selectedElementDimension.right + import_constants.LIVE_PREVIEW_OUTLINE_WIDTH_IN_PX}px`)) {
|
|
56
59
|
focusedToolbar.style.justifyContent = "flex-end";
|
|
57
60
|
focusedToolbar.style.left = `${selectedElementDimension.right + import_constants.LIVE_PREVIEW_OUTLINE_WIDTH_IN_PX}px`;
|
|
@@ -72,17 +75,35 @@ function updateFocussedState({
|
|
|
72
75
|
resizeObserver
|
|
73
76
|
}) {
|
|
74
77
|
var _a, _b;
|
|
75
|
-
|
|
78
|
+
let previousSelectedEditableDOM = import__.VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM;
|
|
76
79
|
if (!visualBuilderContainer || !editableElement || !previousSelectedEditableDOM || !overlayWrapper) {
|
|
77
80
|
return;
|
|
78
81
|
}
|
|
82
|
+
const previousSelectedElementCslp = previousSelectedEditableDOM == null ? void 0 : previousSelectedEditableDOM.getAttribute("data-cslp");
|
|
83
|
+
const newPreviousSelectedElement = document.querySelector(
|
|
84
|
+
`[data-cslp="${previousSelectedElementCslp}"]`
|
|
85
|
+
);
|
|
86
|
+
if (!newPreviousSelectedElement && resizeObserver) {
|
|
87
|
+
(0, import_generateOverlay.hideFocusOverlay)({
|
|
88
|
+
visualBuilderOverlayWrapper: overlayWrapper,
|
|
89
|
+
focusedToolbar,
|
|
90
|
+
visualBuilderContainer,
|
|
91
|
+
resizeObserver,
|
|
92
|
+
noTrigger: true
|
|
93
|
+
});
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (newPreviousSelectedElement !== previousSelectedEditableDOM) {
|
|
97
|
+
previousSelectedEditableDOM = newPreviousSelectedElement;
|
|
98
|
+
import__.VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM = previousSelectedEditableDOM;
|
|
99
|
+
}
|
|
79
100
|
(0, import_mouseHover.hideHoverOutline)(visualBuilderContainer);
|
|
80
101
|
(0, import_generateOverlay.addFocusOverlay)(previousSelectedEditableDOM, overlayWrapper);
|
|
81
102
|
const psuedoEditableElement = visualBuilderContainer.querySelector(
|
|
82
103
|
".visual-builder__pseudo-editable-element"
|
|
83
104
|
);
|
|
84
105
|
if (psuedoEditableElement) {
|
|
85
|
-
const styles = (0,
|
|
106
|
+
const styles = (0, import_getPsuedoEditableStylesElement.getPsuedoEditableElementStyles)(editableElement);
|
|
86
107
|
const styleString = Object.entries(styles).reduce(
|
|
87
108
|
(acc, [key, value]) => {
|
|
88
109
|
return `${acc}${key}:${value};`;
|
|
@@ -91,17 +112,13 @@ function updateFocussedState({
|
|
|
91
112
|
);
|
|
92
113
|
psuedoEditableElement.style.cssText = styleString;
|
|
93
114
|
psuedoEditableElement.style.visibility = "visible";
|
|
94
|
-
psuedoEditableElement.style.position = "absolute";
|
|
95
|
-
psuedoEditableElement.style.top = `${editableElement.offsetTop}px`;
|
|
96
|
-
psuedoEditableElement.style.left = `${editableElement.offsetLeft}px`;
|
|
97
115
|
}
|
|
98
116
|
const cslp = (editableElement == null ? void 0 : editableElement.getAttribute("data-cslp")) || "";
|
|
99
117
|
const fieldMetadata = (0, import_cslp.extractDetailsFromCslp)(cslp);
|
|
100
118
|
const targetElementDimension = editableElement.getBoundingClientRect();
|
|
101
119
|
if (targetElementDimension.width && targetElementDimension.height) {
|
|
102
120
|
const selectedElement = import__.VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM;
|
|
103
|
-
if (!selectedElement)
|
|
104
|
-
return;
|
|
121
|
+
if (!selectedElement) return;
|
|
105
122
|
positionToolbar({
|
|
106
123
|
focusedToolbar,
|
|
107
124
|
selectedElementDimension: selectedElement.getBoundingClientRect()
|
|
@@ -131,11 +148,28 @@ function updateFocussedState({
|
|
|
131
148
|
}
|
|
132
149
|
}
|
|
133
150
|
}
|
|
134
|
-
function updateFocussedStateOnMutation(focusOverlayWrapper, focusedToolbar, visualBuilderContainer) {
|
|
151
|
+
function updateFocussedStateOnMutation(focusOverlayWrapper, focusedToolbar, visualBuilderContainer, resizeObserver) {
|
|
135
152
|
if (!focusOverlayWrapper) return;
|
|
136
|
-
|
|
137
|
-
if (!selectedElement)
|
|
153
|
+
let selectedElement = import__.VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM;
|
|
154
|
+
if (!selectedElement) return;
|
|
155
|
+
const selectedElementCslp = selectedElement == null ? void 0 : selectedElement.getAttribute("data-cslp");
|
|
156
|
+
const newSelectedElement = document.querySelector(
|
|
157
|
+
`[data-cslp="${selectedElementCslp}"]`
|
|
158
|
+
);
|
|
159
|
+
if (!newSelectedElement && resizeObserver) {
|
|
160
|
+
(0, import_generateOverlay.hideFocusOverlay)({
|
|
161
|
+
visualBuilderOverlayWrapper: focusOverlayWrapper,
|
|
162
|
+
focusedToolbar,
|
|
163
|
+
visualBuilderContainer,
|
|
164
|
+
resizeObserver,
|
|
165
|
+
noTrigger: true
|
|
166
|
+
});
|
|
138
167
|
return;
|
|
168
|
+
}
|
|
169
|
+
if (newSelectedElement !== selectedElement) {
|
|
170
|
+
selectedElement = newSelectedElement;
|
|
171
|
+
import__.VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM = selectedElement;
|
|
172
|
+
}
|
|
139
173
|
const selectedElementDimension = selectedElement.getBoundingClientRect();
|
|
140
174
|
const focusOutline = focusOverlayWrapper.querySelector(
|
|
141
175
|
".visual-builder__overlay--outline"
|
|
@@ -217,19 +251,16 @@ function updateFocussedStateOnMutation(focusOverlayWrapper, focusedToolbar, visu
|
|
|
217
251
|
".visual-builder__pseudo-editable-element"
|
|
218
252
|
);
|
|
219
253
|
const editableElement = selectedElement;
|
|
220
|
-
const styles = (0,
|
|
254
|
+
const styles = (0, import_getPsuedoEditableStylesElement.getPsuedoEditableElementStyles)(editableElement);
|
|
221
255
|
const styleString = Object.entries(styles).reduce(
|
|
222
256
|
(acc, [key, value]) => {
|
|
223
257
|
return `${acc}${key}:${value};`;
|
|
224
258
|
},
|
|
225
259
|
""
|
|
226
260
|
);
|
|
227
|
-
if (psuedoEditableElement && (psuedoEditableElement.style.cssText !== styleString || psuedoEditableElement.style.visibility !== "visible"
|
|
261
|
+
if (psuedoEditableElement && (psuedoEditableElement.style.cssText !== styleString || psuedoEditableElement.style.visibility !== "visible")) {
|
|
228
262
|
psuedoEditableElement.style.cssText = styleString;
|
|
229
263
|
psuedoEditableElement.style.visibility = "visible";
|
|
230
|
-
psuedoEditableElement.style.position = "absolute";
|
|
231
|
-
psuedoEditableElement.style.top = `${editableElement.offsetTop}px`;
|
|
232
|
-
psuedoEditableElement.style.left = `${editableElement.offsetLeft}px`;
|
|
233
264
|
}
|
|
234
265
|
}
|
|
235
266
|
}
|