@contentstack/live-preview-utils 4.2.0 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/README.md +1 -1
  2. package/dist/legacy/configManager/config.default.cjs +4 -2
  3. package/dist/legacy/configManager/config.default.cjs.map +1 -1
  4. package/dist/legacy/configManager/config.default.d.cts +1 -1
  5. package/dist/legacy/configManager/config.default.d.ts +1 -1
  6. package/dist/legacy/configManager/config.default.js +4 -2
  7. package/dist/legacy/configManager/config.default.js.map +1 -1
  8. package/dist/legacy/configManager/handleUserConfig.cjs +4 -0
  9. package/dist/legacy/configManager/handleUserConfig.cjs.map +1 -1
  10. package/dist/legacy/configManager/handleUserConfig.js +4 -0
  11. package/dist/legacy/configManager/handleUserConfig.js.map +1 -1
  12. package/dist/legacy/cslp/cslpdata.cjs +28 -3
  13. package/dist/legacy/cslp/cslpdata.cjs.map +1 -1
  14. package/dist/legacy/cslp/cslpdata.d.cts +27 -1
  15. package/dist/legacy/cslp/cslpdata.d.ts +27 -1
  16. package/dist/legacy/cslp/cslpdata.js +26 -2
  17. package/dist/legacy/cslp/cslpdata.js.map +1 -1
  18. package/dist/legacy/cslp/index.d.cts +1 -1
  19. package/dist/legacy/cslp/index.d.ts +1 -1
  20. package/dist/legacy/light-sdk.cjs +1 -1
  21. package/dist/legacy/light-sdk.js +1 -1
  22. package/dist/legacy/livePreview/editButton/editButton.cjs +1 -1
  23. package/dist/legacy/livePreview/editButton/editButton.cjs.map +1 -1
  24. package/dist/legacy/livePreview/editButton/editButton.js +2 -2
  25. package/dist/legacy/livePreview/editButton/editButton.js.map +1 -1
  26. package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.cjs +11 -6
  27. package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.cjs.map +1 -1
  28. package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.js +11 -6
  29. package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.js.map +1 -1
  30. package/dist/legacy/preview/contentstack-live-preview-HOC.cjs +1 -1
  31. package/dist/legacy/preview/contentstack-live-preview-HOC.js +1 -1
  32. package/dist/legacy/timeline/compare/compare.cjs +3 -1
  33. package/dist/legacy/timeline/compare/compare.cjs.map +1 -1
  34. package/dist/legacy/timeline/compare/compare.js +3 -1
  35. package/dist/legacy/timeline/compare/compare.js.map +1 -1
  36. package/dist/legacy/types/types.cjs.map +1 -1
  37. package/dist/legacy/types/types.d.cts +2 -0
  38. package/dist/legacy/types/types.d.ts +2 -0
  39. package/dist/legacy/types/types.js.map +1 -1
  40. package/dist/legacy/visualBuilder/components/fieldLabelWrapper.cjs +1 -1
  41. package/dist/legacy/visualBuilder/components/fieldLabelWrapper.cjs.map +1 -1
  42. package/dist/legacy/visualBuilder/components/fieldLabelWrapper.js +2 -2
  43. package/dist/legacy/visualBuilder/components/fieldLabelWrapper.js.map +1 -1
  44. package/dist/legacy/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.cjs +19 -22
  45. package/dist/legacy/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.cjs.map +1 -1
  46. package/dist/legacy/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.d.cts +2 -1
  47. package/dist/legacy/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.d.ts +2 -1
  48. package/dist/legacy/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.js +18 -22
  49. package/dist/legacy/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.js.map +1 -1
  50. package/dist/legacy/visualBuilder/eventManager/useRevalidateFieldDataPostMessageEvent.cjs +2 -2
  51. package/dist/legacy/visualBuilder/eventManager/useRevalidateFieldDataPostMessageEvent.cjs.map +1 -1
  52. package/dist/legacy/visualBuilder/eventManager/useRevalidateFieldDataPostMessageEvent.js +3 -3
  53. package/dist/legacy/visualBuilder/eventManager/useRevalidateFieldDataPostMessageEvent.js.map +1 -1
  54. package/dist/legacy/visualBuilder/eventManager/useVariantsPostMessageEvent.cjs +63 -13
  55. package/dist/legacy/visualBuilder/eventManager/useVariantsPostMessageEvent.cjs.map +1 -1
  56. package/dist/legacy/visualBuilder/eventManager/useVariantsPostMessageEvent.d.cts +12 -3
  57. package/dist/legacy/visualBuilder/eventManager/useVariantsPostMessageEvent.d.ts +12 -3
  58. package/dist/legacy/visualBuilder/eventManager/useVariantsPostMessageEvent.js +60 -14
  59. package/dist/legacy/visualBuilder/eventManager/useVariantsPostMessageEvent.js.map +1 -1
  60. package/dist/legacy/visualBuilder/generators/generateEmptyBlock.cjs +1 -1
  61. package/dist/legacy/visualBuilder/generators/generateEmptyBlock.cjs.map +1 -1
  62. package/dist/legacy/visualBuilder/generators/generateEmptyBlock.js +2 -2
  63. package/dist/legacy/visualBuilder/generators/generateEmptyBlock.js.map +1 -1
  64. package/dist/legacy/visualBuilder/generators/generateHighlightedComment.cjs +2 -1
  65. package/dist/legacy/visualBuilder/generators/generateHighlightedComment.cjs.map +1 -1
  66. package/dist/legacy/visualBuilder/generators/generateHighlightedComment.js +2 -1
  67. package/dist/legacy/visualBuilder/generators/generateHighlightedComment.js.map +1 -1
  68. package/dist/legacy/visualBuilder/generators/generateOverlay.cjs +1 -1
  69. package/dist/legacy/visualBuilder/generators/generateOverlay.cjs.map +1 -1
  70. package/dist/legacy/visualBuilder/generators/generateOverlay.js +2 -2
  71. package/dist/legacy/visualBuilder/generators/generateOverlay.js.map +1 -1
  72. package/dist/legacy/visualBuilder/generators/generateThread.d.cts +1 -1
  73. package/dist/legacy/visualBuilder/generators/generateThread.d.ts +1 -1
  74. package/dist/legacy/visualBuilder/index.cjs +12 -2
  75. package/dist/legacy/visualBuilder/index.cjs.map +1 -1
  76. package/dist/legacy/visualBuilder/index.d.cts +2 -0
  77. package/dist/legacy/visualBuilder/index.d.ts +2 -0
  78. package/dist/legacy/visualBuilder/index.js +14 -4
  79. package/dist/legacy/visualBuilder/index.js.map +1 -1
  80. package/dist/legacy/visualBuilder/listeners/mouseClick.cjs +14 -10
  81. package/dist/legacy/visualBuilder/listeners/mouseClick.cjs.map +1 -1
  82. package/dist/legacy/visualBuilder/listeners/mouseClick.js +14 -10
  83. package/dist/legacy/visualBuilder/listeners/mouseClick.js.map +1 -1
  84. package/dist/legacy/visualBuilder/utils/collabUtils.d.cts +1 -1
  85. package/dist/legacy/visualBuilder/utils/collabUtils.d.ts +1 -1
  86. package/dist/legacy/visualBuilder/utils/getCsDataOfElement.cjs +3 -3
  87. package/dist/legacy/visualBuilder/utils/getCsDataOfElement.cjs.map +1 -1
  88. package/dist/legacy/visualBuilder/utils/getCsDataOfElement.js +4 -4
  89. package/dist/legacy/visualBuilder/utils/getCsDataOfElement.js.map +1 -1
  90. package/dist/legacy/visualBuilder/utils/getEntryIdentifiersInCurrentPage.cjs +1 -1
  91. package/dist/legacy/visualBuilder/utils/getEntryIdentifiersInCurrentPage.cjs.map +1 -1
  92. package/dist/legacy/visualBuilder/utils/getEntryIdentifiersInCurrentPage.js +2 -2
  93. package/dist/legacy/visualBuilder/utils/getEntryIdentifiersInCurrentPage.js.map +1 -1
  94. package/dist/legacy/visualBuilder/utils/getVisualBuilderRedirectionUrl.cjs +2 -2
  95. package/dist/legacy/visualBuilder/utils/getVisualBuilderRedirectionUrl.cjs.map +1 -1
  96. package/dist/legacy/visualBuilder/utils/getVisualBuilderRedirectionUrl.js +3 -3
  97. package/dist/legacy/visualBuilder/utils/getVisualBuilderRedirectionUrl.js.map +1 -1
  98. package/dist/legacy/visualBuilder/utils/types/postMessage.types.cjs +1 -0
  99. package/dist/legacy/visualBuilder/utils/types/postMessage.types.cjs.map +1 -1
  100. package/dist/legacy/visualBuilder/utils/types/postMessage.types.d.cts +1 -0
  101. package/dist/legacy/visualBuilder/utils/types/postMessage.types.d.ts +1 -0
  102. package/dist/legacy/visualBuilder/utils/types/postMessage.types.js +1 -0
  103. package/dist/legacy/visualBuilder/utils/types/postMessage.types.js.map +1 -1
  104. package/dist/legacy/visualBuilder/utils/updateFocussedState.cjs +1 -1
  105. package/dist/legacy/visualBuilder/utils/updateFocussedState.cjs.map +1 -1
  106. package/dist/legacy/visualBuilder/utils/updateFocussedState.js +2 -2
  107. package/dist/legacy/visualBuilder/utils/updateFocussedState.js.map +1 -1
  108. package/dist/legacy/visualBuilder/visualBuilder.style.cjs +2 -1
  109. package/dist/legacy/visualBuilder/visualBuilder.style.cjs.map +1 -1
  110. package/dist/legacy/visualBuilder/visualBuilder.style.d.cts +1 -0
  111. package/dist/legacy/visualBuilder/visualBuilder.style.d.ts +1 -0
  112. package/dist/legacy/visualBuilder/visualBuilder.style.js +2 -1
  113. package/dist/legacy/visualBuilder/visualBuilder.style.js.map +1 -1
  114. package/dist/modern/configManager/config.default.cjs +4 -2
  115. package/dist/modern/configManager/config.default.cjs.map +1 -1
  116. package/dist/modern/configManager/config.default.d.cts +1 -1
  117. package/dist/modern/configManager/config.default.d.ts +1 -1
  118. package/dist/modern/configManager/config.default.js +4 -2
  119. package/dist/modern/configManager/config.default.js.map +1 -1
  120. package/dist/modern/configManager/handleUserConfig.cjs +4 -0
  121. package/dist/modern/configManager/handleUserConfig.cjs.map +1 -1
  122. package/dist/modern/configManager/handleUserConfig.js +4 -0
  123. package/dist/modern/configManager/handleUserConfig.js.map +1 -1
  124. package/dist/modern/cslp/cslpdata.cjs +28 -3
  125. package/dist/modern/cslp/cslpdata.cjs.map +1 -1
  126. package/dist/modern/cslp/cslpdata.d.cts +27 -1
  127. package/dist/modern/cslp/cslpdata.d.ts +27 -1
  128. package/dist/modern/cslp/cslpdata.js +26 -2
  129. package/dist/modern/cslp/cslpdata.js.map +1 -1
  130. package/dist/modern/cslp/index.d.cts +1 -1
  131. package/dist/modern/cslp/index.d.ts +1 -1
  132. package/dist/modern/light-sdk.cjs +1 -1
  133. package/dist/modern/light-sdk.js +1 -1
  134. package/dist/modern/livePreview/editButton/editButton.cjs +1 -1
  135. package/dist/modern/livePreview/editButton/editButton.cjs.map +1 -1
  136. package/dist/modern/livePreview/editButton/editButton.js +2 -2
  137. package/dist/modern/livePreview/editButton/editButton.js.map +1 -1
  138. package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.cjs +11 -6
  139. package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.cjs.map +1 -1
  140. package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.js +11 -6
  141. package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.js.map +1 -1
  142. package/dist/modern/preview/contentstack-live-preview-HOC.cjs +1 -1
  143. package/dist/modern/preview/contentstack-live-preview-HOC.js +1 -1
  144. package/dist/modern/timeline/compare/compare.cjs +3 -1
  145. package/dist/modern/timeline/compare/compare.cjs.map +1 -1
  146. package/dist/modern/timeline/compare/compare.js +3 -1
  147. package/dist/modern/timeline/compare/compare.js.map +1 -1
  148. package/dist/modern/types/types.cjs.map +1 -1
  149. package/dist/modern/types/types.d.cts +2 -0
  150. package/dist/modern/types/types.d.ts +2 -0
  151. package/dist/modern/types/types.js.map +1 -1
  152. package/dist/modern/visualBuilder/components/fieldLabelWrapper.cjs +1 -1
  153. package/dist/modern/visualBuilder/components/fieldLabelWrapper.cjs.map +1 -1
  154. package/dist/modern/visualBuilder/components/fieldLabelWrapper.js +2 -2
  155. package/dist/modern/visualBuilder/components/fieldLabelWrapper.js.map +1 -1
  156. package/dist/modern/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.cjs +19 -22
  157. package/dist/modern/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.cjs.map +1 -1
  158. package/dist/modern/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.d.cts +2 -1
  159. package/dist/modern/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.d.ts +2 -1
  160. package/dist/modern/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.js +18 -22
  161. package/dist/modern/visualBuilder/eventManager/useRecalculateVariantDataCSLPValues.js.map +1 -1
  162. package/dist/modern/visualBuilder/eventManager/useRevalidateFieldDataPostMessageEvent.cjs +2 -2
  163. package/dist/modern/visualBuilder/eventManager/useRevalidateFieldDataPostMessageEvent.cjs.map +1 -1
  164. package/dist/modern/visualBuilder/eventManager/useRevalidateFieldDataPostMessageEvent.js +3 -3
  165. package/dist/modern/visualBuilder/eventManager/useRevalidateFieldDataPostMessageEvent.js.map +1 -1
  166. package/dist/modern/visualBuilder/eventManager/useVariantsPostMessageEvent.cjs +62 -13
  167. package/dist/modern/visualBuilder/eventManager/useVariantsPostMessageEvent.cjs.map +1 -1
  168. package/dist/modern/visualBuilder/eventManager/useVariantsPostMessageEvent.d.cts +12 -3
  169. package/dist/modern/visualBuilder/eventManager/useVariantsPostMessageEvent.d.ts +12 -3
  170. package/dist/modern/visualBuilder/eventManager/useVariantsPostMessageEvent.js +59 -14
  171. package/dist/modern/visualBuilder/eventManager/useVariantsPostMessageEvent.js.map +1 -1
  172. package/dist/modern/visualBuilder/generators/generateEmptyBlock.cjs +1 -1
  173. package/dist/modern/visualBuilder/generators/generateEmptyBlock.cjs.map +1 -1
  174. package/dist/modern/visualBuilder/generators/generateEmptyBlock.js +2 -2
  175. package/dist/modern/visualBuilder/generators/generateEmptyBlock.js.map +1 -1
  176. package/dist/modern/visualBuilder/generators/generateHighlightedComment.cjs +2 -1
  177. package/dist/modern/visualBuilder/generators/generateHighlightedComment.cjs.map +1 -1
  178. package/dist/modern/visualBuilder/generators/generateHighlightedComment.js +2 -1
  179. package/dist/modern/visualBuilder/generators/generateHighlightedComment.js.map +1 -1
  180. package/dist/modern/visualBuilder/generators/generateOverlay.cjs +1 -1
  181. package/dist/modern/visualBuilder/generators/generateOverlay.cjs.map +1 -1
  182. package/dist/modern/visualBuilder/generators/generateOverlay.js +2 -2
  183. package/dist/modern/visualBuilder/generators/generateOverlay.js.map +1 -1
  184. package/dist/modern/visualBuilder/generators/generateThread.d.cts +1 -1
  185. package/dist/modern/visualBuilder/generators/generateThread.d.ts +1 -1
  186. package/dist/modern/visualBuilder/index.cjs +12 -2
  187. package/dist/modern/visualBuilder/index.cjs.map +1 -1
  188. package/dist/modern/visualBuilder/index.d.cts +2 -0
  189. package/dist/modern/visualBuilder/index.d.ts +2 -0
  190. package/dist/modern/visualBuilder/index.js +14 -4
  191. package/dist/modern/visualBuilder/index.js.map +1 -1
  192. package/dist/modern/visualBuilder/listeners/mouseClick.cjs +14 -10
  193. package/dist/modern/visualBuilder/listeners/mouseClick.cjs.map +1 -1
  194. package/dist/modern/visualBuilder/listeners/mouseClick.js +14 -10
  195. package/dist/modern/visualBuilder/listeners/mouseClick.js.map +1 -1
  196. package/dist/modern/visualBuilder/utils/collabUtils.d.cts +1 -1
  197. package/dist/modern/visualBuilder/utils/collabUtils.d.ts +1 -1
  198. package/dist/modern/visualBuilder/utils/getCsDataOfElement.cjs +3 -3
  199. package/dist/modern/visualBuilder/utils/getCsDataOfElement.cjs.map +1 -1
  200. package/dist/modern/visualBuilder/utils/getCsDataOfElement.js +4 -4
  201. package/dist/modern/visualBuilder/utils/getCsDataOfElement.js.map +1 -1
  202. package/dist/modern/visualBuilder/utils/getEntryIdentifiersInCurrentPage.cjs +1 -1
  203. package/dist/modern/visualBuilder/utils/getEntryIdentifiersInCurrentPage.cjs.map +1 -1
  204. package/dist/modern/visualBuilder/utils/getEntryIdentifiersInCurrentPage.js +2 -2
  205. package/dist/modern/visualBuilder/utils/getEntryIdentifiersInCurrentPage.js.map +1 -1
  206. package/dist/modern/visualBuilder/utils/getVisualBuilderRedirectionUrl.cjs +2 -2
  207. package/dist/modern/visualBuilder/utils/getVisualBuilderRedirectionUrl.cjs.map +1 -1
  208. package/dist/modern/visualBuilder/utils/getVisualBuilderRedirectionUrl.js +3 -3
  209. package/dist/modern/visualBuilder/utils/getVisualBuilderRedirectionUrl.js.map +1 -1
  210. package/dist/modern/visualBuilder/utils/types/postMessage.types.cjs +1 -0
  211. package/dist/modern/visualBuilder/utils/types/postMessage.types.cjs.map +1 -1
  212. package/dist/modern/visualBuilder/utils/types/postMessage.types.d.cts +1 -0
  213. package/dist/modern/visualBuilder/utils/types/postMessage.types.d.ts +1 -0
  214. package/dist/modern/visualBuilder/utils/types/postMessage.types.js +1 -0
  215. package/dist/modern/visualBuilder/utils/types/postMessage.types.js.map +1 -1
  216. package/dist/modern/visualBuilder/utils/updateFocussedState.cjs +1 -1
  217. package/dist/modern/visualBuilder/utils/updateFocussedState.cjs.map +1 -1
  218. package/dist/modern/visualBuilder/utils/updateFocussedState.js +2 -2
  219. package/dist/modern/visualBuilder/utils/updateFocussedState.js.map +1 -1
  220. package/dist/modern/visualBuilder/visualBuilder.style.cjs +2 -1
  221. package/dist/modern/visualBuilder/visualBuilder.style.cjs.map +1 -1
  222. package/dist/modern/visualBuilder/visualBuilder.style.d.cts +1 -0
  223. package/dist/modern/visualBuilder/visualBuilder.style.d.ts +1 -0
  224. package/dist/modern/visualBuilder/visualBuilder.style.js +2 -1
  225. package/dist/modern/visualBuilder/visualBuilder.style.js.map +1 -1
  226. package/package.json +8 -8
@@ -4,6 +4,29 @@ import "../chunk-5WRI5ZAA.js";
4
4
  import { isNil, isFinite, findLastIndex, findLast } from "lodash-es";
5
5
  import Config from "../configManager/configManager.js";
6
6
  import { cslpTagStyles } from "../livePreview/editButton/editButton.style.js";
7
+ function areRequiredPartsNonEmpty(parts) {
8
+ if (parts.length < 3) {
9
+ return false;
10
+ }
11
+ return parts[0].length > 0 && parts[1].length > 0 && parts[2].length > 0;
12
+ }
13
+ function isValidCslp(cslpValue) {
14
+ if (!cslpValue) {
15
+ return false;
16
+ }
17
+ if (cslpValue.startsWith("v2:")) {
18
+ const dataAfterPrefix = cslpValue.substring(3);
19
+ const parts2 = dataAfterPrefix.split(".");
20
+ if (!areRequiredPartsNonEmpty(parts2)) {
21
+ return false;
22
+ }
23
+ const entryUidVariantUid = parts2[1];
24
+ const entryVariantParts = entryUidVariantUid.split("_");
25
+ return entryVariantParts.length >= 2 && entryVariantParts.every((part) => part.length > 0);
26
+ }
27
+ const parts = cslpValue.split(".");
28
+ return areRequiredPartsNonEmpty(parts);
29
+ }
7
30
  function extractDetailsFromCslp(cslpValue) {
8
31
  let [cslpVersion, cslpData] = cslpValue.split(":");
9
32
  if (cslpVersion.length > 2) {
@@ -90,7 +113,7 @@ function addCslpOutline(e, callback) {
90
113
  if (element.nodeName === "BODY") break;
91
114
  if (typeof element?.getAttribute !== "function") continue;
92
115
  const cslpTag = element.getAttribute("data-cslp");
93
- if (trigger && cslpTag) {
116
+ if (trigger && isValidCslp(cslpTag)) {
94
117
  if (elements.highlightedElement)
95
118
  elements.highlightedElement.classList.remove(
96
119
  cslpTagStyles()["cslp-edit-mode"]
@@ -111,6 +134,7 @@ function addCslpOutline(e, callback) {
111
134
  }
112
135
  export {
113
136
  addCslpOutline,
114
- extractDetailsFromCslp
137
+ extractDetailsFromCslp,
138
+ isValidCslp
115
139
  };
116
140
  //# sourceMappingURL=cslpdata.js.map
@@ -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 * @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":[]}
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 * Validates that the required CSLP parts (content_type_uid, entry_uid/entry_uid_variant_uid, locale) are non-empty.\n * @param parts The array of parts from splitting the CSLP string by \".\"\n * @returns `true` if all required parts (first 3) are non-empty, `false` otherwise.\n */\nfunction areRequiredPartsNonEmpty(parts: string[]): boolean {\n // Check that we have at least 3 parts\n if (parts.length < 3) {\n return false;\n }\n // Verify that content_type_uid (parts[0]), entry_uid/entry_uid_variant_uid (parts[1]), and locale (parts[2]) are all non-empty\n return parts[0].length > 0 && parts[1].length > 0 && parts[2].length > 0;\n}\n\n/**\n * Validates if a CSLP value string is valid.\n * \n * Supports two formats:\n * - **v1 format**: `content_type_uid.entry_uid.locale[.field_path]` (requires at least 3 parts)\n * - **v2 format**: `v2:content_type_uid.entry_uid_variant_uid.locale[.field_path]` \n * (requires at least 3 parts, entry_uid_variant_uid must contain underscore separating entry_uid and variant_uid)\n * \n * @param cslpValue The CSLP value string to validate (can be null or undefined).\n * @returns Type predicate: `true` if the CSLP value is valid (narrows type to `string`), `false` otherwise.\n * \n * @example\n * Valid v1 format\n * isValidCslp(\"page.entry123.en-us\") -> true\n * isValidCslp(\"page.entry123.en-us.title\") -> true\n * \n * Valid v2 format\n * isValidCslp(\"v2:page.entry123_variant456.en-us\") -> true\n * isValidCslp(\"v2:page.entry123_variant456.en-us.title\") -> true\n * \n * Invalid cases\n * isValidCslp(null) -> false\n * isValidCslp(\"invalid\") -> false (less than 3 parts)\n * isValidCslp(\"v2:page.entry123.en-us\") -> false (missing underscore in entry_uid_variant_uid)\n */\nexport function isValidCslp(\n cslpValue: string | null | undefined\n): cslpValue is string {\n // Return false for null, undefined, or empty string\n if (!cslpValue) {\n return false;\n }\n\n // Check for v2 format (starts with \"v2:\")\n if (cslpValue.startsWith(\"v2:\")) {\n const dataAfterPrefix = cslpValue.substring(3); // Remove \"v2:\" prefix\n const parts = dataAfterPrefix.split(\".\");\n // v2 format requires at least 3 parts: content_type_uid.entry_uid_variant_uid.locale\n // Verify that content_type_uid, entry_uid_variant_uid, and locale are all non-empty\n if (!areRequiredPartsNonEmpty(parts)) {\n return false;\n }\n // Verify that entry_uid_variant_uid (second part) contains both entry_uid and variant_uid separated by at least one underscore\n const entryUidVariantUid = parts[1];\n const entryVariantParts = entryUidVariantUid.split(\"_\");\n // Check that we have at least 2 parts (entry_uid and variant_uid) and all parts are non-empty\n return entryVariantParts.length >= 2 && entryVariantParts.every((part) => part.length > 0);\n }\n\n // v1 format (default, no prefix)\n const parts = cslpValue.split(\".\");\n // v1 format requires at least 3 parts: content_type_uid.entry_uid.locale\n // Verify that content_type_uid, entry_uid, and locale are all non-empty\n return areRequiredPartsNonEmpty(parts);\n}\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 && isValidCslp(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":["parts"]}
@@ -1,2 +1,2 @@
1
- export { addCslpOutline, extractDetailsFromCslp } from './cslpdata.cjs';
1
+ export { addCslpOutline, extractDetailsFromCslp, isValidCslp } from './cslpdata.cjs';
2
2
  import './types/cslp.types.cjs';
@@ -1,2 +1,2 @@
1
- export { addCslpOutline, extractDetailsFromCslp } from './cslpdata.js';
1
+ export { addCslpOutline, extractDetailsFromCslp, isValidCslp } from './cslpdata.js';
2
2
  import './types/cslp.types.js';
@@ -60,7 +60,7 @@ var _LightLivePreviewHoC = class _LightLivePreviewHoC {
60
60
  static unsubscribeOnEntryChange() {
61
61
  }
62
62
  static getSdkVersion() {
63
- return "4.2.0";
63
+ return "4.3.0";
64
64
  }
65
65
  };
66
66
  _LightLivePreviewHoC.previewConstructors = {};
@@ -38,7 +38,7 @@ var _LightLivePreviewHoC = class _LightLivePreviewHoC {
38
38
  static unsubscribeOnEntryChange() {
39
39
  }
40
40
  static getSdkVersion() {
41
- return "4.2.0";
41
+ return "4.3.0";
42
42
  }
43
43
  };
44
44
  _LightLivePreviewHoC.previewConstructors = {};
@@ -340,7 +340,7 @@ var LivePreviewEditButton = class {
340
340
  scrollHandler() {
341
341
  if (!this.tooltip) return;
342
342
  const cslpTag = this.tooltip.getAttribute("current-data-cslp");
343
- if (cslpTag) {
343
+ if ((0, import_cslp.isValidCslp)(cslpTag)) {
344
344
  const {
345
345
  content_type_uid,
346
346
  entry_uid,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/livePreview/editButton/editButton.ts"],"sourcesContent":["import { effect } from \"@preact/signals\";\nimport { inIframe, isOpeningInNewTab } 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 if (!document.getElementById(\"cslp-tooltip\")) {\n this.createCslpTooltip();\n }\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 updateStyles = this.shouldUpdateStyle(e);\n // Checks whether the mouse pointer is within the safe zone of the\n // element which was hovered on, since it also returns undefined when the\n // above can't be determined we can still add styles\n const shouldRedraw =\n typeof updateStyles === \"undefined\" ? true : updateStyles;\n if (!shouldRedraw) {\n return;\n }\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 shouldUpdateStyle(event: MouseEvent) {\n const editButtonPos = Config.get().editButton.position;\n const editButtonDomRect = this.tooltip?.getBoundingClientRect();\n return isPointerWithinEditButtonSafeZone({\n event,\n editButtonPos,\n editButtonDomRect,\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 {\n content_type_uid,\n entry_uid,\n locale,\n variant,\n fieldPathWithIndex,\n } = extractDetailsFromCslp(cslpTag);\n\n if (inIframe() || isOpeningInNewTab()) {\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\n/**\n * Find first element with cslp on the event composed path,\n * do safe zone calculation for the element based on its\n * width and height, and return true if mouse pointer is\n * within the safe zone. Returns undefined when this cannot\n * be determined.\n */\nexport function isPointerWithinEditButtonSafeZone({\n event,\n editButtonDomRect,\n editButtonPos,\n}: {\n event: MouseEvent;\n editButtonDomRect: DOMRect | undefined;\n editButtonPos: string | undefined;\n}) {\n const SAFE_ZONE_RATIO = 0.1;\n const MAX_SAFE_ZONE_DISTANCE = 30;\n if (!editButtonDomRect || !editButtonPos) {\n return undefined;\n }\n if (!(editButtonDomRect.x > 0) || !(editButtonDomRect.y > 0)) {\n return undefined;\n }\n const isTop = editButtonPos.includes(\"top\");\n const isLeft = editButtonPos.includes(\"left\");\n const isBottom = editButtonPos.includes(\"bottom\");\n const isVertical = isTop || isBottom;\n const cslpElement = event.composedPath().find((target) => {\n const element = target as HTMLElement;\n if (element.nodeName === \"BODY\") {\n return false;\n }\n if (typeof element?.hasAttribute !== \"function\") {\n return false;\n }\n return element.hasAttribute(\"data-cslp\");\n });\n if (!cslpElement) {\n return undefined;\n }\n const element = cslpElement as HTMLElement;\n const elementRect = element.getBoundingClientRect();\n let safeZoneDistance = isVertical\n ? // if vertical positioning (\"top\"/\"bottom\")\n // button is rendered along the width\n elementRect.width * SAFE_ZONE_RATIO\n : // button is rendered along the height\n elementRect.height * SAFE_ZONE_RATIO;\n safeZoneDistance =\n safeZoneDistance > MAX_SAFE_ZONE_DISTANCE\n ? MAX_SAFE_ZONE_DISTANCE\n : safeZoneDistance;\n\n const tooltipX2 = editButtonDomRect.x + editButtonDomRect.width;\n const tooltipY2 = editButtonDomRect.y + editButtonDomRect.height;\n const safeX1 = editButtonDomRect.x - safeZoneDistance;\n const safeX2 = tooltipX2 + safeZoneDistance;\n const safeY1 = editButtonDomRect.y - safeZoneDistance;\n const safeY2 = tooltipY2 + safeZoneDistance;\n\n if (isTop || isBottom) {\n const verticalSafeDistance = isTop\n ? Math.abs(tooltipY2 - event.clientY)\n : Math.abs(editButtonDomRect.y - event.clientY);\n const isInSafeZone =\n event.clientX > safeX1 &&\n event.clientX < safeX2 &&\n verticalSafeDistance < safeZoneDistance;\n if (isInSafeZone) {\n return false;\n }\n } else {\n const horizontalSafeDistance = isLeft\n ? Math.abs(tooltipX2 - event.clientX)\n : Math.abs(editButtonDomRect.x - event.clientX);\n\n const isInSafeZone =\n event.clientY > safeY1 &&\n event.clientY < safeY2 &&\n horizontalSafeDistance < safeZoneDistance;\n if (isInSafeZone) {\n return false;\n }\n }\n return true;\n}\n"],"mappings":"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","names":["import_editButton","Config","livePreviewPostMessage","element"]}
1
+ {"version":3,"sources":["../../../../src/livePreview/editButton/editButton.ts"],"sourcesContent":["import { effect } from \"@preact/signals\";\nimport { inIframe, isOpeningInNewTab } from \"../../common/inIframe\";\nimport Config from \"../../configManager/configManager\";\nimport { addCslpOutline, extractDetailsFromCslp, isValidCslp } 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 if (!document.getElementById(\"cslp-tooltip\")) {\n this.createCslpTooltip();\n }\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 updateStyles = this.shouldUpdateStyle(e);\n // Checks whether the mouse pointer is within the safe zone of the\n // element which was hovered on, since it also returns undefined when the\n // above can't be determined we can still add styles\n const shouldRedraw =\n typeof updateStyles === \"undefined\" ? true : updateStyles;\n if (!shouldRedraw) {\n return;\n }\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 shouldUpdateStyle(event: MouseEvent) {\n const editButtonPos = Config.get().editButton.position;\n const editButtonDomRect = this.tooltip?.getBoundingClientRect();\n return isPointerWithinEditButtonSafeZone({\n event,\n editButtonPos,\n editButtonDomRect,\n });\n }\n\n private scrollHandler() {\n if (!this.tooltip) return;\n\n const cslpTag = this.tooltip.getAttribute(\"current-data-cslp\");\n\n if (isValidCslp(cslpTag)) {\n const {\n content_type_uid,\n entry_uid,\n locale,\n variant,\n fieldPathWithIndex,\n } = extractDetailsFromCslp(cslpTag);\n\n if (inIframe() || isOpeningInNewTab()) {\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\n/**\n * Find first element with cslp on the event composed path,\n * do safe zone calculation for the element based on its\n * width and height, and return true if mouse pointer is\n * within the safe zone. Returns undefined when this cannot\n * be determined.\n */\nexport function isPointerWithinEditButtonSafeZone({\n event,\n editButtonDomRect,\n editButtonPos,\n}: {\n event: MouseEvent;\n editButtonDomRect: DOMRect | undefined;\n editButtonPos: string | undefined;\n}) {\n const SAFE_ZONE_RATIO = 0.1;\n const MAX_SAFE_ZONE_DISTANCE = 30;\n if (!editButtonDomRect || !editButtonPos) {\n return undefined;\n }\n if (!(editButtonDomRect.x > 0) || !(editButtonDomRect.y > 0)) {\n return undefined;\n }\n const isTop = editButtonPos.includes(\"top\");\n const isLeft = editButtonPos.includes(\"left\");\n const isBottom = editButtonPos.includes(\"bottom\");\n const isVertical = isTop || isBottom;\n const cslpElement = event.composedPath().find((target) => {\n const element = target as HTMLElement;\n if (element.nodeName === \"BODY\") {\n return false;\n }\n if (typeof element?.hasAttribute !== \"function\") {\n return false;\n }\n return element.hasAttribute(\"data-cslp\");\n });\n if (!cslpElement) {\n return undefined;\n }\n const element = cslpElement as HTMLElement;\n const elementRect = element.getBoundingClientRect();\n let safeZoneDistance = isVertical\n ? // if vertical positioning (\"top\"/\"bottom\")\n // button is rendered along the width\n elementRect.width * SAFE_ZONE_RATIO\n : // button is rendered along the height\n elementRect.height * SAFE_ZONE_RATIO;\n safeZoneDistance =\n safeZoneDistance > MAX_SAFE_ZONE_DISTANCE\n ? MAX_SAFE_ZONE_DISTANCE\n : safeZoneDistance;\n\n const tooltipX2 = editButtonDomRect.x + editButtonDomRect.width;\n const tooltipY2 = editButtonDomRect.y + editButtonDomRect.height;\n const safeX1 = editButtonDomRect.x - safeZoneDistance;\n const safeX2 = tooltipX2 + safeZoneDistance;\n const safeY1 = editButtonDomRect.y - safeZoneDistance;\n const safeY2 = tooltipY2 + safeZoneDistance;\n\n if (isTop || isBottom) {\n const verticalSafeDistance = isTop\n ? Math.abs(tooltipY2 - event.clientY)\n : Math.abs(editButtonDomRect.y - event.clientY);\n const isInSafeZone =\n event.clientX > safeX1 &&\n event.clientX < safeX2 &&\n verticalSafeDistance < safeZoneDistance;\n if (isInSafeZone) {\n return false;\n }\n } else {\n const horizontalSafeDistance = isLeft\n ? Math.abs(tooltipX2 - event.clientX)\n : Math.abs(editButtonDomRect.x - event.clientX);\n\n const isInSafeZone =\n event.clientY > safeY1 &&\n event.clientY < safeY2 &&\n horizontalSafeDistance < safeZoneDistance;\n if (isInSafeZone) {\n return false;\n }\n }\n return true;\n}\n"],"mappings":"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","names":["import_editButton","Config","livePreviewPostMessage","element"]}
@@ -4,7 +4,7 @@ import "../../chunk-5WRI5ZAA.js";
4
4
  import { effect } from "@preact/signals";
5
5
  import { inIframe, isOpeningInNewTab } from "../../common/inIframe.js";
6
6
  import Config from "../../configManager/configManager.js";
7
- import { addCslpOutline, extractDetailsFromCslp } from "../../cslp/index.js";
7
+ import { addCslpOutline, extractDetailsFromCslp, isValidCslp } from "../../cslp/index.js";
8
8
  import { cslpTagStyles } from "./editButton.style.js";
9
9
  import { PublicLogger } from "../../logger/logger.js";
10
10
  import {
@@ -303,7 +303,7 @@ var LivePreviewEditButton = class {
303
303
  scrollHandler() {
304
304
  if (!this.tooltip) return;
305
305
  const cslpTag = this.tooltip.getAttribute("current-data-cslp");
306
- if (cslpTag) {
306
+ if (isValidCslp(cslpTag)) {
307
307
  const {
308
308
  content_type_uid,
309
309
  entry_uid,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/livePreview/editButton/editButton.ts"],"sourcesContent":["import { effect } from \"@preact/signals\";\nimport { inIframe, isOpeningInNewTab } 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 if (!document.getElementById(\"cslp-tooltip\")) {\n this.createCslpTooltip();\n }\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 updateStyles = this.shouldUpdateStyle(e);\n // Checks whether the mouse pointer is within the safe zone of the\n // element which was hovered on, since it also returns undefined when the\n // above can't be determined we can still add styles\n const shouldRedraw =\n typeof updateStyles === \"undefined\" ? true : updateStyles;\n if (!shouldRedraw) {\n return;\n }\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 shouldUpdateStyle(event: MouseEvent) {\n const editButtonPos = Config.get().editButton.position;\n const editButtonDomRect = this.tooltip?.getBoundingClientRect();\n return isPointerWithinEditButtonSafeZone({\n event,\n editButtonPos,\n editButtonDomRect,\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 {\n content_type_uid,\n entry_uid,\n locale,\n variant,\n fieldPathWithIndex,\n } = extractDetailsFromCslp(cslpTag);\n\n if (inIframe() || isOpeningInNewTab()) {\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\n/**\n * Find first element with cslp on the event composed path,\n * do safe zone calculation for the element based on its\n * width and height, and return true if mouse pointer is\n * within the safe zone. Returns undefined when this cannot\n * be determined.\n */\nexport function isPointerWithinEditButtonSafeZone({\n event,\n editButtonDomRect,\n editButtonPos,\n}: {\n event: MouseEvent;\n editButtonDomRect: DOMRect | undefined;\n editButtonPos: string | undefined;\n}) {\n const SAFE_ZONE_RATIO = 0.1;\n const MAX_SAFE_ZONE_DISTANCE = 30;\n if (!editButtonDomRect || !editButtonPos) {\n return undefined;\n }\n if (!(editButtonDomRect.x > 0) || !(editButtonDomRect.y > 0)) {\n return undefined;\n }\n const isTop = editButtonPos.includes(\"top\");\n const isLeft = editButtonPos.includes(\"left\");\n const isBottom = editButtonPos.includes(\"bottom\");\n const isVertical = isTop || isBottom;\n const cslpElement = event.composedPath().find((target) => {\n const element = target as HTMLElement;\n if (element.nodeName === \"BODY\") {\n return false;\n }\n if (typeof element?.hasAttribute !== \"function\") {\n return false;\n }\n return element.hasAttribute(\"data-cslp\");\n });\n if (!cslpElement) {\n return undefined;\n }\n const element = cslpElement as HTMLElement;\n const elementRect = element.getBoundingClientRect();\n let safeZoneDistance = isVertical\n ? // if vertical positioning (\"top\"/\"bottom\")\n // button is rendered along the width\n elementRect.width * SAFE_ZONE_RATIO\n : // button is rendered along the height\n elementRect.height * SAFE_ZONE_RATIO;\n safeZoneDistance =\n safeZoneDistance > MAX_SAFE_ZONE_DISTANCE\n ? MAX_SAFE_ZONE_DISTANCE\n : safeZoneDistance;\n\n const tooltipX2 = editButtonDomRect.x + editButtonDomRect.width;\n const tooltipY2 = editButtonDomRect.y + editButtonDomRect.height;\n const safeX1 = editButtonDomRect.x - safeZoneDistance;\n const safeX2 = tooltipX2 + safeZoneDistance;\n const safeY1 = editButtonDomRect.y - safeZoneDistance;\n const safeY2 = tooltipY2 + safeZoneDistance;\n\n if (isTop || isBottom) {\n const verticalSafeDistance = isTop\n ? Math.abs(tooltipY2 - event.clientY)\n : Math.abs(editButtonDomRect.y - event.clientY);\n const isInSafeZone =\n event.clientX > safeX1 &&\n event.clientX < safeX2 &&\n verticalSafeDistance < safeZoneDistance;\n if (isInSafeZone) {\n return false;\n }\n } else {\n const horizontalSafeDistance = isLeft\n ? Math.abs(tooltipX2 - event.clientX)\n : Math.abs(editButtonDomRect.x - event.clientX);\n\n const isInSafeZone =\n event.clientY > safeY1 &&\n event.clientY < safeY2 &&\n horizontalSafeDistance < safeZoneDistance;\n if (isInSafeZone) {\n return false;\n }\n }\n return true;\n}\n"],"mappings":"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","names":["element"]}
1
+ {"version":3,"sources":["../../../../src/livePreview/editButton/editButton.ts"],"sourcesContent":["import { effect } from \"@preact/signals\";\nimport { inIframe, isOpeningInNewTab } from \"../../common/inIframe\";\nimport Config from \"../../configManager/configManager\";\nimport { addCslpOutline, extractDetailsFromCslp, isValidCslp } 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 if (!document.getElementById(\"cslp-tooltip\")) {\n this.createCslpTooltip();\n }\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 updateStyles = this.shouldUpdateStyle(e);\n // Checks whether the mouse pointer is within the safe zone of the\n // element which was hovered on, since it also returns undefined when the\n // above can't be determined we can still add styles\n const shouldRedraw =\n typeof updateStyles === \"undefined\" ? true : updateStyles;\n if (!shouldRedraw) {\n return;\n }\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 shouldUpdateStyle(event: MouseEvent) {\n const editButtonPos = Config.get().editButton.position;\n const editButtonDomRect = this.tooltip?.getBoundingClientRect();\n return isPointerWithinEditButtonSafeZone({\n event,\n editButtonPos,\n editButtonDomRect,\n });\n }\n\n private scrollHandler() {\n if (!this.tooltip) return;\n\n const cslpTag = this.tooltip.getAttribute(\"current-data-cslp\");\n\n if (isValidCslp(cslpTag)) {\n const {\n content_type_uid,\n entry_uid,\n locale,\n variant,\n fieldPathWithIndex,\n } = extractDetailsFromCslp(cslpTag);\n\n if (inIframe() || isOpeningInNewTab()) {\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\n/**\n * Find first element with cslp on the event composed path,\n * do safe zone calculation for the element based on its\n * width and height, and return true if mouse pointer is\n * within the safe zone. Returns undefined when this cannot\n * be determined.\n */\nexport function isPointerWithinEditButtonSafeZone({\n event,\n editButtonDomRect,\n editButtonPos,\n}: {\n event: MouseEvent;\n editButtonDomRect: DOMRect | undefined;\n editButtonPos: string | undefined;\n}) {\n const SAFE_ZONE_RATIO = 0.1;\n const MAX_SAFE_ZONE_DISTANCE = 30;\n if (!editButtonDomRect || !editButtonPos) {\n return undefined;\n }\n if (!(editButtonDomRect.x > 0) || !(editButtonDomRect.y > 0)) {\n return undefined;\n }\n const isTop = editButtonPos.includes(\"top\");\n const isLeft = editButtonPos.includes(\"left\");\n const isBottom = editButtonPos.includes(\"bottom\");\n const isVertical = isTop || isBottom;\n const cslpElement = event.composedPath().find((target) => {\n const element = target as HTMLElement;\n if (element.nodeName === \"BODY\") {\n return false;\n }\n if (typeof element?.hasAttribute !== \"function\") {\n return false;\n }\n return element.hasAttribute(\"data-cslp\");\n });\n if (!cslpElement) {\n return undefined;\n }\n const element = cslpElement as HTMLElement;\n const elementRect = element.getBoundingClientRect();\n let safeZoneDistance = isVertical\n ? // if vertical positioning (\"top\"/\"bottom\")\n // button is rendered along the width\n elementRect.width * SAFE_ZONE_RATIO\n : // button is rendered along the height\n elementRect.height * SAFE_ZONE_RATIO;\n safeZoneDistance =\n safeZoneDistance > MAX_SAFE_ZONE_DISTANCE\n ? MAX_SAFE_ZONE_DISTANCE\n : safeZoneDistance;\n\n const tooltipX2 = editButtonDomRect.x + editButtonDomRect.width;\n const tooltipY2 = editButtonDomRect.y + editButtonDomRect.height;\n const safeX1 = editButtonDomRect.x - safeZoneDistance;\n const safeX2 = tooltipX2 + safeZoneDistance;\n const safeY1 = editButtonDomRect.y - safeZoneDistance;\n const safeY2 = tooltipY2 + safeZoneDistance;\n\n if (isTop || isBottom) {\n const verticalSafeDistance = isTop\n ? Math.abs(tooltipY2 - event.clientY)\n : Math.abs(editButtonDomRect.y - event.clientY);\n const isInSafeZone =\n event.clientX > safeX1 &&\n event.clientX < safeX2 &&\n verticalSafeDistance < safeZoneDistance;\n if (isInSafeZone) {\n return false;\n }\n } else {\n const horizontalSafeDistance = isLeft\n ? Math.abs(tooltipX2 - event.clientX)\n : Math.abs(editButtonDomRect.x - event.clientX);\n\n const isInSafeZone =\n event.clientY > safeY1 &&\n event.clientY < safeY2 &&\n horizontalSafeDistance < safeZoneDistance;\n if (isInSafeZone) {\n return false;\n }\n }\n return true;\n}\n"],"mappings":"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","names":["element"]}
@@ -131,15 +131,20 @@ function useOnEntryUpdatePostMessageEvent() {
131
131
  );
132
132
  }
133
133
  function sendInitializeLivePreviewPostMessageEvent() {
134
+ const config = import_configManager.default.get();
135
+ const initConfig = {
136
+ shouldReload: config.ssr,
137
+ href: window.location.href,
138
+ sdkVersion: "4.3.0",
139
+ mode: config.mode
140
+ };
141
+ if (config.enableLivePreviewOutsideIframe !== void 0) {
142
+ initConfig.enableLivePreviewOutsideIframe = config.enableLivePreviewOutsideIframe;
143
+ }
134
144
  import_livePreviewEventManager.default?.send(
135
145
  import_livePreviewEventManager2.LIVE_PREVIEW_POST_MESSAGE_EVENTS.INIT,
136
146
  {
137
- config: {
138
- shouldReload: import_configManager.default.get().ssr,
139
- href: window.location.href,
140
- sdkVersion: "4.2.0",
141
- mode: import_configManager.default.get().mode
142
- }
147
+ config: initConfig
143
148
  }
144
149
  ).then((data) => {
145
150
  const {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/livePreview/eventManager/postMessageEvent.hooks.ts"],"sourcesContent":["import { isOpeningInNewTab } from \"../../common/inIframe\";\nimport Config, { setConfigFromParams } from \"../../configManager/configManager\";\nimport { PublicLogger } from \"../../logger/logger\";\nimport { ILivePreviewWindowType } from \"../../types/types\";\nimport { addParamsToUrl, isOpeningInTimeline } from \"../../utils\";\nimport livePreviewPostMessage from \"./livePreviewEventManager\";\nimport { LIVE_PREVIEW_POST_MESSAGE_EVENTS } from \"./livePreviewEventManager.constant\";\nimport {\n HistoryLivePreviewPostMessageEventData,\n LivePreviewInitEventResponse,\n OnChangeLivePreviewPostMessageEventData,\n OnChangeLivePreviewPostMessageEventTypes,\n} from \"./types/livePreviewPostMessageEvent.type\";\n\n/**\n * Registers a post message event listener for history-related events.\n * The listener handles events for forward, backward, and reload actions on the browser history.\n */\nexport function useHistoryPostMessageEvent(): void {\n livePreviewPostMessage?.on<HistoryLivePreviewPostMessageEventData>(\n LIVE_PREVIEW_POST_MESSAGE_EVENTS.HISTORY,\n (event) => {\n switch (event.data.type) {\n case \"forward\": {\n window.history.forward();\n break;\n }\n case \"backward\": {\n window.history.back();\n break;\n }\n case \"reload\": {\n window.history.go();\n break;\n }\n default: {\n const exhaustiveCheck: never = event.data.type;\n throw new Error(`Unhandled event: ${exhaustiveCheck}`);\n }\n }\n }\n );\n}\n\n/**\n * Registers a post message event listener for updating the entry in the live preview.\n */\nexport function useOnEntryUpdatePostMessageEvent(): void {\n livePreviewPostMessage?.on<OnChangeLivePreviewPostMessageEventData>(\n LIVE_PREVIEW_POST_MESSAGE_EVENTS.ON_CHANGE,\n (event) => {\n try {\n const { ssr, onChange, stackDetails } = Config.get();\n const event_type = event.data._metadata?.event_type;\n setConfigFromParams({\n live_preview: event.data.hash,\n });\n\n // This section will run when there is a change in the entry and the website is CSR\n if (!ssr && !event_type) {\n onChange();\n }\n\n if (isOpeningInNewTab()) {\n if (!window) {\n PublicLogger.error(\"window is not defined\");\n return;\n };\n\n if (ssr && !event_type) {\n const url = new URL(window.location.href);\n let live_preview = url.searchParams.get(\"live_preview\");\n let content_type_uid = url.searchParams.get(\"content_type_uid\");\n let entry_uid = url.searchParams.get(\"entry_uid\");\n\n if (live_preview && content_type_uid && entry_uid) {\n // All required params are present, just reload\n window.location.reload();\n } else {\n live_preview = event.data.hash;\n content_type_uid = event.data.content_type_uid || stackDetails.$contentTypeUid?.toString() || \"\";\n entry_uid = event.data.entry_uid || stackDetails.$entryUid?.toString() || \"\";\n // Set missing params and redirect\n url.searchParams.set(\"live_preview\", live_preview);\n if (content_type_uid) {\n url.searchParams.set(\n \"content_type_uid\",\n content_type_uid\n );\n }\n if (entry_uid) {\n url.searchParams.set(\n \"entry_uid\",\n entry_uid\n );\n }\n window.location.href = url.toString();\n }\n }\n\n // This section will run when the hash changes and the website is SSR or CSR\n if (event_type === OnChangeLivePreviewPostMessageEventTypes.HASH_CHANGE) {\n const newUrl = new URL(window.location.href);\n newUrl.searchParams.set(\"live_preview\", event.data.hash);\n window.history.pushState({}, \"\", newUrl.toString());\n }\n\n // This section will run when the URL of the page changes\n if (event_type === OnChangeLivePreviewPostMessageEventTypes.URL_CHANGE && event.data.url) {\n window.location.href = event.data.url;\n }\n }\n } catch (error) {\n PublicLogger.error(\"Error handling live preview update:\", error);\n return;\n }\n }\n );\n}\n\nexport function sendInitializeLivePreviewPostMessageEvent(): void {\n livePreviewPostMessage\n ?.send<LivePreviewInitEventResponse>(\n LIVE_PREVIEW_POST_MESSAGE_EVENTS.INIT,\n {\n config: {\n shouldReload: Config.get().ssr,\n href: window.location.href,\n sdkVersion: process?.env?.PACKAGE_VERSION,\n mode: Config.get().mode,\n },\n }\n )\n .then((data) => {\n const {\n contentTypeUid,\n entryUid,\n windowType = ILivePreviewWindowType.PREVIEW,\n } = data || {};\n\n // TODO: This is a fix for the issue where we were calling sending init in the builder\n // Let's remove this condition when we fix it.\n if (Config?.get()?.windowType && Config.get().windowType === ILivePreviewWindowType.BUILDER) {\n return;\n }\n\n if (contentTypeUid && entryUid) {\n // TODO: we should not use this function. Instead we should have sideEffect run automatically when we set the config.\n setConfigFromParams({\n content_type_uid: contentTypeUid,\n entry_uid: entryUid,\n });\n } else {\n // TODO: add debug logs that runs conditionally\n // PublicLogger.debug(\n // \"init message did not contain contentTypeUid or entryUid.\"\n // );\n }\n if (Config.get().ssr || isOpeningInTimeline() || isOpeningInNewTab()) {\n addParamsToUrl();\n }\n Config.set(\"windowType\", windowType);\n\n // set timeout for client side (use to show warning: You are not editing this page)\n if (!Config.get().ssr) {\n setInterval(() => {\n sendCurrentPageUrlPostMessageEvent();\n }, 1500);\n }\n\n useHistoryPostMessageEvent();\n useOnEntryUpdatePostMessageEvent();\n })\n .catch((e) => {\n // TODO: add debug logs that runs conditionally\n // PublicLogger.debug(\"Error while sending init message\", e);\n });\n}\n\nfunction sendCurrentPageUrlPostMessageEvent(): void {\n livePreviewPostMessage\n ?.send(LIVE_PREVIEW_POST_MESSAGE_EVENTS.CHECK_ENTRY_PAGE, {\n href: window.location.href,\n })\n .catch(() => {\n // TODO: add debug logs that runs conditionally\n });\n}\n"],"mappings":"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","names":["import_livePreviewEventManager","livePreviewPostMessage","Config"]}
1
+ {"version":3,"sources":["../../../../src/livePreview/eventManager/postMessageEvent.hooks.ts"],"sourcesContent":["import { isOpeningInNewTab } from \"../../common/inIframe\";\nimport Config, { setConfigFromParams } from \"../../configManager/configManager\";\nimport { PublicLogger } from \"../../logger/logger\";\nimport { ILivePreviewWindowType } from \"../../types/types\";\nimport { addParamsToUrl, isOpeningInTimeline } from \"../../utils\";\nimport livePreviewPostMessage from \"./livePreviewEventManager\";\nimport { LIVE_PREVIEW_POST_MESSAGE_EVENTS } from \"./livePreviewEventManager.constant\";\nimport {\n HistoryLivePreviewPostMessageEventData,\n LivePreviewInitEventResponse,\n OnChangeLivePreviewPostMessageEventData,\n OnChangeLivePreviewPostMessageEventTypes,\n} from \"./types/livePreviewPostMessageEvent.type\";\n\n/**\n * Registers a post message event listener for history-related events.\n * The listener handles events for forward, backward, and reload actions on the browser history.\n */\nexport function useHistoryPostMessageEvent(): void {\n livePreviewPostMessage?.on<HistoryLivePreviewPostMessageEventData>(\n LIVE_PREVIEW_POST_MESSAGE_EVENTS.HISTORY,\n (event) => {\n switch (event.data.type) {\n case \"forward\": {\n window.history.forward();\n break;\n }\n case \"backward\": {\n window.history.back();\n break;\n }\n case \"reload\": {\n window.history.go();\n break;\n }\n default: {\n const exhaustiveCheck: never = event.data.type;\n throw new Error(`Unhandled event: ${exhaustiveCheck}`);\n }\n }\n }\n );\n}\n\n/**\n * Registers a post message event listener for updating the entry in the live preview.\n */\nexport function useOnEntryUpdatePostMessageEvent(): void {\n livePreviewPostMessage?.on<OnChangeLivePreviewPostMessageEventData>(\n LIVE_PREVIEW_POST_MESSAGE_EVENTS.ON_CHANGE,\n (event) => {\n try {\n const { ssr, onChange, stackDetails } = Config.get();\n const event_type = event.data._metadata?.event_type;\n setConfigFromParams({\n live_preview: event.data.hash,\n });\n\n // This section will run when there is a change in the entry and the website is CSR\n if (!ssr && !event_type) {\n onChange();\n }\n\n if (isOpeningInNewTab()) {\n if (!window) {\n PublicLogger.error(\"window is not defined\");\n return;\n };\n\n if (ssr && !event_type) {\n const url = new URL(window.location.href);\n let live_preview = url.searchParams.get(\"live_preview\");\n let content_type_uid = url.searchParams.get(\"content_type_uid\");\n let entry_uid = url.searchParams.get(\"entry_uid\");\n\n if (live_preview && content_type_uid && entry_uid) {\n // All required params are present, just reload\n window.location.reload();\n } else {\n live_preview = event.data.hash;\n content_type_uid = event.data.content_type_uid || stackDetails.$contentTypeUid?.toString() || \"\";\n entry_uid = event.data.entry_uid || stackDetails.$entryUid?.toString() || \"\";\n // Set missing params and redirect\n url.searchParams.set(\"live_preview\", live_preview);\n if (content_type_uid) {\n url.searchParams.set(\n \"content_type_uid\",\n content_type_uid\n );\n }\n if (entry_uid) {\n url.searchParams.set(\n \"entry_uid\",\n entry_uid\n );\n }\n window.location.href = url.toString();\n }\n }\n\n // This section will run when the hash changes and the website is SSR or CSR\n if (event_type === OnChangeLivePreviewPostMessageEventTypes.HASH_CHANGE) {\n const newUrl = new URL(window.location.href);\n newUrl.searchParams.set(\"live_preview\", event.data.hash);\n window.history.pushState({}, \"\", newUrl.toString());\n }\n\n // This section will run when the URL of the page changes\n if (event_type === OnChangeLivePreviewPostMessageEventTypes.URL_CHANGE && event.data.url) {\n window.location.href = event.data.url;\n }\n }\n } catch (error) {\n PublicLogger.error(\"Error handling live preview update:\", error);\n return;\n }\n }\n );\n}\n\nexport function sendInitializeLivePreviewPostMessageEvent(): void {\n const config = Config.get();\n const initConfig: {\n shouldReload: boolean;\n href: string;\n sdkVersion: string | undefined;\n mode: number;\n enableLivePreviewOutsideIframe?: boolean;\n } = {\n shouldReload: config.ssr,\n href: window.location.href,\n sdkVersion: process?.env?.PACKAGE_VERSION,\n mode: config.mode,\n };\n\n if (config.enableLivePreviewOutsideIframe !== undefined) {\n initConfig.enableLivePreviewOutsideIframe = config.enableLivePreviewOutsideIframe;\n }\n\n livePreviewPostMessage\n ?.send<LivePreviewInitEventResponse>(\n LIVE_PREVIEW_POST_MESSAGE_EVENTS.INIT,\n {\n config: initConfig,\n }\n )\n .then((data) => {\n const {\n contentTypeUid,\n entryUid,\n windowType = ILivePreviewWindowType.PREVIEW,\n } = data || {};\n\n // TODO: This is a fix for the issue where we were calling sending init in the builder\n // Let's remove this condition when we fix it.\n if (Config?.get()?.windowType && Config.get().windowType === ILivePreviewWindowType.BUILDER) {\n return;\n }\n\n if (contentTypeUid && entryUid) {\n // TODO: we should not use this function. Instead we should have sideEffect run automatically when we set the config.\n setConfigFromParams({\n content_type_uid: contentTypeUid,\n entry_uid: entryUid,\n });\n } else {\n // TODO: add debug logs that runs conditionally\n // PublicLogger.debug(\n // \"init message did not contain contentTypeUid or entryUid.\"\n // );\n }\n if (Config.get().ssr || isOpeningInTimeline() || isOpeningInNewTab()) {\n addParamsToUrl();\n }\n Config.set(\"windowType\", windowType);\n\n // set timeout for client side (use to show warning: You are not editing this page)\n if (!Config.get().ssr) {\n setInterval(() => {\n sendCurrentPageUrlPostMessageEvent();\n }, 1500);\n }\n\n useHistoryPostMessageEvent();\n useOnEntryUpdatePostMessageEvent();\n })\n .catch((e) => {\n // TODO: add debug logs that runs conditionally\n // PublicLogger.debug(\"Error while sending init message\", e);\n });\n}\n\nfunction sendCurrentPageUrlPostMessageEvent(): void {\n livePreviewPostMessage\n ?.send(LIVE_PREVIEW_POST_MESSAGE_EVENTS.CHECK_ENTRY_PAGE, {\n href: window.location.href,\n })\n .catch(() => {\n // TODO: add debug logs that runs conditionally\n });\n}\n"],"mappings":"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","names":["import_livePreviewEventManager","livePreviewPostMessage","Config"]}