{"version":3,"file":"ProductBadge.js","names":["ProductBadge","a","setters","Component","default","on","off","deepMerge","DataLayer","mix","AnalyticsMixin","execute","with","constructor","element","options","arguments","length","templateName","dataModelId","isClientEnabled","productID","recommendedBadge","linksAnalytics","bindEvents","onProductUpdated","bind","onClick","afterInit","dataLayer","getData","customer","recommendedProducts","Object","keys","some","application","products","indexOf","appendChild","createRecommendedBadge","e","model","detail","data","render","target","tagName","title","getAttribute","label","toLowerCase","extraData","cta_name","sendAnalytics","badge","image","url","backgroundColor","textColor","cssClass","span","document","createElement","className","style","color","split","forEach","classList","add","content","innerHTML","destroy"],"sources":["components/product/ProductBadge.js"],"sourcesContent":["import Component from 'core/Component';\nimport { on, off } from 'toolbox/event';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport DataLayer from 'services/DataLayer';\nimport { mix } from 'core/mixwith';\nimport AnalyticsMixin from 'mixins/Analytics';\n\n/**\n * This is a description of the ProductBadge constructor function.\n * @class\n * @classdesc This is a description of the ProductBadge class. (must be edited)\n * @extends Component\n */\nexport default class ProductBadge extends mix(Component).with(AnalyticsMixin) {\n /**\n * Constructor of the class that mainly merge the options of the components\n * @param {HTMLElement} element HTMLElement of the component\n * @param {Object} options options that belongs to the component\n */\n constructor(element, options = {}) {\n super(element, deepMerge({\n templateName: 'product/productbadge',\n dataModelId: 'productbadge',\n isClientEnabled: false, // if true, the component will be updated on variation change\n productID: '', // product ID\n recommendedBadge: null, // recommended badge\n linksAnalytics: null, // links analytics\n }, options));\n }\n\n /**\n * Should contain only event listeners and nothing else\n * All the event handlers should be into a separated function. No usage of anonymous function\n */\n bindEvents() {\n if (this.options.isClientEnabled) {\n on('product.updated', this.element, this.onProductUpdated.bind(this));\n }\n on('click', this.element, this.onClick.bind(this));\n }\n\n /**\n * After init\n * Run any script after the component is fully initialized\n */\n afterInit() {\n const dataLayer = DataLayer.getData();\n const { productID, recommendedBadge } = this.options;\n\n if (productID && recommendedBadge && dataLayer && dataLayer.customer && dataLayer.customer.recommendedProducts) {\n const { recommendedProducts } = dataLayer.customer;\n Object.keys(recommendedProducts).some((application) => {\n const products = recommendedProducts[application].products || [];\n if (products.indexOf(productID) !== -1) {\n this.element.appendChild(this.createRecommendedBadge(recommendedBadge));\n return true;\n }\n return false;\n });\n }\n }\n\n /**\n * Update component when product updated\n * @param {Object} e - event data\n */\n onProductUpdated(e) {\n const model = e.detail.data && e.detail.data[this.options.dataModelId];\n if (model) {\n this.render(model);\n }\n }\n\n /**\n * Click event handler,\n * send analytics if linksAnalytics is provided and the target is an anchor tag\n * @param {Object} e - event data\n */\n onClick(e) {\n const { linksAnalytics } = this.options;\n if (linksAnalytics && e.target.tagName === 'A') {\n const { target } = e;\n const title = target.getAttribute('data-js-title');\n\n linksAnalytics.label = (title || '').toLowerCase();\n if (linksAnalytics.extraData) {\n linksAnalytics.extraData.cta_name = (title || '').toLowerCase();\n }\n\n this.sendAnalytics(linksAnalytics);\n }\n }\n\n /**\n * Create recommended badge\n * @param {Object} badge - badge object\n * @param {string} badge.image - badge image\n * @param {string} badge.url - badge url\n * @param {string} badge.title - badge title\n * @returns {HTMLElement} recommended badge\n */\n createRecommendedBadge(badge) {\n const {\n image, url, title, backgroundColor, textColor, cssClass,\n } = badge;\n const span = document.createElement('span');\n span.className = image ? 'c-product-badge__image' : 'c-product-badge__title';\n if (backgroundColor) {\n span.style.backgroundColor = backgroundColor;\n }\n\n if (textColor) {\n span.style.color = textColor;\n }\n\n if (cssClass) {\n cssClass.split(' ').forEach((element) => {\n span.classList.add(element);\n });\n }\n\n const content = image || title;\n span.innerHTML = url ? `${content}` : content;\n\n return span;\n }\n\n /**\n * Destroy is called automatically after the component is being removed from the DOM\n * You must always destroy the listeners attached to an element to avoid any memory leaks\n */\n destroy() {\n if (this.options.isClientEnabled) {\n off('product.updated', this.element);\n }\n off('click', this.element);\n }\n}\n"],"mappings":"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","ignoreList":[]}