File manager - Edit - /usr/local/cpanel/whostmgr/docroot/templates/monitoring-campaigns/sequence/campaign-banner.min.js.map
Back
{"version":3,"file":"campaign-banner.min.js","sources":["../node_modules/style-inject/dist/style-inject.es.js","../src/campaign-banner.js","../src/index.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","// Copyright 2024 WebPros International, LLC\n// All rights Reserved.\n// copyright@cpanel.net http://cpanel.net\n// This code is subject to the cPanel license. Unauthorized copying is prohibited\n\nimport scss from \"./campaign-banner.scss\";\n\nconst eventNameRules = [\n {\n name: \"close.click\",\n pattern: /--track-close$/,\n },\n {\n name: \"conversion.click\",\n pattern: /--track-cta-button$/,\n },\n {\n name: \"survey-yes.click\",\n pattern: /--track-survey-yes$/,\n },\n {\n name: \"survey-no.click\",\n pattern: /--track-survey-no$/,\n },\n];\n\nconst application = \"WHM\";\nconst appKey = \"home\";\n\nexport class CampaignBanner extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n }\n\n /**\n * Web Component lifecycle method\n * Called each time the element is added to the document\n */\n connectedCallback() {\n this.setupProps();\n\n this.checkHidden();\n\n if (this.isHidden) {\n return;\n }\n\n this.render();\n\n this.setupEventListeners();\n this.setupViewHandler();\n }\n\n /**\n * Initializes the properties of the campaign banner.\n * @private\n */\n setupProps() {\n const getAttr = (attr, def) => this.getAttribute(attr) || def;\n\n // banner props and behavior\n this.campaignId = getAttr(\"campaign-id\");\n this.stepId = getAttr(\"step-id\");\n this.securityToken = getAttr(\"cp-security-token\");\n this.showAgainIn = Number(getAttr(\"show-again-in\"));\n this.dismissible = this.hasAttribute(\"dismissible\");\n this.hasAnalytics = this.hasAttribute(\"banner-analytics\");\n\n // banner UI\n this.imageUrl = getAttr(\"image-url\", \"_blank\");\n this.bannerTitle = getAttr(\"banner-title\", \"Banner Title\");\n this.bannerDescription = getAttr(\n \"banner-description\",\n \"Banner Description.\",\n );\n this.closeTitle = getAttr(\"close-title\", \"Close\");\n\n // cta UI\n this.ctaOffsite = this.hasAttribute(\"cta-offsite\");\n this.ctaText = getAttr(\"cta-text\", \"Learn More\");\n this.ctaLink = getAttr(\"cta-link\");\n\n // survey\n this.showSurvey = !this.hasAttribute(\"survey-dismissed\");\n this.surveyTitle = getAttr(\"survey-title\");\n this.surveyYes = getAttr(\"survey-yes\");\n this.surveyNo = getAttr(\"survey-no\");\n\n // internal props\n this.isHidden = false;\n }\n\n /**\n * Retrieve the unique fully qualified id.\n */\n getId() {\n return this.campaignId + ( this.stepId ? `.${this.stepId}` : '' );\n };\n\n /**\n * Sets up event listeners for the campaign banner.\n *\n */\n setupEventListeners() {\n this.shadowRoot\n .querySelectorAll(`[id^=\"${this.campaignId}--track\"]`)\n .forEach((el) => {\n // Don't add listener to the banner itself since this\n // causes extra mix panel events we don't want.\n if (el.id.match(/--banner$/)) {\n return;\n }\n\n el.addEventListener(\"click\", (event) =>\n this.handleClick(event, el),\n );\n });\n }\n\n /**\n * Handles click events on the campaign banner.\n * @param {Event} event - The click event.\n * @param {HTMLElement} el - The element that was clicked.\n */\n handleClick(event, el) {\n if (el.onlyOnce) {\n return;\n }\n\n el.onlyOnce = true;\n\n let eventName = \"click\";\n for (const eventNameRule of eventNameRules) {\n if (eventNameRule.pattern.test(el.id)) {\n eventName = eventNameRule.name;\n break;\n }\n }\n\n if (this.hasAnalytics) {\n this.trackEvent(eventName, el.id);\n }\n\n if (/--track-cta-button$/.test(el.id)) {\n return;\n }\n if (/--track-survey-/.test(el.id)) {\n this.dismissSurvey();\n return;\n }\n this.dismiss();\n event.preventDefault();\n }\n\n /**\n * Sets up a view handler for the campaign banner.\n */\n setupViewHandler() {\n const campaignEl = this.shadowRoot.getElementById(\n `${this.campaignId}--banner`,\n );\n // Setup the view handler\n if (campaignEl) {\n // Intersection Observer options\n const options = {\n root: null,\n rootMargin: \"0px\",\n threshold: 0.5,\n };\n\n // when observed elements intersect with the viewport\n const intersectionCallback = (entries, observer) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n if (this.hasAnalytics) {\n this.trackEvent(\"view\", campaignEl.id);\n }\n // We only need to know it was seen once per\n // page view.\n\n observer.unobserve(campaignEl);\n }\n });\n };\n\n const observer = new IntersectionObserver(\n intersectionCallback,\n options,\n );\n observer.observe(campaignEl);\n }\n }\n\n /**\n * Track the event\n *\n * @private\n * @param {string} action - the kind of action taken\n * @param {string} elementId - unique id of the element the action is taken against\n */\n trackEvent(action, elementId) {\n window[\"mixpanel\"]?.track(\n `${application}-${appKey}-${this.campaignId}.${action}`,\n {\n campaign_id: this.campaignId,\n campaign_step: this.stepId,\n action: action.toLowerCase(),\n id: elementId,\n application: application.toLowerCase(),\n },\n );\n }\n\n /**\n * Renders the campaign banner.\n */\n render() {\n const dir = this.closest(\"[dir]\")?.getAttribute(\"dir\") || \"ltr\";\n\n const bannerHidden = () =>\n `<input type=\"hidden\" name=\"id\" value=\"${this.getId()}\" />`;\n\n const bannerHeaderDescription = (size) =>\n `<p class=\"banner-header-description--${size}\">${this.bannerDescription}</p>`;\n\n const closeButton = (dismissible) => {\n return dismissible\n ? `<button\n type=\"button\"\n class=\"btn btn-close btn-shrink close float-right banner-close whatever\"\n id=\"${this.campaignId}--track-close\"\n title=\"${this.closeTitle}\"\n data-testid=\"banner-close__${this.campaignId}\"\n >\n <span aria-hidden=\"true\" class=\"visually-hidden\">×</span>\n </button>`\n : \"\";\n };\n\n const survey = () =>\n `<div class=\"banner-hr\"></div>\n <div id=\"${this.campaignId}--survey\" class=\"card-footer\">\n <p>${this.surveyTitle}</p>\n <span class=\"banner-survey-options\">\n <button class=\"btn icon-btn-link banner-survey-button\" id=\"${this.campaignId}--track-survey-yes\" data-testid=\"banner-survey-yes__${this.campaignId}\">${this.surveyYes}</button>\n <span>|</span>\n <button class=\"btn icon-btn-link banner-survey-button\" id=\"${this.campaignId}--track-survey-no\" data-testid=\"banner-survey-no__${this.campaignId}\">${this.surveyNo}</button>\n </span>\n </div>`;\n\n this.shadowRoot.innerHTML = `\n <style>${scss}</style>\n <div id=\"${this.campaignId}--banner\" class=\"card\" dir=\"${dir}\">\n ${bannerHidden()}\n <div class=\"card-header\">\n <div class=\"banner-header-content\">\n <img id=\"${this.campaignId}--image\" class=\"banner-image\" src=\"${this.imageUrl}\" data-testid=\"banner-image__${this.campaignId}\" alt=\"Logo\" />\n <div class=\"banner-header-text\">\n <p class=\"banner-header-title\">${this.bannerTitle}</p>\n ${bannerHeaderDescription(\"large\")}\n </div>\n </div>\n ${bannerHeaderDescription(\"small\")}\n <a\n id=\"${this.campaignId}--track-cta-button\"\n class=\"btn btn-primary banner-cta ${this.dismissible ? \"banner-primary-action--dismissible\" : \"\"}\"\n href=\"${this.ctaLink}\"\n ${this.ctaOffsite ? 'target=\"_blank\"' : \"\"}\n data-testid=\"banner-cta__${this.campaignId}\"\n >\n ${this.ctaText}\n </a>\n </div>\n ${this.hasAnalytics && this.showSurvey && this.surveyTitle ? survey() : \"\"}\n ${closeButton(this.dismissible)}\n </div>`;\n }\n\n /**\n * Retrieve the last time the campaign was dismissed, if anytime.\n *\n * @private\n * @returns\n */\n lastTimeDismissed = () => {\n return localStorage.getItem(`${this.getId()}.dismissed`);\n };\n\n /**\n * Dismiss the campaign. This will set the date the campaign was dismissed so we can\n * calculate the retry period that will allow the campaign to be shown again in a few\n * days according to the configured showItAgain period in seconds.\n *\n * @private\n */\n dismiss = async () => {\n if (this.dismissible) {\n this.hide();\n localStorage.setItem(\n `${this.getId()}.dismissed`,\n new Date().toISOString(),\n );\n\n // save the last closed step so the backend\n // can exit before rendering on the next run\n // that would show the same step.\n await this.setPersonalizationData(\n this.securityToken,\n \"last_closed_step\",\n this.stepId,\n );\n }\n };\n\n /**\n * Hide the view.\n *\n * @private\n */\n hide = () => {\n const campaignEl = this.shadowRoot.getElementById(\n `${this.campaignId}--banner`,\n );\n campaignEl?.remove();\n };\n\n /**\n * Remove the banner and add a localstorage entry so that it is hidden on refresh.\n *\n * @private\n */\n dismissSurvey = async () => {\n const campaignSurvey = this.shadowRoot.getElementById(\n `${this.campaignId}--survey`,\n );\n campaignSurvey?.remove();\n\n await this.setPersonalizationData(\n this.securityToken,\n `${this.getId()}_survey`,\n 1,\n );\n };\n\n /**\n * Initialize the campaign view\n *\n * @private\n */\n checkHidden = () => {\n const dismissed = this.lastTimeDismissed();\n\n const elapsedGreaterThanShow =\n new Date() - new Date(dismissed) > this.showAgainIn;\n\n if (\n !dismissed ||\n (this.showAgainInAvailable && elapsedGreaterThanShow)\n ) {\n return;\n }\n\n this.isHidden = true;\n };\n\n /**\n * Set personalization data (nvdata) for user\n * in /var/cpanel/whm/nvdata/root/${campaignId}.yaml\n */\n async setPersonalizationData(securityToken, name, data) {\n const body = {\n \"api.version\": 1,\n store: this.campaignId,\n personalization: { [name]: data },\n };\n\n const request = new Request(\n `${securityToken}/json-api/personalization_set`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n },\n );\n\n try {\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(\n `Network response was not ok: ${response.statusText}`,\n );\n }\n\n const responseData = await response.json();\n\n if (responseData.metadata && !responseData.metadata.result) {\n throw new Error(responseData.metadata.reason);\n }\n\n return responseData;\n } catch (error) {\n console.error(`DEV ERROR: ${error}`);\n }\n }\n}\n","// Copyright 2024 WebPros International, LLC\n// All rights Reserved.\n// copyright@cpanel.net http://cpanel.net\n// This code is subject to the cPanel license. Unauthorized copying is prohibited\n\nimport { CampaignBanner } from \"./campaign-banner\";\n\ncustomElements.get(\"campaign-banner\") || customElements.define(\"campaign-banner\", CampaignBanner);"],"names":["css","ref","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","eventNameRules","name","pattern","CampaignBanner","HTMLElement","constructor","super","this","attachShadow","mode","connectedCallback","setupProps","checkHidden","isHidden","render","setupEventListeners","setupViewHandler","getAttr","attr","def","getAttribute","campaignId","stepId","securityToken","showAgainIn","Number","dismissible","hasAttribute","hasAnalytics","imageUrl","bannerTitle","bannerDescription","closeTitle","ctaOffsite","ctaText","ctaLink","showSurvey","surveyTitle","surveyYes","surveyNo","getId","shadowRoot","querySelectorAll","forEach","el","id","match","addEventListener","event","handleClick","onlyOnce","eventName","eventNameRule","test","trackEvent","dismissSurvey","dismiss","preventDefault","campaignEl","getElementById","intersectionCallback","entries","observer","entry","isIntersecting","unobserve","IntersectionObserver","root","rootMargin","threshold","observe","action","elementId","window","track","campaign_id","campaign_step","toLowerCase","application","dir","closest","bannerHeaderDescription","size","innerHTML","scss","bannerHidden","survey","closeButton","lastTimeDismissed","localStorage","getItem","async","hide","setItem","Date","toISOString","setPersonalizationData","remove","campaignSurvey","dismissed","elapsedGreaterThanShow","showAgainInAvailable","data","body","store","personalization","request","Request","method","headers","JSON","stringify","response","fetch","ok","Error","statusText","responseData","json","metadata","result","reason","error","console","customElements","get","define"],"mappings":"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","x_google_ignoreList":[0]}
| ver. 1.4 |
Github
|
.
| PHP 8.1.34 | Generation time: 0.05 |
proxy
|
phpinfo
|
Settings