/* global SCS, SCSRenderAPI, process */ import { getHeaderData } from './menu.mjs'; export default class { constructor(contentClient, noPermissionToView, SCSCompileAPI, utils, modules) { this.contentClient = contentClient; this.noPermissionToView = noPermissionToView || 'You do not have permission to view this asset'; this.libs = this.contentClient.getLibs() || {}; this.marked = this.libs.marked || window.marked; this.isCompilation = !!SCSCompileAPI; this.SCSCompileAPI = SCSCompileAPI; this.utils = utils; this.initializeModules(modules); } initializeModules(modules) { if (this.isCompilation) { this.localizationPath = '../../../themes/IR-Standard-Master-Theme/assets/js/localization/localization.mjs'; if (modules && modules.localizationModule) { this.localization = modules.localizationModule; } this.ImageRenditionFormats = modules.ImageRenditionFormats; this.ImageRenditionTypes = modules.ImageRenditionTypes; } else { this.localizationPath = SCSRenderAPI.getThemeUrlPrefix() + '/assets/js/localization/localization.mjs'; import(this.localizationPath) .then((moduleLocalization) => { this.localization = new moduleLocalization.default({ SCSCompileAPI: this.SCSCompileAPI, SiteUtils: this.localUtils, }); }) .catch((err) => { console.log('HEADER:LOCALIZATION:MODULE:NOT:INITIALIZED:', err); }); } } getRefItems(ids) { if (ids.length === 0) { return Promise.resolve({}); } else { return this.contentClient.getItems({ ids: ids, }); } } findReferenceFieldIds(referencedItems, fields) { const referencedIds = []; referencedItems.forEach((referencedItem) => { if (fields[referencedItem]) { (Array.isArray(fields[referencedItem]) ? fields[referencedItem] : [fields[referencedItem]]).forEach( (entry) => { if (entry) { if (!entry.reference || entry.reference.isAccessible) { referencedIds.push(entry.id); } else { entry.referenceInaccessible = this.noPermissionToView; } } } ); } }); return referencedIds; } updateDigitalAssetURLs(digitalAssetFields, fields) { digitalAssetFields.forEach((digitalAssetField) => { if (fields[digitalAssetField]) { (Array.isArray(fields[digitalAssetField]) ? fields[digitalAssetField] : [fields[digitalAssetField]] ).forEach((entry) => { if (entry) { if (!entry.reference || entry.reference.isAccessible) { if (entry.type === 'Video' || entry.type === 'File') { entry.showName = true; } else { entry.url = this.contentClient.getRenditionURL({ id: entry.id, }); } } else { entry.referenceInaccessible = this.noPermissionToView; } } }); } }); } updateMarkdownFields(markdownFields, fields) { const parseMarkdown = (mdText) => { if (mdText && /^\n\r/i.test(mdText)) { mdText = mdText.replace('\n\r', ''); mdText = this.marked(mdText); } return mdText; }; markdownFields.forEach((markdownField) => { if (fields[markdownField]) { if (Array.isArray(fields[markdownField])) { fields[markdownField] = fields[markdownField].map((entry) => { return parseMarkdown(this.contentClient.expandMacros(entry)); }); } else { fields[markdownField] = parseMarkdown(this.contentClient.expandMacros(fields[markdownField])); } } }); } updateRichTextFields(richTextFields, fields) { richTextFields.forEach((richTextField) => { if (fields[richTextField]) { if (Array.isArray(fields[richTextField])) { fields[richTextField] = fields[richTextField].map((entry) => { return this.contentClient.expandMacros(entry); }); } else { fields[richTextField] = this.contentClient.expandMacros(fields[richTextField]); } } }); } updateDateTimeFields(dateTimeFields, fields) { const dateToMDY = (date) => { if (!date) { return ''; } const dateObj = new Date(date); const options = { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit', }; const formattedDate = dateObj.toLocaleDateString('en-US', options); return formattedDate; }; dateTimeFields.forEach((dateTimeField) => { if (fields[dateTimeField]) { if (Array.isArray(fields[dateTimeField])) { fields[dateTimeField] = fields[dateTimeField].map((entry) => { return (entry.formatted = dateToMDY(entry.value)); }); } else { fields[dateTimeField].formatted = dateToMDY(fields[dateTimeField].value); } } }); } addReferencedItems(referencedItems, results, fields) { ((results && results.items) || []).forEach((item) => { referencedItems.forEach((referencedItem) => { (Array.isArray(fields[referencedItem]) ? fields[referencedItem] : [fields[referencedItem]]).forEach( (entry) => { if (entry && entry.id === item.id) { entry.contentItem = item; const digitalAssetFields = Object.keys(item.fields).filter((key) => { const field = item.fields[key]; return field && typeof field === 'object' && field.typeCategory === 'DigitalAssetType'; }); this.updateDigitalAssetURLs(digitalAssetFields, item.fields); } } ); }); }); } async getLocalizationModule() { if (this.localization) { return this.localization; } else { const moduleLocalization = await import(this.localizationPath).then((moduleLocalization) => { return moduleLocalization; }); this.localization = new moduleLocalization.default({ SCSCompileAPI: this.SCSCompileAPI, SiteUtils: this.localUtils, }); return this.localization; } } async getLanguageAsset(contentItemData) { console.log('HEADER:GET:LANGUAGE:'); if (contentItemData === undefined || contentItemData == null || contentItemData.length <= 0) { console.log('HEADER:CHECKFALLBACKS:EMPTY:OBJECT'); return contentItemData; } const localization = await this.getLocalizationModule(); return localization.getLanguageAsset(contentItemData); } /** * Returns the content item header data for the given content id. Returns cache data if available. * * @param {string} contentId * @param {string} cacheName * @returns */ async queryContent(contentId, cacheName) { if (!this.isCompilation && window.parent.contentCache[cacheName]) { return window.parent.contentCache[cacheName]; } return await getHeaderData({ channelToken: this.contentClient.getInfo().channelToken, headerItemId: contentId, graphql: this.contentClient.graphql, }); } transformUpperHeaderLinks(item) { const itemTransformed = item; this.updateMarkdownFields(['link'], item.fields); if (item.fields) { item.fields.link_url = item.fields.fieldLink; } if (this.isCompilation) { item = this.utils.formatCtaLinks(this.SCSCompileAPI, item, 'header'); } else { item = this.utils.formatCtaLinks(item, 'header'); } itemTransformed.fields['fieldLink'] = item.fields.full_link; itemTransformed.fields['linkTitle'] = item.fields.link_title; itemTransformed.fields['linktype'] = item.fields.linktype || ''; itemTransformed.fields['siteid'] = item.fields.siteid || ''; itemTransformed.fields['target'] = item.fields.target || ''; //class to make the link like a button itemTransformed.fields.link_format_class = 'GDHeaderTop__CTA__a brandbackground'; const linkFormat = itemTransformed.fields.linkFormat || itemTransformed.fields.link_format; if (linkFormat && linkFormat.toLowerCase().indexOf('link') > -1) { //this class will make it look like link instead of button itemTransformed.fields.link_format_class = 'GDHeaderTop__Home__a'; } return itemTransformed; } getSiteId() { if (this.isCompilation) { return this.SCSCompileAPI.siteInfo.properties.customProperties.SITE_ID || this.SCSCompileAPI.getSiteId(); } else { return SCS.siteInfo.properties.customProperties.SITE_ID || SCS.siteId; } } /** * @param {IR | RAW | ISO} mode * @returns IR: lg-rg, RAW: lg-x-RG|lg-RG, ISO: lg-RG */ getPageLanguageCode(mode = 'ND') { let localCode = 'en'; if (this.isCompilation) { localCode = this.SCSCompileAPI.pageLocale || localCode; } else { localCode = (SCSRenderAPI && SCSRenderAPI.getPageLocaleAlias()) || SCS.localeAlias || SCS.pageLanguageCode || localCode; } mode = mode.toUpperCase(); if (mode == 'IR') { localCode = localCode.toLowerCase(); } if (mode == 'RAW') { if (this.isCompilation) { localCode = this.SCSCompileAPI.siteInfo.properties.localeAliases[localCode] || localCode; } else { localCode = SCS.siteInfo.properties.localeAliases[localCode] || localCode; } } if (mode == 'ISO') { if (this.isCompilation) { localCode = this.SCSCompileAPI.siteInfo.properties.localeAliases[localCode] || localCode; } else { localCode = SCS.siteInfo.properties.localeAliases[localCode] || localCode; } if (localCode.indexOf('-x-') > -1) { const ls = localCode.split('-x-'); if (ls.length > 0) { localCode = ls[0] + '-' + ls[ls.length - 1].toUpperCase(); } } } console.log('HEADER2:MODE:PAGELANG', mode, localCode); return localCode; } getLanguageCodeNormalized(locale) { let languageCode = locale ? locale : ''; const languageCodeSplit = languageCode.split('-'); languageCode = languageCodeSplit[0]; if (languageCodeSplit[languageCodeSplit.length - 1] && languageCodeSplit[1]) { languageCode = languageCode + '-' + languageCodeSplit[languageCodeSplit.length - 1]; } return languageCode; } getLanguageFromLocale(locale) { let languageCode = locale ? locale : ''; const languageCodeSplit = languageCode.split('-'); languageCode = languageCodeSplit[0]; return languageCode; } getCountryCodeFromLocale(locale) { let countryCode = ''; const localeSplit = locale.split('-'); if (localeSplit.length > 1) { countryCode = localeSplit[localeSplit.length - 1].toLowerCase(); } else { countryCode = ''; } return countryCode; } getRedirectRules(model) { if (model.redirectRules) { return model.redirectRules; } else { model.redirectRules = []; const redirectJson = model.fields.domain_redirect_rules_json || model.fields.domainRedirectRulesJson || {}; if (redirectJson && redirectJson.list && redirectJson.list.length > 0) { model.redirectRules = redirectJson.list.reduce((acc, cur, i) => { let locale = ''; if (cur.locale.indexOf('-go') > -1) { locale = cur.locale; } else { locale = this.getLanguageCodeNormalized(cur.locale); } acc[locale.toLowerCase()] = cur.domain; return acc; }, {}); } return model.redirectRules; } } setCookies(url, siteId, lang, userRegLang) { document.cookie = 'url=' + url + '; path=/'; document.cookie = siteId + '#lang=' + lang.toLowerCase() + '; path=/'; document.cookie = 'userRegLang' + '#lang=' + userRegLang.toLowerCase() + '; path=/'; this.cookieLang = { cookieLanguageCode: lang.toLowerCase(), userRegLang: userRegLang.toLowerCase() }; } getCookies() { if (this.cookieLang) { return this.cookieLang; } else { const siteId = SCS.siteId; let cookieLanguageCode = 'ND'; let userRegLang = 'ND'; const cookieArr = document.cookie.split(';').map((ck) => { return { [ck.split('=')[0].trim()]: ck.split('=')[1] }; }); cookieArr.forEach((item) => { if (item[siteId + '#lang']) { cookieLanguageCode = item[siteId + '#lang']; } if (item['userRegLang#lang']) { userRegLang = item['userRegLang#lang']; } }); this.cookieLang = { cookieLanguageCode: cookieLanguageCode, userRegLang: userRegLang }; return this.cookieLang; } } setEventCountrySelector(countryCollection) { for (let i = 0; i < countryCollection.length; i++) { const country = countryCollection[i]; country.addEventListener('click', (event) => { const url = country.getAttribute('href'); const lang = country.dataset['cx-lang'] || country.dataset.cxLang; const countryCode = country.dataset['cx-flag'] || country.dataset.cxFlag; const siteId = country.dataset['cx-site'] || SCS.siteId; this.setCookies(url, siteId, lang, lang + '-' + countryCode); }); } } /** * Creates the header menu with all the child elements. * * @param {content} model */ callMenu(model) { const self = this; var id1 = 1; var menu = []; var styleLevelGlobal; const repetedItems = []; for (let i = 0; i < model.fields?.level1Items?.length; i++) { const navNode = model.fields.level1Items[i]; let repeted = false; repetedItems.forEach((item) => { if (item == navNode?.name) { repeted = true; } }); !repeted ? repetedItems.push(navNode?.name) : (navNode.fields.headerChildItems = []); } for (let i = 0; i < model.fields?.level1Items?.length; i++) { const navNode = model.fields.level1Items[i]; addNavMenu(navNode); } model['menu'] = menu; function addNavMenu(navNode) { const name = navNode?.type.indexOf('-LinkItem') > -1 ? navNode?.fields?.linkTitle : getCurrentNodeName(navNode); let image = navNode?.type.indexOf('-LinkItem') > -1 ? '' : getCurrentNodeImage(navNode); if (navNode?.fields?.mediaFile?.fields?.renditions) { if (navNode.fields.mediaFile.fields.renditions[1]) { image = navNode.fields.mediaFile.fields.renditions[1].file.url; } else { image = navNode.fields.mediaFile.fields.renditions[0].file.url; } } navNode = manageCTALink(navNode); const link_url = navNode.fields.full_link; const linktype = navNode.fields.linktype || ''; const siteid = navNode.fields.siteid || ''; const target = navNode.fields.target || '_self'; const currentNode = { id: id1, name: name, image: image, dd_after: '', afterTriangle: '', link: link_url, style: '', children: [], showSubMenu: '', linktype: linktype, siteid: siteid, target: target, }; if (navNode?.fields?.headerChildItems?.length > 0) { addSubMenu(navNode, currentNode, 2); menu.push(currentNode); } else { menu.push(currentNode); } id1++; } function addSubMenu(navNode, currentNode, levelNumber) { let style = '', scroller = ''; const dynamicID = []; const mobiledynamicID = []; let childNode; for (let k = 0; k < navNode?.fields?.headerChildItems?.length; k++) { dynamicID.push('S' + id1 + k); mobiledynamicID.push('MS' + id1 + k); } styleLevelGlobal = 0; currentNode.style = 'width: 250px; left: -100px;'; for (let j = 0; j < navNode?.fields?.headerChildItems?.length; j++) { childNode = navNode?.fields?.headerChildItems[j] ? navNode?.fields?.headerChildItems[j] : ''; currentNode.dd_after = 'dd_after'; currentNode.afterTriangle = 'afterTriangle'; currentNode.showSubMenu = true; const name = childNode?.type?.indexOf('-LinkItem') > -1 ? childNode?.fields?.linkTitle : getCurrentNodeName(childNode); const header_description = childNode?.fields?.headerDescription; let image = childNode?.type?.indexOf('-LinkItem') > -1 ? '' : getCurrentNodeImage(childNode); if (childNode?.fields?.mediaFile?.fields?.renditions) { if (childNode.fields.mediaFile.fields.renditions[1]) { image = childNode.fields.mediaFile.fields.renditions[1].file.url; } else { image = childNode.fields.mediaFile.fields.renditions[0].file.url; } } style = image ? 'width: 500px; left: -200px;' : style; currentNode.style = style; let dd_after2 = image ? ' dd_after2' : ''; if (childNode?.fields?.headerChildItems?.length > 0) { dd_after2 = ' dd_after2'; } childNode = manageCTALink(childNode); const link_url = childNode.fields.full_link; const linktype = childNode.fields.linktype || ''; const siteid = childNode.fields.siteid || ''; const target = childNode.fields.target || '_self'; if (navNode?.fields?.headerChildItems) { scroller = navNode?.fields?.headerChildItems?.length > 6 ? '