File manager - Edit - /usr/local/cpanel/whostmgr/docroot/templates/components/warning-banner.min.js.map
Back
{"version":3,"file":"warning-banner.min.js","sources":["../node_modules/style-inject/dist/style-inject.es.js","../src/warning-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 \"../node_modules/remixicon/fonts/remixicon.css\";\nimport scss from \"./warning-banner.scss\";\n\nconst NVDATA_STORE = \"warning-banner\";\n\nconst eventNameRules = [\n {\n name: \"close.click\",\n pattern: /--track-close$/,\n },\n {\n name: \"conversion.click\",\n pattern: /--track-learnmore-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 WarningBanner 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 this.hideTrialIfPresent();\n this.render();\n\n this.setupEventListeners();\n this.setupViewHandler();\n }\n\n /**\n * Hide the trial banner when we show this banner so there is not a confusing\n * conversion.\n */\n hideTrialIfPresent() {\n const trialBanner = document.getElementById(\"divTrialLicenseWarning\");\n if (trialBanner) {\n trialBanner.style.display = 'none';\n }\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\n this.campaignId = getAttr(\"campaign-id\");\n this.imageUrl = getAttr(\"image-url\", null); // Changed default to null\n this.title = getAttr(\"title\", \"Banner Title\");\n this.learnMoreLink = getAttr(\"learn-more-link\", null);\n this.learnMoreText = getAttr(\"learn-more-text\", \"Learn More\");\n this.imageSize = getAttr(\"image-size\", \"\");\n this.description = getAttr(\"description\", \"\");\n this.securityToken = getAttr(\"cp-security-token\");\n this.showAgainIn = Number(getAttr(\"show-again-in\"));\n this.dismissible = this.hasAttribute(\"dismissible\");\n this.collapsible = this.hasAttribute(\"collapsible\");\n this.hasAnalytics = this.hasAttribute(\"banner-analytics\");\n //this.showSurvey = !this.hasAttribute(\"survey-dismissed\");\n this.showSurvey = \"\";\n\n // marketing strings\n this.surveyTitle = getAttr(\"survey-title\");\n this.surveyYes = getAttr(\"survey-yes\");\n this.surveyNo = getAttr(\"survey-no\");\n\n // internal props\n this.campaignStateId = `${this.campaignId}.dismissed`;\n this.isCollapsed = this.getCollapsedState();\n this.isHidden = false;\n this.collapseIcon = `<svg class=\"remix-small\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"rgba(143,155,179,1)\"><path d=\"M11.9999 10.8284L7.0502 15.7782L5.63599 14.364L11.9999 8L18.3639 14.364L16.9497 15.7782L11.9999 10.8284Z\"></path></svg>`;\n this.expandIcon = `<svg class=\"remix-small\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"rgba(143,155,179,1)\"><path d=\"M11.9999 13.1714L16.9497 8.22168L18.3639 9.63589L11.9999 15.9999L5.63599 9.63589L7.0502 8.22168L11.9999 13.1714Z\"></path></svg>`;\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 handleCollapse() {\n this.isCollapsed = !this.isCollapsed;\n this.setCollapsedState(this.isCollapsed);\n this.render();\n this.setupEventListeners();\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.id.match(/--track-collapse$/)) {\n this.handleCollapse();\n return;\n }\n\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-learnmore-button$/.test(el.id)) {\n return;\n }\n\n if (/--track-survey-/.test(el.id)) {\n this.dismissSurvey();\n return;\n }\n this.dismiss();\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 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 bannerHeaderDescription = (size) =>\n `<p class=\"banner-header-description--${size}\">${this.description}</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 data-testid=\"banner-close__${this.campaignId}\"\n >\n <span aria-hidden=\"true\" class=\"visually-hidden\">×</span>\n </button>`\n : \"\";\n };\n\n const collapseButton = (collapsible) => {\n return collapsible\n ? `<button\n type=\"button\"\n class=\"btn btn-shrink collapse float-right banner-collapse cp-group__header-expand\"\n id=\"${this.campaignId}--track-collapse\"\n data-testid=\"banner-collapse__${this.campaignId}\"\n >\n ${this.isCollapsed ? this.expandIcon : this.collapseIcon}\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 const learnMoreButton = () => {\n return this.learnMoreLink\n ? `<a\n id=\"${this.campaignId}--track-learnmore-button\"\n class=\"btn btn-primary banner-cta ${this.dismissible ? \"banner-primary-action--dismissible\" : \"\"}\"\n href=\"${this.learnMoreLink}\"\n target=\"_blank\"\n data-testid=\"banner-learn-more__${this.campaignId}\"\n >\n ${this.learnMoreText}\n </a>`\n : \"\";\n };\n\n this.shadowRoot.innerHTML = `\n <style>${scss}</style>\n <div id=\"${this.campaignId}--banner\" class=\"card\" dir=\"${dir}\">\n <div class=\"card-header\">\n <div class=\"banner-header-content\">\n <img id=\"${this.campaignId}--image\" class=\"banner-image remix-${this.imageSize}\" src=\"${this.imageUrl}\" data-testid=\"banner-image__${this.campaignId}\" alt=\"Logo\" />\n <div class=\"banner-header-text\">\n <p class=\"banner-header-title\">${this.title}</p>\n ${bannerHeaderDescription(\"large\")}\n </div>\n </div>\n ${bannerHeaderDescription(\"small\")}\n </div>\n ${learnMoreButton()}\n ${this.isCollapsed ? \"\" : `<div class=\"card-body\">${this.innerHTML}</div>`}\n ${this.hasAnalytics && this.showSurvey ? survey() : \"\"}\n ${collapseButton(this.collapsible)}\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.campaignStateId);\n };\n\n /**\n * Retrieve the collapsed state of the campaign banner.\n *\n * @private\n * @returns {boolean}\n */\n getCollapsedState = () => {\n return (\n JSON.parse(localStorage.getItem(`${this.campaignId}.collapsed`)) ||\n false\n );\n };\n\n /**\n * Store the collapsed state of the campaign banner.\n *\n * @private\n * @param {boolean} state - The collapsed state to store.\n */\n setCollapsedState = (state) => {\n localStorage.setItem(\n `${this.campaignId}.collapsed`,\n JSON.stringify(state),\n );\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 = () => {\n if (this.dismissible) {\n this.hide();\n localStorage.setItem(\n this.campaignStateId,\n new Date().toISOString(),\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.campaignId}_survey`,\n 1,\n );\n };\n\n /**\n * Initialize the campaign view\n *\n * @private\n */\n checkHidden = () => {\n const dismissed = this.lastTimeDismissed(this.campaignId);\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 * Specifically with ${campaignId}_survey: 1\n // in /var/cpanel/whm/nvdata/root/warning-banner.yaml\n */\n async setPersonalizationData(securityToken, name, data) {\n const body = {\n \"api.version\": 1,\n store: NVDATA_STORE,\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 { WarningBanner } from \"./warning-banner\";\n\ncustomElements.define(\"warning-banner\", WarningBanner);\n"],"names":["styleInject","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","eventNameRules","name","pattern","WarningBanner","HTMLElement","constructor","super","this","attachShadow","mode","connectedCallback","setupProps","checkHidden","isHidden","hideTrialIfPresent","render","setupEventListeners","setupViewHandler","trialBanner","getElementById","display","getAttr","attr","def","getAttribute","campaignId","imageUrl","title","learnMoreLink","learnMoreText","imageSize","description","securityToken","showAgainIn","Number","dismissible","hasAttribute","collapsible","hasAnalytics","showSurvey","surveyTitle","surveyYes","surveyNo","campaignStateId","isCollapsed","getCollapsedState","collapseIcon","expandIcon","shadowRoot","querySelectorAll","forEach","el","id","match","addEventListener","event","handleClick","handleCollapse","setCollapsedState","onlyOnce","eventName","eventNameRule","test","trackEvent","dismissSurvey","dismiss","campaignEl","intersectionCallback","entries","observer","entry","isIntersecting","unobserve","IntersectionObserver","root","rootMargin","threshold","observe","action","elementId","window","track","campaign_id","toLowerCase","application","dir","closest","bannerHeaderDescription","size","innerHTML","scss","learnMoreButton","survey","collapseButton","closeButton","lastTimeDismissed","localStorage","getItem","JSON","parse","state","setItem","stringify","hide","Date","toISOString","remove","async","campaignSurvey","setPersonalizationData","dismissed","elapsedGreaterThanShow","showAgainInAvailable","data","body","store","personalization","request","Request","method","headers","response","fetch","ok","Error","statusText","responseData","json","metadata","result","reason","error","console","customElements","define"],"mappings":"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","x_google_ignoreList":[0]}
| ver. 1.4 |
Github
|
.
| PHP 8.1.34 | Generation time: 0.03 |
proxy
|
phpinfo
|
Settings