{ "version": 3, "sources": ["../../../../src/assets/mcui-js/tracking/LinkDownloadType.ts", "../../../../src/assets/mcui-js/marketo/form-cta-modal-launcher.ts"], "sourcesContent": ["/** The type of a download link click */\r\nexport const LinkDownloadType = [\"text\", \"button\", \"image\"] as const;\r\nexport type LinkDownloadType = (typeof LinkDownloadType)[number];", "import { isNil, isString, type Nil } from \"@mcwd/typescript-type-guards\";\r\nimport { isFormWidgetData, type FormWidgetData, type FormSetupType } from \"../widgetDataTs.js\";\r\nimport { LinkDownloadType } from \"../tracking/LinkDownloadType.js\";\r\nimport { BaseFormLogger as logger } from \"./base-form-logger.js\";\r\nimport type { VideoFormSettingsKey } from \"./form-settings/form-experience/form-settings-keys.js\";\r\nimport type { ModalFormSettingsKey } from \"./form-modal-launcher.js\";\r\n\r\nconst { launchModalForm, DynamicModalWrapperManager } = await import(\"./form-modal-launcher.js\");\r\n\r\ninterface CtaModalLauncherArgs {\r\n $ctaButton: JQuery;\r\n $widgetEl: JQuery;\r\n widgetName: string | Nil;\r\n variation: string | Nil;\r\n instanceId: string | Nil;\r\n ctaText: string | Nil;\r\n ctaType: LinkDownloadType | Nil;\r\n modalType: string | Nil; \r\n}\r\n\r\nconst DataAttrs = {\r\n widgetName: \"data-widget-name\",\r\n ctaText: \"data-download-cta-text\",\r\n setupName: \"data-setup-name\",\r\n videoGuidId: \"data-video-guid-id\",\r\n ctaType: \"data-widget-cta-type\",\r\n variation: \"data-widget-variation\",\r\n instanceId: \"data-widget-instance-id\",\r\n modalType: \"data-modal-type\",\r\n} as const;\r\n\r\nfunction getWidgetElFromCta($ctaButton: JQuery) {\r\n return $ctaButton.is(`*[${DataAttrs.widgetName}]`)\r\n ? $ctaButton\r\n : $ctaButton.closest(`*[${DataAttrs.widgetName}]`);\r\n}\r\n\r\nfunction getCtaText($ctaButton: JQuery) {\r\n let ctaText = (\r\n $ctaButton.is(`*[${DataAttrs.ctaText}]`)\r\n ? $ctaButton.attr(DataAttrs.ctaText)\r\n : null\r\n )?.trim();\r\n // If the current element has the \"data-download-cta-text\" attribute, use that text.\r\n // Otherwise look at the $ctaTextEl element for text.\r\n if (isNil(ctaText)) {\r\n // If this element is the cta text element, we can use it, otherwise we can look inside of the element to see there is a child element\r\n let $ctaTextEl = $ctaButton.is(\".js-cta-text-element\")\r\n ? $ctaButton\r\n : $ctaButton.find(\".js-cta-text-element\");\r\n // Use either the $ctaTextEl element, or default to the current element.\r\n if ($ctaTextEl.length === 0) {\r\n $ctaTextEl = $ctaButton;\r\n }\r\n // Get the text from the current element.\r\n ctaText = $ctaTextEl.text().trim();\r\n }\r\n return ctaText;\r\n}\r\n\r\nfunction getSetupNameFilter(argsObj: CtaModalLauncherArgs) {\r\n const { $ctaButton } = argsObj;\r\n const setupName = $ctaButton.attr(DataAttrs.setupName);\r\n if (isString(setupName) && setupName.trim().length > 0) {\r\n return { setupName };\r\n } else return {};\r\n}\r\n\r\nfunction getDocumentSelectorFilter(argsObj: CtaModalLauncherArgs) {\r\n const { widgetName, $widgetEl } = argsObj;\r\n\r\n if (widgetName === \"DocSelectorBladeWidgetController\") {\r\n // .attr(\"value\") gets the values from both the checkbox inputs and the .docSelector-title elements\r\n const selected = ([] as JQuery[]).slice\r\n .call(\r\n $widgetEl.find(\r\n \".docSelector-list input:checked, .docSelector-list .docSelector-title[value]\"\r\n )\r\n )\r\n .map((el) => $(el).attr(\"value\"))\r\n .filter(isString);\r\n return { documentSelector: selected };\r\n }\r\n return {};\r\n}\r\n\r\nfunction getVideoSelectorFilter(argsObj: CtaModalLauncherArgs) {\r\n const { widgetName, $ctaButton } = argsObj;\r\n\r\n if (widgetName === \"VideoCarouselBladeWidgetController\") {\r\n const selectedVideoId = $ctaButton.attr(\"data-video-guid-id\");\r\n return { videoSelector: selectedVideoId };\r\n }\r\n return {};\r\n}\r\n\r\nfunction getLauncherArgsObj($ctaButton: JQuery): CtaModalLauncherArgs {\r\n const $widgetEl = getWidgetElFromCta($ctaButton);\r\n const ctaText = getCtaText($ctaButton);\r\n const ctaType = $ctaButton.attr(DataAttrs.ctaType);\r\n const widgetName = $widgetEl.attr(DataAttrs.widgetName);\r\n const variation = $widgetEl.attr(DataAttrs.variation);\r\n const instanceId = $widgetEl.attr(DataAttrs.instanceId);\r\n const modalType = $widgetEl.attr(DataAttrs.modalType);\r\n \r\n return {\r\n $ctaButton,\r\n $widgetEl,\r\n widgetName,\r\n variation,\r\n instanceId,\r\n modalType,\r\n ctaText,\r\n ctaType: LinkDownloadType.includes(ctaType as LinkDownloadType) ? (ctaType as LinkDownloadType) : null,\r\n };\r\n}\r\n\r\nfunction setCtaValues(\r\n widgetData: FormWidgetData<\"ResourceForm\" | \"VideoForm\" | \"GatedVideoForm\">,\r\n argsObj: CtaModalLauncherArgs\r\n) {\r\n const { ctaText, ctaType } = argsObj;\r\n widgetData.setup.tracking ??= { usePageOfferId: false };\r\n const { tracking } = widgetData.setup;\r\n tracking.ctaText = ctaText;\r\n tracking.ctaType = ctaType;\r\n}\r\n\r\n/** Export an object with two functions, `create` and `cleanup` that allow directly controlling creation and cleanup handler creation for the dynamic modal wrapper.\r\n * This object is exposed only for legacy code.\r\n * We need to verify that the dynamicModalWrapper const isn't used anywhere in legacy code or the sitefinity database, then we can remove this and simply use the `launchModalForm` function instead.\r\n * @deprecated -- Cannot remove until we verify that this isn't used anywhere in legacy code or script blocks on the website \r\n */\r\nexport const dynamicModalWrapper = DynamicModalWrapperManager;\r\n\r\nexport async function launchDocumentForm(argsObj: CtaModalLauncherArgs) {\r\n const { instanceId } = argsObj;\r\n\r\n if (isNil(instanceId)) {\r\n logger.warn(\"Property 'instanceId' cannot be Nil\", argsObj);\r\n throw new Error(\"Property 'instanceId' cannot be Nil\");\r\n }\r\n\r\n const setupNameFilter = getSetupNameFilter(argsObj);\r\n const docSelectorFilter = getDocumentSelectorFilter(argsObj);\r\n const modifiersObj = { ...setupNameFilter, ...docSelectorFilter } as {\r\n setupName?: string | undefined;\r\n documentSelector?: string[] | undefined;\r\n };\r\n\r\n const widgetData = window.AppState.WidgetData.Get(instanceId, modifiersObj);\r\n if (isFormWidgetData(widgetData, \"ResourceForm\", true)) {\r\n setCtaValues(widgetData, argsObj);\r\n\r\n logger.debug(\"initializeDocumentForm\");\r\n const { appInstance, componentInstance } = await launchModalForm({ formSettingsKey: \"document\", widgetData, isInModal: true });\r\n return { appInstance, componentInstance };\r\n }\r\n throw new Error(\"The referenced widgetData is not of type 'ResourceForm'\");\r\n}\r\n\r\nexport async function launchVideoForm(argsObj: CtaModalLauncherArgs, formSettingsKey: VideoFormSettingsKey & ModalFormSettingsKey) {\r\n const { instanceId } = argsObj;\r\n\r\n if (isNil(instanceId)) {\r\n logger.warn(\"Property 'instanceId' cannot be Nil\", argsObj);\r\n throw new Error(\"Property 'instanceId' cannot be Nil\");\r\n }\r\n\r\n const setupNameFilter = getSetupNameFilter(argsObj);\r\n const videoSelectorFilter = getVideoSelectorFilter(argsObj);\r\n const modifiersObj = { ...setupNameFilter, ...videoSelectorFilter };\r\n\r\n const widgetData = window.AppState.WidgetData.Get(instanceId, modifiersObj);\r\n const setupType: FormSetupType = formSettingsKey === \"video\" ? \"VideoForm\" : \"GatedVideoForm\";\r\n if (isFormWidgetData(widgetData, setupType, true)) {\r\n setCtaValues(widgetData, argsObj);\r\n const { appInstance, componentInstance } = await launchModalForm({ formSettingsKey, widgetData, isInModal: true });\r\n return { appInstance, componentInstance };\r\n }\r\n throw new Error(\"The referenced widgetData is not of type 'VideoForm' or 'GatedVideoForm'\");\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n McForm?: {\r\n CtaModalLauncher?: {\r\n launchVideoForm: typeof launchVideoForm,\r\n launchDocumentForm: typeof launchDocumentForm\r\n }\r\n }\r\n }\r\n}\r\n\r\n// To be compatible with existing code that relies on globals\r\nwindow.McForm ??= {};\r\nwindow.McForm.CtaModalLauncher ??= {\r\n launchVideoForm,\r\n launchDocumentForm\r\n};\r\n\r\nexport function initCtaModalLauncherListeners() {\r\n // Launch from .js-cta-form-launcher elements with data-modal-type === 'Document'\r\n $(document).on(\r\n \"click\",\r\n `.js-cta-modal-launcher[${DataAttrs.modalType}='Document']`,\r\n function (this: HTMLElement) {\r\n const launcherArgsObj = getLauncherArgsObj($(this));\r\n launchDocumentForm(launcherArgsObj).catch(logger.error);\r\n }\r\n );\r\n\r\n // Launch from .js-cta-form-launcher elements with data-modal-type === 'Video'\r\n $(document).on(\r\n \"click\",\r\n `.js-cta-modal-launcher[${DataAttrs.modalType}='Video']`,\r\n function (this: HTMLElement) {\r\n const launcherArgsObj = getLauncherArgsObj($(this));\r\n launchVideoForm(launcherArgsObj, 'video').catch(logger.error);\r\n }\r\n );\r\n// Launch from .js-cta-form-launcher elements with data-modal-type === 'VideoGated'\r\n $(document).on(\r\n \"click\", \r\n `.js-cta-modal-launcher[${DataAttrs.modalType}='VideoGated']`,\r\n function(this: HTMLElement){\r\n const launcherArgsObj = getLauncherArgsObj($(this));\r\n launchVideoForm(launcherArgsObj, \"video-gated\").catch(logger.error);\r\n }\r\n );\r\n}\r\n"], "mappings": "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", "names": ["LinkDownloadType", "launchModalForm", "DynamicModalWrapperManager", "DataAttrs", "getWidgetElFromCta", "$ctaButton", "getCtaText", "ctaText", "isNil", "$ctaTextEl", "getSetupNameFilter", "argsObj", "setupName", "isString", "getDocumentSelectorFilter", "widgetName", "$widgetEl", "el", "getVideoSelectorFilter", "getLauncherArgsObj", "ctaType", "variation", "instanceId", "modalType", "LinkDownloadType", "setCtaValues", "widgetData", "tracking", "dynamicModalWrapper", "launchDocumentForm", "BaseFormLogger", "setupNameFilter", "docSelectorFilter", "modifiersObj", "isFormWidgetData", "appInstance", "componentInstance", "launchVideoForm", "formSettingsKey", "videoSelectorFilter", "initCtaModalLauncherListeners", "launcherArgsObj"] }