@contentstack/live-preview-utils 2.0.3 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/legacy/compare.cjs +72 -66
- package/dist/legacy/compare.cjs.map +1 -1
- package/dist/legacy/compare.js +72 -66
- package/dist/legacy/compare.js.map +1 -1
- package/dist/legacy/contentstack-live-preview-HOC.cjs +1 -1
- package/dist/legacy/contentstack-live-preview-HOC.js +1 -1
- package/dist/legacy/index.cjs.map +1 -1
- package/dist/legacy/index.d.cts +3 -2
- package/dist/legacy/index.d.ts +3 -2
- package/dist/legacy/index.js.map +1 -1
- package/dist/legacy/live-preview.cjs +20 -6
- package/dist/legacy/live-preview.cjs.map +1 -1
- package/dist/legacy/live-preview.js +20 -6
- package/dist/legacy/live-preview.js.map +1 -1
- package/dist/legacy/utils/cslpdata.cjs +62 -0
- package/dist/legacy/utils/cslpdata.cjs.map +1 -0
- package/dist/legacy/utils/cslpdata.d.cts +16 -0
- package/dist/legacy/utils/cslpdata.d.ts +16 -0
- package/dist/legacy/utils/cslpdata.js +37 -0
- package/dist/legacy/utils/cslpdata.js.map +1 -0
- package/dist/modern/compare.cjs +72 -66
- package/dist/modern/compare.cjs.map +1 -1
- package/dist/modern/compare.js +72 -66
- package/dist/modern/compare.js.map +1 -1
- package/dist/modern/contentstack-live-preview-HOC.cjs +1 -1
- package/dist/modern/contentstack-live-preview-HOC.js +1 -1
- package/dist/modern/index.cjs.map +1 -1
- package/dist/modern/index.d.cts +3 -2
- package/dist/modern/index.d.ts +3 -2
- package/dist/modern/index.js.map +1 -1
- package/dist/modern/live-preview.cjs +20 -6
- package/dist/modern/live-preview.cjs.map +1 -1
- package/dist/modern/live-preview.js +20 -6
- package/dist/modern/live-preview.js.map +1 -1
- package/dist/modern/utils/cslpdata.cjs +62 -0
- package/dist/modern/utils/cslpdata.cjs.map +1 -0
- package/dist/modern/utils/cslpdata.d.cts +16 -0
- package/dist/modern/utils/cslpdata.d.ts +16 -0
- package/dist/modern/utils/cslpdata.js +37 -0
- package/dist/modern/utils/cslpdata.js.map +1 -0
- package/package.json +5 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/live-preview.ts"],"sourcesContent":["import {\n createSingularEditButton,\n createMultipleEditButton,\n addLivePreviewQueryTags,\n shouldRenderEditButton,\n getEditButtonPosition,\n} from \"./utils\";\nimport { PublicLogger } from \"./utils/public-logger\";\nimport {\n IConfig,\n IEditButtonPosition,\n IEditEntrySearchParams,\n IInitData,\n ILivePreviewReceivePostMessages,\n} from \"./utils/types\";\nimport { handleInitData } from \"./utils/handleUserConfig\";\nimport { userInitData } from \"./utils/defaults\";\nimport { livePreviewStyles } from \"./styles/live_preview\";\n\nexport default class LivePreview {\n /**\n * @hideconstructor\n */\n\n private config: IConfig = {\n ssr: true,\n enable: true,\n runScriptsOnUpdate: false,\n cleanCslpOnProduction: true,\n hash: \"\",\n\n editButton: {\n enable: true,\n exclude: [],\n position: \"top\",\n includeByQueryParameter: true,\n },\n stackDetails: {\n apiKey: \"\",\n environment: \"\",\n branch: \"\",\n contentTypeUid: \"\",\n entryUid: \"\",\n },\n\n clientUrlParams: {\n protocol: \"https\",\n host: \"app.contentstack.com\",\n port: 443,\n url: \"https://app.contentstack.com:443\",\n },\n stackSdk: {\n live_preview: {},\n environment: \"\",\n },\n\n onChange: () => {\n // this is intentional\n },\n };\n\n private tooltip: HTMLButtonElement | null = null; // this tooltip is responsible to redirect user to Contentstack edit page\n private currentElementBesideTooltip: HTMLElement | null = null; // this element helps to move tooltip with the scroll\n private isHoveringOnTooltip = false;\n private hideInterval: ReturnType<typeof setInterval> | null = null;\n\n private tooltipChild: {\n singular: HTMLDivElement | null;\n multiple: HTMLDivElement | null;\n } = {\n singular: null,\n multiple: null,\n };\n private tooltipCurrentChild: \"multiple\" | \"singular\" = \"singular\";\n\n constructor(initData: Partial<IInitData> = userInitData) {\n handleInitData(initData, this.config);\n\n this.addEditStyleOnHover = this.addEditStyleOnHover.bind(this);\n this.removeEditButtonStyle = this.removeEditButtonStyle.bind(this);\n this.generateRedirectUrl = this.generateRedirectUrl.bind(this);\n this.scrollHandler = this.scrollHandler.bind(this);\n this.linkClickHandler = this.linkClickHandler.bind(this);\n this.handleUserChange = this.handleUserChange.bind(this);\n this.setOnChangeCallback = this.setOnChangeCallback.bind(this);\n this.resolveIncomingMessage = this.resolveIncomingMessage.bind(this);\n this.createCslpTooltip = this.createCslpTooltip.bind(this);\n this.requestDataSync = this.requestDataSync.bind(this);\n this.updateTooltipPosition = this.updateTooltipPosition.bind(this);\n this.removeDataCslp = this.removeDataCslp.bind(this);\n this.toggleHoveringOnEditButton =\n this.toggleHoveringOnEditButton.bind(this);\n this.hideTooltip = this.hideTooltip.bind(this);\n\n // @ts-ignore\n if (initData.debug) {\n PublicLogger.debug(\n \"Contentstack Live Preview Debugging mode: config --\",\n this.config\n );\n }\n\n if (this.config.enable) {\n if (\n typeof document !== undefined &&\n document.readyState === \"complete\"\n ) {\n this.requestDataSync();\n } else {\n window.addEventListener(\"load\", this.requestDataSync);\n }\n window.addEventListener(\"message\", this.resolveIncomingMessage);\n window.addEventListener(\"scroll\", this.updateTooltipPosition);\n // render the hover outline only when edit button enable\n if (this.config.editButton.enable) {\n window.addEventListener(\"mouseover\", this.addEditStyleOnHover);\n }\n\n if (this.config.ssr) {\n window.addEventListener(\"load\", (e) => {\n const allATags = document.querySelectorAll(\"a\");\n allATags.forEach((tag) => {\n const docOrigin: string = document.location.origin;\n if (tag.href && tag.href.includes(docOrigin)) {\n const newUrl = addLivePreviewQueryTags(tag.href);\n tag.href = newUrl;\n }\n });\n });\n\n // Setting the query params to all the click events related to current domain\n window.addEventListener(\"click\", (event: any) => {\n const target: any = event.target;\n const targetHref: string | any = target.href;\n const docOrigin: string = document.location.origin;\n if (\n targetHref &&\n targetHref.includes(docOrigin) &&\n !targetHref.includes(\"live_preview\")\n ) {\n const newUrl = addLivePreviewQueryTags(target.href);\n event.target.href = newUrl || target.href;\n }\n });\n }\n } else if (this.config.cleanCslpOnProduction) {\n this.removeDataCslp();\n }\n }\n\n private addEditStyleOnHover(e: MouseEvent) {\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 // in case where the Edit button is not available in the body element\n if (!document.getElementById(\"cslp-tooltip\")) {\n this.createCslpTooltip();\n }\n if (this.hideInterval) {\n clearInterval(this.hideInterval);\n this.hideInterval = null;\n }\n if (this.currentElementBesideTooltip) {\n this.currentElementBesideTooltip.classList.remove(\n livePreviewStyles()[\"cslp-edit-mode\"]\n );\n this.currentElementBesideTooltip.removeEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n }\n element.classList.add(livePreviewStyles()[\"cslp-edit-mode\"]);\n this.currentElementBesideTooltip = element;\n this.currentElementBesideTooltip.addEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n\n if (this.updateTooltipPosition()) {\n this.tooltip?.setAttribute(\"current-data-cslp\", cslpTag);\n this.tooltip?.setAttribute(\n \"current-href\",\n element.getAttribute(\"href\") ?? \"\"\n );\n }\n\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(livePreviewStyles()[\"cslp-edit-mode\"]);\n }\n }\n }\n\n private removeEditButtonStyle(e: MouseEvent) {\n if (!this.currentElementBesideTooltip || !this.tooltip) return false;\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 this.hideInterval = setInterval(this.hideTooltip, 500);\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(livePreviewStyles()[\"cslp-edit-mode\"]);\n }\n }\n }\n\n private hideTooltip() {\n if (\n !this.currentElementBesideTooltip ||\n !this.tooltip ||\n this.isHoveringOnTooltip\n )\n return false;\n this.currentElementBesideTooltip.classList.remove(\n livePreviewStyles()[\"cslp-edit-mode\"]\n );\n this.currentElementBesideTooltip.removeEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n this.currentElementBesideTooltip = null;\n this.tooltip.style.top = \"-100%\";\n }\n\n private generateRedirectUrl(\n content_type_uid: string,\n locale = \"en-us\",\n entry_uid: string,\n preview_field: string\n ): string {\n if (!this.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 (!this.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(this.config.clientUrlParams.protocol);\n const host = String(this.config.clientUrlParams.host);\n const port = String(this.config.clientUrlParams.port);\n const environment = String(this.config.stackDetails.environment);\n const branch = String(this.config.stackDetails.branch || \"main\");\n\n const urlHash = `!/stack/${\n this.config.stackDetails.apiKey\n }/content-type/${content_type_uid}/${\n locale ?? \"en-us\"\n }/entry/${entry_uid}/edit`;\n\n const url = new URL(`${protocol}://${host}`);\n url.port = port;\n url.hash = urlHash;\n if (this.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 scrollHandler() {\n if (!this.tooltip) return;\n\n const cslpTag = this.tooltip.getAttribute(\"current-data-cslp\");\n\n if (cslpTag) {\n const [content_type_uid, entry_uid, locale, ...field] =\n cslpTag.split(\".\");\n\n // check if opened inside an iframe\n if (window.location !== window.parent.location) {\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"scroll\",\n data: {\n field: field.join(\".\"),\n content_type_uid,\n entry_uid,\n locale,\n },\n },\n \"*\"\n );\n } else {\n try {\n const redirectUrl = this.generateRedirectUrl(\n content_type_uid,\n locale,\n entry_uid,\n field.join(\".\")\n );\n\n window.open(redirectUrl, \"_blank\");\n } catch (error) {\n PublicLogger.error(error);\n }\n }\n }\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 private handleUserChange(editEntrySearchParams: IEditEntrySearchParams) {\n // here we provide contentTypeUid and EntryUid to the StackDelivery SDK.\n this.config.stackSdk.live_preview = {\n ...this.config.stackSdk.live_preview,\n ...editEntrySearchParams,\n live_preview: editEntrySearchParams.hash,\n };\n this.config.onChange();\n }\n\n setOnChangeCallback(onChangeCallback: () => void): void {\n this.config.onChange = onChangeCallback;\n }\n\n /**\n * It is the live preview hash.\n * This hash could be used when data is fetched manually.\n */\n get hash(): string {\n return this.config.hash;\n }\n\n /**\n * Sets the live preview hash from the query param which is\n * accessible via `hash` property.\n * @param params query param in an object form\n */\n setConfigFromParams(\n params: ConstructorParameters<typeof URLSearchParams>[0] = {}\n ): void {\n if (typeof params !== \"object\")\n throw new TypeError(\n \"Live preview SDK: query param must be an object\"\n );\n\n const urlParams = new URLSearchParams(params);\n const live_preview = urlParams.get(\"live_preview\");\n\n if (live_preview) {\n this.config.hash = live_preview;\n }\n }\n\n private resolveIncomingMessage(\n e: MessageEvent<ILivePreviewReceivePostMessages>\n ) {\n if (typeof e.data !== \"object\") return;\n\n if (e.data.from !== \"live-preview\") return;\n\n switch (e.data.type) {\n case \"client-data-send\": {\n const { contentTypeUid, entryUid } = this.config.stackDetails;\n const { hash } = e.data.data;\n\n this.setConfigFromParams({ live_preview: hash });\n\n if (!this.config.ssr) {\n this.handleUserChange({\n content_type_uid: contentTypeUid,\n entry_uid: entryUid,\n hash: hash,\n });\n }\n break;\n }\n case \"init-ack\": {\n const { contentTypeUid, entryUid } = e.data.data;\n\n this.config.stackDetails.contentTypeUid = contentTypeUid;\n this.config.stackDetails.entryUid = entryUid;\n break;\n }\n case \"history\": {\n switch (e.data.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 }\n }\n break;\n }\n default: {\n // ensure that the switch statement is exhaustive\n const exhaustiveCheck: never = e.data;\n return exhaustiveCheck; // TODO: add debug message while we are in development mode.\n }\n }\n }\n\n private createCslpTooltip = () => {\n if (\n !document.getElementById(\"cslp-tooltip\") &&\n this.config.editButton.enable\n ) {\n const tooltip = document.createElement(\"button\");\n const tooltipInnerContainer = document.createElement(\"div\");\n tooltipInnerContainer.classList.add(\n livePreviewStyles()[\"cslp-tooltip-inner-container\"]\n );\n tooltip.classList.add(livePreviewStyles()[\"cslp-tooltip\"]);\n tooltip.classList.add(livePreviewStyles()[\"cslp-tooltip\"]);\n tooltip.setAttribute(\"data-test-id\", \"cs-cslp-tooltip\");\n tooltip.id = \"cslp-tooltip\";\n tooltipInnerContainer.id = \"cslp-tooltip-inner-container\";\n tooltip.addEventListener(\"mouseover\", () => {\n this.toggleHoveringOnEditButton(true);\n });\n tooltip.addEventListener(\"mouseleave\", (e: MouseEvent) => {\n this.toggleHoveringOnEditButton(false);\n this.removeEditButtonStyle(e);\n });\n window.document.body.insertAdjacentElement(\"beforeend\", tooltip);\n this.tooltipChild.singular = createSingularEditButton(\n this.scrollHandler\n );\n this.tooltipChild.multiple = createMultipleEditButton(\n this.scrollHandler,\n this.linkClickHandler\n );\n\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(this.tooltipChild.singular);\n tooltip.appendChild(tooltipInnerContainer);\n this.tooltip = tooltip;\n }\n this.updateTooltipPosition();\n };\n\n private toggleHoveringOnEditButton = (isHoveringOnTooltip: boolean) => {\n this.isHoveringOnTooltip = isHoveringOnTooltip;\n };\n\n // Request parent for data sync when document loads\n private requestDataSync() {\n // add edit tooltip\n this.createCslpTooltip();\n\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"init\",\n data: {\n config: {\n shouldReload: this.config.ssr,\n href: window.location.href,\n sdkVersion: process.env.PACKAGE_VERSION,\n },\n },\n },\n \"*\"\n );\n\n // set timeout for client side (use to show warning: You are not editing this page)\n if (!this.config.ssr) {\n setInterval(() => {\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"check-entry-page\",\n data: {\n href: window.location.href,\n },\n },\n \"*\"\n );\n }, 1500);\n }\n }\n\n private updateTooltipPosition() {\n if (!this.currentElementBesideTooltip || !this.tooltip) return false;\n\n const currentRectOfElement =\n this.currentElementBesideTooltip.getBoundingClientRect();\n const currentRectOfParentOfElement =\n this.tooltip.parentElement?.getBoundingClientRect();\n\n if (currentRectOfElement && currentRectOfParentOfElement) {\n let {\n upperBoundOfTooltip,\n // eslint-disable-next-line prefer-const\n leftBoundOfTooltip,\n }: IEditButtonPosition = getEditButtonPosition(\n this.currentElementBesideTooltip,\n this.config.editButton.position\n );\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 this.currentElementBesideTooltip.style.zIndex || \"200\";\n this.tooltip.style.left = leftBoundOfTooltip + \"px\";\n\n if (this.tooltipChild.singular && this.tooltipChild.multiple) {\n if (this.currentElementBesideTooltip.hasAttribute(\"href\")) {\n if (this.tooltipCurrentChild !== \"multiple\") {\n const tooltipInnerContainer =\n this.tooltip.querySelector(\n `div.${\n livePreviewStyles()[\n \"cslp-tooltip-inner-container\"\n ]\n }`\n );\n if (tooltipInnerContainer) {\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(\n this.tooltipChild.multiple\n );\n this.tooltipCurrentChild = \"multiple\";\n }\n }\n } else if (this.tooltipCurrentChild !== \"singular\") {\n const tooltipInnerContainer = this.tooltip.querySelector(\n `div.${\n livePreviewStyles()[\"cslp-tooltip-inner-container\"]\n }`\n );\n if (tooltipInnerContainer) {\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(\n this.tooltipChild.singular\n );\n this.tooltipCurrentChild = \"singular\";\n }\n }\n }\n return true;\n }\n\n return false;\n }\n\n // remove attributes when livePreview is false\n private removeDataCslp() {\n const nodes = document.querySelectorAll(\"[data-cslp]\");\n\n nodes.forEach((node) => {\n node.removeAttribute(\"data-cslp\");\n node.removeAttribute(\"data-cslp-button-position\");\n });\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/live-preview.ts"],"sourcesContent":["import {\n createSingularEditButton,\n createMultipleEditButton,\n addLivePreviewQueryTags,\n shouldRenderEditButton,\n getEditButtonPosition,\n} from \"./utils\";\nimport { PublicLogger } from \"./utils/public-logger\";\nimport {\n IConfig,\n IEditButtonPosition,\n IEditEntrySearchParams,\n IInitData,\n ILivePreviewReceivePostMessages,\n} from \"./utils/types\";\nimport { handleInitData } from \"./utils/handleUserConfig\";\nimport { userInitData } from \"./utils/defaults\";\nimport packageJson from \"../package.json\";\nimport { extractDetailsFromCslp } from \"./utils/cslpdata\";\nimport { livePreviewStyles } from \"./styles/live_preview\";\n\nexport default class LivePreview {\n /**\n * @hideconstructor\n */\n\n private config: IConfig = {\n ssr: true,\n enable: true,\n runScriptsOnUpdate: false,\n cleanCslpOnProduction: true,\n hash: \"\",\n\n editButton: {\n enable: true,\n exclude: [],\n position: \"top\",\n includeByQueryParameter: true,\n },\n stackDetails: {\n apiKey: \"\",\n environment: \"\",\n branch: \"\",\n contentTypeUid: \"\",\n entryUid: \"\",\n },\n\n clientUrlParams: {\n protocol: \"https\",\n host: \"app.contentstack.com\",\n port: 443,\n url: \"https://app.contentstack.com:443\",\n },\n stackSdk: {\n live_preview: {},\n environment: \"\",\n },\n\n onChange: () => {\n // this is intentional\n },\n };\n\n private tooltip: HTMLButtonElement | null = null; // this tooltip is responsible to redirect user to Contentstack edit page\n private currentElementBesideTooltip: HTMLElement | null = null; // this element helps to move tooltip with the scroll\n private isHoveringOnTooltip = false;\n private hideInterval: ReturnType<typeof setInterval> | null = null;\n\n private tooltipChild: {\n singular: HTMLDivElement | null;\n multiple: HTMLDivElement | null;\n } = {\n singular: null,\n multiple: null,\n };\n private tooltipCurrentChild: \"multiple\" | \"singular\" = \"singular\";\n\n constructor(initData: Partial<IInitData> = userInitData) {\n handleInitData(initData, this.config);\n\n this.addEditStyleOnHover = this.addEditStyleOnHover.bind(this);\n this.removeEditButtonStyle = this.removeEditButtonStyle.bind(this);\n this.generateRedirectUrl = this.generateRedirectUrl.bind(this);\n this.scrollHandler = this.scrollHandler.bind(this);\n this.linkClickHandler = this.linkClickHandler.bind(this);\n this.handleUserChange = this.handleUserChange.bind(this);\n this.setOnChangeCallback = this.setOnChangeCallback.bind(this);\n this.resolveIncomingMessage = this.resolveIncomingMessage.bind(this);\n this.createCslpTooltip = this.createCslpTooltip.bind(this);\n this.requestDataSync = this.requestDataSync.bind(this);\n this.updateTooltipPosition = this.updateTooltipPosition.bind(this);\n this.removeDataCslp = this.removeDataCslp.bind(this);\n this.toggleHoveringOnEditButton =\n this.toggleHoveringOnEditButton.bind(this);\n this.hideTooltip = this.hideTooltip.bind(this);\n\n // @ts-ignore\n if (initData.debug) {\n PublicLogger.debug(\n \"Contentstack Live Preview Debugging mode: config --\",\n this.config\n );\n }\n\n if (this.config.enable) {\n if (\n typeof document !== undefined &&\n document.readyState === \"complete\"\n ) {\n this.requestDataSync();\n } else {\n window.addEventListener(\"load\", this.requestDataSync);\n }\n window.addEventListener(\"message\", this.resolveIncomingMessage);\n window.addEventListener(\"scroll\", this.updateTooltipPosition);\n // render the hover outline only when edit button enable\n if (this.config.editButton.enable) {\n window.addEventListener(\"mouseover\", this.addEditStyleOnHover);\n }\n\n if (this.config.ssr) {\n window.addEventListener(\"load\", (e) => {\n const allATags = document.querySelectorAll(\"a\");\n allATags.forEach((tag) => {\n const docOrigin: string = document.location.origin;\n if (tag.href && tag.href.includes(docOrigin)) {\n const newUrl = addLivePreviewQueryTags(tag.href);\n tag.href = newUrl;\n }\n });\n });\n\n // Setting the query params to all the click events related to current domain\n window.addEventListener(\"click\", (event: any) => {\n const target: any = event.target;\n const targetHref: string | any = target.href;\n const docOrigin: string = document.location.origin;\n if (\n targetHref &&\n targetHref.includes(docOrigin) &&\n !targetHref.includes(\"live_preview\")\n ) {\n const newUrl = addLivePreviewQueryTags(target.href);\n event.target.href = newUrl || target.href;\n }\n });\n }\n } else if (this.config.cleanCslpOnProduction) {\n this.removeDataCslp();\n }\n }\n\n private addEditStyleOnHover(e: MouseEvent) {\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 // in case where the Edit button is not available in the body element\n if (!document.getElementById(\"cslp-tooltip\")) {\n this.createCslpTooltip();\n }\n if (this.hideInterval) {\n clearInterval(this.hideInterval);\n this.hideInterval = null;\n }\n if (this.currentElementBesideTooltip) {\n this.currentElementBesideTooltip.classList.remove(\n livePreviewStyles()[\"cslp-edit-mode\"]\n );\n this.currentElementBesideTooltip.removeEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n }\n element.classList.add(livePreviewStyles()[\"cslp-edit-mode\"]);\n this.currentElementBesideTooltip = element;\n this.currentElementBesideTooltip.addEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n\n if (this.updateTooltipPosition()) {\n this.tooltip?.setAttribute(\"current-data-cslp\", cslpTag);\n this.tooltip?.setAttribute(\n \"current-href\",\n element.getAttribute(\"href\") ?? \"\"\n );\n }\n\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(livePreviewStyles()[\"cslp-edit-mode\"]);\n }\n }\n }\n\n private removeEditButtonStyle(e: MouseEvent) {\n if (!this.currentElementBesideTooltip || !this.tooltip) return false;\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 this.hideInterval = setInterval(this.hideTooltip, 500);\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(livePreviewStyles()[\"cslp-edit-mode\"]);\n }\n }\n }\n\n private hideTooltip() {\n if (\n !this.currentElementBesideTooltip ||\n !this.tooltip ||\n this.isHoveringOnTooltip\n )\n return false;\n this.currentElementBesideTooltip.classList.remove(\n livePreviewStyles()[\"cslp-edit-mode\"]\n );\n this.currentElementBesideTooltip.removeEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n this.currentElementBesideTooltip = null;\n this.tooltip.style.top = \"-100%\";\n }\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 if (!this.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 (!this.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(this.config.clientUrlParams.protocol);\n const host = String(this.config.clientUrlParams.host);\n const port = String(this.config.clientUrlParams.port);\n const environment = String(this.config.stackDetails.environment);\n const branch = String(this.config.stackDetails.branch || \"main\");\n\n let urlHash = `!/stack/${\n this.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 (this.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 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 fieldPath: field,\n } = extractDetailsFromCslp(cslpTag);\n // check if opened inside an iframe\n if (window.location !== window.parent.location) {\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"scroll\",\n data: {\n field,\n content_type_uid,\n entry_uid,\n variant,\n locale,\n },\n },\n \"*\"\n );\n } else {\n try {\n const redirectUrl = this.generateRedirectUrl(\n content_type_uid,\n locale,\n entry_uid,\n variant,\n field\n );\n\n window.open(redirectUrl, \"_blank\");\n } catch (error) {\n PublicLogger.error(error);\n }\n }\n }\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 private handleUserChange(editEntrySearchParams: IEditEntrySearchParams) {\n // here we provide contentTypeUid and EntryUid to the StackDelivery SDK.\n this.config.stackSdk.live_preview = {\n ...this.config.stackSdk.live_preview,\n ...editEntrySearchParams,\n live_preview: editEntrySearchParams.hash,\n };\n this.config.onChange();\n }\n\n setOnChangeCallback(onChangeCallback: () => void): void {\n this.config.onChange = onChangeCallback;\n }\n\n /**\n * It is the live preview hash.\n * This hash could be used when data is fetched manually.\n */\n get hash(): string {\n return this.config.hash;\n }\n\n /**\n * Sets the live preview hash from the query param which is\n * accessible via `hash` property.\n * @param params query param in an object form\n */\n setConfigFromParams(\n params: ConstructorParameters<typeof URLSearchParams>[0] = {}\n ): void {\n if (typeof params !== \"object\")\n throw new TypeError(\n \"Live preview SDK: query param must be an object\"\n );\n\n const urlParams = new URLSearchParams(params);\n const live_preview = urlParams.get(\"live_preview\");\n\n if (live_preview) {\n this.config.hash = live_preview;\n }\n }\n\n private resolveIncomingMessage(\n e: MessageEvent<ILivePreviewReceivePostMessages>\n ) {\n if (typeof e.data !== \"object\") return;\n\n if (e.data.from !== \"live-preview\") return;\n\n switch (e.data.type) {\n case \"client-data-send\": {\n const { contentTypeUid, entryUid } = this.config.stackDetails;\n const { hash } = e.data.data;\n\n this.setConfigFromParams({ live_preview: hash });\n\n if (!this.config.ssr) {\n this.handleUserChange({\n content_type_uid: contentTypeUid,\n entry_uid: entryUid,\n hash: hash,\n });\n }\n break;\n }\n case \"init-ack\": {\n const { contentTypeUid, entryUid } = e.data.data;\n\n this.config.stackDetails.contentTypeUid = contentTypeUid;\n this.config.stackDetails.entryUid = entryUid;\n break;\n }\n case \"history\": {\n switch (e.data.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 }\n }\n break;\n }\n default: {\n // ensure that the switch statement is exhaustive\n const exhaustiveCheck: never = e.data;\n return exhaustiveCheck; // TODO: add debug message while we are in development mode.\n }\n }\n }\n\n private createCslpTooltip = () => {\n if (\n !document.getElementById(\"cslp-tooltip\") &&\n this.config.editButton.enable\n ) {\n const tooltip = document.createElement(\"button\");\n const tooltipInnerContainer = document.createElement(\"div\");\n tooltipInnerContainer.classList.add(\n livePreviewStyles()[\"cslp-tooltip-inner-container\"]\n );\n tooltip.classList.add(livePreviewStyles()[\"cslp-tooltip\"]);\n tooltip.classList.add(livePreviewStyles()[\"cslp-tooltip\"]);\n tooltip.setAttribute(\"data-test-id\", \"cs-cslp-tooltip\");\n tooltip.id = \"cslp-tooltip\";\n tooltipInnerContainer.id = \"cslp-tooltip-inner-container\";\n tooltip.addEventListener(\"mouseover\", () => {\n this.toggleHoveringOnEditButton(true);\n });\n tooltip.addEventListener(\"mouseleave\", (e: MouseEvent) => {\n this.toggleHoveringOnEditButton(false);\n this.removeEditButtonStyle(e);\n });\n window.document.body.insertAdjacentElement(\"beforeend\", tooltip);\n this.tooltipChild.singular = createSingularEditButton(\n this.scrollHandler\n );\n this.tooltipChild.multiple = createMultipleEditButton(\n this.scrollHandler,\n this.linkClickHandler\n );\n\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(this.tooltipChild.singular);\n tooltip.appendChild(tooltipInnerContainer);\n this.tooltip = tooltip;\n }\n this.updateTooltipPosition();\n };\n\n private toggleHoveringOnEditButton = (isHoveringOnTooltip: boolean) => {\n this.isHoveringOnTooltip = isHoveringOnTooltip;\n };\n\n // Request parent for data sync when document loads\n private requestDataSync() {\n // add edit tooltip\n this.createCslpTooltip();\n\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"init\",\n data: {\n config: {\n shouldReload: this.config.ssr,\n href: window.location.href,\n sdkVersion: process.env.PACKAGE_VERSION,\n },\n },\n },\n \"*\"\n );\n\n // set timeout for client side (use to show warning: You are not editing this page)\n if (!this.config.ssr) {\n setInterval(() => {\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"check-entry-page\",\n data: {\n href: window.location.href,\n },\n },\n \"*\"\n );\n }, 1500);\n }\n }\n\n private updateTooltipPosition() {\n if (!this.currentElementBesideTooltip || !this.tooltip) return false;\n\n const currentRectOfElement =\n this.currentElementBesideTooltip.getBoundingClientRect();\n const currentRectOfParentOfElement =\n this.tooltip.parentElement?.getBoundingClientRect();\n\n if (currentRectOfElement && currentRectOfParentOfElement) {\n let {\n upperBoundOfTooltip,\n // eslint-disable-next-line prefer-const\n leftBoundOfTooltip,\n }: IEditButtonPosition = getEditButtonPosition(\n this.currentElementBesideTooltip,\n this.config.editButton.position\n );\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 this.currentElementBesideTooltip.style.zIndex || \"200\";\n this.tooltip.style.left = leftBoundOfTooltip + \"px\";\n\n if (this.tooltipChild.singular && this.tooltipChild.multiple) {\n if (this.currentElementBesideTooltip.hasAttribute(\"href\")) {\n if (this.tooltipCurrentChild !== \"multiple\") {\n const tooltipInnerContainer =\n this.tooltip.querySelector(\n `div.${\n livePreviewStyles()[\n \"cslp-tooltip-inner-container\"\n ]\n }`\n );\n if (tooltipInnerContainer) {\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(\n this.tooltipChild.multiple\n );\n this.tooltipCurrentChild = \"multiple\";\n }\n }\n } else if (this.tooltipCurrentChild !== \"singular\") {\n const tooltipInnerContainer = this.tooltip.querySelector(\n `div.${\n livePreviewStyles()[\"cslp-tooltip-inner-container\"]\n }`\n );\n if (tooltipInnerContainer) {\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(\n this.tooltipChild.singular\n );\n this.tooltipCurrentChild = \"singular\";\n }\n }\n }\n return true;\n }\n\n return false;\n }\n\n // remove attributes when livePreview is false\n private removeDataCslp() {\n const nodes = document.querySelectorAll(\"[data-cslp]\");\n\n nodes.forEach((node) => {\n node.removeAttribute(\"data-cslp\");\n node.removeAttribute(\"data-cslp-button-position\");\n });\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
import { PublicLogger } from "./utils/public-logger.js";
|
|
9
9
|
import { handleInitData } from "./utils/handleUserConfig.js";
|
|
10
10
|
import { userInitData } from "./utils/defaults.js";
|
|
11
|
+
import { extractDetailsFromCslp } from "./utils/cslpdata.js";
|
|
11
12
|
import { livePreviewStyles } from "./styles/live_preview.js";
|
|
12
13
|
var LivePreview = class {
|
|
13
14
|
constructor(initData = userInitData) {
|
|
@@ -230,7 +231,7 @@ var LivePreview = class {
|
|
|
230
231
|
this.currentElementBesideTooltip = null;
|
|
231
232
|
this.tooltip.style.top = "-100%";
|
|
232
233
|
}
|
|
233
|
-
generateRedirectUrl(content_type_uid, locale = "en-us", entry_uid, preview_field) {
|
|
234
|
+
generateRedirectUrl(content_type_uid, locale = "en-us", entry_uid, variant, preview_field) {
|
|
234
235
|
if (!this.config.stackDetails.apiKey) {
|
|
235
236
|
throw `To use edit tags, you must provide the stack API key. Specify the API key while initializing the Live Preview SDK.
|
|
236
237
|
|
|
@@ -258,7 +259,12 @@ var LivePreview = class {
|
|
|
258
259
|
const port = String(this.config.clientUrlParams.port);
|
|
259
260
|
const environment = String(this.config.stackDetails.environment);
|
|
260
261
|
const branch = String(this.config.stackDetails.branch || "main");
|
|
261
|
-
|
|
262
|
+
let urlHash = `!/stack/${this.config.stackDetails.apiKey}/content-type/${content_type_uid}/${locale ?? "en-us"}/entry/${entry_uid}`;
|
|
263
|
+
if (variant) {
|
|
264
|
+
urlHash += `/variant/${variant}/edit`;
|
|
265
|
+
} else {
|
|
266
|
+
urlHash += `/edit`;
|
|
267
|
+
}
|
|
262
268
|
const url = new URL(`${protocol}://${host}`);
|
|
263
269
|
url.port = port;
|
|
264
270
|
url.hash = urlHash;
|
|
@@ -275,16 +281,23 @@ var LivePreview = class {
|
|
|
275
281
|
return;
|
|
276
282
|
const cslpTag = this.tooltip.getAttribute("current-data-cslp");
|
|
277
283
|
if (cslpTag) {
|
|
278
|
-
const
|
|
284
|
+
const {
|
|
285
|
+
content_type_uid,
|
|
286
|
+
entry_uid,
|
|
287
|
+
locale,
|
|
288
|
+
variant,
|
|
289
|
+
fieldPath: field
|
|
290
|
+
} = extractDetailsFromCslp(cslpTag);
|
|
279
291
|
if (window.location !== window.parent.location) {
|
|
280
292
|
window.parent.postMessage(
|
|
281
293
|
{
|
|
282
294
|
from: "live-preview",
|
|
283
295
|
type: "scroll",
|
|
284
296
|
data: {
|
|
285
|
-
field
|
|
297
|
+
field,
|
|
286
298
|
content_type_uid,
|
|
287
299
|
entry_uid,
|
|
300
|
+
variant,
|
|
288
301
|
locale
|
|
289
302
|
}
|
|
290
303
|
},
|
|
@@ -296,7 +309,8 @@ var LivePreview = class {
|
|
|
296
309
|
content_type_uid,
|
|
297
310
|
locale,
|
|
298
311
|
entry_uid,
|
|
299
|
-
|
|
312
|
+
variant,
|
|
313
|
+
field
|
|
300
314
|
);
|
|
301
315
|
window.open(redirectUrl, "_blank");
|
|
302
316
|
} catch (error) {
|
|
@@ -405,7 +419,7 @@ var LivePreview = class {
|
|
|
405
419
|
config: {
|
|
406
420
|
shouldReload: this.config.ssr,
|
|
407
421
|
href: window.location.href,
|
|
408
|
-
sdkVersion: "2.0.
|
|
422
|
+
sdkVersion: "2.0.4"
|
|
409
423
|
}
|
|
410
424
|
}
|
|
411
425
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/live-preview.ts"],"sourcesContent":["import {\n createSingularEditButton,\n createMultipleEditButton,\n addLivePreviewQueryTags,\n shouldRenderEditButton,\n getEditButtonPosition,\n} from \"./utils\";\nimport { PublicLogger } from \"./utils/public-logger\";\nimport {\n IConfig,\n IEditButtonPosition,\n IEditEntrySearchParams,\n IInitData,\n ILivePreviewReceivePostMessages,\n} from \"./utils/types\";\nimport { handleInitData } from \"./utils/handleUserConfig\";\nimport { userInitData } from \"./utils/defaults\";\nimport { livePreviewStyles } from \"./styles/live_preview\";\n\nexport default class LivePreview {\n /**\n * @hideconstructor\n */\n\n private config: IConfig = {\n ssr: true,\n enable: true,\n runScriptsOnUpdate: false,\n cleanCslpOnProduction: true,\n hash: \"\",\n\n editButton: {\n enable: true,\n exclude: [],\n position: \"top\",\n includeByQueryParameter: true,\n },\n stackDetails: {\n apiKey: \"\",\n environment: \"\",\n branch: \"\",\n contentTypeUid: \"\",\n entryUid: \"\",\n },\n\n clientUrlParams: {\n protocol: \"https\",\n host: \"app.contentstack.com\",\n port: 443,\n url: \"https://app.contentstack.com:443\",\n },\n stackSdk: {\n live_preview: {},\n environment: \"\",\n },\n\n onChange: () => {\n // this is intentional\n },\n };\n\n private tooltip: HTMLButtonElement | null = null; // this tooltip is responsible to redirect user to Contentstack edit page\n private currentElementBesideTooltip: HTMLElement | null = null; // this element helps to move tooltip with the scroll\n private isHoveringOnTooltip = false;\n private hideInterval: ReturnType<typeof setInterval> | null = null;\n\n private tooltipChild: {\n singular: HTMLDivElement | null;\n multiple: HTMLDivElement | null;\n } = {\n singular: null,\n multiple: null,\n };\n private tooltipCurrentChild: \"multiple\" | \"singular\" = \"singular\";\n\n constructor(initData: Partial<IInitData> = userInitData) {\n handleInitData(initData, this.config);\n\n this.addEditStyleOnHover = this.addEditStyleOnHover.bind(this);\n this.removeEditButtonStyle = this.removeEditButtonStyle.bind(this);\n this.generateRedirectUrl = this.generateRedirectUrl.bind(this);\n this.scrollHandler = this.scrollHandler.bind(this);\n this.linkClickHandler = this.linkClickHandler.bind(this);\n this.handleUserChange = this.handleUserChange.bind(this);\n this.setOnChangeCallback = this.setOnChangeCallback.bind(this);\n this.resolveIncomingMessage = this.resolveIncomingMessage.bind(this);\n this.createCslpTooltip = this.createCslpTooltip.bind(this);\n this.requestDataSync = this.requestDataSync.bind(this);\n this.updateTooltipPosition = this.updateTooltipPosition.bind(this);\n this.removeDataCslp = this.removeDataCslp.bind(this);\n this.toggleHoveringOnEditButton =\n this.toggleHoveringOnEditButton.bind(this);\n this.hideTooltip = this.hideTooltip.bind(this);\n\n // @ts-ignore\n if (initData.debug) {\n PublicLogger.debug(\n \"Contentstack Live Preview Debugging mode: config --\",\n this.config\n );\n }\n\n if (this.config.enable) {\n if (\n typeof document !== undefined &&\n document.readyState === \"complete\"\n ) {\n this.requestDataSync();\n } else {\n window.addEventListener(\"load\", this.requestDataSync);\n }\n window.addEventListener(\"message\", this.resolveIncomingMessage);\n window.addEventListener(\"scroll\", this.updateTooltipPosition);\n // render the hover outline only when edit button enable\n if (this.config.editButton.enable) {\n window.addEventListener(\"mouseover\", this.addEditStyleOnHover);\n }\n\n if (this.config.ssr) {\n window.addEventListener(\"load\", (e) => {\n const allATags = document.querySelectorAll(\"a\");\n allATags.forEach((tag) => {\n const docOrigin: string = document.location.origin;\n if (tag.href && tag.href.includes(docOrigin)) {\n const newUrl = addLivePreviewQueryTags(tag.href);\n tag.href = newUrl;\n }\n });\n });\n\n // Setting the query params to all the click events related to current domain\n window.addEventListener(\"click\", (event: any) => {\n const target: any = event.target;\n const targetHref: string | any = target.href;\n const docOrigin: string = document.location.origin;\n if (\n targetHref &&\n targetHref.includes(docOrigin) &&\n !targetHref.includes(\"live_preview\")\n ) {\n const newUrl = addLivePreviewQueryTags(target.href);\n event.target.href = newUrl || target.href;\n }\n });\n }\n } else if (this.config.cleanCslpOnProduction) {\n this.removeDataCslp();\n }\n }\n\n private addEditStyleOnHover(e: MouseEvent) {\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 // in case where the Edit button is not available in the body element\n if (!document.getElementById(\"cslp-tooltip\")) {\n this.createCslpTooltip();\n }\n if (this.hideInterval) {\n clearInterval(this.hideInterval);\n this.hideInterval = null;\n }\n if (this.currentElementBesideTooltip) {\n this.currentElementBesideTooltip.classList.remove(\n livePreviewStyles()[\"cslp-edit-mode\"]\n );\n this.currentElementBesideTooltip.removeEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n }\n element.classList.add(livePreviewStyles()[\"cslp-edit-mode\"]);\n this.currentElementBesideTooltip = element;\n this.currentElementBesideTooltip.addEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n\n if (this.updateTooltipPosition()) {\n this.tooltip?.setAttribute(\"current-data-cslp\", cslpTag);\n this.tooltip?.setAttribute(\n \"current-href\",\n element.getAttribute(\"href\") ?? \"\"\n );\n }\n\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(livePreviewStyles()[\"cslp-edit-mode\"]);\n }\n }\n }\n\n private removeEditButtonStyle(e: MouseEvent) {\n if (!this.currentElementBesideTooltip || !this.tooltip) return false;\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 this.hideInterval = setInterval(this.hideTooltip, 500);\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(livePreviewStyles()[\"cslp-edit-mode\"]);\n }\n }\n }\n\n private hideTooltip() {\n if (\n !this.currentElementBesideTooltip ||\n !this.tooltip ||\n this.isHoveringOnTooltip\n )\n return false;\n this.currentElementBesideTooltip.classList.remove(\n livePreviewStyles()[\"cslp-edit-mode\"]\n );\n this.currentElementBesideTooltip.removeEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n this.currentElementBesideTooltip = null;\n this.tooltip.style.top = \"-100%\";\n }\n\n private generateRedirectUrl(\n content_type_uid: string,\n locale = \"en-us\",\n entry_uid: string,\n preview_field: string\n ): string {\n if (!this.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 (!this.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(this.config.clientUrlParams.protocol);\n const host = String(this.config.clientUrlParams.host);\n const port = String(this.config.clientUrlParams.port);\n const environment = String(this.config.stackDetails.environment);\n const branch = String(this.config.stackDetails.branch || \"main\");\n\n const urlHash = `!/stack/${\n this.config.stackDetails.apiKey\n }/content-type/${content_type_uid}/${\n locale ?? \"en-us\"\n }/entry/${entry_uid}/edit`;\n\n const url = new URL(`${protocol}://${host}`);\n url.port = port;\n url.hash = urlHash;\n if (this.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 scrollHandler() {\n if (!this.tooltip) return;\n\n const cslpTag = this.tooltip.getAttribute(\"current-data-cslp\");\n\n if (cslpTag) {\n const [content_type_uid, entry_uid, locale, ...field] =\n cslpTag.split(\".\");\n\n // check if opened inside an iframe\n if (window.location !== window.parent.location) {\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"scroll\",\n data: {\n field: field.join(\".\"),\n content_type_uid,\n entry_uid,\n locale,\n },\n },\n \"*\"\n );\n } else {\n try {\n const redirectUrl = this.generateRedirectUrl(\n content_type_uid,\n locale,\n entry_uid,\n field.join(\".\")\n );\n\n window.open(redirectUrl, \"_blank\");\n } catch (error) {\n PublicLogger.error(error);\n }\n }\n }\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 private handleUserChange(editEntrySearchParams: IEditEntrySearchParams) {\n // here we provide contentTypeUid and EntryUid to the StackDelivery SDK.\n this.config.stackSdk.live_preview = {\n ...this.config.stackSdk.live_preview,\n ...editEntrySearchParams,\n live_preview: editEntrySearchParams.hash,\n };\n this.config.onChange();\n }\n\n setOnChangeCallback(onChangeCallback: () => void): void {\n this.config.onChange = onChangeCallback;\n }\n\n /**\n * It is the live preview hash.\n * This hash could be used when data is fetched manually.\n */\n get hash(): string {\n return this.config.hash;\n }\n\n /**\n * Sets the live preview hash from the query param which is\n * accessible via `hash` property.\n * @param params query param in an object form\n */\n setConfigFromParams(\n params: ConstructorParameters<typeof URLSearchParams>[0] = {}\n ): void {\n if (typeof params !== \"object\")\n throw new TypeError(\n \"Live preview SDK: query param must be an object\"\n );\n\n const urlParams = new URLSearchParams(params);\n const live_preview = urlParams.get(\"live_preview\");\n\n if (live_preview) {\n this.config.hash = live_preview;\n }\n }\n\n private resolveIncomingMessage(\n e: MessageEvent<ILivePreviewReceivePostMessages>\n ) {\n if (typeof e.data !== \"object\") return;\n\n if (e.data.from !== \"live-preview\") return;\n\n switch (e.data.type) {\n case \"client-data-send\": {\n const { contentTypeUid, entryUid } = this.config.stackDetails;\n const { hash } = e.data.data;\n\n this.setConfigFromParams({ live_preview: hash });\n\n if (!this.config.ssr) {\n this.handleUserChange({\n content_type_uid: contentTypeUid,\n entry_uid: entryUid,\n hash: hash,\n });\n }\n break;\n }\n case \"init-ack\": {\n const { contentTypeUid, entryUid } = e.data.data;\n\n this.config.stackDetails.contentTypeUid = contentTypeUid;\n this.config.stackDetails.entryUid = entryUid;\n break;\n }\n case \"history\": {\n switch (e.data.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 }\n }\n break;\n }\n default: {\n // ensure that the switch statement is exhaustive\n const exhaustiveCheck: never = e.data;\n return exhaustiveCheck; // TODO: add debug message while we are in development mode.\n }\n }\n }\n\n private createCslpTooltip = () => {\n if (\n !document.getElementById(\"cslp-tooltip\") &&\n this.config.editButton.enable\n ) {\n const tooltip = document.createElement(\"button\");\n const tooltipInnerContainer = document.createElement(\"div\");\n tooltipInnerContainer.classList.add(\n livePreviewStyles()[\"cslp-tooltip-inner-container\"]\n );\n tooltip.classList.add(livePreviewStyles()[\"cslp-tooltip\"]);\n tooltip.classList.add(livePreviewStyles()[\"cslp-tooltip\"]);\n tooltip.setAttribute(\"data-test-id\", \"cs-cslp-tooltip\");\n tooltip.id = \"cslp-tooltip\";\n tooltipInnerContainer.id = \"cslp-tooltip-inner-container\";\n tooltip.addEventListener(\"mouseover\", () => {\n this.toggleHoveringOnEditButton(true);\n });\n tooltip.addEventListener(\"mouseleave\", (e: MouseEvent) => {\n this.toggleHoveringOnEditButton(false);\n this.removeEditButtonStyle(e);\n });\n window.document.body.insertAdjacentElement(\"beforeend\", tooltip);\n this.tooltipChild.singular = createSingularEditButton(\n this.scrollHandler\n );\n this.tooltipChild.multiple = createMultipleEditButton(\n this.scrollHandler,\n this.linkClickHandler\n );\n\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(this.tooltipChild.singular);\n tooltip.appendChild(tooltipInnerContainer);\n this.tooltip = tooltip;\n }\n this.updateTooltipPosition();\n };\n\n private toggleHoveringOnEditButton = (isHoveringOnTooltip: boolean) => {\n this.isHoveringOnTooltip = isHoveringOnTooltip;\n };\n\n // Request parent for data sync when document loads\n private requestDataSync() {\n // add edit tooltip\n this.createCslpTooltip();\n\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"init\",\n data: {\n config: {\n shouldReload: this.config.ssr,\n href: window.location.href,\n sdkVersion: process.env.PACKAGE_VERSION,\n },\n },\n },\n \"*\"\n );\n\n // set timeout for client side (use to show warning: You are not editing this page)\n if (!this.config.ssr) {\n setInterval(() => {\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"check-entry-page\",\n data: {\n href: window.location.href,\n },\n },\n \"*\"\n );\n }, 1500);\n }\n }\n\n private updateTooltipPosition() {\n if (!this.currentElementBesideTooltip || !this.tooltip) return false;\n\n const currentRectOfElement =\n this.currentElementBesideTooltip.getBoundingClientRect();\n const currentRectOfParentOfElement =\n this.tooltip.parentElement?.getBoundingClientRect();\n\n if (currentRectOfElement && currentRectOfParentOfElement) {\n let {\n upperBoundOfTooltip,\n // eslint-disable-next-line prefer-const\n leftBoundOfTooltip,\n }: IEditButtonPosition = getEditButtonPosition(\n this.currentElementBesideTooltip,\n this.config.editButton.position\n );\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 this.currentElementBesideTooltip.style.zIndex || \"200\";\n this.tooltip.style.left = leftBoundOfTooltip + \"px\";\n\n if (this.tooltipChild.singular && this.tooltipChild.multiple) {\n if (this.currentElementBesideTooltip.hasAttribute(\"href\")) {\n if (this.tooltipCurrentChild !== \"multiple\") {\n const tooltipInnerContainer =\n this.tooltip.querySelector(\n `div.${\n livePreviewStyles()[\n \"cslp-tooltip-inner-container\"\n ]\n }`\n );\n if (tooltipInnerContainer) {\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(\n this.tooltipChild.multiple\n );\n this.tooltipCurrentChild = \"multiple\";\n }\n }\n } else if (this.tooltipCurrentChild !== \"singular\") {\n const tooltipInnerContainer = this.tooltip.querySelector(\n `div.${\n livePreviewStyles()[\"cslp-tooltip-inner-container\"]\n }`\n );\n if (tooltipInnerContainer) {\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(\n this.tooltipChild.singular\n );\n this.tooltipCurrentChild = \"singular\";\n }\n }\n }\n return true;\n }\n\n return false;\n }\n\n // remove attributes when livePreview is false\n private removeDataCslp() {\n const nodes = document.querySelectorAll(\"[data-cslp]\");\n\n nodes.forEach((node) => {\n node.removeAttribute(\"data-cslp\");\n node.removeAttribute(\"data-cslp-button-position\");\n });\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/live-preview.ts"],"sourcesContent":["import {\n createSingularEditButton,\n createMultipleEditButton,\n addLivePreviewQueryTags,\n shouldRenderEditButton,\n getEditButtonPosition,\n} from \"./utils\";\nimport { PublicLogger } from \"./utils/public-logger\";\nimport {\n IConfig,\n IEditButtonPosition,\n IEditEntrySearchParams,\n IInitData,\n ILivePreviewReceivePostMessages,\n} from \"./utils/types\";\nimport { handleInitData } from \"./utils/handleUserConfig\";\nimport { userInitData } from \"./utils/defaults\";\nimport packageJson from \"../package.json\";\nimport { extractDetailsFromCslp } from \"./utils/cslpdata\";\nimport { livePreviewStyles } from \"./styles/live_preview\";\n\nexport default class LivePreview {\n /**\n * @hideconstructor\n */\n\n private config: IConfig = {\n ssr: true,\n enable: true,\n runScriptsOnUpdate: false,\n cleanCslpOnProduction: true,\n hash: \"\",\n\n editButton: {\n enable: true,\n exclude: [],\n position: \"top\",\n includeByQueryParameter: true,\n },\n stackDetails: {\n apiKey: \"\",\n environment: \"\",\n branch: \"\",\n contentTypeUid: \"\",\n entryUid: \"\",\n },\n\n clientUrlParams: {\n protocol: \"https\",\n host: \"app.contentstack.com\",\n port: 443,\n url: \"https://app.contentstack.com:443\",\n },\n stackSdk: {\n live_preview: {},\n environment: \"\",\n },\n\n onChange: () => {\n // this is intentional\n },\n };\n\n private tooltip: HTMLButtonElement | null = null; // this tooltip is responsible to redirect user to Contentstack edit page\n private currentElementBesideTooltip: HTMLElement | null = null; // this element helps to move tooltip with the scroll\n private isHoveringOnTooltip = false;\n private hideInterval: ReturnType<typeof setInterval> | null = null;\n\n private tooltipChild: {\n singular: HTMLDivElement | null;\n multiple: HTMLDivElement | null;\n } = {\n singular: null,\n multiple: null,\n };\n private tooltipCurrentChild: \"multiple\" | \"singular\" = \"singular\";\n\n constructor(initData: Partial<IInitData> = userInitData) {\n handleInitData(initData, this.config);\n\n this.addEditStyleOnHover = this.addEditStyleOnHover.bind(this);\n this.removeEditButtonStyle = this.removeEditButtonStyle.bind(this);\n this.generateRedirectUrl = this.generateRedirectUrl.bind(this);\n this.scrollHandler = this.scrollHandler.bind(this);\n this.linkClickHandler = this.linkClickHandler.bind(this);\n this.handleUserChange = this.handleUserChange.bind(this);\n this.setOnChangeCallback = this.setOnChangeCallback.bind(this);\n this.resolveIncomingMessage = this.resolveIncomingMessage.bind(this);\n this.createCslpTooltip = this.createCslpTooltip.bind(this);\n this.requestDataSync = this.requestDataSync.bind(this);\n this.updateTooltipPosition = this.updateTooltipPosition.bind(this);\n this.removeDataCslp = this.removeDataCslp.bind(this);\n this.toggleHoveringOnEditButton =\n this.toggleHoveringOnEditButton.bind(this);\n this.hideTooltip = this.hideTooltip.bind(this);\n\n // @ts-ignore\n if (initData.debug) {\n PublicLogger.debug(\n \"Contentstack Live Preview Debugging mode: config --\",\n this.config\n );\n }\n\n if (this.config.enable) {\n if (\n typeof document !== undefined &&\n document.readyState === \"complete\"\n ) {\n this.requestDataSync();\n } else {\n window.addEventListener(\"load\", this.requestDataSync);\n }\n window.addEventListener(\"message\", this.resolveIncomingMessage);\n window.addEventListener(\"scroll\", this.updateTooltipPosition);\n // render the hover outline only when edit button enable\n if (this.config.editButton.enable) {\n window.addEventListener(\"mouseover\", this.addEditStyleOnHover);\n }\n\n if (this.config.ssr) {\n window.addEventListener(\"load\", (e) => {\n const allATags = document.querySelectorAll(\"a\");\n allATags.forEach((tag) => {\n const docOrigin: string = document.location.origin;\n if (tag.href && tag.href.includes(docOrigin)) {\n const newUrl = addLivePreviewQueryTags(tag.href);\n tag.href = newUrl;\n }\n });\n });\n\n // Setting the query params to all the click events related to current domain\n window.addEventListener(\"click\", (event: any) => {\n const target: any = event.target;\n const targetHref: string | any = target.href;\n const docOrigin: string = document.location.origin;\n if (\n targetHref &&\n targetHref.includes(docOrigin) &&\n !targetHref.includes(\"live_preview\")\n ) {\n const newUrl = addLivePreviewQueryTags(target.href);\n event.target.href = newUrl || target.href;\n }\n });\n }\n } else if (this.config.cleanCslpOnProduction) {\n this.removeDataCslp();\n }\n }\n\n private addEditStyleOnHover(e: MouseEvent) {\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 // in case where the Edit button is not available in the body element\n if (!document.getElementById(\"cslp-tooltip\")) {\n this.createCslpTooltip();\n }\n if (this.hideInterval) {\n clearInterval(this.hideInterval);\n this.hideInterval = null;\n }\n if (this.currentElementBesideTooltip) {\n this.currentElementBesideTooltip.classList.remove(\n livePreviewStyles()[\"cslp-edit-mode\"]\n );\n this.currentElementBesideTooltip.removeEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n }\n element.classList.add(livePreviewStyles()[\"cslp-edit-mode\"]);\n this.currentElementBesideTooltip = element;\n this.currentElementBesideTooltip.addEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n\n if (this.updateTooltipPosition()) {\n this.tooltip?.setAttribute(\"current-data-cslp\", cslpTag);\n this.tooltip?.setAttribute(\n \"current-href\",\n element.getAttribute(\"href\") ?? \"\"\n );\n }\n\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(livePreviewStyles()[\"cslp-edit-mode\"]);\n }\n }\n }\n\n private removeEditButtonStyle(e: MouseEvent) {\n if (!this.currentElementBesideTooltip || !this.tooltip) return false;\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 this.hideInterval = setInterval(this.hideTooltip, 500);\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(livePreviewStyles()[\"cslp-edit-mode\"]);\n }\n }\n }\n\n private hideTooltip() {\n if (\n !this.currentElementBesideTooltip ||\n !this.tooltip ||\n this.isHoveringOnTooltip\n )\n return false;\n this.currentElementBesideTooltip.classList.remove(\n livePreviewStyles()[\"cslp-edit-mode\"]\n );\n this.currentElementBesideTooltip.removeEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n this.currentElementBesideTooltip = null;\n this.tooltip.style.top = \"-100%\";\n }\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 if (!this.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 (!this.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(this.config.clientUrlParams.protocol);\n const host = String(this.config.clientUrlParams.host);\n const port = String(this.config.clientUrlParams.port);\n const environment = String(this.config.stackDetails.environment);\n const branch = String(this.config.stackDetails.branch || \"main\");\n\n let urlHash = `!/stack/${\n this.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 (this.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 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 fieldPath: field,\n } = extractDetailsFromCslp(cslpTag);\n // check if opened inside an iframe\n if (window.location !== window.parent.location) {\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"scroll\",\n data: {\n field,\n content_type_uid,\n entry_uid,\n variant,\n locale,\n },\n },\n \"*\"\n );\n } else {\n try {\n const redirectUrl = this.generateRedirectUrl(\n content_type_uid,\n locale,\n entry_uid,\n variant,\n field\n );\n\n window.open(redirectUrl, \"_blank\");\n } catch (error) {\n PublicLogger.error(error);\n }\n }\n }\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 private handleUserChange(editEntrySearchParams: IEditEntrySearchParams) {\n // here we provide contentTypeUid and EntryUid to the StackDelivery SDK.\n this.config.stackSdk.live_preview = {\n ...this.config.stackSdk.live_preview,\n ...editEntrySearchParams,\n live_preview: editEntrySearchParams.hash,\n };\n this.config.onChange();\n }\n\n setOnChangeCallback(onChangeCallback: () => void): void {\n this.config.onChange = onChangeCallback;\n }\n\n /**\n * It is the live preview hash.\n * This hash could be used when data is fetched manually.\n */\n get hash(): string {\n return this.config.hash;\n }\n\n /**\n * Sets the live preview hash from the query param which is\n * accessible via `hash` property.\n * @param params query param in an object form\n */\n setConfigFromParams(\n params: ConstructorParameters<typeof URLSearchParams>[0] = {}\n ): void {\n if (typeof params !== \"object\")\n throw new TypeError(\n \"Live preview SDK: query param must be an object\"\n );\n\n const urlParams = new URLSearchParams(params);\n const live_preview = urlParams.get(\"live_preview\");\n\n if (live_preview) {\n this.config.hash = live_preview;\n }\n }\n\n private resolveIncomingMessage(\n e: MessageEvent<ILivePreviewReceivePostMessages>\n ) {\n if (typeof e.data !== \"object\") return;\n\n if (e.data.from !== \"live-preview\") return;\n\n switch (e.data.type) {\n case \"client-data-send\": {\n const { contentTypeUid, entryUid } = this.config.stackDetails;\n const { hash } = e.data.data;\n\n this.setConfigFromParams({ live_preview: hash });\n\n if (!this.config.ssr) {\n this.handleUserChange({\n content_type_uid: contentTypeUid,\n entry_uid: entryUid,\n hash: hash,\n });\n }\n break;\n }\n case \"init-ack\": {\n const { contentTypeUid, entryUid } = e.data.data;\n\n this.config.stackDetails.contentTypeUid = contentTypeUid;\n this.config.stackDetails.entryUid = entryUid;\n break;\n }\n case \"history\": {\n switch (e.data.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 }\n }\n break;\n }\n default: {\n // ensure that the switch statement is exhaustive\n const exhaustiveCheck: never = e.data;\n return exhaustiveCheck; // TODO: add debug message while we are in development mode.\n }\n }\n }\n\n private createCslpTooltip = () => {\n if (\n !document.getElementById(\"cslp-tooltip\") &&\n this.config.editButton.enable\n ) {\n const tooltip = document.createElement(\"button\");\n const tooltipInnerContainer = document.createElement(\"div\");\n tooltipInnerContainer.classList.add(\n livePreviewStyles()[\"cslp-tooltip-inner-container\"]\n );\n tooltip.classList.add(livePreviewStyles()[\"cslp-tooltip\"]);\n tooltip.classList.add(livePreviewStyles()[\"cslp-tooltip\"]);\n tooltip.setAttribute(\"data-test-id\", \"cs-cslp-tooltip\");\n tooltip.id = \"cslp-tooltip\";\n tooltipInnerContainer.id = \"cslp-tooltip-inner-container\";\n tooltip.addEventListener(\"mouseover\", () => {\n this.toggleHoveringOnEditButton(true);\n });\n tooltip.addEventListener(\"mouseleave\", (e: MouseEvent) => {\n this.toggleHoveringOnEditButton(false);\n this.removeEditButtonStyle(e);\n });\n window.document.body.insertAdjacentElement(\"beforeend\", tooltip);\n this.tooltipChild.singular = createSingularEditButton(\n this.scrollHandler\n );\n this.tooltipChild.multiple = createMultipleEditButton(\n this.scrollHandler,\n this.linkClickHandler\n );\n\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(this.tooltipChild.singular);\n tooltip.appendChild(tooltipInnerContainer);\n this.tooltip = tooltip;\n }\n this.updateTooltipPosition();\n };\n\n private toggleHoveringOnEditButton = (isHoveringOnTooltip: boolean) => {\n this.isHoveringOnTooltip = isHoveringOnTooltip;\n };\n\n // Request parent for data sync when document loads\n private requestDataSync() {\n // add edit tooltip\n this.createCslpTooltip();\n\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"init\",\n data: {\n config: {\n shouldReload: this.config.ssr,\n href: window.location.href,\n sdkVersion: process.env.PACKAGE_VERSION,\n },\n },\n },\n \"*\"\n );\n\n // set timeout for client side (use to show warning: You are not editing this page)\n if (!this.config.ssr) {\n setInterval(() => {\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"check-entry-page\",\n data: {\n href: window.location.href,\n },\n },\n \"*\"\n );\n }, 1500);\n }\n }\n\n private updateTooltipPosition() {\n if (!this.currentElementBesideTooltip || !this.tooltip) return false;\n\n const currentRectOfElement =\n this.currentElementBesideTooltip.getBoundingClientRect();\n const currentRectOfParentOfElement =\n this.tooltip.parentElement?.getBoundingClientRect();\n\n if (currentRectOfElement && currentRectOfParentOfElement) {\n let {\n upperBoundOfTooltip,\n // eslint-disable-next-line prefer-const\n leftBoundOfTooltip,\n }: IEditButtonPosition = getEditButtonPosition(\n this.currentElementBesideTooltip,\n this.config.editButton.position\n );\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 this.currentElementBesideTooltip.style.zIndex || \"200\";\n this.tooltip.style.left = leftBoundOfTooltip + \"px\";\n\n if (this.tooltipChild.singular && this.tooltipChild.multiple) {\n if (this.currentElementBesideTooltip.hasAttribute(\"href\")) {\n if (this.tooltipCurrentChild !== \"multiple\") {\n const tooltipInnerContainer =\n this.tooltip.querySelector(\n `div.${\n livePreviewStyles()[\n \"cslp-tooltip-inner-container\"\n ]\n }`\n );\n if (tooltipInnerContainer) {\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(\n this.tooltipChild.multiple\n );\n this.tooltipCurrentChild = \"multiple\";\n }\n }\n } else if (this.tooltipCurrentChild !== \"singular\") {\n const tooltipInnerContainer = this.tooltip.querySelector(\n `div.${\n livePreviewStyles()[\"cslp-tooltip-inner-container\"]\n }`\n );\n if (tooltipInnerContainer) {\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(\n this.tooltipChild.singular\n );\n this.tooltipCurrentChild = \"singular\";\n }\n }\n }\n return true;\n }\n\n return false;\n }\n\n // remove attributes when livePreview is false\n private removeDataCslp() {\n const nodes = document.querySelectorAll(\"[data-cslp]\");\n\n nodes.forEach((node) => {\n node.removeAttribute(\"data-cslp\");\n node.removeAttribute(\"data-cslp-button-position\");\n });\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/utils/cslpdata.ts
|
|
21
|
+
var cslpdata_exports = {};
|
|
22
|
+
__export(cslpdata_exports, {
|
|
23
|
+
extractDetailsFromCslp: () => extractDetailsFromCslp
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(cslpdata_exports);
|
|
26
|
+
function extractDetailsFromCslp(cslpValue) {
|
|
27
|
+
let [cslpVersion, cslpData] = cslpValue.split(":");
|
|
28
|
+
if (cslpVersion.length > 2) {
|
|
29
|
+
cslpData = cslpVersion;
|
|
30
|
+
cslpVersion = "v1";
|
|
31
|
+
}
|
|
32
|
+
return destructureCslpValue(cslpData, cslpVersion);
|
|
33
|
+
}
|
|
34
|
+
function destructureCslpValue(cslpData, version) {
|
|
35
|
+
const [content_type_uid, entryInfo, locale, ...fieldPath] = cslpData.split(".");
|
|
36
|
+
switch (version) {
|
|
37
|
+
case "v2": {
|
|
38
|
+
const [entry_uid, variant] = entryInfo.split("_");
|
|
39
|
+
return {
|
|
40
|
+
entry_uid,
|
|
41
|
+
content_type_uid,
|
|
42
|
+
variant,
|
|
43
|
+
locale,
|
|
44
|
+
cslpValue: cslpData,
|
|
45
|
+
fieldPath: fieldPath.join(".")
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
default:
|
|
49
|
+
return {
|
|
50
|
+
entry_uid: entryInfo,
|
|
51
|
+
content_type_uid,
|
|
52
|
+
locale,
|
|
53
|
+
cslpValue: cslpData,
|
|
54
|
+
fieldPath: fieldPath.join(".")
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
59
|
+
0 && (module.exports = {
|
|
60
|
+
extractDetailsFromCslp
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=cslpdata.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/cslpdata.ts"],"sourcesContent":["export interface CslpData {\n entry_uid: string;\n content_type_uid: string;\n variant?: string;\n cslpValue: string;\n locale: string;\n fieldPath: string;\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 return destructureCslpValue(cslpData, cslpVersion);\n}\n\nfunction destructureCslpValue(cslpData: string, version: string): CslpData {\n const [content_type_uid, entryInfo, locale, ...fieldPath] =\n cslpData.split(\".\");\n switch (version) {\n case \"v2\": {\n const [entry_uid, variant] = entryInfo.split(\"_\");\n return {\n entry_uid,\n content_type_uid,\n variant,\n locale,\n cslpValue: cslpData,\n fieldPath: fieldPath.join(\".\"),\n };\n }\n default:\n return {\n entry_uid: entryInfo,\n content_type_uid,\n locale,\n cslpValue: cslpData,\n fieldPath: fieldPath.join(\".\"),\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAaO,SAAS,uBAAuB,WAA6B;AAChE,MAAI,CAAC,aAAa,QAAQ,IAAI,UAAU,MAAM,GAAG;AAEjD,MAAI,YAAY,SAAS,GAAG;AACxB,eAAW;AACX,kBAAc;AAAA,EAClB;AACA,SAAO,qBAAqB,UAAU,WAAW;AACrD;AAEA,SAAS,qBAAqB,UAAkB,SAA2B;AACvE,QAAM,CAAC,kBAAkB,WAAW,QAAQ,GAAG,SAAS,IACpD,SAAS,MAAM,GAAG;AACtB,UAAQ,SAAS;AAAA,IACb,KAAK,MAAM;AACP,YAAM,CAAC,WAAW,OAAO,IAAI,UAAU,MAAM,GAAG;AAChD,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,WAAW,UAAU,KAAK,GAAG;AAAA,MACjC;AAAA,IACJ;AAAA,IACA;AACI,aAAO;AAAA,QACH,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,WAAW,UAAU,KAAK,GAAG;AAAA,MACjC;AAAA,EACR;AACJ;","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface CslpData {
|
|
2
|
+
entry_uid: string;
|
|
3
|
+
content_type_uid: string;
|
|
4
|
+
variant?: string;
|
|
5
|
+
cslpValue: string;
|
|
6
|
+
locale: string;
|
|
7
|
+
fieldPath: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Extracts details from a CSLP value string.
|
|
11
|
+
* @param cslpValue The CSLP value string to extract details from.
|
|
12
|
+
* @returns An object containing the extracted details.
|
|
13
|
+
*/
|
|
14
|
+
declare function extractDetailsFromCslp(cslpValue: string): CslpData;
|
|
15
|
+
|
|
16
|
+
export { type CslpData, extractDetailsFromCslp };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface CslpData {
|
|
2
|
+
entry_uid: string;
|
|
3
|
+
content_type_uid: string;
|
|
4
|
+
variant?: string;
|
|
5
|
+
cslpValue: string;
|
|
6
|
+
locale: string;
|
|
7
|
+
fieldPath: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Extracts details from a CSLP value string.
|
|
11
|
+
* @param cslpValue The CSLP value string to extract details from.
|
|
12
|
+
* @returns An object containing the extracted details.
|
|
13
|
+
*/
|
|
14
|
+
declare function extractDetailsFromCslp(cslpValue: string): CslpData;
|
|
15
|
+
|
|
16
|
+
export { type CslpData, extractDetailsFromCslp };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// src/utils/cslpdata.ts
|
|
2
|
+
function extractDetailsFromCslp(cslpValue) {
|
|
3
|
+
let [cslpVersion, cslpData] = cslpValue.split(":");
|
|
4
|
+
if (cslpVersion.length > 2) {
|
|
5
|
+
cslpData = cslpVersion;
|
|
6
|
+
cslpVersion = "v1";
|
|
7
|
+
}
|
|
8
|
+
return destructureCslpValue(cslpData, cslpVersion);
|
|
9
|
+
}
|
|
10
|
+
function destructureCslpValue(cslpData, version) {
|
|
11
|
+
const [content_type_uid, entryInfo, locale, ...fieldPath] = cslpData.split(".");
|
|
12
|
+
switch (version) {
|
|
13
|
+
case "v2": {
|
|
14
|
+
const [entry_uid, variant] = entryInfo.split("_");
|
|
15
|
+
return {
|
|
16
|
+
entry_uid,
|
|
17
|
+
content_type_uid,
|
|
18
|
+
variant,
|
|
19
|
+
locale,
|
|
20
|
+
cslpValue: cslpData,
|
|
21
|
+
fieldPath: fieldPath.join(".")
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
default:
|
|
25
|
+
return {
|
|
26
|
+
entry_uid: entryInfo,
|
|
27
|
+
content_type_uid,
|
|
28
|
+
locale,
|
|
29
|
+
cslpValue: cslpData,
|
|
30
|
+
fieldPath: fieldPath.join(".")
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
extractDetailsFromCslp
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=cslpdata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/cslpdata.ts"],"sourcesContent":["export interface CslpData {\n entry_uid: string;\n content_type_uid: string;\n variant?: string;\n cslpValue: string;\n locale: string;\n fieldPath: string;\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 return destructureCslpValue(cslpData, cslpVersion);\n}\n\nfunction destructureCslpValue(cslpData: string, version: string): CslpData {\n const [content_type_uid, entryInfo, locale, ...fieldPath] =\n cslpData.split(\".\");\n switch (version) {\n case \"v2\": {\n const [entry_uid, variant] = entryInfo.split(\"_\");\n return {\n entry_uid,\n content_type_uid,\n variant,\n locale,\n cslpValue: cslpData,\n fieldPath: fieldPath.join(\".\"),\n };\n }\n default:\n return {\n entry_uid: entryInfo,\n content_type_uid,\n locale,\n cslpValue: cslpData,\n fieldPath: fieldPath.join(\".\"),\n };\n }\n}\n"],"mappings":";AAaO,SAAS,uBAAuB,WAA6B;AAChE,MAAI,CAAC,aAAa,QAAQ,IAAI,UAAU,MAAM,GAAG;AAEjD,MAAI,YAAY,SAAS,GAAG;AACxB,eAAW;AACX,kBAAc;AAAA,EAClB;AACA,SAAO,qBAAqB,UAAU,WAAW;AACrD;AAEA,SAAS,qBAAqB,UAAkB,SAA2B;AACvE,QAAM,CAAC,kBAAkB,WAAW,QAAQ,GAAG,SAAS,IACpD,SAAS,MAAM,GAAG;AACtB,UAAQ,SAAS;AAAA,IACb,KAAK,MAAM;AACP,YAAM,CAAC,WAAW,OAAO,IAAI,UAAU,MAAM,GAAG;AAChD,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,WAAW,UAAU,KAAK,GAAG;AAAA,MACjC;AAAA,IACJ;AAAA,IACA;AACI,aAAO;AAAA,QACH,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,WAAW,UAAU,KAAK,GAAG;AAAA,MACjC;AAAA,EACR;AACJ;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contentstack/live-preview-utils",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.4",
|
|
4
4
|
"description": "Contentstack provides the Live Preview SDK to establish a communication channel between the various Contentstack SDKs and your website, transmitting live changes to the preview pane.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "dist/legacy/index.d.ts",
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"@types/jest": "^27.0.1",
|
|
51
51
|
"@types/mustache": "^4.2.2",
|
|
52
52
|
"@types/post-robot": "^10.0.6",
|
|
53
|
+
"@types/ssri": "^7.1.5",
|
|
53
54
|
"@types/uuid": "^8.3.1",
|
|
54
55
|
"@typescript-eslint/eslint-plugin": "^4.31.1",
|
|
55
56
|
"@typescript-eslint/parser": "^4.31.1",
|
|
@@ -65,6 +66,7 @@
|
|
|
65
66
|
"mini-css-extract-plugin": "^2.3.0",
|
|
66
67
|
"prettier": "^2.8.4",
|
|
67
68
|
"prettier-eslint": "^15.0.1",
|
|
69
|
+
"ssri": "^11.0.0",
|
|
68
70
|
"style-loader": "^2.0.0",
|
|
69
71
|
"ts-jest": "^29.1.2",
|
|
70
72
|
"ts-loader": "^9.4.2",
|
|
@@ -84,9 +86,10 @@
|
|
|
84
86
|
"dependencies": {
|
|
85
87
|
"goober": "^2.1.14",
|
|
86
88
|
"just-camel-case": "^4.0.2",
|
|
89
|
+
"lodash-es": "^4.17.21",
|
|
87
90
|
"morphdom": "^2.6.1",
|
|
88
91
|
"mustache": "^4.2.0",
|
|
89
|
-
"post-robot": "
|
|
92
|
+
"post-robot": "8.0.31",
|
|
90
93
|
"uuid": "^8.3.2"
|
|
91
94
|
},
|
|
92
95
|
"lint-staged": {
|