{"version":3,"file":"render.mjs","sources":["src/common.mjs","src/render.mjs"],"sourcesContent":["/**\r\n * Common utilities class\r\n * Invoked by both render.mjs and compile.mjs\r\n */\r\nexport default class {\r\n\t/**\r\n\t * Fetch a set of assets of a given type based on a set of id values\r\n\t * @param {array} arIDs array of id strings representing assets to fetch\r\n\t * @param {string} strAssetType the asset type represented by the id values\r\n\t * @param {object} contentClient Content client used to fetch assets\r\n\t * @param {string} strFields comma separated list of fields to fetch\r\n\t * @returns object response from the server, hopefully with a .items result\r\n\t */\r\n\tstatic async fetchAssets(arIDs, strAssetType, contentClient, strFields = 'all') {\r\n\t\t// Assemble the id values together as a set of\r\n\t\t// 'id eq \"somevalue\"' strings joined together with \"or\" statements\r\n\t\tconst strIDs = arIDs.map((id) => `id eq \"${id}\"`).join(' OR ');\r\n\r\n\t\t// Assemble the full query string\r\n\t\tconst strQuery = `(type eq \"${strAssetType}\" AND (${strIDs}))`;\r\n\t\t// Perform our search\r\n\r\n\t\t//response data\r\n\t\tconst objToReturn = await contentClient.queryItems({\r\n\t\t\tq: strQuery, \r\n\t\t\tfields: strFields,\r\n\t\t\tlinks: 'none',\r\n\t\t});\r\n\t\treturn objToReturn;\r\n\t}\r\n\r\n\t/**\r\n\t * TODO Write a description\r\n\t * @param {Object} contentClient\r\n\t * @returns Object - the site configuration asset fields requested\r\n\t */\r\n\tstatic async fetchSiteConfig(contentClient, api) {\r\n\t\tconst strSiteConfigID = api.getCustomSiteProperty('siteConfig');\r\n\t\tconst objSiteConfig = await contentClient.getItem({\r\n\t\t\tid: strSiteConfigID,\r\n\t\t\texpand: 'fields.partner_login,fields.sidebar_link,fields.column_1,fields.column_2,fields.column_3,fields.column_4,fields.column_5,fields.alerts',\r\n\t\t\tlinks: 'none',\r\n\t\t});\r\n\t\treturn objSiteConfig;\r\n\t}\r\n\r\n\t// TODO Document me with JSDocs\r\n\tstatic checkAlertDate(alertVal) {\r\n\t\tconst startDate = new Date(alertVal.fields.start_date.value);\r\n\t\tconst endDate = new Date(alertVal.fields.end_date.value);\r\n\t\tconst currentDate = new Date();\r\n\t\treturn currentDate > startDate && currentDate < endDate;\r\n\t}\r\n\r\n\t// TODO Document me with JSDocs\r\n\tstatic async getAlert(objModel, contentClient, pageCategory) {\r\n\t\tconst self = this;\r\n\r\n\t\tif (!objModel?.fields?.alerts) return false;\r\n\t\t//grab all of the alerts\r\n\t\tconst arMessageIds = objModel.fields.alerts.map((i) => i.id);\r\n\t\t//(arIDs, strAssetType, contentClient, strFields)\r\n\t\tconst alertFields =\r\n\t\t\t'fields.category,fields.cta_link,fields.cta_text,fields.end_date,fields.message,fields.start_date,fields.type';\r\n\t\tconst objPageAlert = await self.fetchAssets(\r\n\t\t\tarMessageIds,\r\n\t\t\t'MNH_Alert',\r\n\t\t\tcontentClient,\r\n\t\t\talertFields\r\n\t\t);\r\n\t\t//Filter the alerts into categories\r\n\t\tlet arPageAlerts = objPageAlert.items.filter((i) => i.fields.category === pageCategory);\r\n\t\t//if there's no page alerts check for global alerts\r\n\t\tif (arPageAlerts.length === 0) {\r\n\t\t\tarPageAlerts = objPageAlert.items.filter((i) => i.fields.category === 'global');\r\n\t\t\t//make sure it's in an active date range\r\n\t\t\tif (arPageAlerts.length > 0) {\r\n\t\t\t\tarPageAlerts = arPageAlerts.filter(self.checkAlertDate);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tarPageAlerts = arPageAlerts.filter(self.checkAlertDate);\r\n\t\t}\r\n\t\tlet arEmergencyAlerts = arPageAlerts.filter(i => i.fields.type === 'emergency');\r\n\t\tlet arRegularAlerts = arPageAlerts.filter(i => i.fields.type === 'announcement');\r\n\t\tlet arAlertsToReturn = [...arEmergencyAlerts.slice(-1), ...arRegularAlerts.slice(-1)];\r\n\t\t\r\n\t\treturn arAlertsToReturn.length > 0 && arAlertsToReturn || false;\r\n\t}\r\n\r\n\tstatic async createSecureLoginHTML(objCommonContext) {\r\n\t\tconst Mustache = objCommonContext.Mustache;\r\n\t\tconst contentClient = objCommonContext.contentClient;\r\n\t\tconst loginTemplate = objCommonContext.loginTemplate;\r\n\t\tconst api = objCommonContext.api;\r\n\r\n\t\tconst strLoginMessageId = api.getCustomSiteProperty('loginAsset');\r\n\t\tif (!strLoginMessageId) return false;\r\n\t\tconst loginAsset = await contentClient.getItem({\r\n\t\t\t'id': strLoginMessageId,\r\n\t\t});\r\n\r\n\t\tlet model = {\r\n\t\t\tloginMessage: loginAsset.fields.content[2] ? loginAsset.fields.content[0] : null,\r\n\t\t\tlenderButtonLinkText: loginAsset.fields.content[2]\r\n\t\t\t\t? loginAsset.fields.content[1]\r\n\t\t\t\t: loginAsset.fields.content[0],\r\n\t\t\tloanCommitmentSystemLink: loginAsset.fields.content[2]\r\n\t\t\t\t? loginAsset.fields.content[2]\r\n\t\t\t\t: loginAsset.fields.content[1],\r\n\t\t};\r\n\t\tmodel.noText = model.loginMessage === null ? 'noText' : '';\r\n\r\n\t\t// Renders the secure login component using the Mustache template\r\n\t\tconst htmlSecureLogin = Mustache.render(loginTemplate, model);\r\n\t\treturn htmlSecureLogin;\r\n\t}\r\n\r\n\t// TODO Document me with JSDocs\r\n\tstatic async shapeData(objCommonContext) {\r\n\t\tconst self = this;\r\n\t\t// extract all the required dependencies from the context\r\n\t\tconst Mustache = objCommonContext.Mustache;\r\n\t\tconst customSettingsData = objCommonContext.customSettingsData;\r\n\t\tlet template = objCommonContext.template;\r\n\t\tconst contentClient = objCommonContext.contentClient;\r\n\t\tconst api = objCommonContext.api;\r\n\r\n\t\t// fetch the site config used to create the model\r\n\t\tconst objModel = await self.fetchSiteConfig(contentClient, api);\r\n\r\n\t\t// extract the original values (or apply default values)\r\n\t\t// const layout = (objCommonContext.args && objCommonContext.args.componentLayout) || componentLayout || 'default'\r\n\t\tconst customData =\r\n\t\t\t(objCommonContext.args && objCommonContext.args.customSettingsData) ||\r\n\t\t\tcustomSettingsData ||\r\n\t\t\t{};\r\n\r\n\t\tcustomData.nls = customData.nls || {};\r\n\r\n\t\t//adds the skip links to the model\r\n\t\tif (customSettingsData.nls.skipLinks) {\r\n\t\t\tobjModel.fields.skipLinks = customSettingsData.nls.skipLinks;\r\n\t\t} else {\r\n\t\t\tobjModel.fields.skipLinks = 'Skip to main content';\r\n\t\t}\r\n\r\n\t\tobjModel.fields.print_logo.src = contentClient.getRenditionURL({\r\n\t\t\tid: objModel.fields.print_logo.id,\r\n\t\t});\r\n\r\n\t\tobjModel.fields.logo.src = contentClient.getRenditionURL({\r\n\t\t\tid: objModel.fields.logo.id,\r\n\t\t});\r\n\r\n\t\t// provide the link for the header's logo that points to the root page of the site\r\n\t\tobjModel.fields.header_href = objCommonContext.boolNotMain\r\n\t\t\t? 'https://mnhousing.gov/index.html'\r\n\t\t\t: objCommonContext.pageRootLink.href;\r\n\r\n\t\t// use the array to ask the content client for the assets\r\n\t\tconst arConsolidatedColumns = objModel.fields.column_1\r\n\t\t\t.concat(\r\n\t\t\t\tobjModel.fields.column_2,\r\n\t\t\t\tobjModel.fields.column_3,\r\n\t\t\t\tobjModel.fields.column_4,\r\n\t\t\t\tobjModel.fields.column_5\r\n\t\t\t)\r\n\t\t\t.filter((i) => i != null);\r\n\r\n\t\t// fetch all the link assets contained in columns 1-5\r\n\t\tconst arConsolidatedLinks = [];\r\n\t\tarConsolidatedColumns.forEach((objColumn) => {\r\n\t\t\tif (objColumn.fields.primary_link) {\r\n\t\t\t\tarConsolidatedLinks.push(objColumn.fields.primary_link);\r\n\t\t\t}\r\n\t\t\tobjColumn.fields.link &&\r\n\t\t\t\tobjColumn.fields.link.forEach((objLink) => {\r\n\t\t\t\t\tarConsolidatedLinks.push(objLink);\r\n\t\t\t\t});\r\n\t\t});\r\n\t\t// grab all the link assets contained in the sidebar\r\n\t\tobjModel.fields.sidebar_link.forEach((objItem) => {\r\n\t\t\t// we don't need to fetch the direct links in the sidebar, just any children of the sidebar items\r\n\t\t\tif (objItem.type == 'MNH_Social-Bar') {\r\n\t\t\t\tobjItem.fields.link.forEach((objLink) => {\r\n\t\t\t\t\tarConsolidatedLinks.push(objLink);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// fetch all the link assets contained in the megamenu\r\n\t\tconst arLinkIds = arConsolidatedLinks.map((i) => i.id);\r\n\t\t//arIDs, strAssetType, contentClient, strFields\r\n\t\tconst linkFields =\r\n\t\t\t'id,fields.dark_icon,fields.icon,fields.url,fields.innerText,fields.target,fields.link_description,fields.anchor_id';\r\n\t\tconst objConsolidatedLinks = await self.fetchAssets(\r\n\t\t\tarLinkIds,\r\n\t\t\t'MNH_Link',\r\n\t\t\tcontentClient,\r\n\t\t\tlinkFields\r\n\t\t);\r\n\r\n\t\t//Check for alerts\r\n\t\tconst objPageAlert = await self.getAlert(\r\n\t\t\tobjModel,\r\n\t\t\tcontentClient,\r\n\t\t\tapi.getCustomPageProperty('pageCategory')\r\n\t\t);\r\n\r\n\t\t// create a map of consolidated links by id for easy lookup\r\n\t\tlet mapLinkAssets = new Map();\r\n\t\tobjConsolidatedLinks.items.forEach((i) => {\r\n\t\t\tmapLinkAssets.set(i.id, i);\r\n\t\t});\r\n\r\n\t\t// replace the link objects in the sidebar with the fetched link assets\r\n\t\tobjModel.fields.sidebar_link.forEach((item, i) => {\r\n\t\t\tif (item.type == 'MNH_Social-Bar') {\r\n\t\t\t\titem.fields.isSocialBar = true;\r\n\r\n\t\t\t\titem.fields.link.forEach((link, index) => {\r\n\t\t\t\t\titem.fields.link[index] = mapLinkAssets.get(link.id) || {};\r\n\t\t\t\t});\r\n\t\t\t\titem.fields.link.forEach((link, index) => {\r\n\t\t\t\t\tif (link && link.fields.dark_icon && link.fields.dark_icon.id) {\r\n\t\t\t\t\t\titem.fields.link[index].fields.icon.url = contentClient.getRenditionURL({\r\n\t\t\t\t\t\t\tid: item.fields.link[index].fields.dark_icon.id,\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (link && link.fields.icon && link.fields.icon.id) {\r\n\t\t\t\t\t\titem.fields.link[index].fields.icon.url = contentClient.getRenditionURL({\r\n\t\t\t\t\t\t\tid: item.fields.link[index].fields.icon.id,\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t// if we're still here, it's a regular link\r\n\t\t\titem.fields.isSocialBar = false;\r\n\t\t});\r\n\r\n\t\t// replace the link objects in the columns with the fetched link assets\r\n\t\tObject.keys(objModel.fields)\r\n\t\t\t.filter((property) => property.startsWith('column_'))\r\n\t\t\t.forEach((column) => {\r\n\t\t\t\tif (objModel.fields[column] == null) return;\r\n\t\t\t\t// loop through the column items and replace the link asset with the consolidated link asset\r\n\t\t\t\tobjModel.fields[column].forEach((item, index) => {\r\n\t\t\t\t\t//foreach category block in this column\r\n\t\t\t\t\t// set the primary link asset\r\n\t\t\t\t\tif (item.fields.primary_link) {\r\n\t\t\t\t\t\tobjModel.fields[column][index].fields.primary_link = mapLinkAssets.get(\r\n\t\t\t\t\t\t\titem.fields.primary_link.id\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (item.fields.link) {\r\n\t\t\t\t\t\t// set the link assets\r\n\t\t\t\t\t\tobjModel.fields[column][index].fields.link = item.fields.link.map(\r\n\t\t\t\t\t\t\t(i) => mapLinkAssets.get(i.id) || {}\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tobjModel.fields[column][index].fields.image.url = contentClient.getRenditionURL(\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tid: item.fields.image.id,\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t// Shape objModel for the Mustache template\r\n\r\n\t\tobjModel.fields.page_alerts = objPageAlert.length > 0 ? [...objPageAlert.map(i => {\r\n\t\t\treturn {\r\n\t\t\t\t...i.fields,\r\n\t\t\t\ticonType: i.fields.type === 'announcement' ? 'info' : 'warning',\r\n\t\t\t\tid: i.id\r\n\t\t\t}\r\n\t\t})] : false;\r\n\r\n\t\t//// megamenu\r\n\t\tobjModel.fields.columns = {\r\n\t\t\titems: [\r\n\t\t\t\t{\r\n\t\t\t\t\tblocks: objModel.fields.column_1,\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tblocks: objModel.fields.column_2,\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tblocks: objModel.fields.column_3,\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tblocks: objModel.fields.column_4,\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tblocks: objModel.fields.column_5,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t};\r\n\t\t// remove empty columns\r\n\t\tobjModel.fields.columns.items = objModel.fields.columns.items.filter(\r\n\t\t\t(i) => i.blocks != null\r\n\t\t);\r\n\t\t/**\r\n\t\t * Expand custom macros in the returned HTML\r\n\t\t * @param {string} strInput\r\n\t\t * @returns {string} HTML string with macros expanded\r\n\t\t */\r\n\t\treturn objModel;\r\n\t\t// render the component\r\n\t}\r\n\r\n\tstatic renderMustacheTemplate(context, template, objModel, boolNotMain) {\r\n\t\ttry {\r\n\t\t\ttemplate = context.Mustache.render(template, objModel);\r\n\t\t\tif (!boolNotMain) {\r\n\t\t\t\t// replace \"[[page-221]]\" with \"[!--$SCS_PAGE--]221[/!--$SCS_PAGE--]\"\r\n\t\t\t\tlet strOutput = template.replace(\r\n\t\t\t\t\t/\\[\\[page-(\\d+)\\]\\]/g,\r\n\t\t\t\t\t'[!--$SCS_PAGE--]$1[/!--$SCS_PAGE--]'\r\n\t\t\t\t);\r\n\r\n\t\t\t\t// replace \"[[asset-221]]\" with \"[!--$CEC_DIGITAL_ASSET--]221[/--$CEC_DIGITAL_ASSET--]\"\r\n\t\t\t\tstrOutput = strOutput.replace(\r\n\t\t\t\t\t/\\[\\[asset-(\\d+)\\]\\]/g,\r\n\t\t\t\t\t'[!--$CEC_DIGITAL_ASSET--]$1[/!--$CEC_DIGITAL_ASSET--]'\r\n\t\t\t\t);\r\n\r\n\t\t\t\tstrOutput = context.contentClient.expandMacros(strOutput);\r\n\t\t\t\treturn strOutput;\r\n\t\t\t} else {\r\n\t\t\t\tlet strOutput = template;\r\n\t\t\t\tconst structureMap = JSON.parse(objModel.fields.structure_map);\r\n\t\t\t\tfor (const [key, value] of Object.entries(structureMap)) {\r\n\t\t\t\t\tstrOutput = strOutput.replaceAll(\r\n\t\t\t\t\t\t`[[page-${value.id}]]`,\r\n\t\t\t\t\t\t'https://mnhousing.gov/' + value.pageUrl\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tstrOutput = strOutput.replace(\r\n\t\t\t\t\t/\\[\\[asset-(\\d+)\\]\\]/g,\r\n\t\t\t\t\t'[!--$CEC_DIGITAL_ASSET--]$1[/!--$CEC_DIGITAL_ASSET--]'\r\n\t\t\t\t);\r\n\t\t\t\tstrOutput = context.contentClient.expandMacros(strOutput);\r\n\t\t\t\treturn strOutput;\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\tconsole.log('Failed to expand Mustache template.', e);\r\n\t\t\treturn '';\r\n\t\t}\r\n\t}\r\n}\r\n","import CommonUtils from './common.mjs';\r\n\r\n// The Custom Component class will be the \"default\" export from the module\r\nexport default class {\r\n\tconstructor(args) {\r\n\t\t// store the args\r\n\t\tthis.id = args.id;\r\n\r\n\t\t// store the path to the /assets folder\r\n\t\tthis.assetsPath = import.meta.url.replace('/render.mjs', '');\r\n\r\n\t\t// get the OCM environment resources\r\n\t\tthis.sitesSDK = args.SitesSDK;\r\n\t\tthis.Mustache = SCSRenderAPI.getMustache();\r\n\t\tthis.loginTimeInHours = 24;\r\n\t\tthis.expires = new Date();\r\n\t\tthis.expires.setTime(this.expires.getTime() + this.loginTimeInHours * 60 * 60 * 1000);\r\n\t}\r\n\r\n\t// Checks the 'sitePasscode' site property and storage if a password is saved,\r\n\t// if they password isn't saved, it will hide the page content and displays the secure login screen.\r\n\t// If the correct password is saved in the local storage, the secure login will not show\r\n\tasync secureLogin() {\r\n\t\tconst elBreadcrumbs = document.querySelector('#layout-breadcrumbs');\r\n\t\tif (document.querySelector('.secure-login') && elBreadcrumbs) {\r\n\t\t\t// move .secure-login to the end of the breadcrumbs\r\n\t\t\telBreadcrumbs.appendChild(document.querySelector('.secure-login'));\r\n\t\t}\r\n\t\t// get the site passcode (if it's set)\r\n\t\tconst strSitePropertyPasscode = SCSRenderAPI.getCustomSiteProperty('sitePasscode');\r\n\r\n\t\t// look for a cookie with the key sitePasscode\r\n\t\tconst cookies = new URLSearchParams(document.cookie.replace(/; ?/g, '&'));\r\n\t\tconst strSessionPasscode = cookies.get('sitePasscode');\r\n\r\n\t\t// don't show the component at all in site builder\r\n\t\tif (\r\n\t\t\tSCSRenderAPI.getRenderMode() === SCSRenderAPI.RENDER_MODE_NAVIGATE ||\r\n\t\t\tSCSRenderAPI.getRenderMode() === SCSRenderAPI.RENDER_MODE_EDIT\r\n\t\t) {\r\n\t\t\tdocument.querySelector('.secure-login')?.classList.remove('showing');\r\n\t\t\tdocument.querySelectorAll('.scs-slot').forEach((el) => el.classList.add('showing'));\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (strSitePropertyPasscode && strSitePropertyPasscode.length > 0) {\r\n\t\t\tif (strSitePropertyPasscode !== strSessionPasscode) {\r\n\t\t\t\t// Hides the page content and displays the secure login screen\r\n\t\t\t\tdocument.querySelector('#slot-header').classList.add('showing');\r\n\t\t\t\tdocument.querySelector('#slot-footer').classList.add('showing');\r\n\r\n\t\t\t\t// we definitely need to show the login screen at this point. lets go get the asset\r\n\t\t\t\t// Gets the login asset by ID using the content client\r\n\t\t\t\tif (!document.querySelector('.secure-login')) {\r\n\t\t\t\t\tlet layouts = await SCSRenderAPI.importText(this.assetsPath + '/login.html');\r\n\t\t\t\t\tconst objCommonContext = {\r\n\t\t\t\t\t\tMustache: this.Mustache,\r\n\t\t\t\t\t\tcontentClient: this.sitesSDK.getProperty('contentClient'),\r\n\t\t\t\t\t\tloginTemplate: layouts,\r\n\t\t\t\t\t\tapi: SCSRenderAPI,\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t// use the objCommonContext to generate the HTML for this component\r\n\t\t\t\t\tconst htmlSecureLogin = await CommonUtils.createSecureLoginHTML(\r\n\t\t\t\t\t\tobjCommonContext\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\t//Appends the secure login component to the breadcrumbs. This is so the breadcrumbs still show above the login.\r\n\t\t\t\t\telBreadcrumbs.innerHTML = elBreadcrumbs.innerHTML + htmlSecureLogin;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdocument.querySelector('.secure-login')?.classList.add('showing');\r\n\t\t\t} else {\r\n\t\t\t\t// No need to call the rest of the function if the password is correct\r\n\t\t\t\t// refresh the cookie to keep the user logged in\r\n\t\t\t\tdocument.querySelector('.secure-login')?.classList.remove('showing');\r\n\t\t\t\tdocument.querySelectorAll('.scs-slot').forEach((el) => el.classList.add('showing'));\r\n\t\t\t\tdocument.cookie = `sitePasscode=${strSessionPasscode};expires=${this.expires.toUTCString()};path='/'`;\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// No need to call the rest of the function if there is no passcode\r\n\t\t\tdocument.querySelector('.secure-login')?.classList.remove('showing');\r\n\t\t\tdocument.querySelectorAll('.scs-slot').forEach((el) => {\r\n\t\t\t\tif (el.children.length > 0) el.classList.add('showing');\r\n\t\t\t});\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tasync secureLoginHandlers() {\r\n\t\tconst strSitePropertyPasscode = SCSRenderAPI.getCustomSiteProperty('sitePasscode');\r\n\t\tlet elPasswordInput = document.querySelector('.passcode');\r\n\t\tlet elTogglePasswordVisibility = document.querySelector('.eyebutton');\r\n\r\n\t\t//when the eye on the password field is clicked, it shows the password texted. Clicking it again will revert the password back to the secured dots.\r\n\t\telTogglePasswordVisibility.addEventListener('click', () => {\r\n\t\t\tif (elPasswordInput.type == 'password') {\r\n\t\t\t\telPasswordInput.type = 'text';\r\n\t\t\t\telTogglePasswordVisibility.innerHTML = 'visibility';\r\n\t\t\t} else {\r\n\t\t\t\telPasswordInput.type = 'password';\r\n\t\t\t\telTogglePasswordVisibility.innerHTML = 'visibility_off';\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Create a function to check if the provided password is valid\r\n\t\tfunction checkPassword(userInputtedPasscode, strSitePropertyPasscode) {\r\n\t\t\t// Check if the provided password is the same as the valid password\r\n\t\t\treturn userInputtedPasscode === strSitePropertyPasscode;\r\n\t\t}\r\n\r\n\t\tdocument.querySelector('form#secure-login').addEventListener('submit', (e) => {\r\n\t\t\ttry {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tlet passcodeField = document.querySelector('.passcode-field');\r\n\t\t\t\tpasscodeField.classList.remove('show-helper-text');\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tcheckPassword(\r\n\t\t\t\t\t\tdocument.querySelector('.passcode').value,\r\n\t\t\t\t\t\tstrSitePropertyPasscode,\r\n\t\t\t\t\t\tthis.loginTimeInHours\r\n\t\t\t\t\t)\r\n\t\t\t\t) {\r\n\t\t\t\t\tdocument.querySelector('.secure-login').classList.remove('showing');\r\n\t\t\t\t\tdocument\r\n\t\t\t\t\t\t.querySelectorAll('.scs-slot')\r\n\t\t\t\t\t\t.forEach((el) => el.classList.add('showing'));\r\n\t\t\t\t\tdocument.cookie = `sitePasscode=${strSitePropertyPasscode};Expires=${this.expires.toGMTString()};path='/'`;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\tpasscodeField.classList.add('show-helper-text');\r\n\t\t\t\t\t}, 200);\r\n\t\t\t\t}\r\n\t\t\t} catch (error) {\r\n\t\t\t\tconsole.log(error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Add in the listeners for the triggers/actions and whenever the settings values change\r\n\t * In this case, we want to re-render the component on the screen\r\n\t */\r\n\taddEventListeners() {\r\n\t\t// listen for settings update\r\n\t\tthis.sitesSDK.subscribe(this.sitesSDK.MESSAGE_TYPES.SETTINGS_UPDATED, (props) => {\r\n\t\t\tif (props.property === 'customSettingsData') {\r\n\t\t\t\tthis.renderComponent({\r\n\t\t\t\t\tcustomSettingsData: props.value,\r\n\t\t\t\t});\r\n\t\t\t} else if (props.property === 'componentLayout') {\r\n\t\t\t\tthis.renderComponent({\r\n\t\t\t\t\tcomponentLayout: props.value,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Add in the click handlers for search, menu, and alert\r\n\t * @param {HTMLElement} container\r\n\t */\r\n\taddClickHandlers(container) {\r\n\t\t// mobile search button\r\n\t\tdocument.arrive('.js-toggleMobileSearch', { onceOnly: false, existing: true }, (btn) => {\r\n\t\t\tbtn.addEventListener('click', () => {\r\n\t\t\t\tdocument.querySelectorAll('.hdrSearchBox').forEach((box) => {\r\n\t\t\t\t\t// If the box has content, then we want to run this.doSearch() instead of toggling the search box\r\n\t\t\t\t\t// ONLY if the search box is currently visible\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tbox.value &&\r\n\t\t\t\t\t\tdocument.querySelector('.mobileSearchField').classList.contains('active')\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tthis.doSearch(box.value);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tdocument.querySelector('.mobileSearchField').classList.toggle('active');\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\t// add in the click handler for the menu button\r\n\t\tdocument.arrive('.hdrMenu', { onceOnly: true, existing: true }, (menuBtn) => {\r\n\t\t\tmenuBtn.addEventListener('click', () => {\r\n\t\t\t\tthis.toggleMegaMenu();\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\t// add in the click handler for the alert Button\r\n\t\tdocument.arrive('.alertBanner .icon', { onceOnly: false, existing: true }, (alertBtn) => {\r\n\t\t\tconst alert = alertBtn.parentElement.parentElement;\r\n\t\t\talertBtn.addEventListener('click', () => {\r\n\t\t\t\tsessionStorage.setItem(`alert-${alert.dataset.id}`, true);\r\n\t\t\t\talert.remove();\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\t//Search Button Handlers\r\n\t\t//When the search icon is clicked, the doSearch function runs with the search value as a parameter\r\n\t\tdocument.arrive('.searchIcon', { onceOnly: true, existing: true }, (elSearchIcon) => {\r\n\t\t\telSearchIcon.addEventListener('click', () => {\r\n\t\t\t\tconst strSearchTerm = document.querySelector('input.hdrSearchBox').value || '';\r\n\t\t\t\tif (strSearchTerm) {\r\n\t\t\t\t\tthis.doSearch(strSearchTerm);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\t//When the user presses Enter while in the search bar, the doSearch function runs with the search value as a parameter\r\n\t\tdocument.arrive('.hdrSearchBox', { onceOnly: false, existing: true }, (elSearchBox) => {\r\n\t\t\telSearchBox.addEventListener('keyup', (event) => {\r\n\t\t\t\tconst strSearchTerm = event.target.value;\r\n\t\t\t\tif (strSearchTerm) {\r\n\t\t\t\t\tif (event.keyCode === 13) {\r\n\t\t\t\t\t\tthis.doSearch(strSearchTerm);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a search query of the search bar value to the url and redirects the page to the search results page\r\n\t * @param {string} strSearchVal\r\n\t * @returns {void}\r\n\t * @example this.doSearch('search term')\r\n\t */\r\n\tdoSearch(strSearchVal) {\r\n\t\tconst strSearchPageID = Object.values(SCS.structureMap).find((i) => i.isSearchPage).id;\r\n\r\n\t\tconst strSearchURL = `${window.origin}${\r\n\t\t\tSCSRenderAPI.getPageLinkData(strSearchPageID).href\r\n\t\t}?s=${strSearchVal}&match=exact`;\r\n\t\twindow.location = strSearchURL;\r\n\t}\r\n\r\n\t/**\r\n\t * Toggles the mega menu\r\n\t * @returns {void}\r\n\t * @example this.toggleMegaMenu()\r\n\t */\r\n\ttoggleMegaMenu() {\r\n\t\tconst self = this;\r\n\t\tconst menuIcon = document.querySelector('.hdrMenuIcon');\r\n\t\tconst megaMenu = document.querySelector('.megamenu');\r\n\t\tconst menuActive = megaMenu.classList.contains('active') ? true : false;\r\n\t\tlet iconContent = 'menu';\r\n\r\n\t\tconst escapeKeyPressed = (e) => {\r\n\t\t\tif (e.keyCode === 27) {\r\n\t\t\t\tself.toggleMegaMenu();\r\n\t\t\t\tdocument.removeEventListener('keydown', escapeKeyPressed);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif (!menuActive) {\r\n\t\t\t// swap the icon\r\n\t\t\ticonContent = 'close';\r\n\r\n\t\t\t//create a backdrop\r\n\t\t\tconst elHeaderMask = document.createElement('div');\r\n\t\t\telHeaderMask.setAttribute('class', 'headerMask');\r\n\t\t\telHeaderMask.addEventListener('click', () => {\r\n\t\t\t\tthis.toggleMegaMenu();\r\n\t\t\t});\r\n\t\t\tdocument.querySelector('body').appendChild(elHeaderMask);\r\n\t\t\tdocument.addEventListener('keydown', escapeKeyPressed);\r\n\r\n\t\t\t// add accessibility attributes to the menu button\r\n\t\t\tdocument.querySelector('#megamenuButton').setAttribute('aria-expanded', 'true');\r\n\t\t\tdocument.querySelectorAll('.megamenu a').forEach((link) => {\r\n\t\t\t\tlink.setAttribute('tabindex', '1');\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\t// update accessibility attributes\r\n\t\t\tdocument.querySelector('#megamenuButton').removeAttribute('aria-expanded');\r\n\t\t\tdocument.querySelectorAll('.megamenu a').forEach((link) => {\r\n\t\t\t\tlink.setAttribute('tabindex', '-1');\r\n\t\t\t});\r\n\r\n\t\t\t// remove the backdrop\r\n\t\t\tif (document.querySelector('.headerMask')) {\r\n\t\t\t\tdocument.querySelector('.headerMask').remove();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tmegaMenu.classList.toggle('active');\r\n\t\tmenuIcon.innerHTML = iconContent;\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if the alert banner should be displayed\r\n\t * @returns {void}\r\n\t * @example this.checkAlert()\r\n\t */\r\n\tcheckAlert() {\r\n\t\tlet alertIds = document.querySelectorAll('.alertBanner')\r\n\t\tif (alertIds.length > 0) {\r\n\t\t\talertIds.forEach(alert => {\r\n\t\t\t\tif (sessionStorage.getItem(`alert-${alert.dataset.id}`) === null) {\r\n\t\t\t\t\talert.classList.remove('disabled')\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the component HTML\r\n\t */\r\n\tasync renderComponent() {\r\n\t\tconst componentResources = await Promise.all([\r\n\t\t\tSCSRenderAPI.importText(this.assetsPath + '/template.html'),\r\n\t\t\tSCSRenderAPI.importCSS(this.assetsPath + '/styles/design.css'),\r\n\t\t]);\r\n\t\tconst objCommonContext = {\r\n\t\t\tMustache: this.Mustache,\r\n\t\t\tcomponentLayout: this.sitesSDK.getProperty('componentLayout'),\r\n\t\t\tcustomSettingsData: this.sitesSDK.getProperty('customSettingsData'),\r\n\t\t\tcontentClient: this.sitesSDK.getProperty('contentClient'),\r\n\t\t\tnestedComponents: this.nestedComponents, // include any nested component definitions\r\n\t\t\ttemplate: componentResources[0],\r\n\t\t\tapi: SCSRenderAPI,\r\n\t\t\tpageRootLink: SCSRenderAPI.getPageLinkData(SCS.navigationRoot), //provides the link data for the top most parent\r\n\t\t\tboolNotMain: SCSRenderAPI.siteInfo.properties.siteName !== 'MN-Housing',\r\n\t\t};\r\n\t\t// use the objCommonContext to generate the HTML for this component\r\n\t\tconst objData = await CommonUtils.shapeData(objCommonContext);\r\n\t\tconst componentHtml = await CommonUtils.renderMustacheTemplate(\r\n\t\t\tobjCommonContext,\r\n\t\t\tobjCommonContext.template,\r\n\t\t\tobjData,\r\n\t\t\tobjCommonContext.boolNotMain\r\n\t\t);\r\n\t\t// replace the content of the container with the rendered HTML\r\n\t\treturn (this.container.innerHTML = componentHtml);\r\n\t}\r\n\r\n\tupdateUrls(container) {\r\n\t\tconst urls = container.querySelectorAll('a');\r\n\t\tconst hostname = window.parent.location.hostname;\r\n\t\tconst mnHousing = 'mnhousing.gov';\r\n\t\tconst wwwMNHousing = 'www.mnhousing.gov';\r\n\t\tconst ocmSitesUrl = window.parent.location.href.includes('oraclecloud.com/site/');\r\n\t\t[...urls].forEach((url) => {\r\n\t\t\tconst urlObj = new URL(url.href);\r\n\t\t\tif (\r\n\t\t\t\t(urlObj.origin === 'https://mnhousing.gov' ||\r\n\t\t\t\t\turlObj.origin === 'https://www.mnhousing.gov') &&\r\n\t\t\t\thostname !== mnHousing &&\r\n\t\t\t\thostname !== wwwMNHousing\r\n\t\t\t) {\r\n\t\t\t\tswitch (SCSRenderAPI.renderMode) {\r\n\t\t\t\t\tcase 'preview':\r\n\t\t\t\t\t\turl.setAttribute(\r\n\t\t\t\t\t\t\t'href',\r\n\t\t\t\t\t\t\t`/sites/preview/MN-Housing/en-US${urlObj.pathname}`\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'view':\r\n\t\t\t\t\t\turl.setAttribute(\r\n\t\t\t\t\t\t\t'href',\r\n\t\t\t\t\t\t\tocmSitesUrl\r\n\t\t\t\t\t\t\t\t? `/site/MN-Housing${urlObj.pathname}`\r\n\t\t\t\t\t\t\t\t: `https://www.mnhousing.gov${urlObj.pathname}`\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// the hydrate method is called when a component has been compiled into the page at runtime\r\n\t// this gives the opportunity to add any event handlers to the HTML that has been inserted into the page\r\n\tasync hydrate(container) {\r\n\t\tthis.container = container;\r\n\t\tthis.addClickHandlers(this.container);\r\n\t\tthis.checkAlert();\r\n\t\tlet isSecure = await this.secureLogin();\r\n\t\tif (isSecure) await this.secureLoginHandlers();\r\n\t\tif (window.parent.location.href !== 'https://www.mnhousing.gov') this.updateUrls(container);\r\n\t\tthis.sitesSDK.setProperty('renderComplete', true);\r\n\t}\r\n\r\n\t// the render method is called to render the component dynamically onto the page\r\n\tasync render(container) {\r\n\t\tthis.container = container;\r\n\t\tawait this.renderComponent();\r\n\t\tawait this.hydrate(container);\r\n\t\tthis.addEventListeners();\r\n\t}\r\n}\r\n"],"names":["CommonUtils","fetchAssets","arIDs","strAssetType","contentClient","strFields","arguments","length","undefined","strQuery","map","id","join","queryItems","q","fields","links","fetchSiteConfig","api","strSiteConfigID","getCustomSiteProperty","getItem","expand","checkAlertDate","alertVal","startDate","Date","start_date","value","endDate","end_date","currentDate","getAlert","objModel","pageCategory","self","this","alerts","arMessageIds","i","objPageAlert","arPageAlerts","items","filter","category","arEmergencyAlerts","type","arRegularAlerts","arAlertsToReturn","slice","createSecureLoginHTML","objCommonContext","Mustache","loginTemplate","strLoginMessageId","loginAsset","model","loginMessage","content","lenderButtonLinkText","loanCommitmentSystemLink","noText","render","shapeData","customSettingsData","template","customData","args","nls","skipLinks","print_logo","src","getRenditionURL","logo","header_href","boolNotMain","pageRootLink","href","arConsolidatedColumns","column_1","concat","column_2","column_3","column_4","column_5","arConsolidatedLinks","forEach","objColumn","primary_link","push","link","objLink","sidebar_link","objItem","arLinkIds","objConsolidatedLinks","getCustomPageProperty","mapLinkAssets","Map","set","item","isSocialBar","index","get","dark_icon","icon","url","Object","keys","property","startsWith","column","image","page_alerts","iconType","columns","blocks","renderMustacheTemplate","context","strOutput","structureMap","JSON","parse","structure_map","key","entries","replaceAll","pageUrl","replace","expandMacros","e","console","log","constructor","assetsPath","sitesSDK","SitesSDK","SCSRenderAPI","getMustache","loginTimeInHours","expires","setTime","getTime","secureLogin","elBreadcrumbs","document","querySelector","appendChild","strSitePropertyPasscode","strSessionPasscode","URLSearchParams","cookie","getRenderMode","RENDER_MODE_NAVIGATE","RENDER_MODE_EDIT","classList","remove","querySelectorAll","el","add","children","toUTCString","layouts","importText","getProperty","htmlSecureLogin","innerHTML","secureLoginHandlers","elPasswordInput","elTogglePasswordVisibility","addEventListener","preventDefault","passcodeField","userInputtedPasscode","checkPassword","setTimeout","toGMTString","error","addEventListeners","subscribe","MESSAGE_TYPES","SETTINGS_UPDATED","props","renderComponent","componentLayout","addClickHandlers","container","arrive","onceOnly","existing","btn","box","contains","doSearch","toggle","menuBtn","toggleMegaMenu","alertBtn","alert","parentElement","sessionStorage","setItem","dataset","elSearchIcon","strSearchTerm","elSearchBox","event","target","keyCode","strSearchVal","strSearchPageID","values","SCS","find","isSearchPage","strSearchURL","window","origin","getPageLinkData","location","menuIcon","megaMenu","menuActive","iconContent","escapeKeyPressed","removeEventListener","removeAttribute","setAttribute","elHeaderMask","createElement","checkAlert","alertIds","componentResources","Promise","all","importCSS","nestedComponents","navigationRoot","siteInfo","properties","siteName","objData","componentHtml","updateUrls","urls","hostname","parent","ocmSitesUrl","includes","urlObj","URL","renderMode","pathname","hydrate","setProperty"],"mappings":"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"}