@contentstack/live-preview-utils 3.0.1 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/LICENSE +1 -1
  2. package/dist/legacy/cslp/cslpdata.cjs.map +1 -1
  3. package/dist/legacy/cslp/cslpdata.js.map +1 -1
  4. package/dist/legacy/livePreview/editButton/editButton.cjs +2 -2
  5. package/dist/legacy/livePreview/editButton/editButton.cjs.map +1 -1
  6. package/dist/legacy/livePreview/editButton/editButton.js +2 -2
  7. package/dist/legacy/livePreview/editButton/editButton.js.map +1 -1
  8. package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.cjs +1 -1
  9. package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.js +1 -1
  10. package/dist/legacy/preview/contentstack-live-preview-HOC.cjs +1 -1
  11. package/dist/legacy/preview/contentstack-live-preview-HOC.js +1 -1
  12. package/dist/legacy/timeline/compare/compare.cjs +2 -1
  13. package/dist/legacy/timeline/compare/compare.cjs.map +1 -1
  14. package/dist/legacy/timeline/compare/compare.js +2 -1
  15. package/dist/legacy/timeline/compare/compare.js.map +1 -1
  16. package/dist/legacy/visualBuilder/components/FieldRevert/FieldRevertComponent.cjs +2 -2
  17. package/dist/legacy/visualBuilder/components/FieldRevert/FieldRevertComponent.cjs.map +1 -1
  18. package/dist/legacy/visualBuilder/components/FieldRevert/FieldRevertComponent.d.cts +1 -1
  19. package/dist/legacy/visualBuilder/components/FieldRevert/FieldRevertComponent.d.ts +1 -1
  20. package/dist/legacy/visualBuilder/components/FieldRevert/FieldRevertComponent.js +2 -2
  21. package/dist/legacy/visualBuilder/components/FieldRevert/FieldRevertComponent.js.map +1 -1
  22. package/dist/legacy/visualBuilder/components/FieldToolbar.cjs +33 -34
  23. package/dist/legacy/visualBuilder/components/FieldToolbar.cjs.map +1 -1
  24. package/dist/legacy/visualBuilder/components/FieldToolbar.js +33 -34
  25. package/dist/legacy/visualBuilder/components/FieldToolbar.js.map +1 -1
  26. package/dist/legacy/visualBuilder/components/emptyBlock.cjs +1 -0
  27. package/dist/legacy/visualBuilder/components/emptyBlock.cjs.map +1 -1
  28. package/dist/legacy/visualBuilder/components/emptyBlock.js +1 -0
  29. package/dist/legacy/visualBuilder/components/emptyBlock.js.map +1 -1
  30. package/dist/legacy/visualBuilder/generators/generateToolbar.cjs +1 -1
  31. package/dist/legacy/visualBuilder/generators/generateToolbar.cjs.map +1 -1
  32. package/dist/legacy/visualBuilder/generators/generateToolbar.js +1 -1
  33. package/dist/legacy/visualBuilder/generators/generateToolbar.js.map +1 -1
  34. package/dist/legacy/visualBuilder/listeners/index.cjs +8 -2
  35. package/dist/legacy/visualBuilder/listeners/index.cjs.map +1 -1
  36. package/dist/legacy/visualBuilder/listeners/index.js +8 -2
  37. package/dist/legacy/visualBuilder/listeners/index.js.map +1 -1
  38. package/dist/legacy/visualBuilder/utils/constants.cjs +5 -2
  39. package/dist/legacy/visualBuilder/utils/constants.cjs.map +1 -1
  40. package/dist/legacy/visualBuilder/utils/constants.d.cts +2 -1
  41. package/dist/legacy/visualBuilder/utils/constants.d.ts +2 -1
  42. package/dist/legacy/visualBuilder/utils/constants.js +3 -1
  43. package/dist/legacy/visualBuilder/utils/constants.js.map +1 -1
  44. package/dist/legacy/visualBuilder/utils/getFieldType.cjs +6 -5
  45. package/dist/legacy/visualBuilder/utils/getFieldType.cjs.map +1 -1
  46. package/dist/legacy/visualBuilder/utils/getFieldType.js +6 -5
  47. package/dist/legacy/visualBuilder/utils/getFieldType.js.map +1 -1
  48. package/dist/legacy/visualBuilder/utils/handleFieldMouseDown.cjs +10 -0
  49. package/dist/legacy/visualBuilder/utils/handleFieldMouseDown.cjs.map +1 -1
  50. package/dist/legacy/visualBuilder/utils/handleFieldMouseDown.js +10 -0
  51. package/dist/legacy/visualBuilder/utils/handleFieldMouseDown.js.map +1 -1
  52. package/dist/legacy/visualBuilder/utils/handleIndividualFields.cjs +63 -39
  53. package/dist/legacy/visualBuilder/utils/handleIndividualFields.cjs.map +1 -1
  54. package/dist/legacy/visualBuilder/utils/handleIndividualFields.js +53 -39
  55. package/dist/legacy/visualBuilder/utils/handleIndividualFields.js.map +1 -1
  56. package/dist/legacy/visualBuilder/utils/insertSpaceAtCursor.cjs +44 -0
  57. package/dist/legacy/visualBuilder/utils/insertSpaceAtCursor.cjs.map +1 -0
  58. package/dist/legacy/visualBuilder/utils/insertSpaceAtCursor.d.cts +3 -0
  59. package/dist/legacy/visualBuilder/utils/insertSpaceAtCursor.d.ts +3 -0
  60. package/dist/legacy/visualBuilder/utils/insertSpaceAtCursor.js +21 -0
  61. package/dist/legacy/visualBuilder/utils/insertSpaceAtCursor.js.map +1 -0
  62. package/dist/legacy/visualBuilder/utils/multipleElementAddButton.cjs +1 -1
  63. package/dist/legacy/visualBuilder/utils/multipleElementAddButton.cjs.map +1 -1
  64. package/dist/legacy/visualBuilder/utils/multipleElementAddButton.js +1 -1
  65. package/dist/legacy/visualBuilder/utils/multipleElementAddButton.js.map +1 -1
  66. package/dist/modern/cslp/cslpdata.cjs.map +1 -1
  67. package/dist/modern/cslp/cslpdata.js.map +1 -1
  68. package/dist/modern/livePreview/editButton/editButton.cjs +1 -1
  69. package/dist/modern/livePreview/editButton/editButton.cjs.map +1 -1
  70. package/dist/modern/livePreview/editButton/editButton.js +1 -1
  71. package/dist/modern/livePreview/editButton/editButton.js.map +1 -1
  72. package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.cjs +1 -1
  73. package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.js +1 -1
  74. package/dist/modern/preview/contentstack-live-preview-HOC.cjs +1 -1
  75. package/dist/modern/preview/contentstack-live-preview-HOC.js +1 -1
  76. package/dist/modern/timeline/compare/compare.cjs +2 -1
  77. package/dist/modern/timeline/compare/compare.cjs.map +1 -1
  78. package/dist/modern/timeline/compare/compare.js +2 -1
  79. package/dist/modern/timeline/compare/compare.js.map +1 -1
  80. package/dist/modern/visualBuilder/components/FieldRevert/FieldRevertComponent.cjs +2 -2
  81. package/dist/modern/visualBuilder/components/FieldRevert/FieldRevertComponent.cjs.map +1 -1
  82. package/dist/modern/visualBuilder/components/FieldRevert/FieldRevertComponent.d.cts +1 -1
  83. package/dist/modern/visualBuilder/components/FieldRevert/FieldRevertComponent.d.ts +1 -1
  84. package/dist/modern/visualBuilder/components/FieldRevert/FieldRevertComponent.js +2 -2
  85. package/dist/modern/visualBuilder/components/FieldRevert/FieldRevertComponent.js.map +1 -1
  86. package/dist/modern/visualBuilder/components/FieldToolbar.cjs +32 -33
  87. package/dist/modern/visualBuilder/components/FieldToolbar.cjs.map +1 -1
  88. package/dist/modern/visualBuilder/components/FieldToolbar.js +32 -33
  89. package/dist/modern/visualBuilder/components/FieldToolbar.js.map +1 -1
  90. package/dist/modern/visualBuilder/components/emptyBlock.cjs +1 -0
  91. package/dist/modern/visualBuilder/components/emptyBlock.cjs.map +1 -1
  92. package/dist/modern/visualBuilder/components/emptyBlock.js +1 -0
  93. package/dist/modern/visualBuilder/components/emptyBlock.js.map +1 -1
  94. package/dist/modern/visualBuilder/generators/generateToolbar.cjs +1 -1
  95. package/dist/modern/visualBuilder/generators/generateToolbar.cjs.map +1 -1
  96. package/dist/modern/visualBuilder/generators/generateToolbar.js +1 -1
  97. package/dist/modern/visualBuilder/generators/generateToolbar.js.map +1 -1
  98. package/dist/modern/visualBuilder/listeners/index.cjs +8 -2
  99. package/dist/modern/visualBuilder/listeners/index.cjs.map +1 -1
  100. package/dist/modern/visualBuilder/listeners/index.js +8 -2
  101. package/dist/modern/visualBuilder/listeners/index.js.map +1 -1
  102. package/dist/modern/visualBuilder/utils/constants.cjs +5 -2
  103. package/dist/modern/visualBuilder/utils/constants.cjs.map +1 -1
  104. package/dist/modern/visualBuilder/utils/constants.d.cts +2 -1
  105. package/dist/modern/visualBuilder/utils/constants.d.ts +2 -1
  106. package/dist/modern/visualBuilder/utils/constants.js +3 -1
  107. package/dist/modern/visualBuilder/utils/constants.js.map +1 -1
  108. package/dist/modern/visualBuilder/utils/getFieldType.cjs +5 -5
  109. package/dist/modern/visualBuilder/utils/getFieldType.cjs.map +1 -1
  110. package/dist/modern/visualBuilder/utils/getFieldType.js +5 -5
  111. package/dist/modern/visualBuilder/utils/getFieldType.js.map +1 -1
  112. package/dist/modern/visualBuilder/utils/handleFieldMouseDown.cjs +10 -0
  113. package/dist/modern/visualBuilder/utils/handleFieldMouseDown.cjs.map +1 -1
  114. package/dist/modern/visualBuilder/utils/handleFieldMouseDown.js +10 -0
  115. package/dist/modern/visualBuilder/utils/handleFieldMouseDown.js.map +1 -1
  116. package/dist/modern/visualBuilder/utils/handleIndividualFields.cjs +62 -39
  117. package/dist/modern/visualBuilder/utils/handleIndividualFields.cjs.map +1 -1
  118. package/dist/modern/visualBuilder/utils/handleIndividualFields.js +52 -39
  119. package/dist/modern/visualBuilder/utils/handleIndividualFields.js.map +1 -1
  120. package/dist/modern/visualBuilder/utils/insertSpaceAtCursor.cjs +44 -0
  121. package/dist/modern/visualBuilder/utils/insertSpaceAtCursor.cjs.map +1 -0
  122. package/dist/modern/visualBuilder/utils/insertSpaceAtCursor.d.cts +3 -0
  123. package/dist/modern/visualBuilder/utils/insertSpaceAtCursor.d.ts +3 -0
  124. package/dist/modern/visualBuilder/utils/insertSpaceAtCursor.js +21 -0
  125. package/dist/modern/visualBuilder/utils/insertSpaceAtCursor.js.map +1 -0
  126. package/dist/modern/visualBuilder/utils/multipleElementAddButton.cjs +1 -1
  127. package/dist/modern/visualBuilder/utils/multipleElementAddButton.cjs.map +1 -1
  128. package/dist/modern/visualBuilder/utils/multipleElementAddButton.js +1 -1
  129. package/dist/modern/visualBuilder/utils/multipleElementAddButton.js.map +1 -1
  130. package/package.json +1 -1
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/visualBuilder/utils/insertSpaceAtCursor.ts
21
+ var insertSpaceAtCursor_exports = {};
22
+ __export(insertSpaceAtCursor_exports, {
23
+ insertSpaceAtCursor: () => insertSpaceAtCursor
24
+ });
25
+ module.exports = __toCommonJS(insertSpaceAtCursor_exports);
26
+ var import_constants = require("./constants.cjs");
27
+ function insertSpaceAtCursor(element) {
28
+ const selection = window.getSelection();
29
+ if (selection && selection.rangeCount > 0) {
30
+ const range = selection.getRangeAt(0);
31
+ const spaceNode = document.createTextNode(import_constants.unicodeNonBreakingSpace);
32
+ range.deleteContents();
33
+ range.insertNode(spaceNode);
34
+ range.setStartAfter(spaceNode);
35
+ range.setEndAfter(spaceNode);
36
+ selection.removeAllRanges();
37
+ selection.addRange(range);
38
+ }
39
+ }
40
+ // Annotate the CommonJS export names for ESM import in node:
41
+ 0 && (module.exports = {
42
+ insertSpaceAtCursor
43
+ });
44
+ //# sourceMappingURL=insertSpaceAtCursor.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/visualBuilder/utils/insertSpaceAtCursor.ts"],"sourcesContent":["import { unicodeNonBreakingSpace } from \"./constants\";\n\nexport function insertSpaceAtCursor(element: HTMLElement) {\n // Check if the browser supports modern selection API\n const selection = window.getSelection();\n\n // Ensure there's a valid selection\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n\n // Create a text node with a space\n const spaceNode = document.createTextNode(unicodeNonBreakingSpace);\n\n // Delete any selected content first\n range.deleteContents();\n\n // Insert the space node\n range.insertNode(spaceNode);\n\n // Move cursor after the inserted space\n range.setStartAfter(spaceNode);\n range.setEndAfter(spaceNode);\n\n // Update the selection\n selection.removeAllRanges();\n selection.addRange(range);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAwC;AAEjC,SAAS,oBAAoB,SAAsB;AAEtD,QAAM,YAAY,OAAO,aAAa;AAGtC,MAAI,aAAa,UAAU,aAAa,GAAG;AACvC,UAAM,QAAQ,UAAU,WAAW,CAAC;AAGpC,UAAM,YAAY,SAAS,eAAe,wCAAuB;AAGjE,UAAM,eAAe;AAGrB,UAAM,WAAW,SAAS;AAG1B,UAAM,cAAc,SAAS;AAC7B,UAAM,YAAY,SAAS;AAG3B,cAAU,gBAAgB;AAC1B,cAAU,SAAS,KAAK;AAAA,EAC5B;AACJ;","names":[]}
@@ -0,0 +1,3 @@
1
+ declare function insertSpaceAtCursor(element: HTMLElement): void;
2
+
3
+ export { insertSpaceAtCursor };
@@ -0,0 +1,3 @@
1
+ declare function insertSpaceAtCursor(element: HTMLElement): void;
2
+
3
+ export { insertSpaceAtCursor };
@@ -0,0 +1,21 @@
1
+ import "../../chunk-5WRI5ZAA.js";
2
+
3
+ // src/visualBuilder/utils/insertSpaceAtCursor.ts
4
+ import { unicodeNonBreakingSpace } from "./constants.js";
5
+ function insertSpaceAtCursor(element) {
6
+ const selection = window.getSelection();
7
+ if (selection && selection.rangeCount > 0) {
8
+ const range = selection.getRangeAt(0);
9
+ const spaceNode = document.createTextNode(unicodeNonBreakingSpace);
10
+ range.deleteContents();
11
+ range.insertNode(spaceNode);
12
+ range.setStartAfter(spaceNode);
13
+ range.setEndAfter(spaceNode);
14
+ selection.removeAllRanges();
15
+ selection.addRange(range);
16
+ }
17
+ }
18
+ export {
19
+ insertSpaceAtCursor
20
+ };
21
+ //# sourceMappingURL=insertSpaceAtCursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/visualBuilder/utils/insertSpaceAtCursor.ts"],"sourcesContent":["import { unicodeNonBreakingSpace } from \"./constants\";\n\nexport function insertSpaceAtCursor(element: HTMLElement) {\n // Check if the browser supports modern selection API\n const selection = window.getSelection();\n\n // Ensure there's a valid selection\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n\n // Create a text node with a space\n const spaceNode = document.createTextNode(unicodeNonBreakingSpace);\n\n // Delete any selected content first\n range.deleteContents();\n\n // Insert the space node\n range.insertNode(spaceNode);\n\n // Move cursor after the inserted space\n range.setStartAfter(spaceNode);\n range.setEndAfter(spaceNode);\n\n // Update the selection\n selection.removeAllRanges();\n selection.addRange(range);\n }\n}\n"],"mappings":";;;AAAA,SAAS,+BAA+B;AAEjC,SAAS,oBAAoB,SAAsB;AAEtD,QAAM,YAAY,OAAO,aAAa;AAGtC,MAAI,aAAa,UAAU,aAAa,GAAG;AACvC,UAAM,QAAQ,UAAU,WAAW,CAAC;AAGpC,UAAM,YAAY,SAAS,eAAe,uBAAuB;AAGjE,UAAM,eAAe;AAGrB,UAAM,WAAW,SAAS;AAG1B,UAAM,cAAc,SAAS;AAC7B,UAAM,YAAY,SAAS;AAG3B,cAAU,gBAAgB;AAC1B,cAAU,SAAS,KAAK;AAAA,EAC5B;AACJ;","names":[]}
@@ -179,7 +179,7 @@ function observeParentAndFocusNewInstance({
179
179
  `[data-cslp='${expectedCslp}']`
180
180
  );
181
181
  if (newInstance) {
182
- setTimeout(() => newInstance.click(), 150);
182
+ setTimeout(() => newInstance.click(), 350);
183
183
  observer.disconnect();
184
184
  hasObserverDisconnected = true;
185
185
  return;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/visualBuilder/utils/multipleElementAddButton.ts"],"sourcesContent":["import { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport {\n generateAddInstanceButton,\n getAddInstanceButtons,\n} from \"../generators/generateAddInstanceButtons\";\nimport visualBuilderPostMessage from \"./visualBuilderPostMessage\";\nimport { VisualBuilderPostMessageEvents } from \"./types/postMessage.types\";\nimport getChildrenDirection from \"./getChildrenDirection\";\nimport { hideOverlay } from \"../generators/generateOverlay\";\nimport { hideHoverOutline } from \"../listeners/mouseHover\";\nimport { ISchemaFieldMap } from \"./types/index.types\";\n\nconst WAIT_FOR_NEW_INSTANCE_TIMEOUT = 4000;\n\n/**\n * The function that handles the add instance buttons for multiple fields.\n * @param eventDetails The details containing the field metadata and cslp value.\n * @param elements The elements object that contain the editable element and visual builder wrapper.\n * @param config The configuration object that contains the expected field data and disabled state.\n * @returns void\n */\nexport function handleAddButtonsForMultiple(\n eventDetails: VisualBuilderCslpEventDetails,\n elements: {\n editableElement: Element | null;\n visualBuilderContainer: HTMLDivElement | null;\n resizeObserver: ResizeObserver;\n },\n config: {\n fieldSchema: ISchemaFieldMap;\n /**\n * expectedFieldData is the value of the whole multiple field (an array)\n */\n expectedFieldData: any;\n disabled: boolean;\n label: string | undefined;\n }\n): void {\n const { editableElement, visualBuilderContainer, resizeObserver } =\n elements;\n const { expectedFieldData, fieldSchema, disabled, label } = config;\n\n const parentCslpValue =\n eventDetails.fieldMetadata.multipleFieldMetadata?.parentDetails\n ?.parentCslpValue;\n\n if (!editableElement || !parentCslpValue) {\n return;\n }\n\n const direction = getChildrenDirection(editableElement, parentCslpValue);\n if (direction === \"none\" || !visualBuilderContainer) {\n return;\n }\n\n const targetDOMDimension = editableElement.getBoundingClientRect();\n removeAddInstanceButtons(\n {\n visualBuilderContainer: visualBuilderContainer,\n eventTarget: null,\n overlayWrapper: null,\n },\n true\n );\n\n const overlayWrapper = visualBuilderContainer.querySelector(\n \".visual-builder__overlay__wrapper\"\n );\n const focusedToolbar = visualBuilderContainer.querySelector(\n \".visual-builder__focused-toolbar\"\n );\n\n const hideOverlayAndHoverOutline = () => {\n hideHoverOutline(visualBuilderContainer);\n hideOverlay({\n visualBuilderContainer: visualBuilderContainer,\n visualBuilderOverlayWrapper: overlayWrapper as HTMLDivElement,\n focusedToolbar: focusedToolbar as HTMLDivElement,\n resizeObserver,\n });\n };\n\n if (disabled) {\n return;\n }\n\n // is whole field and not a single instance of the multiple field\n const isField =\n eventDetails.fieldMetadata.instance.fieldPathWithIndex ===\n eventDetails.fieldMetadata.fieldPathWithIndex;\n\n const prevIndex = isField\n ? 0\n : eventDetails.fieldMetadata.multipleFieldMetadata.index;\n const nextIndex = isField\n ? expectedFieldData.length\n : eventDetails.fieldMetadata.multipleFieldMetadata.index + 1;\n\n const parentCslp = isField ? eventDetails.cslpData : parentCslpValue;\n\n const onMessageSent = (index: number) => {\n hideOverlayAndHoverOutline();\n observeParentAndFocusNewInstance({\n parentCslp,\n index,\n });\n };\n\n const previousButton = generateAddInstanceButton({\n onClick: () => {\n visualBuilderPostMessage\n ?.send(VisualBuilderPostMessageEvents.ADD_INSTANCE, {\n fieldMetadata: eventDetails.fieldMetadata,\n index: prevIndex,\n })\n .then(onMessageSent.bind(null, prevIndex));\n },\n label,\n fieldSchema,\n value: expectedFieldData,\n });\n\n const nextButton = generateAddInstanceButton({\n onClick: () => {\n visualBuilderPostMessage\n ?.send(VisualBuilderPostMessageEvents.ADD_INSTANCE, {\n fieldMetadata: eventDetails.fieldMetadata,\n index: nextIndex,\n })\n .then(onMessageSent.bind(null, nextIndex));\n },\n label,\n fieldSchema,\n value: expectedFieldData,\n });\n\n if (!visualBuilderContainer.contains(previousButton)) {\n visualBuilderContainer.appendChild(previousButton);\n }\n\n if (!visualBuilderContainer.contains(nextButton)) {\n visualBuilderContainer.appendChild(nextButton);\n }\n\n if (direction === \"horizontal\") {\n const middleHeight =\n targetDOMDimension.top +\n (targetDOMDimension.bottom - targetDOMDimension.top) / 2 +\n window.scrollY;\n previousButton.style.left = `${targetDOMDimension.left}px`;\n previousButton.style.top = `${middleHeight}px`;\n\n nextButton.style.left = `${targetDOMDimension.right}px`;\n nextButton.style.top = `${middleHeight}px`;\n } else {\n const middleWidth =\n targetDOMDimension.left +\n (targetDOMDimension.right - targetDOMDimension.left) / 2;\n previousButton.style.left = `${middleWidth}px`;\n previousButton.style.top = `${\n targetDOMDimension.top + window.scrollY\n }px`;\n\n nextButton.style.left = `${middleWidth}px`;\n nextButton.style.top = `${\n targetDOMDimension.bottom + window.scrollY\n }px`;\n }\n}\n\nexport function removeAddInstanceButtons(\n elements: {\n visualBuilderContainer: HTMLDivElement | null;\n overlayWrapper: HTMLDivElement | null;\n eventTarget: EventTarget | null;\n },\n forceRemoveAll = false\n): void {\n const { visualBuilderContainer, overlayWrapper, eventTarget } = elements;\n\n if (!visualBuilderContainer) {\n return;\n }\n\n if (forceRemoveAll) {\n const addInstanceButtons = getAddInstanceButtons(\n visualBuilderContainer,\n true\n );\n\n addInstanceButtons?.forEach((button) => button.remove());\n }\n\n const addInstanceButtons = getAddInstanceButtons(visualBuilderContainer);\n\n if (!addInstanceButtons) {\n return;\n }\n\n const [previousButton, nextButton] = addInstanceButtons;\n\n if (overlayWrapper?.classList.contains(\"visible\")) {\n return;\n }\n\n if (\n eventTarget &&\n (previousButton.contains(eventTarget as Node) ||\n nextButton.contains(eventTarget as Node))\n ) {\n return;\n }\n\n nextButton.remove();\n previousButton.remove();\n}\n\n/**\n * This function that observes the parent element and focuses the newly added instance.\n *\n * @param parentCslp The parent cslp value.\n * @param index The index of the new instance.\n * @returns void\n *\n * We can evolve the retry logic, as different use cases arise.\n * Currently, if the new element is not found after the first mutation, we until\n * WAIT_FOR_NEW_INSTANCE_TIMEOUT, expecting that the new instance/block will be\n * found in later mutations and we can focus + disconnect then.\n * We also ensure there is only one setTimeout scheduled.\n */\nexport function observeParentAndFocusNewInstance({\n parentCslp,\n index,\n}: {\n parentCslp: string;\n index: number;\n}): void {\n const parent = document.querySelector(\n `[data-cslp='${parentCslp}']`\n ) as HTMLElement;\n\n if (parent) {\n const expectedCslp = [parentCslp, index].join(\".\");\n\n let hasObserverDisconnected = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const mutationObserver = new MutationObserver(\n (_mutations, observer) => {\n const newInstance = parent.querySelector(\n `[data-cslp='${expectedCslp}']`\n ) as HTMLElement | null;\n if (newInstance) {\n // this is how we also navigate to parent elements, but parent elements\n // are never primitive fields, the instances can be and this steals\n // focus from the form and puts it on the canvas.\n // So currently for a singleline multiple field, the form opens but we\n // come back to the canvas.\n // TODO - maybe we should not focus the content-editable\n // TODO - temp fix. We remove our empty block div once the new block arrives\n // but we focus the element before that and then the block shifts.\n // For some reason, the window resize event also does not trigger\n setTimeout(() => newInstance.click(), 150);\n observer.disconnect();\n hasObserverDisconnected = true;\n return;\n }\n if (!hasObserverDisconnected && !timeoutId) {\n // disconnect the observer whether we found the new instance or not\n // after timeout\n timeoutId = setTimeout(() => {\n observer.disconnect();\n hasObserverDisconnected = false;\n }, WAIT_FOR_NEW_INSTANCE_TIMEOUT);\n }\n }\n );\n mutationObserver.observe(parent, {\n childList: true,\n // watch subtrees as there may be wrapper elements\n subtree: true,\n // we don't need to watch for attribute changes\n attributes: false,\n });\n }\n}\n"],"mappings":"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","names":["getChildrenDirection","_a","visualBuilderPostMessage","addInstanceButtons"]}
1
+ {"version":3,"sources":["../../../../src/visualBuilder/utils/multipleElementAddButton.ts"],"sourcesContent":["import { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport {\n generateAddInstanceButton,\n getAddInstanceButtons,\n} from \"../generators/generateAddInstanceButtons\";\nimport visualBuilderPostMessage from \"./visualBuilderPostMessage\";\nimport { VisualBuilderPostMessageEvents } from \"./types/postMessage.types\";\nimport getChildrenDirection from \"./getChildrenDirection\";\nimport { hideOverlay } from \"../generators/generateOverlay\";\nimport { hideHoverOutline } from \"../listeners/mouseHover\";\nimport { ISchemaFieldMap } from \"./types/index.types\";\n\nconst WAIT_FOR_NEW_INSTANCE_TIMEOUT = 4000;\n\n/**\n * The function that handles the add instance buttons for multiple fields.\n * @param eventDetails The details containing the field metadata and cslp value.\n * @param elements The elements object that contain the editable element and visual builder wrapper.\n * @param config The configuration object that contains the expected field data and disabled state.\n * @returns void\n */\nexport function handleAddButtonsForMultiple(\n eventDetails: VisualBuilderCslpEventDetails,\n elements: {\n editableElement: Element | null;\n visualBuilderContainer: HTMLDivElement | null;\n resizeObserver: ResizeObserver;\n },\n config: {\n fieldSchema: ISchemaFieldMap;\n /**\n * expectedFieldData is the value of the whole multiple field (an array)\n */\n expectedFieldData: any;\n disabled: boolean;\n label: string | undefined;\n }\n): void {\n const { editableElement, visualBuilderContainer, resizeObserver } =\n elements;\n const { expectedFieldData, fieldSchema, disabled, label } = config;\n\n const parentCslpValue =\n eventDetails.fieldMetadata.multipleFieldMetadata?.parentDetails\n ?.parentCslpValue;\n\n if (!editableElement || !parentCslpValue) {\n return;\n }\n\n const direction = getChildrenDirection(editableElement, parentCslpValue);\n if (direction === \"none\" || !visualBuilderContainer) {\n return;\n }\n\n const targetDOMDimension = editableElement.getBoundingClientRect();\n removeAddInstanceButtons(\n {\n visualBuilderContainer: visualBuilderContainer,\n eventTarget: null,\n overlayWrapper: null,\n },\n true\n );\n\n const overlayWrapper = visualBuilderContainer.querySelector(\n \".visual-builder__overlay__wrapper\"\n );\n const focusedToolbar = visualBuilderContainer.querySelector(\n \".visual-builder__focused-toolbar\"\n );\n\n const hideOverlayAndHoverOutline = () => {\n hideHoverOutline(visualBuilderContainer);\n hideOverlay({\n visualBuilderContainer: visualBuilderContainer,\n visualBuilderOverlayWrapper: overlayWrapper as HTMLDivElement,\n focusedToolbar: focusedToolbar as HTMLDivElement,\n resizeObserver,\n });\n };\n\n if (disabled) {\n return;\n }\n\n // is whole field and not a single instance of the multiple field\n const isField =\n eventDetails.fieldMetadata.instance.fieldPathWithIndex ===\n eventDetails.fieldMetadata.fieldPathWithIndex;\n\n const prevIndex = isField\n ? 0\n : eventDetails.fieldMetadata.multipleFieldMetadata.index;\n const nextIndex = isField\n ? expectedFieldData.length\n : eventDetails.fieldMetadata.multipleFieldMetadata.index + 1;\n\n const parentCslp = isField ? eventDetails.cslpData : parentCslpValue;\n\n const onMessageSent = (index: number) => {\n hideOverlayAndHoverOutline();\n observeParentAndFocusNewInstance({\n parentCslp,\n index,\n });\n };\n\n const previousButton = generateAddInstanceButton({\n onClick: () => {\n visualBuilderPostMessage\n ?.send(VisualBuilderPostMessageEvents.ADD_INSTANCE, {\n fieldMetadata: eventDetails.fieldMetadata,\n index: prevIndex,\n })\n .then(onMessageSent.bind(null, prevIndex));\n },\n label,\n fieldSchema,\n value: expectedFieldData,\n });\n\n const nextButton = generateAddInstanceButton({\n onClick: () => {\n visualBuilderPostMessage\n ?.send(VisualBuilderPostMessageEvents.ADD_INSTANCE, {\n fieldMetadata: eventDetails.fieldMetadata,\n index: nextIndex,\n })\n .then(onMessageSent.bind(null, nextIndex));\n },\n label,\n fieldSchema,\n value: expectedFieldData,\n });\n\n if (!visualBuilderContainer.contains(previousButton)) {\n visualBuilderContainer.appendChild(previousButton);\n }\n\n if (!visualBuilderContainer.contains(nextButton)) {\n visualBuilderContainer.appendChild(nextButton);\n }\n\n if (direction === \"horizontal\") {\n const middleHeight =\n targetDOMDimension.top +\n (targetDOMDimension.bottom - targetDOMDimension.top) / 2 +\n window.scrollY;\n previousButton.style.left = `${targetDOMDimension.left}px`;\n previousButton.style.top = `${middleHeight}px`;\n\n nextButton.style.left = `${targetDOMDimension.right}px`;\n nextButton.style.top = `${middleHeight}px`;\n } else {\n const middleWidth =\n targetDOMDimension.left +\n (targetDOMDimension.right - targetDOMDimension.left) / 2;\n previousButton.style.left = `${middleWidth}px`;\n previousButton.style.top = `${\n targetDOMDimension.top + window.scrollY\n }px`;\n\n nextButton.style.left = `${middleWidth}px`;\n nextButton.style.top = `${\n targetDOMDimension.bottom + window.scrollY\n }px`;\n }\n}\n\nexport function removeAddInstanceButtons(\n elements: {\n visualBuilderContainer: HTMLDivElement | null;\n overlayWrapper: HTMLDivElement | null;\n eventTarget: EventTarget | null;\n },\n forceRemoveAll = false\n): void {\n const { visualBuilderContainer, overlayWrapper, eventTarget } = elements;\n\n if (!visualBuilderContainer) {\n return;\n }\n\n if (forceRemoveAll) {\n const addInstanceButtons = getAddInstanceButtons(\n visualBuilderContainer,\n true\n );\n\n addInstanceButtons?.forEach((button) => button.remove());\n }\n\n const addInstanceButtons = getAddInstanceButtons(visualBuilderContainer);\n\n if (!addInstanceButtons) {\n return;\n }\n\n const [previousButton, nextButton] = addInstanceButtons;\n\n if (overlayWrapper?.classList.contains(\"visible\")) {\n return;\n }\n\n if (\n eventTarget &&\n (previousButton.contains(eventTarget as Node) ||\n nextButton.contains(eventTarget as Node))\n ) {\n return;\n }\n\n nextButton.remove();\n previousButton.remove();\n}\n\n/**\n * This function that observes the parent element and focuses the newly added instance.\n *\n * @param parentCslp The parent cslp value.\n * @param index The index of the new instance.\n * @returns void\n *\n * We can evolve the retry logic, as different use cases arise.\n * Currently, if the new element is not found after the first mutation, we until\n * WAIT_FOR_NEW_INSTANCE_TIMEOUT, expecting that the new instance/block will be\n * found in later mutations and we can focus + disconnect then.\n * We also ensure there is only one setTimeout scheduled.\n */\nexport function observeParentAndFocusNewInstance({\n parentCslp,\n index,\n}: {\n parentCslp: string;\n index: number;\n}): void {\n const parent = document.querySelector(\n `[data-cslp='${parentCslp}']`\n ) as HTMLElement;\n\n if (parent) {\n const expectedCslp = [parentCslp, index].join(\".\");\n\n let hasObserverDisconnected = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const mutationObserver = new MutationObserver(\n (_mutations, observer) => {\n const newInstance = parent.querySelector(\n `[data-cslp='${expectedCslp}']`\n ) as HTMLElement | null;\n if (newInstance) {\n // this is how we also navigate to parent elements, but parent elements\n // are never primitive fields, the instances can be and this steals\n // focus from the form and puts it on the canvas.\n // So currently for a singleline multiple field, the form opens but we\n // come back to the canvas.\n // TODO - maybe we should not focus the content-editable\n // TODO - temp fix. We remove our empty block div once the new block arrives\n // but we focus the element before that and then the block shifts.\n // For some reason, the window resize event also does not trigger\n setTimeout(() => newInstance.click(), 350);\n observer.disconnect();\n hasObserverDisconnected = true;\n return;\n }\n if (!hasObserverDisconnected && !timeoutId) {\n // disconnect the observer whether we found the new instance or not\n // after timeout\n timeoutId = setTimeout(() => {\n observer.disconnect();\n hasObserverDisconnected = false;\n }, WAIT_FOR_NEW_INSTANCE_TIMEOUT);\n }\n }\n );\n mutationObserver.observe(parent, {\n childList: true,\n // watch subtrees as there may be wrapper elements\n subtree: true,\n // we don't need to watch for attribute changes\n attributes: false,\n });\n }\n}\n"],"mappings":"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","names":["getChildrenDirection","_a","visualBuilderPostMessage","addInstanceButtons"]}
@@ -148,7 +148,7 @@ function observeParentAndFocusNewInstance({
148
148
  `[data-cslp='${expectedCslp}']`
149
149
  );
150
150
  if (newInstance) {
151
- setTimeout(() => newInstance.click(), 150);
151
+ setTimeout(() => newInstance.click(), 350);
152
152
  observer.disconnect();
153
153
  hasObserverDisconnected = true;
154
154
  return;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/visualBuilder/utils/multipleElementAddButton.ts"],"sourcesContent":["import { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport {\n generateAddInstanceButton,\n getAddInstanceButtons,\n} from \"../generators/generateAddInstanceButtons\";\nimport visualBuilderPostMessage from \"./visualBuilderPostMessage\";\nimport { VisualBuilderPostMessageEvents } from \"./types/postMessage.types\";\nimport getChildrenDirection from \"./getChildrenDirection\";\nimport { hideOverlay } from \"../generators/generateOverlay\";\nimport { hideHoverOutline } from \"../listeners/mouseHover\";\nimport { ISchemaFieldMap } from \"./types/index.types\";\n\nconst WAIT_FOR_NEW_INSTANCE_TIMEOUT = 4000;\n\n/**\n * The function that handles the add instance buttons for multiple fields.\n * @param eventDetails The details containing the field metadata and cslp value.\n * @param elements The elements object that contain the editable element and visual builder wrapper.\n * @param config The configuration object that contains the expected field data and disabled state.\n * @returns void\n */\nexport function handleAddButtonsForMultiple(\n eventDetails: VisualBuilderCslpEventDetails,\n elements: {\n editableElement: Element | null;\n visualBuilderContainer: HTMLDivElement | null;\n resizeObserver: ResizeObserver;\n },\n config: {\n fieldSchema: ISchemaFieldMap;\n /**\n * expectedFieldData is the value of the whole multiple field (an array)\n */\n expectedFieldData: any;\n disabled: boolean;\n label: string | undefined;\n }\n): void {\n const { editableElement, visualBuilderContainer, resizeObserver } =\n elements;\n const { expectedFieldData, fieldSchema, disabled, label } = config;\n\n const parentCslpValue =\n eventDetails.fieldMetadata.multipleFieldMetadata?.parentDetails\n ?.parentCslpValue;\n\n if (!editableElement || !parentCslpValue) {\n return;\n }\n\n const direction = getChildrenDirection(editableElement, parentCslpValue);\n if (direction === \"none\" || !visualBuilderContainer) {\n return;\n }\n\n const targetDOMDimension = editableElement.getBoundingClientRect();\n removeAddInstanceButtons(\n {\n visualBuilderContainer: visualBuilderContainer,\n eventTarget: null,\n overlayWrapper: null,\n },\n true\n );\n\n const overlayWrapper = visualBuilderContainer.querySelector(\n \".visual-builder__overlay__wrapper\"\n );\n const focusedToolbar = visualBuilderContainer.querySelector(\n \".visual-builder__focused-toolbar\"\n );\n\n const hideOverlayAndHoverOutline = () => {\n hideHoverOutline(visualBuilderContainer);\n hideOverlay({\n visualBuilderContainer: visualBuilderContainer,\n visualBuilderOverlayWrapper: overlayWrapper as HTMLDivElement,\n focusedToolbar: focusedToolbar as HTMLDivElement,\n resizeObserver,\n });\n };\n\n if (disabled) {\n return;\n }\n\n // is whole field and not a single instance of the multiple field\n const isField =\n eventDetails.fieldMetadata.instance.fieldPathWithIndex ===\n eventDetails.fieldMetadata.fieldPathWithIndex;\n\n const prevIndex = isField\n ? 0\n : eventDetails.fieldMetadata.multipleFieldMetadata.index;\n const nextIndex = isField\n ? expectedFieldData.length\n : eventDetails.fieldMetadata.multipleFieldMetadata.index + 1;\n\n const parentCslp = isField ? eventDetails.cslpData : parentCslpValue;\n\n const onMessageSent = (index: number) => {\n hideOverlayAndHoverOutline();\n observeParentAndFocusNewInstance({\n parentCslp,\n index,\n });\n };\n\n const previousButton = generateAddInstanceButton({\n onClick: () => {\n visualBuilderPostMessage\n ?.send(VisualBuilderPostMessageEvents.ADD_INSTANCE, {\n fieldMetadata: eventDetails.fieldMetadata,\n index: prevIndex,\n })\n .then(onMessageSent.bind(null, prevIndex));\n },\n label,\n fieldSchema,\n value: expectedFieldData,\n });\n\n const nextButton = generateAddInstanceButton({\n onClick: () => {\n visualBuilderPostMessage\n ?.send(VisualBuilderPostMessageEvents.ADD_INSTANCE, {\n fieldMetadata: eventDetails.fieldMetadata,\n index: nextIndex,\n })\n .then(onMessageSent.bind(null, nextIndex));\n },\n label,\n fieldSchema,\n value: expectedFieldData,\n });\n\n if (!visualBuilderContainer.contains(previousButton)) {\n visualBuilderContainer.appendChild(previousButton);\n }\n\n if (!visualBuilderContainer.contains(nextButton)) {\n visualBuilderContainer.appendChild(nextButton);\n }\n\n if (direction === \"horizontal\") {\n const middleHeight =\n targetDOMDimension.top +\n (targetDOMDimension.bottom - targetDOMDimension.top) / 2 +\n window.scrollY;\n previousButton.style.left = `${targetDOMDimension.left}px`;\n previousButton.style.top = `${middleHeight}px`;\n\n nextButton.style.left = `${targetDOMDimension.right}px`;\n nextButton.style.top = `${middleHeight}px`;\n } else {\n const middleWidth =\n targetDOMDimension.left +\n (targetDOMDimension.right - targetDOMDimension.left) / 2;\n previousButton.style.left = `${middleWidth}px`;\n previousButton.style.top = `${\n targetDOMDimension.top + window.scrollY\n }px`;\n\n nextButton.style.left = `${middleWidth}px`;\n nextButton.style.top = `${\n targetDOMDimension.bottom + window.scrollY\n }px`;\n }\n}\n\nexport function removeAddInstanceButtons(\n elements: {\n visualBuilderContainer: HTMLDivElement | null;\n overlayWrapper: HTMLDivElement | null;\n eventTarget: EventTarget | null;\n },\n forceRemoveAll = false\n): void {\n const { visualBuilderContainer, overlayWrapper, eventTarget } = elements;\n\n if (!visualBuilderContainer) {\n return;\n }\n\n if (forceRemoveAll) {\n const addInstanceButtons = getAddInstanceButtons(\n visualBuilderContainer,\n true\n );\n\n addInstanceButtons?.forEach((button) => button.remove());\n }\n\n const addInstanceButtons = getAddInstanceButtons(visualBuilderContainer);\n\n if (!addInstanceButtons) {\n return;\n }\n\n const [previousButton, nextButton] = addInstanceButtons;\n\n if (overlayWrapper?.classList.contains(\"visible\")) {\n return;\n }\n\n if (\n eventTarget &&\n (previousButton.contains(eventTarget as Node) ||\n nextButton.contains(eventTarget as Node))\n ) {\n return;\n }\n\n nextButton.remove();\n previousButton.remove();\n}\n\n/**\n * This function that observes the parent element and focuses the newly added instance.\n *\n * @param parentCslp The parent cslp value.\n * @param index The index of the new instance.\n * @returns void\n *\n * We can evolve the retry logic, as different use cases arise.\n * Currently, if the new element is not found after the first mutation, we until\n * WAIT_FOR_NEW_INSTANCE_TIMEOUT, expecting that the new instance/block will be\n * found in later mutations and we can focus + disconnect then.\n * We also ensure there is only one setTimeout scheduled.\n */\nexport function observeParentAndFocusNewInstance({\n parentCslp,\n index,\n}: {\n parentCslp: string;\n index: number;\n}): void {\n const parent = document.querySelector(\n `[data-cslp='${parentCslp}']`\n ) as HTMLElement;\n\n if (parent) {\n const expectedCslp = [parentCslp, index].join(\".\");\n\n let hasObserverDisconnected = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const mutationObserver = new MutationObserver(\n (_mutations, observer) => {\n const newInstance = parent.querySelector(\n `[data-cslp='${expectedCslp}']`\n ) as HTMLElement | null;\n if (newInstance) {\n // this is how we also navigate to parent elements, but parent elements\n // are never primitive fields, the instances can be and this steals\n // focus from the form and puts it on the canvas.\n // So currently for a singleline multiple field, the form opens but we\n // come back to the canvas.\n // TODO - maybe we should not focus the content-editable\n // TODO - temp fix. We remove our empty block div once the new block arrives\n // but we focus the element before that and then the block shifts.\n // For some reason, the window resize event also does not trigger\n setTimeout(() => newInstance.click(), 150);\n observer.disconnect();\n hasObserverDisconnected = true;\n return;\n }\n if (!hasObserverDisconnected && !timeoutId) {\n // disconnect the observer whether we found the new instance or not\n // after timeout\n timeoutId = setTimeout(() => {\n observer.disconnect();\n hasObserverDisconnected = false;\n }, WAIT_FOR_NEW_INSTANCE_TIMEOUT);\n }\n }\n );\n mutationObserver.observe(parent, {\n childList: true,\n // watch subtrees as there may be wrapper elements\n subtree: true,\n // we don't need to watch for attribute changes\n attributes: false,\n });\n }\n}\n"],"mappings":"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","names":["_a","addInstanceButtons"]}
1
+ {"version":3,"sources":["../../../../src/visualBuilder/utils/multipleElementAddButton.ts"],"sourcesContent":["import { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport {\n generateAddInstanceButton,\n getAddInstanceButtons,\n} from \"../generators/generateAddInstanceButtons\";\nimport visualBuilderPostMessage from \"./visualBuilderPostMessage\";\nimport { VisualBuilderPostMessageEvents } from \"./types/postMessage.types\";\nimport getChildrenDirection from \"./getChildrenDirection\";\nimport { hideOverlay } from \"../generators/generateOverlay\";\nimport { hideHoverOutline } from \"../listeners/mouseHover\";\nimport { ISchemaFieldMap } from \"./types/index.types\";\n\nconst WAIT_FOR_NEW_INSTANCE_TIMEOUT = 4000;\n\n/**\n * The function that handles the add instance buttons for multiple fields.\n * @param eventDetails The details containing the field metadata and cslp value.\n * @param elements The elements object that contain the editable element and visual builder wrapper.\n * @param config The configuration object that contains the expected field data and disabled state.\n * @returns void\n */\nexport function handleAddButtonsForMultiple(\n eventDetails: VisualBuilderCslpEventDetails,\n elements: {\n editableElement: Element | null;\n visualBuilderContainer: HTMLDivElement | null;\n resizeObserver: ResizeObserver;\n },\n config: {\n fieldSchema: ISchemaFieldMap;\n /**\n * expectedFieldData is the value of the whole multiple field (an array)\n */\n expectedFieldData: any;\n disabled: boolean;\n label: string | undefined;\n }\n): void {\n const { editableElement, visualBuilderContainer, resizeObserver } =\n elements;\n const { expectedFieldData, fieldSchema, disabled, label } = config;\n\n const parentCslpValue =\n eventDetails.fieldMetadata.multipleFieldMetadata?.parentDetails\n ?.parentCslpValue;\n\n if (!editableElement || !parentCslpValue) {\n return;\n }\n\n const direction = getChildrenDirection(editableElement, parentCslpValue);\n if (direction === \"none\" || !visualBuilderContainer) {\n return;\n }\n\n const targetDOMDimension = editableElement.getBoundingClientRect();\n removeAddInstanceButtons(\n {\n visualBuilderContainer: visualBuilderContainer,\n eventTarget: null,\n overlayWrapper: null,\n },\n true\n );\n\n const overlayWrapper = visualBuilderContainer.querySelector(\n \".visual-builder__overlay__wrapper\"\n );\n const focusedToolbar = visualBuilderContainer.querySelector(\n \".visual-builder__focused-toolbar\"\n );\n\n const hideOverlayAndHoverOutline = () => {\n hideHoverOutline(visualBuilderContainer);\n hideOverlay({\n visualBuilderContainer: visualBuilderContainer,\n visualBuilderOverlayWrapper: overlayWrapper as HTMLDivElement,\n focusedToolbar: focusedToolbar as HTMLDivElement,\n resizeObserver,\n });\n };\n\n if (disabled) {\n return;\n }\n\n // is whole field and not a single instance of the multiple field\n const isField =\n eventDetails.fieldMetadata.instance.fieldPathWithIndex ===\n eventDetails.fieldMetadata.fieldPathWithIndex;\n\n const prevIndex = isField\n ? 0\n : eventDetails.fieldMetadata.multipleFieldMetadata.index;\n const nextIndex = isField\n ? expectedFieldData.length\n : eventDetails.fieldMetadata.multipleFieldMetadata.index + 1;\n\n const parentCslp = isField ? eventDetails.cslpData : parentCslpValue;\n\n const onMessageSent = (index: number) => {\n hideOverlayAndHoverOutline();\n observeParentAndFocusNewInstance({\n parentCslp,\n index,\n });\n };\n\n const previousButton = generateAddInstanceButton({\n onClick: () => {\n visualBuilderPostMessage\n ?.send(VisualBuilderPostMessageEvents.ADD_INSTANCE, {\n fieldMetadata: eventDetails.fieldMetadata,\n index: prevIndex,\n })\n .then(onMessageSent.bind(null, prevIndex));\n },\n label,\n fieldSchema,\n value: expectedFieldData,\n });\n\n const nextButton = generateAddInstanceButton({\n onClick: () => {\n visualBuilderPostMessage\n ?.send(VisualBuilderPostMessageEvents.ADD_INSTANCE, {\n fieldMetadata: eventDetails.fieldMetadata,\n index: nextIndex,\n })\n .then(onMessageSent.bind(null, nextIndex));\n },\n label,\n fieldSchema,\n value: expectedFieldData,\n });\n\n if (!visualBuilderContainer.contains(previousButton)) {\n visualBuilderContainer.appendChild(previousButton);\n }\n\n if (!visualBuilderContainer.contains(nextButton)) {\n visualBuilderContainer.appendChild(nextButton);\n }\n\n if (direction === \"horizontal\") {\n const middleHeight =\n targetDOMDimension.top +\n (targetDOMDimension.bottom - targetDOMDimension.top) / 2 +\n window.scrollY;\n previousButton.style.left = `${targetDOMDimension.left}px`;\n previousButton.style.top = `${middleHeight}px`;\n\n nextButton.style.left = `${targetDOMDimension.right}px`;\n nextButton.style.top = `${middleHeight}px`;\n } else {\n const middleWidth =\n targetDOMDimension.left +\n (targetDOMDimension.right - targetDOMDimension.left) / 2;\n previousButton.style.left = `${middleWidth}px`;\n previousButton.style.top = `${\n targetDOMDimension.top + window.scrollY\n }px`;\n\n nextButton.style.left = `${middleWidth}px`;\n nextButton.style.top = `${\n targetDOMDimension.bottom + window.scrollY\n }px`;\n }\n}\n\nexport function removeAddInstanceButtons(\n elements: {\n visualBuilderContainer: HTMLDivElement | null;\n overlayWrapper: HTMLDivElement | null;\n eventTarget: EventTarget | null;\n },\n forceRemoveAll = false\n): void {\n const { visualBuilderContainer, overlayWrapper, eventTarget } = elements;\n\n if (!visualBuilderContainer) {\n return;\n }\n\n if (forceRemoveAll) {\n const addInstanceButtons = getAddInstanceButtons(\n visualBuilderContainer,\n true\n );\n\n addInstanceButtons?.forEach((button) => button.remove());\n }\n\n const addInstanceButtons = getAddInstanceButtons(visualBuilderContainer);\n\n if (!addInstanceButtons) {\n return;\n }\n\n const [previousButton, nextButton] = addInstanceButtons;\n\n if (overlayWrapper?.classList.contains(\"visible\")) {\n return;\n }\n\n if (\n eventTarget &&\n (previousButton.contains(eventTarget as Node) ||\n nextButton.contains(eventTarget as Node))\n ) {\n return;\n }\n\n nextButton.remove();\n previousButton.remove();\n}\n\n/**\n * This function that observes the parent element and focuses the newly added instance.\n *\n * @param parentCslp The parent cslp value.\n * @param index The index of the new instance.\n * @returns void\n *\n * We can evolve the retry logic, as different use cases arise.\n * Currently, if the new element is not found after the first mutation, we until\n * WAIT_FOR_NEW_INSTANCE_TIMEOUT, expecting that the new instance/block will be\n * found in later mutations and we can focus + disconnect then.\n * We also ensure there is only one setTimeout scheduled.\n */\nexport function observeParentAndFocusNewInstance({\n parentCslp,\n index,\n}: {\n parentCslp: string;\n index: number;\n}): void {\n const parent = document.querySelector(\n `[data-cslp='${parentCslp}']`\n ) as HTMLElement;\n\n if (parent) {\n const expectedCslp = [parentCslp, index].join(\".\");\n\n let hasObserverDisconnected = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const mutationObserver = new MutationObserver(\n (_mutations, observer) => {\n const newInstance = parent.querySelector(\n `[data-cslp='${expectedCslp}']`\n ) as HTMLElement | null;\n if (newInstance) {\n // this is how we also navigate to parent elements, but parent elements\n // are never primitive fields, the instances can be and this steals\n // focus from the form and puts it on the canvas.\n // So currently for a singleline multiple field, the form opens but we\n // come back to the canvas.\n // TODO - maybe we should not focus the content-editable\n // TODO - temp fix. We remove our empty block div once the new block arrives\n // but we focus the element before that and then the block shifts.\n // For some reason, the window resize event also does not trigger\n setTimeout(() => newInstance.click(), 350);\n observer.disconnect();\n hasObserverDisconnected = true;\n return;\n }\n if (!hasObserverDisconnected && !timeoutId) {\n // disconnect the observer whether we found the new instance or not\n // after timeout\n timeoutId = setTimeout(() => {\n observer.disconnect();\n hasObserverDisconnected = false;\n }, WAIT_FOR_NEW_INSTANCE_TIMEOUT);\n }\n }\n );\n mutationObserver.observe(parent, {\n childList: true,\n // watch subtrees as there may be wrapper elements\n subtree: true,\n // we don't need to watch for attribute changes\n attributes: false,\n });\n }\n}\n"],"mappings":"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","names":["_a","addInstanceButtons"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cslp/cslpdata.ts"],"sourcesContent":["import { isNil, isFinite, findLastIndex, findLast } from \"lodash-es\";\nimport {\n CslpData,\n CslpDataMultipleFieldMetadata,\n CslpDataParentDetails,\n} from \"./types/cslp.types\";\nimport Config from \"../configManager/configManager\";\nimport { DeepSignal } from \"deepsignal\";\nimport { cslpTagStyles } from \"../livePreview/editButton/editButton.style\";\n\n/**\n * Extracts details from a CSLP value string.\n * @param cslpValue The CSLP value string to extract details from.\n * @returns An object containing the extracted details.\n */\nexport function extractDetailsFromCslp(cslpValue: string): CslpData {\n let [cslpVersion, cslpData] = cslpValue.split(\":\");\n // If the cslpVersion is greater than 2 letter which means it is v1 version of cslp data\n if (cslpVersion.length > 2) {\n cslpData = cslpVersion;\n cslpVersion = \"v1\";\n }\n\n const [content_type_uid, entryInfo, locale, ...fieldPath] =\n cslpData.split(\".\");\n\n let entry_uid: string;\n let variant;\n\n switch (cslpVersion) {\n case \"v2\": {\n const [uid, variant_uid] = entryInfo.split(\"_\");\n entry_uid = uid;\n variant = variant_uid;\n break;\n }\n default: {\n entry_uid = entryInfo;\n break;\n }\n }\n const instancePathWithInstance = fieldPath.join(\".\");\n const calculatedPath = fieldPath.filter((path) => {\n const isEmpty = isNil(path);\n const isNumber = isFinite(+path);\n return (!isEmpty && !isNumber) || false;\n });\n\n const multipleFieldMetadata: CslpDataMultipleFieldMetadata =\n getMultipleFieldMetadata(\n content_type_uid,\n entry_uid,\n locale,\n fieldPath\n );\n\n /**\n * The index in the end of the field does not represent a field.\n * It represents the index of the field in the multiple field.\n * Hence, we pop it out.\n */\n if (isFinite(+fieldPath[fieldPath.length - 1])) {\n fieldPath.pop();\n }\n\n return {\n entry_uid,\n content_type_uid,\n variant,\n locale,\n cslpValue: cslpValue,\n fieldPath: calculatedPath.join(\".\"),\n fieldPathWithIndex: fieldPath.join(\".\"),\n multipleFieldMetadata: multipleFieldMetadata,\n instance: {\n fieldPathWithIndex: instancePathWithInstance,\n },\n };\n}\n\n/**\n * Returns the parent path details of a given field path in CSLP format.\n * @param content_type_uid - The UID of the content type.\n * @param entry_uid - The UID of the entry.\n * @param locale - The locale of the entry.\n * @param fieldPath - The field path to get the parent path details for.\n * @returns The parent path details in CSLP format, or null if the field path does not have a parent.\n */\nfunction getParentPathDetails(\n content_type_uid: string,\n entry_uid: string,\n locale: string,\n fieldPath: string[]\n): CslpDataParentDetails | null {\n const index = findLastIndex(fieldPath, (path) => isFinite(+path));\n if (index === -1) return null;\n\n const parentPath = fieldPath.slice(0, index);\n return {\n parentPath: parentPath.join(\".\"),\n parentCslpValue: [\n content_type_uid,\n entry_uid,\n locale,\n ...parentPath,\n ].join(\".\"),\n };\n}\n\n/**\n * Returns metadata for a multiple field in a content entry.\n * @param content_type_uid - The UID of the content type.\n * @param entry_uid - The UID of the content entry.\n * @param locale - The locale of the content entry.\n * @param fieldPath - The path of the multiple field.\n * @returns The metadata for the multiple field.\n */\nfunction getMultipleFieldMetadata(\n content_type_uid: string,\n entry_uid: string,\n locale: string,\n fieldPath: string[]\n): CslpDataMultipleFieldMetadata {\n const parentDetails = getParentPathDetails(\n content_type_uid,\n entry_uid,\n locale,\n fieldPath\n );\n\n const index = findLast(fieldPath, (path) => isFinite(+path));\n\n return {\n parentDetails: parentDetails,\n index: isNil(index) ? -1 : +index,\n };\n}\n\n//TODO: move this to editbutton\n/**\n * Adds an outline to the clicked element and triggers a callback function.\n * @param e - The MouseEvent object representing the click event.\n * @param callback - An optional callback function that will be called with the CSLP tag and highlighted element as arguments.\n */\nexport function addCslpOutline(\n e: MouseEvent,\n callback?: (args: {\n cslpTag: string;\n highlightedElement: HTMLElement;\n }) => void\n): void {\n const elements = Config.get().elements;\n\n let trigger = true;\n const eventTargets = e.composedPath();\n\n for (const eventTarget of eventTargets) {\n const element = eventTarget as HTMLElement;\n if (element.nodeName === \"BODY\") break;\n if (typeof element?.getAttribute !== \"function\") continue;\n\n const cslpTag = element.getAttribute(\"data-cslp\");\n\n if (trigger && cslpTag) {\n if (elements.highlightedElement)\n elements.highlightedElement.classList.remove(\n cslpTagStyles()[\"cslp-edit-mode\"]\n );\n element.classList.add(cslpTagStyles()[\"cslp-edit-mode\"]);\n\n const updatedElements = elements;\n updatedElements.highlightedElement =\n element as DeepSignal<HTMLElement>;\n Config.set(\"elements\", updatedElements);\n\n callback?.({\n cslpTag: cslpTag,\n highlightedElement: element,\n });\n\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(cslpTagStyles()[\"cslp-edit-mode\"]);\n }\n }\n}\n"],"mappings":"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","names":["Config"]}
1
+ {"version":3,"sources":["../../../src/cslp/cslpdata.ts"],"sourcesContent":["import { isNil, isFinite, findLastIndex, findLast } from \"lodash-es\";\nimport {\n CslpData,\n CslpDataMultipleFieldMetadata,\n CslpDataParentDetails,\n} from \"./types/cslp.types\";\nimport Config from \"../configManager/configManager\";\nimport { DeepSignal } from \"deepsignal\";\nimport { cslpTagStyles } from \"../livePreview/editButton/editButton.style\";\n\n/**\n * Extracts details from a CSLP value string.\n * @param cslpValue The CSLP value string to extract details from.\n * @returns An object containing the extracted details.\n */\nexport function extractDetailsFromCslp(cslpValue: string): CslpData {\n let [cslpVersion, cslpData] = cslpValue.split(\":\");\n // If the cslpVersion is greater than 2 letter which means it is v1 version of cslp data\n if (cslpVersion.length > 2) {\n cslpData = cslpVersion;\n cslpVersion = \"v1\";\n }\n\n const [content_type_uid, entryInfo, locale, ...fieldPath] =\n cslpData.split(\".\");\n\n let entry_uid: string;\n let variant;\n\n switch (cslpVersion) {\n case \"v2\": {\n const [uid, variant_uid] = entryInfo.split(\"_\");\n entry_uid = uid;\n variant = variant_uid;\n break;\n }\n default: {\n entry_uid = entryInfo;\n break;\n }\n }\n const instancePathWithInstance = fieldPath.join(\".\");\n const calculatedPath = fieldPath.filter((path) => {\n const isEmpty = isNil(path);\n const isNumber = isFinite(+path);\n return (!isEmpty && !isNumber) || false;\n });\n\n const multipleFieldMetadata: CslpDataMultipleFieldMetadata =\n getMultipleFieldMetadata(\n content_type_uid,\n entry_uid,\n locale,\n fieldPath\n );\n\n /**\n * The index in the end of the field does not represent a field.\n * It represents the index of the field in the multiple field.\n * Hence, we pop it out.\n */\n if (isFinite(+fieldPath[fieldPath.length - 1])) {\n fieldPath.pop();\n }\n\n return {\n entry_uid,\n content_type_uid,\n variant,\n locale,\n cslpValue: cslpValue,\n fieldPath: calculatedPath.join(\".\"),\n fieldPathWithIndex: fieldPath.join(\".\"),\n multipleFieldMetadata: multipleFieldMetadata,\n instance: {\n fieldPathWithIndex: instancePathWithInstance,\n },\n };\n}\n\n/**\n * Returns the parent path details of a given field path in CSLP format.\n * @param content_type_uid - The UID of the content type.\n * @param entry_uid - The UID of the entry.\n * @param locale - The locale of the entry.\n * @param fieldPath - The field path to get the parent path details for.\n * @returns The parent path details in CSLP format, or null if the field path does not have a parent.\n */\nfunction getParentPathDetails(\n content_type_uid: string,\n entry_uid: string,\n locale: string,\n fieldPath: string[]\n): CslpDataParentDetails | null {\n const index = findLastIndex(fieldPath, (path) => isFinite(+path));\n if (index === -1) return null;\n\n const parentPath = fieldPath.slice(0, index);\n return {\n parentPath: parentPath.join(\".\"),\n parentCslpValue: [\n content_type_uid,\n entry_uid,\n locale,\n ...parentPath,\n ].join(\".\"),\n };\n}\n\n/**\n * Returns metadata for a multiple field in a content entry.\n * @summary ONLY USE THESE RETURNED VALUES WHEN FIELD IS MULTIPLE\n * @summary IT GIVES WRONG DATA IF FIELD IS NOT MULTIPLE\n * @param content_type_uid - The UID of the content type.\n * @param entry_uid - The UID of the content entry.\n * @param locale - The locale of the content entry.\n * @param fieldPath - The path of the multiple field.\n * @returns The metadata for the multiple field.\n */\nfunction getMultipleFieldMetadata(\n content_type_uid: string,\n entry_uid: string,\n locale: string,\n fieldPath: string[]\n): CslpDataMultipleFieldMetadata {\n const parentDetails = getParentPathDetails(\n content_type_uid,\n entry_uid,\n locale,\n fieldPath\n );\n\n const index = findLast(fieldPath, (path) => isFinite(+path));\n\n return {\n parentDetails: parentDetails,\n index: isNil(index) ? -1 : +index,\n };\n}\n\n//TODO: move this to editbutton\n/**\n * Adds an outline to the clicked element and triggers a callback function.\n * @param e - The MouseEvent object representing the click event.\n * @param callback - An optional callback function that will be called with the CSLP tag and highlighted element as arguments.\n */\nexport function addCslpOutline(\n e: MouseEvent,\n callback?: (args: {\n cslpTag: string;\n highlightedElement: HTMLElement;\n }) => void\n): void {\n const elements = Config.get().elements;\n\n let trigger = true;\n const eventTargets = e.composedPath();\n\n for (const eventTarget of eventTargets) {\n const element = eventTarget as HTMLElement;\n if (element.nodeName === \"BODY\") break;\n if (typeof element?.getAttribute !== \"function\") continue;\n\n const cslpTag = element.getAttribute(\"data-cslp\");\n\n if (trigger && cslpTag) {\n if (elements.highlightedElement)\n elements.highlightedElement.classList.remove(\n cslpTagStyles()[\"cslp-edit-mode\"]\n );\n element.classList.add(cslpTagStyles()[\"cslp-edit-mode\"]);\n\n const updatedElements = elements;\n updatedElements.highlightedElement =\n element as DeepSignal<HTMLElement>;\n Config.set(\"elements\", updatedElements);\n\n callback?.({\n cslpTag: cslpTag,\n highlightedElement: element,\n });\n\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(cslpTagStyles()[\"cslp-edit-mode\"]);\n }\n }\n}\n"],"mappings":"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","names":["Config"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cslp/cslpdata.ts"],"sourcesContent":["import { isNil, isFinite, findLastIndex, findLast } from \"lodash-es\";\nimport {\n CslpData,\n CslpDataMultipleFieldMetadata,\n CslpDataParentDetails,\n} from \"./types/cslp.types\";\nimport Config from \"../configManager/configManager\";\nimport { DeepSignal } from \"deepsignal\";\nimport { cslpTagStyles } from \"../livePreview/editButton/editButton.style\";\n\n/**\n * Extracts details from a CSLP value string.\n * @param cslpValue The CSLP value string to extract details from.\n * @returns An object containing the extracted details.\n */\nexport function extractDetailsFromCslp(cslpValue: string): CslpData {\n let [cslpVersion, cslpData] = cslpValue.split(\":\");\n // If the cslpVersion is greater than 2 letter which means it is v1 version of cslp data\n if (cslpVersion.length > 2) {\n cslpData = cslpVersion;\n cslpVersion = \"v1\";\n }\n\n const [content_type_uid, entryInfo, locale, ...fieldPath] =\n cslpData.split(\".\");\n\n let entry_uid: string;\n let variant;\n\n switch (cslpVersion) {\n case \"v2\": {\n const [uid, variant_uid] = entryInfo.split(\"_\");\n entry_uid = uid;\n variant = variant_uid;\n break;\n }\n default: {\n entry_uid = entryInfo;\n break;\n }\n }\n const instancePathWithInstance = fieldPath.join(\".\");\n const calculatedPath = fieldPath.filter((path) => {\n const isEmpty = isNil(path);\n const isNumber = isFinite(+path);\n return (!isEmpty && !isNumber) || false;\n });\n\n const multipleFieldMetadata: CslpDataMultipleFieldMetadata =\n getMultipleFieldMetadata(\n content_type_uid,\n entry_uid,\n locale,\n fieldPath\n );\n\n /**\n * The index in the end of the field does not represent a field.\n * It represents the index of the field in the multiple field.\n * Hence, we pop it out.\n */\n if (isFinite(+fieldPath[fieldPath.length - 1])) {\n fieldPath.pop();\n }\n\n return {\n entry_uid,\n content_type_uid,\n variant,\n locale,\n cslpValue: cslpValue,\n fieldPath: calculatedPath.join(\".\"),\n fieldPathWithIndex: fieldPath.join(\".\"),\n multipleFieldMetadata: multipleFieldMetadata,\n instance: {\n fieldPathWithIndex: instancePathWithInstance,\n },\n };\n}\n\n/**\n * Returns the parent path details of a given field path in CSLP format.\n * @param content_type_uid - The UID of the content type.\n * @param entry_uid - The UID of the entry.\n * @param locale - The locale of the entry.\n * @param fieldPath - The field path to get the parent path details for.\n * @returns The parent path details in CSLP format, or null if the field path does not have a parent.\n */\nfunction getParentPathDetails(\n content_type_uid: string,\n entry_uid: string,\n locale: string,\n fieldPath: string[]\n): CslpDataParentDetails | null {\n const index = findLastIndex(fieldPath, (path) => isFinite(+path));\n if (index === -1) return null;\n\n const parentPath = fieldPath.slice(0, index);\n return {\n parentPath: parentPath.join(\".\"),\n parentCslpValue: [\n content_type_uid,\n entry_uid,\n locale,\n ...parentPath,\n ].join(\".\"),\n };\n}\n\n/**\n * Returns metadata for a multiple field in a content entry.\n * @param content_type_uid - The UID of the content type.\n * @param entry_uid - The UID of the content entry.\n * @param locale - The locale of the content entry.\n * @param fieldPath - The path of the multiple field.\n * @returns The metadata for the multiple field.\n */\nfunction getMultipleFieldMetadata(\n content_type_uid: string,\n entry_uid: string,\n locale: string,\n fieldPath: string[]\n): CslpDataMultipleFieldMetadata {\n const parentDetails = getParentPathDetails(\n content_type_uid,\n entry_uid,\n locale,\n fieldPath\n );\n\n const index = findLast(fieldPath, (path) => isFinite(+path));\n\n return {\n parentDetails: parentDetails,\n index: isNil(index) ? -1 : +index,\n };\n}\n\n//TODO: move this to editbutton\n/**\n * Adds an outline to the clicked element and triggers a callback function.\n * @param e - The MouseEvent object representing the click event.\n * @param callback - An optional callback function that will be called with the CSLP tag and highlighted element as arguments.\n */\nexport function addCslpOutline(\n e: MouseEvent,\n callback?: (args: {\n cslpTag: string;\n highlightedElement: HTMLElement;\n }) => void\n): void {\n const elements = Config.get().elements;\n\n let trigger = true;\n const eventTargets = e.composedPath();\n\n for (const eventTarget of eventTargets) {\n const element = eventTarget as HTMLElement;\n if (element.nodeName === \"BODY\") break;\n if (typeof element?.getAttribute !== \"function\") continue;\n\n const cslpTag = element.getAttribute(\"data-cslp\");\n\n if (trigger && cslpTag) {\n if (elements.highlightedElement)\n elements.highlightedElement.classList.remove(\n cslpTagStyles()[\"cslp-edit-mode\"]\n );\n element.classList.add(cslpTagStyles()[\"cslp-edit-mode\"]);\n\n const updatedElements = elements;\n updatedElements.highlightedElement =\n element as DeepSignal<HTMLElement>;\n Config.set(\"elements\", updatedElements);\n\n callback?.({\n cslpTag: cslpTag,\n highlightedElement: element,\n });\n\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(cslpTagStyles()[\"cslp-edit-mode\"]);\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cslp/cslpdata.ts"],"sourcesContent":["import { isNil, isFinite, findLastIndex, findLast } from \"lodash-es\";\nimport {\n CslpData,\n CslpDataMultipleFieldMetadata,\n CslpDataParentDetails,\n} from \"./types/cslp.types\";\nimport Config from \"../configManager/configManager\";\nimport { DeepSignal } from \"deepsignal\";\nimport { cslpTagStyles } from \"../livePreview/editButton/editButton.style\";\n\n/**\n * Extracts details from a CSLP value string.\n * @param cslpValue The CSLP value string to extract details from.\n * @returns An object containing the extracted details.\n */\nexport function extractDetailsFromCslp(cslpValue: string): CslpData {\n let [cslpVersion, cslpData] = cslpValue.split(\":\");\n // If the cslpVersion is greater than 2 letter which means it is v1 version of cslp data\n if (cslpVersion.length > 2) {\n cslpData = cslpVersion;\n cslpVersion = \"v1\";\n }\n\n const [content_type_uid, entryInfo, locale, ...fieldPath] =\n cslpData.split(\".\");\n\n let entry_uid: string;\n let variant;\n\n switch (cslpVersion) {\n case \"v2\": {\n const [uid, variant_uid] = entryInfo.split(\"_\");\n entry_uid = uid;\n variant = variant_uid;\n break;\n }\n default: {\n entry_uid = entryInfo;\n break;\n }\n }\n const instancePathWithInstance = fieldPath.join(\".\");\n const calculatedPath = fieldPath.filter((path) => {\n const isEmpty = isNil(path);\n const isNumber = isFinite(+path);\n return (!isEmpty && !isNumber) || false;\n });\n\n const multipleFieldMetadata: CslpDataMultipleFieldMetadata =\n getMultipleFieldMetadata(\n content_type_uid,\n entry_uid,\n locale,\n fieldPath\n );\n\n /**\n * The index in the end of the field does not represent a field.\n * It represents the index of the field in the multiple field.\n * Hence, we pop it out.\n */\n if (isFinite(+fieldPath[fieldPath.length - 1])) {\n fieldPath.pop();\n }\n\n return {\n entry_uid,\n content_type_uid,\n variant,\n locale,\n cslpValue: cslpValue,\n fieldPath: calculatedPath.join(\".\"),\n fieldPathWithIndex: fieldPath.join(\".\"),\n multipleFieldMetadata: multipleFieldMetadata,\n instance: {\n fieldPathWithIndex: instancePathWithInstance,\n },\n };\n}\n\n/**\n * Returns the parent path details of a given field path in CSLP format.\n * @param content_type_uid - The UID of the content type.\n * @param entry_uid - The UID of the entry.\n * @param locale - The locale of the entry.\n * @param fieldPath - The field path to get the parent path details for.\n * @returns The parent path details in CSLP format, or null if the field path does not have a parent.\n */\nfunction getParentPathDetails(\n content_type_uid: string,\n entry_uid: string,\n locale: string,\n fieldPath: string[]\n): CslpDataParentDetails | null {\n const index = findLastIndex(fieldPath, (path) => isFinite(+path));\n if (index === -1) return null;\n\n const parentPath = fieldPath.slice(0, index);\n return {\n parentPath: parentPath.join(\".\"),\n parentCslpValue: [\n content_type_uid,\n entry_uid,\n locale,\n ...parentPath,\n ].join(\".\"),\n };\n}\n\n/**\n * Returns metadata for a multiple field in a content entry.\n * @summary ONLY USE THESE RETURNED VALUES WHEN FIELD IS MULTIPLE\n * @summary IT GIVES WRONG DATA IF FIELD IS NOT MULTIPLE\n * @param content_type_uid - The UID of the content type.\n * @param entry_uid - The UID of the content entry.\n * @param locale - The locale of the content entry.\n * @param fieldPath - The path of the multiple field.\n * @returns The metadata for the multiple field.\n */\nfunction getMultipleFieldMetadata(\n content_type_uid: string,\n entry_uid: string,\n locale: string,\n fieldPath: string[]\n): CslpDataMultipleFieldMetadata {\n const parentDetails = getParentPathDetails(\n content_type_uid,\n entry_uid,\n locale,\n fieldPath\n );\n\n const index = findLast(fieldPath, (path) => isFinite(+path));\n\n return {\n parentDetails: parentDetails,\n index: isNil(index) ? -1 : +index,\n };\n}\n\n//TODO: move this to editbutton\n/**\n * Adds an outline to the clicked element and triggers a callback function.\n * @param e - The MouseEvent object representing the click event.\n * @param callback - An optional callback function that will be called with the CSLP tag and highlighted element as arguments.\n */\nexport function addCslpOutline(\n e: MouseEvent,\n callback?: (args: {\n cslpTag: string;\n highlightedElement: HTMLElement;\n }) => void\n): void {\n const elements = Config.get().elements;\n\n let trigger = true;\n const eventTargets = e.composedPath();\n\n for (const eventTarget of eventTargets) {\n const element = eventTarget as HTMLElement;\n if (element.nodeName === \"BODY\") break;\n if (typeof element?.getAttribute !== \"function\") continue;\n\n const cslpTag = element.getAttribute(\"data-cslp\");\n\n if (trigger && cslpTag) {\n if (elements.highlightedElement)\n elements.highlightedElement.classList.remove(\n cslpTagStyles()[\"cslp-edit-mode\"]\n );\n element.classList.add(cslpTagStyles()[\"cslp-edit-mode\"]);\n\n const updatedElements = elements;\n updatedElements.highlightedElement =\n element as DeepSignal<HTMLElement>;\n Config.set(\"elements\", updatedElements);\n\n callback?.({\n cslpTag: cslpTag,\n highlightedElement: element,\n });\n\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(cslpTagStyles()[\"cslp-edit-mode\"]);\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -190,7 +190,7 @@ function shouldRenderEditButton() {
190
190
  import_logger.PublicLogger.error(error);
191
191
  }
192
192
  const iFrameCheck = (0, import_inIframe.inIframe)();
193
- if (config.editButton.exclude?.find(
193
+ if (!iFrameCheck && config.editButton.exclude?.find(
194
194
  (exclude) => exclude === "outsideLivePreviewPortal"
195
195
  )) {
196
196
  return false;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/livePreview/editButton/editButton.ts"],"sourcesContent":["import { effect } from \"@preact/signals\";\nimport { inIframe } from \"../../common/inIframe\";\nimport Config from \"../../configManager/configManager\";\nimport { addCslpOutline, extractDetailsFromCslp } from \"../../cslp\";\nimport { cslpTagStyles } from \"./editButton.style\";\nimport { PublicLogger } from \"../../logger/logger\";\nimport {\n type IEditButtonPosition,\n ILivePreviewWindowType,\n} from \"../../types/types\";\nimport livePreviewPostMessage from \"../eventManager/livePreviewEventManager\";\nimport { EDIT_BUTTON_TOOLTIP_ID } from \"./editButton.constant\";\nimport { isOpeningInTimeline } from \"../../utils\";\n\nfunction calculateEditButtonPosition(\n currentHoveredElement: HTMLElement,\n cslpButtonPosition: string\n): IEditButtonPosition {\n const editButtonPosition: IEditButtonPosition = {\n upperBoundOfTooltip: 0,\n leftBoundOfTooltip: 0,\n };\n const currentRectOfElement = currentHoveredElement.getBoundingClientRect();\n try {\n const buttonMeasurementValues = {\n width: 72,\n halfWidth: 36,\n height: 40,\n basicMargin: 5,\n widthWithMargin: 77,\n };\n\n switch (cslpButtonPosition) {\n case \"top-center\":\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.top - buttonMeasurementValues.height;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.width / 2 -\n buttonMeasurementValues.halfWidth +\n currentRectOfElement.left;\n break;\n case \"top-right\":\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.top - buttonMeasurementValues.height;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.right - buttonMeasurementValues.width;\n break;\n case \"right\":\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.top -\n buttonMeasurementValues.basicMargin;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.right +\n buttonMeasurementValues.basicMargin;\n break;\n case \"bottom\":\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.bottom +\n buttonMeasurementValues.basicMargin;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.left -\n buttonMeasurementValues.basicMargin;\n break;\n case \"bottom-left\":\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.bottom +\n buttonMeasurementValues.basicMargin;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.left -\n buttonMeasurementValues.basicMargin;\n break;\n case \"bottom-center\":\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.bottom +\n buttonMeasurementValues.basicMargin;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.width / 2 -\n buttonMeasurementValues.halfWidth +\n currentRectOfElement.left;\n break;\n case \"bottom-right\":\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.bottom +\n buttonMeasurementValues.basicMargin;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.right - buttonMeasurementValues.width;\n break;\n case \"left\":\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.top -\n buttonMeasurementValues.basicMargin;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.left -\n buttonMeasurementValues.widthWithMargin;\n break;\n // default position => top, top-left or any other string\n default:\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.top - buttonMeasurementValues.height;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.left -\n buttonMeasurementValues.basicMargin;\n break;\n }\n return editButtonPosition;\n } catch (error) {\n PublicLogger.error(error);\n return editButtonPosition;\n }\n}\n\nexport const createSingularEditButton = (\n editCallback: (e: MouseEvent) => void\n): HTMLDivElement => {\n const singularEditButton = document.createElement(\"div\");\n singularEditButton.classList.add(\"cslp-tooltip-child\", \"singular\");\n singularEditButton.setAttribute(\n \"data-test-id\",\n \"cslp-singular-edit-button\"\n );\n singularEditButton.innerHTML = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8.1 3.5L0.3 11.3C0.1 11.5 0 11.7 0 12V15C0 15.6 0.4 16 1 16H4C4.3 16 4.5 15.9 4.7 15.7L12.5 7.9L8.1 3.5Z\" fill=\"#718096\"></path>\n <path d=\"M15.7 3.3L12.7 0.3C12.3 -0.1 11.7 -0.1 11.3 0.3L9.5 2.1L13.9 6.5L15.7 4.7C16.1 4.3 16.1 3.7 15.7 3.3Z\" fill=\"#718096\"></path>\n </svg>Edit`;\n\n singularEditButton.addEventListener(\"click\", editCallback);\n\n return singularEditButton;\n};\n\nexport const createMultipleEditButton = (\n editCallback: (e: MouseEvent) => void,\n linkCallback: (e: MouseEvent) => void\n): HTMLDivElement => {\n const multipleEditButton = document.createElement(\"div\");\n multipleEditButton.classList.add(\"cslp-tooltip-child\");\n multipleEditButton.setAttribute(\"data-title\", \"Edit\");\n multipleEditButton.setAttribute(\n \"data-test-id\",\n \"cslp-multiple-edit-button\"\n );\n multipleEditButton.innerHTML = ` <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8.1 3.5L0.3 11.3C0.1 11.5 0 11.7 0 12V15C0 15.6 0.4 16 1 16H4C4.3 16 4.5 15.9 4.7 15.7L12.5 7.9L8.1 3.5Z\" fill=\"#718096\"></path>\n <path d=\"M15.7 3.3L12.7 0.3C12.3 -0.1 11.7 -0.1 11.3 0.3L9.5 2.1L13.9 6.5L15.7 4.7C16.1 4.3 16.1 3.7 15.7 3.3Z\" fill=\"#718096\"></path>\n </svg>`;\n\n multipleEditButton.addEventListener(\"click\", editCallback);\n\n const multipleExternalLinkButton = document.createElement(\"div\");\n multipleExternalLinkButton.classList.add(\"cslp-tooltip-child\");\n multipleExternalLinkButton.setAttribute(\"data-title\", \"Go to link\");\n multipleExternalLinkButton.setAttribute(\n \"data-test-id\",\n \"cslp-multiple-external-link-button\"\n );\n multipleExternalLinkButton.innerHTML = ` <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2.66654 2.66758H13.3332V13.3342H6.66654V16.0009H13.3332C14.0405 16.0009 14.7187 15.72 15.2188 15.2199C15.7189 14.7198 15.9999 14.0415 15.9999 13.3342V2.66758C15.9999 1.96034 15.7189 1.28206 15.2188 0.781964C14.7187 0.281867 14.0405 0.000915527 13.3332 0.000915527H2.66654C1.9593 0.000915527 1.28102 0.281867 0.780927 0.781964C0.280829 1.28206 -0.00012207 1.96034 -0.00012207 2.66758V9.33425H2.66654V2.66758Z\" fill=\"#718096\" />\n <path d=\"M6.94263 7.05734L0.999958 13L2.88529 14.8853L8.82796 8.94267L10.8853 11V5.00001H4.88529L6.94263 7.05734Z\" fill=\"#718096\" />\n </svg>`;\n\n multipleExternalLinkButton.addEventListener(\"click\", linkCallback);\n\n const multipleEditFragment = document.createDocumentFragment();\n multipleEditFragment.appendChild(multipleEditButton);\n multipleEditFragment.appendChild(multipleExternalLinkButton);\n\n const multipleDiv = document.createElement(\"div\");\n multipleDiv.appendChild(multipleEditFragment);\n multipleDiv.classList.add(cslpTagStyles()[\"multiple\"]);\n\n return multipleDiv;\n};\n\nexport function getEditButtonPosition(\n currentHoveredElement: HTMLElement | null,\n defaultPosition: string | undefined\n): IEditButtonPosition {\n if (!currentHoveredElement)\n return { upperBoundOfTooltip: 0, leftBoundOfTooltip: 0 };\n\n const cslpButtonPosition = currentHoveredElement.getAttribute(\n \"data-cslp-button-position\"\n );\n if (cslpButtonPosition) {\n return calculateEditButtonPosition(\n currentHoveredElement,\n cslpButtonPosition\n );\n }\n\n // NOTE: position \"top\" and \"top-left\" will be the position of edit button if no default position passed in config\n return calculateEditButtonPosition(\n currentHoveredElement,\n defaultPosition || \"top\"\n );\n}\n\nexport function shouldRenderEditButton(): boolean {\n const config = Config.get();\n\n if (!config.editButton.enable) {\n if (config.editButton.enable === undefined)\n PublicLogger.error(\n \"enable key is required inside editButton object\"\n );\n return false;\n }\n\n // return boolean in case of cslp-buttons query added in url\n try {\n const currentLocation = new URL(window.location.href);\n const cslpButtonQueryValue =\n currentLocation.searchParams.get(\"cslp-buttons\");\n\n if (\n cslpButtonQueryValue !== null &&\n config.editButton.includeByQueryParameter !== false\n )\n return cslpButtonQueryValue === \"false\" ? false : true;\n } catch (error) {\n PublicLogger.error(error);\n }\n\n const iFrameCheck = inIframe();\n\n // case outside live preview\n if (\n config.editButton.exclude?.find(\n (exclude) => exclude === \"outsideLivePreviewPortal\"\n )\n ) {\n return false;\n }\n\n // case if inside live preview\n if (\n iFrameCheck &&\n config.editButton.exclude?.find(\n (exclude) => exclude === \"insideLivePreviewPortal\"\n )\n ) {\n return false;\n } else if (iFrameCheck) {\n // case if inside visual builder\n if (config.windowType === \"builder\") {\n return false;\n }\n\n // case if independent site\n return true;\n }\n\n // Priority list => 1. cslpEditButton query value 2. Inside live preview 3. renderCslpButtonByDefault value selected by user\n return true;\n}\n\nexport function toggleEditButtonElement() {\n const render = shouldRenderEditButton();\n const exists = doesEditButtonExist();\n\n if (render && !exists) {\n LivePreviewEditButton.livePreviewEditButton =\n new LivePreviewEditButton();\n } else if (!render && exists) {\n LivePreviewEditButton.livePreviewEditButton?.destroy();\n }\n}\n\nexport function doesEditButtonExist() {\n return document.getElementById(EDIT_BUTTON_TOOLTIP_ID) !== null;\n}\n\nexport class LivePreviewEditButton {\n private tooltip: HTMLButtonElement | null = null;\n private typeOfCurrentChild: \"singular\" | \"multiple\" = \"singular\";\n private tooltipChild: {\n singular: HTMLDivElement | null;\n multiple: HTMLDivElement | null;\n } = {\n singular: null,\n multiple: null,\n };\n static livePreviewEditButton: LivePreviewEditButton | null = null;\n\n constructor() {\n this.createCslpTooltip = this.createCslpTooltip.bind(this);\n this.updateTooltipPosition = this.updateTooltipPosition.bind(this);\n this.addEditStyleOnHover = this.addEditStyleOnHover.bind(this);\n this.scrollHandler = this.scrollHandler.bind(this);\n this.generateRedirectUrl = this.generateRedirectUrl.bind(this);\n this.linkClickHandler = this.linkClickHandler.bind(this);\n this.destroy = this.destroy.bind(this);\n\n if (this.createCslpTooltip()) {\n this.updateTooltipPosition();\n\n window.addEventListener(\"scroll\", this.updateTooltipPosition);\n window.addEventListener(\"mouseover\", this.addEditStyleOnHover);\n }\n }\n\n private createCslpTooltip(): boolean {\n const editButton = Config.get().editButton;\n\n if (\n !document.getElementById(EDIT_BUTTON_TOOLTIP_ID) &&\n editButton.enable &&\n shouldRenderEditButton()\n ) {\n const tooltip = document.createElement(\"button\");\n this.tooltip = tooltip;\n\n this.tooltip.classList.add(cslpTagStyles()[\"cslp-tooltip\"]);\n this.tooltip.setAttribute(\"data-test-id\", \"cs-cslp-tooltip\");\n this.tooltip.id = EDIT_BUTTON_TOOLTIP_ID;\n\n window.document.body.insertAdjacentElement(\n \"beforeend\",\n this.tooltip\n );\n\n this.tooltipChild.singular = createSingularEditButton(\n this.scrollHandler\n );\n this.tooltipChild.multiple = createMultipleEditButton(\n this.scrollHandler,\n this.linkClickHandler\n );\n\n this.tooltip.appendChild(this.tooltipChild.singular);\n return true;\n }\n return false;\n }\n\n private updateTooltipPosition() {\n const editButton = Config.get().editButton;\n const elements = Config.get().elements;\n\n if (!elements.highlightedElement || !this.tooltip) return false;\n\n const currentRectOfElement =\n elements.highlightedElement.getBoundingClientRect();\n const currentRectOfParentOfElement =\n this.tooltip.parentElement?.getBoundingClientRect();\n\n if (currentRectOfElement && currentRectOfParentOfElement) {\n const editButtonPosition = getEditButtonPosition(\n elements.highlightedElement as HTMLElement,\n editButton.position\n );\n\n let upperBoundOfTooltip = editButtonPosition.upperBoundOfTooltip;\n const leftBoundOfTooltip = editButtonPosition.leftBoundOfTooltip;\n\n // if scrolled and element is still visible, make sure tooltip is also visible\n if (upperBoundOfTooltip < 0) {\n if (currentRectOfElement.top < 0)\n upperBoundOfTooltip = currentRectOfElement.top;\n else upperBoundOfTooltip = 0;\n }\n\n this.tooltip.style.top = upperBoundOfTooltip + \"px\";\n this.tooltip.style.zIndex =\n elements.highlightedElement.style.zIndex || \"200\";\n this.tooltip.style.left = leftBoundOfTooltip + \"px\";\n\n if (this.tooltipChild.singular && this.tooltipChild.multiple) {\n if (\n elements.highlightedElement.hasAttribute(\"href\") &&\n this.typeOfCurrentChild !== \"multiple\"\n ) {\n this.tooltip.innerHTML = \"\";\n this.tooltip.appendChild(this.tooltipChild.multiple);\n this.typeOfCurrentChild = \"multiple\";\n } else if (this.typeOfCurrentChild !== \"singular\") {\n this.tooltip.innerHTML = \"\";\n this.tooltip.appendChild(this.tooltipChild.singular);\n this.typeOfCurrentChild = \"singular\";\n }\n }\n return true;\n }\n\n return false;\n }\n\n private addEditStyleOnHover(e: MouseEvent) {\n const updateTooltipPosition: Parameters<typeof addCslpOutline>[\"1\"] = ({\n cslpTag,\n highlightedElement,\n }) => {\n if (this.updateTooltipPosition()) {\n this.tooltip?.setAttribute(\"current-data-cslp\", cslpTag);\n this.tooltip?.setAttribute(\n \"current-href\",\n highlightedElement.getAttribute(\"href\") ?? \"\"\n );\n }\n };\n\n const editButton = Config.get().editButton;\n const windowType = Config.get().windowType;\n\n if (\n (windowType === ILivePreviewWindowType.PREVIEW ||\n windowType === ILivePreviewWindowType.INDEPENDENT) &&\n editButton.enable\n ) {\n addCslpOutline(e, updateTooltipPosition);\n }\n }\n\n private scrollHandler() {\n if (!this.tooltip) return;\n\n const cslpTag = this.tooltip.getAttribute(\"current-data-cslp\");\n\n if (cslpTag) {\n const { content_type_uid, entry_uid, locale, variant, fieldPathWithIndex } =\n extractDetailsFromCslp(cslpTag);\n\n if (inIframe()) {\n livePreviewPostMessage?.send(\"scroll\", {\n field: fieldPathWithIndex,\n content_type_uid,\n entry_uid,\n variant,\n locale,\n });\n } else {\n try {\n // Redirect to Contentstack edit page\n const redirectUrl = this.generateRedirectUrl(\n content_type_uid,\n locale,\n entry_uid,\n variant,\n fieldPathWithIndex\n );\n\n window.open(redirectUrl, \"_blank\");\n } catch (error) {\n PublicLogger.error(error);\n }\n }\n }\n }\n\n /**\n * Generates the redirect URL for editing a specific entry in the Live Preview SDK.\n * @param content_type_uid - The UID of the content type.\n * @param locale - The locale of the entry (default: \"en-us\").\n * @param entry_uid - The UID of the entry.\n * @param preview_field - The field to be previewed.\n * @returns The redirect URL for editing the entry.\n */\n private generateRedirectUrl(\n content_type_uid: string,\n locale = \"en-us\",\n entry_uid: string,\n variant: string | undefined,\n preview_field: string\n ): string {\n const config = Config.get();\n\n if (!config.stackDetails.apiKey) {\n throw `To use edit tags, you must provide the stack API key. Specify the API key while initializing the Live Preview SDK.\n\n ContentstackLivePreview.init({\n ...,\n stackDetails: {\n apiKey: 'your-api-key'\n },\n ...\n })`;\n }\n\n if (!config.stackDetails.environment) {\n throw `To use edit tags, you must provide the preview environment. Specify the preview environment while initializing the Live Preview SDK.\n\n ContentstackLivePreview.init({\n ...,\n stackDetails: {\n environment: 'Your-environment'\n },\n ...\n })`;\n }\n\n const protocol = String(config.clientUrlParams.protocol);\n const host = String(config.clientUrlParams.host);\n const port = String(config.clientUrlParams.port);\n const environment = String(config.stackDetails.environment);\n const branch = String(config.stackDetails.branch || \"main\");\n\n let urlHash = `!/stack/${\n config.stackDetails.apiKey\n }/content-type/${content_type_uid}/${\n locale ?? \"en-us\"\n }/entry/${entry_uid}`;\n\n if (variant) {\n urlHash += `/variant/${variant}/edit`;\n } else {\n urlHash += `/edit`;\n }\n\n const url = new URL(`${protocol}://${host}`);\n url.port = port;\n url.hash = urlHash;\n if (config.stackDetails.branch) {\n url.searchParams.append(\"branch\", branch);\n }\n url.searchParams.append(\"preview-field\", preview_field);\n url.searchParams.append(\"preview-locale\", locale ?? \"en-us\");\n url.searchParams.append(\"preview-environment\", environment);\n\n return `${url.origin}/${url.hash}${url.search}`;\n }\n\n private linkClickHandler() {\n if (!this.tooltip) return;\n const hrefAttribute = this.tooltip.getAttribute(\"current-href\");\n\n if (hrefAttribute) {\n window.location.assign(hrefAttribute);\n }\n }\n\n /**\n * Destroys the edit button by removing event listeners and removing the tooltip.\n */\n destroy(): void {\n window.removeEventListener(\"scroll\", this.updateTooltipPosition);\n window.removeEventListener(\"mouseover\", this.addEditStyleOnHover);\n this.tooltip?.remove();\n }\n}\n\neffect(function handleWindowTypeChange() {\n // we need to specify when to run this effect.\n // here, we run it when the value of windowType changes\n if (typeof window === \"undefined\") return;\n Config.get().windowType;\n if (LivePreviewEditButton && !isOpeningInTimeline()) {\n toggleEditButtonElement();\n }\n});\n"],"mappings":"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","names":["import_editButton","Config","livePreviewPostMessage"]}
1
+ {"version":3,"sources":["../../../../src/livePreview/editButton/editButton.ts"],"sourcesContent":["import { effect } from \"@preact/signals\";\nimport { inIframe } from \"../../common/inIframe\";\nimport Config from \"../../configManager/configManager\";\nimport { addCslpOutline, extractDetailsFromCslp } from \"../../cslp\";\nimport { cslpTagStyles } from \"./editButton.style\";\nimport { PublicLogger } from \"../../logger/logger\";\nimport {\n type IEditButtonPosition,\n ILivePreviewWindowType,\n} from \"../../types/types\";\nimport livePreviewPostMessage from \"../eventManager/livePreviewEventManager\";\nimport { EDIT_BUTTON_TOOLTIP_ID } from \"./editButton.constant\";\nimport { isOpeningInTimeline } from \"../../utils\";\n\nfunction calculateEditButtonPosition(\n currentHoveredElement: HTMLElement,\n cslpButtonPosition: string\n): IEditButtonPosition {\n const editButtonPosition: IEditButtonPosition = {\n upperBoundOfTooltip: 0,\n leftBoundOfTooltip: 0,\n };\n const currentRectOfElement = currentHoveredElement.getBoundingClientRect();\n try {\n const buttonMeasurementValues = {\n width: 72,\n halfWidth: 36,\n height: 40,\n basicMargin: 5,\n widthWithMargin: 77,\n };\n\n switch (cslpButtonPosition) {\n case \"top-center\":\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.top - buttonMeasurementValues.height;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.width / 2 -\n buttonMeasurementValues.halfWidth +\n currentRectOfElement.left;\n break;\n case \"top-right\":\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.top - buttonMeasurementValues.height;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.right - buttonMeasurementValues.width;\n break;\n case \"right\":\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.top -\n buttonMeasurementValues.basicMargin;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.right +\n buttonMeasurementValues.basicMargin;\n break;\n case \"bottom\":\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.bottom +\n buttonMeasurementValues.basicMargin;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.left -\n buttonMeasurementValues.basicMargin;\n break;\n case \"bottom-left\":\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.bottom +\n buttonMeasurementValues.basicMargin;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.left -\n buttonMeasurementValues.basicMargin;\n break;\n case \"bottom-center\":\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.bottom +\n buttonMeasurementValues.basicMargin;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.width / 2 -\n buttonMeasurementValues.halfWidth +\n currentRectOfElement.left;\n break;\n case \"bottom-right\":\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.bottom +\n buttonMeasurementValues.basicMargin;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.right - buttonMeasurementValues.width;\n break;\n case \"left\":\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.top -\n buttonMeasurementValues.basicMargin;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.left -\n buttonMeasurementValues.widthWithMargin;\n break;\n // default position => top, top-left or any other string\n default:\n editButtonPosition.upperBoundOfTooltip =\n currentRectOfElement.top - buttonMeasurementValues.height;\n editButtonPosition.leftBoundOfTooltip =\n currentRectOfElement.left -\n buttonMeasurementValues.basicMargin;\n break;\n }\n return editButtonPosition;\n } catch (error) {\n PublicLogger.error(error);\n return editButtonPosition;\n }\n}\n\nexport const createSingularEditButton = (\n editCallback: (e: MouseEvent) => void\n): HTMLDivElement => {\n const singularEditButton = document.createElement(\"div\");\n singularEditButton.classList.add(\"cslp-tooltip-child\", \"singular\");\n singularEditButton.setAttribute(\n \"data-test-id\",\n \"cslp-singular-edit-button\"\n );\n singularEditButton.innerHTML = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8.1 3.5L0.3 11.3C0.1 11.5 0 11.7 0 12V15C0 15.6 0.4 16 1 16H4C4.3 16 4.5 15.9 4.7 15.7L12.5 7.9L8.1 3.5Z\" fill=\"#718096\"></path>\n <path d=\"M15.7 3.3L12.7 0.3C12.3 -0.1 11.7 -0.1 11.3 0.3L9.5 2.1L13.9 6.5L15.7 4.7C16.1 4.3 16.1 3.7 15.7 3.3Z\" fill=\"#718096\"></path>\n </svg>Edit`;\n\n singularEditButton.addEventListener(\"click\", editCallback);\n\n return singularEditButton;\n};\n\nexport const createMultipleEditButton = (\n editCallback: (e: MouseEvent) => void,\n linkCallback: (e: MouseEvent) => void\n): HTMLDivElement => {\n const multipleEditButton = document.createElement(\"div\");\n multipleEditButton.classList.add(\"cslp-tooltip-child\");\n multipleEditButton.setAttribute(\"data-title\", \"Edit\");\n multipleEditButton.setAttribute(\n \"data-test-id\",\n \"cslp-multiple-edit-button\"\n );\n multipleEditButton.innerHTML = ` <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8.1 3.5L0.3 11.3C0.1 11.5 0 11.7 0 12V15C0 15.6 0.4 16 1 16H4C4.3 16 4.5 15.9 4.7 15.7L12.5 7.9L8.1 3.5Z\" fill=\"#718096\"></path>\n <path d=\"M15.7 3.3L12.7 0.3C12.3 -0.1 11.7 -0.1 11.3 0.3L9.5 2.1L13.9 6.5L15.7 4.7C16.1 4.3 16.1 3.7 15.7 3.3Z\" fill=\"#718096\"></path>\n </svg>`;\n\n multipleEditButton.addEventListener(\"click\", editCallback);\n\n const multipleExternalLinkButton = document.createElement(\"div\");\n multipleExternalLinkButton.classList.add(\"cslp-tooltip-child\");\n multipleExternalLinkButton.setAttribute(\"data-title\", \"Go to link\");\n multipleExternalLinkButton.setAttribute(\n \"data-test-id\",\n \"cslp-multiple-external-link-button\"\n );\n multipleExternalLinkButton.innerHTML = ` <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2.66654 2.66758H13.3332V13.3342H6.66654V16.0009H13.3332C14.0405 16.0009 14.7187 15.72 15.2188 15.2199C15.7189 14.7198 15.9999 14.0415 15.9999 13.3342V2.66758C15.9999 1.96034 15.7189 1.28206 15.2188 0.781964C14.7187 0.281867 14.0405 0.000915527 13.3332 0.000915527H2.66654C1.9593 0.000915527 1.28102 0.281867 0.780927 0.781964C0.280829 1.28206 -0.00012207 1.96034 -0.00012207 2.66758V9.33425H2.66654V2.66758Z\" fill=\"#718096\" />\n <path d=\"M6.94263 7.05734L0.999958 13L2.88529 14.8853L8.82796 8.94267L10.8853 11V5.00001H4.88529L6.94263 7.05734Z\" fill=\"#718096\" />\n </svg>`;\n\n multipleExternalLinkButton.addEventListener(\"click\", linkCallback);\n\n const multipleEditFragment = document.createDocumentFragment();\n multipleEditFragment.appendChild(multipleEditButton);\n multipleEditFragment.appendChild(multipleExternalLinkButton);\n\n const multipleDiv = document.createElement(\"div\");\n multipleDiv.appendChild(multipleEditFragment);\n multipleDiv.classList.add(cslpTagStyles()[\"multiple\"]);\n\n return multipleDiv;\n};\n\nexport function getEditButtonPosition(\n currentHoveredElement: HTMLElement | null,\n defaultPosition: string | undefined\n): IEditButtonPosition {\n if (!currentHoveredElement)\n return { upperBoundOfTooltip: 0, leftBoundOfTooltip: 0 };\n\n const cslpButtonPosition = currentHoveredElement.getAttribute(\n \"data-cslp-button-position\"\n );\n if (cslpButtonPosition) {\n return calculateEditButtonPosition(\n currentHoveredElement,\n cslpButtonPosition\n );\n }\n\n // NOTE: position \"top\" and \"top-left\" will be the position of edit button if no default position passed in config\n return calculateEditButtonPosition(\n currentHoveredElement,\n defaultPosition || \"top\"\n );\n}\n\nexport function shouldRenderEditButton(): boolean {\n const config = Config.get();\n\n if (!config.editButton.enable) {\n if (config.editButton.enable === undefined)\n PublicLogger.error(\n \"enable key is required inside editButton object\"\n );\n return false;\n }\n\n // return boolean in case of cslp-buttons query added in url\n try {\n const currentLocation = new URL(window.location.href);\n const cslpButtonQueryValue =\n currentLocation.searchParams.get(\"cslp-buttons\");\n\n if (\n cslpButtonQueryValue !== null &&\n config.editButton.includeByQueryParameter !== false\n )\n return cslpButtonQueryValue === \"false\" ? false : true;\n } catch (error) {\n PublicLogger.error(error);\n }\n\n const iFrameCheck = inIframe();\n\n // case outside live preview\n if (\n !iFrameCheck &&\n config.editButton.exclude?.find(\n (exclude) => exclude === \"outsideLivePreviewPortal\"\n )\n ) {\n return false;\n }\n\n // case if inside live preview\n if (\n iFrameCheck &&\n config.editButton.exclude?.find(\n (exclude) => exclude === \"insideLivePreviewPortal\"\n )\n ) {\n return false;\n } else if (iFrameCheck) {\n // case if inside visual builder\n if (config.windowType === \"builder\") {\n return false;\n }\n\n // case if independent site\n return true;\n }\n\n // Priority list => 1. cslpEditButton query value 2. Inside live preview 3. renderCslpButtonByDefault value selected by user\n return true;\n}\n\nexport function toggleEditButtonElement() {\n const render = shouldRenderEditButton();\n const exists = doesEditButtonExist();\n\n if (render && !exists) {\n LivePreviewEditButton.livePreviewEditButton =\n new LivePreviewEditButton();\n } else if (!render && exists) {\n LivePreviewEditButton.livePreviewEditButton?.destroy();\n }\n}\n\nexport function doesEditButtonExist() {\n return document.getElementById(EDIT_BUTTON_TOOLTIP_ID) !== null;\n}\n\nexport class LivePreviewEditButton {\n private tooltip: HTMLButtonElement | null = null;\n private typeOfCurrentChild: \"singular\" | \"multiple\" = \"singular\";\n private tooltipChild: {\n singular: HTMLDivElement | null;\n multiple: HTMLDivElement | null;\n } = {\n singular: null,\n multiple: null,\n };\n static livePreviewEditButton: LivePreviewEditButton | null = null;\n\n constructor() {\n this.createCslpTooltip = this.createCslpTooltip.bind(this);\n this.updateTooltipPosition = this.updateTooltipPosition.bind(this);\n this.addEditStyleOnHover = this.addEditStyleOnHover.bind(this);\n this.scrollHandler = this.scrollHandler.bind(this);\n this.generateRedirectUrl = this.generateRedirectUrl.bind(this);\n this.linkClickHandler = this.linkClickHandler.bind(this);\n this.destroy = this.destroy.bind(this);\n\n if (this.createCslpTooltip()) {\n this.updateTooltipPosition();\n\n window.addEventListener(\"scroll\", this.updateTooltipPosition);\n window.addEventListener(\"mouseover\", this.addEditStyleOnHover);\n }\n }\n\n private createCslpTooltip(): boolean {\n const editButton = Config.get().editButton;\n\n if (\n !document.getElementById(EDIT_BUTTON_TOOLTIP_ID) &&\n editButton.enable &&\n shouldRenderEditButton()\n ) {\n const tooltip = document.createElement(\"button\");\n this.tooltip = tooltip;\n\n this.tooltip.classList.add(cslpTagStyles()[\"cslp-tooltip\"]);\n this.tooltip.setAttribute(\"data-test-id\", \"cs-cslp-tooltip\");\n this.tooltip.id = EDIT_BUTTON_TOOLTIP_ID;\n\n window.document.body.insertAdjacentElement(\n \"beforeend\",\n this.tooltip\n );\n\n this.tooltipChild.singular = createSingularEditButton(\n this.scrollHandler\n );\n this.tooltipChild.multiple = createMultipleEditButton(\n this.scrollHandler,\n this.linkClickHandler\n );\n\n this.tooltip.appendChild(this.tooltipChild.singular);\n return true;\n }\n return false;\n }\n\n private updateTooltipPosition() {\n const editButton = Config.get().editButton;\n const elements = Config.get().elements;\n\n if (!elements.highlightedElement || !this.tooltip) return false;\n\n const currentRectOfElement =\n elements.highlightedElement.getBoundingClientRect();\n const currentRectOfParentOfElement =\n this.tooltip.parentElement?.getBoundingClientRect();\n\n if (currentRectOfElement && currentRectOfParentOfElement) {\n const editButtonPosition = getEditButtonPosition(\n elements.highlightedElement as HTMLElement,\n editButton.position\n );\n\n let upperBoundOfTooltip = editButtonPosition.upperBoundOfTooltip;\n const leftBoundOfTooltip = editButtonPosition.leftBoundOfTooltip;\n\n // if scrolled and element is still visible, make sure tooltip is also visible\n if (upperBoundOfTooltip < 0) {\n if (currentRectOfElement.top < 0)\n upperBoundOfTooltip = currentRectOfElement.top;\n else upperBoundOfTooltip = 0;\n }\n\n this.tooltip.style.top = upperBoundOfTooltip + \"px\";\n this.tooltip.style.zIndex =\n elements.highlightedElement.style.zIndex || \"200\";\n this.tooltip.style.left = leftBoundOfTooltip + \"px\";\n\n if (this.tooltipChild.singular && this.tooltipChild.multiple) {\n if (\n elements.highlightedElement.hasAttribute(\"href\") &&\n this.typeOfCurrentChild !== \"multiple\"\n ) {\n this.tooltip.innerHTML = \"\";\n this.tooltip.appendChild(this.tooltipChild.multiple);\n this.typeOfCurrentChild = \"multiple\";\n } else if (this.typeOfCurrentChild !== \"singular\") {\n this.tooltip.innerHTML = \"\";\n this.tooltip.appendChild(this.tooltipChild.singular);\n this.typeOfCurrentChild = \"singular\";\n }\n }\n return true;\n }\n\n return false;\n }\n\n private addEditStyleOnHover(e: MouseEvent) {\n const updateTooltipPosition: Parameters<typeof addCslpOutline>[\"1\"] = ({\n cslpTag,\n highlightedElement,\n }) => {\n if (this.updateTooltipPosition()) {\n this.tooltip?.setAttribute(\"current-data-cslp\", cslpTag);\n this.tooltip?.setAttribute(\n \"current-href\",\n highlightedElement.getAttribute(\"href\") ?? \"\"\n );\n }\n };\n\n const editButton = Config.get().editButton;\n const windowType = Config.get().windowType;\n\n if (\n (windowType === ILivePreviewWindowType.PREVIEW ||\n windowType === ILivePreviewWindowType.INDEPENDENT) &&\n editButton.enable\n ) {\n addCslpOutline(e, updateTooltipPosition);\n }\n }\n\n private scrollHandler() {\n if (!this.tooltip) return;\n\n const cslpTag = this.tooltip.getAttribute(\"current-data-cslp\");\n\n if (cslpTag) {\n const { content_type_uid, entry_uid, locale, variant, fieldPathWithIndex } =\n extractDetailsFromCslp(cslpTag);\n\n if (inIframe()) {\n livePreviewPostMessage?.send(\"scroll\", {\n field: fieldPathWithIndex,\n content_type_uid,\n entry_uid,\n variant,\n locale,\n });\n } else {\n try {\n // Redirect to Contentstack edit page\n const redirectUrl = this.generateRedirectUrl(\n content_type_uid,\n locale,\n entry_uid,\n variant,\n fieldPathWithIndex\n );\n\n window.open(redirectUrl, \"_blank\");\n } catch (error) {\n PublicLogger.error(error);\n }\n }\n }\n }\n\n /**\n * Generates the redirect URL for editing a specific entry in the Live Preview SDK.\n * @param content_type_uid - The UID of the content type.\n * @param locale - The locale of the entry (default: \"en-us\").\n * @param entry_uid - The UID of the entry.\n * @param preview_field - The field to be previewed.\n * @returns The redirect URL for editing the entry.\n */\n private generateRedirectUrl(\n content_type_uid: string,\n locale = \"en-us\",\n entry_uid: string,\n variant: string | undefined,\n preview_field: string\n ): string {\n const config = Config.get();\n\n if (!config.stackDetails.apiKey) {\n throw `To use edit tags, you must provide the stack API key. Specify the API key while initializing the Live Preview SDK.\n\n ContentstackLivePreview.init({\n ...,\n stackDetails: {\n apiKey: 'your-api-key'\n },\n ...\n })`;\n }\n\n if (!config.stackDetails.environment) {\n throw `To use edit tags, you must provide the preview environment. Specify the preview environment while initializing the Live Preview SDK.\n\n ContentstackLivePreview.init({\n ...,\n stackDetails: {\n environment: 'Your-environment'\n },\n ...\n })`;\n }\n\n const protocol = String(config.clientUrlParams.protocol);\n const host = String(config.clientUrlParams.host);\n const port = String(config.clientUrlParams.port);\n const environment = String(config.stackDetails.environment);\n const branch = String(config.stackDetails.branch || \"main\");\n\n let urlHash = `!/stack/${\n config.stackDetails.apiKey\n }/content-type/${content_type_uid}/${\n locale ?? \"en-us\"\n }/entry/${entry_uid}`;\n\n if (variant) {\n urlHash += `/variant/${variant}/edit`;\n } else {\n urlHash += `/edit`;\n }\n\n const url = new URL(`${protocol}://${host}`);\n url.port = port;\n url.hash = urlHash;\n if (config.stackDetails.branch) {\n url.searchParams.append(\"branch\", branch);\n }\n url.searchParams.append(\"preview-field\", preview_field);\n url.searchParams.append(\"preview-locale\", locale ?? \"en-us\");\n url.searchParams.append(\"preview-environment\", environment);\n\n return `${url.origin}/${url.hash}${url.search}`;\n }\n\n private linkClickHandler() {\n if (!this.tooltip) return;\n const hrefAttribute = this.tooltip.getAttribute(\"current-href\");\n\n if (hrefAttribute) {\n window.location.assign(hrefAttribute);\n }\n }\n\n /**\n * Destroys the edit button by removing event listeners and removing the tooltip.\n */\n destroy(): void {\n window.removeEventListener(\"scroll\", this.updateTooltipPosition);\n window.removeEventListener(\"mouseover\", this.addEditStyleOnHover);\n this.tooltip?.remove();\n }\n}\n\neffect(function handleWindowTypeChange() {\n // we need to specify when to run this effect.\n // here, we run it when the value of windowType changes\n if (typeof window === \"undefined\") return;\n Config.get().windowType;\n if (LivePreviewEditButton && !isOpeningInTimeline()) {\n toggleEditButtonElement();\n }\n});\n"],"mappings":"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","names":["import_editButton","Config","livePreviewPostMessage"]}
@@ -154,7 +154,7 @@ function shouldRenderEditButton() {
154
154
  PublicLogger.error(error);
155
155
  }
156
156
  const iFrameCheck = inIframe();
157
- if (config.editButton.exclude?.find(
157
+ if (!iFrameCheck && config.editButton.exclude?.find(
158
158
  (exclude) => exclude === "outsideLivePreviewPortal"
159
159
  )) {
160
160
  return false;