{"version":3,"file":"render.mjs","sources":["src/common.mjs","src/contentClient.mjs","src/render.mjs"],"sourcesContent":["// Common Utilities Class\nexport default class {\n\tconstructor(context) {\n\t\t// extract all the required dependencies from the context\n\t\tthis.Mustache = context.Mustache\n\t\tthis.componentLayout = context.componentLayout\n\t\tthis.customSettingsData = context.customSettingsData\n\t\tthis.id = context.id\n\t\tthis.template = context.template\n\t\tthis.contentClient = context.contentClient\n\t\tthis.api = context.api\n\t\tthis.parse = context.parser || false\n\t\tthis.detailPageLinkId = this.api.getCustomSiteProperty('eventsDetailPageId') || 621;\n\n\t\t// extract all the required dependencies from the customSettings in settings.js\n\t\tthis.strTheme = this.customSettingsData.theme\n\t\tthis.strTitle = this.customSettingsData.nls.title\n\t\tthis.strToggle = this.customSettingsData.toggle\n\t\tthis.strLinkText = this.customSettingsData.nls.linkText\n\t\tthis.strLinkUrl = this.customSettingsData.linkUrl\n\t\tthis.strTarget = this.customSettingsData.target\n\t\tthis.strTimeSettings = this.customSettingsData.timeSettings\n\t\tthis.arChosenEventCategories = this.customSettingsData.chosenCategories\n\t\tthis.bRadiusToggle = this.customSettingsData.radiusToggle\n\n\t\t// create the view model\n\t\tthis.objModel = {\n\t\t\tlayout: this.componentLayout,\n\t\t\tsettings: {\n\t\t\t\tbRadiusToggle: this.bRadiusToggle,\n\t\t\t},\n\t\t}\n\t}\n\n\t/* Makes a call to OCM to grab a list of events\n\tEach event is deconstructed and manipulated to be presented in the DOM */\n\tasync fetchEvent() {\n\t\t//Creates a variable with the date the query is made to OCM\n\t\tlet strNewDate = new Date()\n\t\tconst strQueryDate = strNewDate.toISOString().split('T')[0]\n\t\tconst arChosenEventCategories = this.arChosenEventCategories && this.arChosenEventCategories.map((category) => `fields.category mt \"${category.value}\"`).join(' or ')\n\t\t/* This is the call to OCM. It grabs a list of events\n\t\t\twhose dates are greater than or equal to the current query date. */\n\t\tlet objResponse = await this.contentClient.queryItems({\n\t\t\t'q': `(type eq \"MNH_Event\" AND fields.end ge \"${strQueryDate}\"${arChosenEventCategories ? ` AND (${arChosenEventCategories})` : ''})`,\n\t\t\tfields: \"all\",\n\t\t})\n\t\t// events list\n\t\tlet arEvents = []\n\n\n\t\t// Inside our forEach, we can check if the object contains our date and add to its array if so\n\t\tobjResponse.items.forEach((item) => {\n\t\t\tconst fields = item.fields\n\t\t\t//the unaltered timestamp\n\t\t\tlet strFullTimestamp = fields.start.value\n\n\t\t\t//the date of the event\n\t\t\tconst strDate = new Date(strFullTimestamp)\n\t\t\tconst strNewStartDate = new Intl.DateTimeFormat('en-US', { dateStyle: 'long', timeZone: 'America/Chicago' }).format(strDate).split(', ')[0]\n\n\t\t\t//formats the time 24-hour time into 12 hour time\n\t\t\tconst timeHours = () => {\n\t\t\t\tconst hours = new Date(strFullTimestamp).getHours()\n\t\t\t\treturn hours > 12 ? hours - 12 : hours;\n\t\t\t}\n\n\t\t\t//formats the minutes so they will always be displayed with double digits\n\t\t\tconst timeMinutes = () => {\n\t\t\t\tconst minutes = new Date(strFullTimestamp).getMinutes()\n\n\t\t\t\tif (minutes < 10) {\n\t\t\t\t\treturn `0${minutes}`\n\t\t\t\t} else {\n\t\t\t\t\treturn minutes\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//handles AM/PM\n\t\t\tconst am_pm = () => {\n\t\t\t\tconst hours = new Date(strFullTimestamp).getHours()\n\t\t\t\treturn hours >= 0 && hours <= 11 ? 'a.m.' : 'p.m.';\n\t\t\t}\n\n\t\t\t//The time, title, and summary that we will use to create the events.\n\t\t\tconst strFormattedTime = `${timeHours()}:${timeMinutes()}${am_pm()}`\n\t\t\tconst strTitle = fields.title\n\n const slug = this.api.getPageLinkData(this.detailPageLinkId, {\n contentId: item.id,\n contentSlug: item.slug,\n contentType: 'MNH_Event',\n }) || {};\n\n\t\t\t// How each individual event will be structured\n\t\t\tconst objEvent = {\n\t\t\t\ttitle: strTitle.trim(),\n\t\t\t\ttime: strFormattedTime.trim(),\n\t\t\t\tslug: slug.href\n\t\t\t}\n\n\t\t\t/*\n\t\t\tIf any events occur on the same date, they will appear as list items under that date. (they will be consolidated)\n\t\t\tOtherwise they each event will appear under the date they occur on.\n\t\t\t*/\n\t\t\tconst newEventsArr = arEvents.filter((item) => item.date === strNewStartDate)\n\t\t\tif (newEventsArr.length) {\n\t\t\t\tnewEventsArr[0].events.push(objEvent)\n\t\t\t\tarEvents = arEvents.map((item) =>\n\t\t\t\t\titem.date === newEventsArr[0].date ? newEventsArr[0] : item\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tconst obj = {\n\t\t\t\t\tdate: strNewStartDate,\n\t\t\t\t\ttimestamp: strFullTimestamp,\n\t\t\t\t\tevents: [objEvent],\n\t\t\t\t}\n\t\t\t\tarEvents.push(obj)\n\t\t\t}\n\t\t})\n\n\t\t// sorts the event list by date\n\t\tarEvents.sort((a, b) => {\n\t\t\treturn new Date(a.timestamp) - new Date(b.timestamp)\n\t\t})\n\n\t\t//limits the event list to include the next 6 events\n\t\tarEvents = arEvents.filter((event) => new Date(event.timestamp).valueOf() > strNewDate)\n\t\tarEvents.length = arEvents.length > 6 ? 6 : arEvents.length\n\t\tarEvents.length > 3 ? this.objModel.settings.cols = 2 : this.objModel.settings.cols = 1\n\t\tthis.objModel.settings.twoCols = this.objModel.settings.cols === 2;\n\t\tif (this.objModel.settings.twoCols) {\n\t\t\tthis.objModel.settings.events = arEvents.slice(0, 3)\n\t\t\tthis.objModel.settings.events2 = arEvents.slice(3, 6)\n\t\t}\n\t\tthis.objModel.events = arEvents\n\t}\n\n\t//adds new properties to the view model\n\tcreateHTML() {\n\t\t//adds the selected theme to the model\n\t\tif (this.strTheme) {\n\t\t\tthis.objModel.settings.theme = this.strTheme\n\t\t} else {\n\t\t\tthis.objModel.settings.theme = 'white'\n\t\t}\n\n\t\t//Adds the selected title to the model\n\t\tif (this.strTitle) {\n\t\t\tthis.objModel.title = this.strTitle\n\t\t} else {\n\t\t\tthis.objModel.title = 'Upcoming Events'\n\t\t}\n\n\t\t//handles CTA toggle selection\n\t\tif (this.strToggle) {\n\t\t\tthis.objModel.settings.toggle = 'show'\n\t\t} else {\n\t\t\tthis.objModel.settings.toggle = 'hidden'\n\t\t}\n\n\t\t// handles CTA link text\n\t\tif (this.strLinkText) {\n\t\t\tthis.objModel.settings.linkText = this.strLinkText\n\t\t} else {\n\t\t\tthis.objModel.settings.linkText = 'Full Events List'\n\t\t}\n\n\t\t// handles the CTA link target\n\t\tif (this.strTarget) {\n\t\t\tthis.objModel.settings.target = this.strTarget\n\t\t} else {\n\t\t\tthis.objModel.settings.target = 'blank'\n\t\t}\n\n\t\t//adds url to the view model\n\t\tif (this.strLinkUrl) {\n\t\t\tthis.objModel.settings.linkUrl = this.strLinkUrl\n\t\t} else {\n\t\t\tthis.objModel.settings.linkUrl = 'https://mnhousing.gov/'\n\t\t}\n\n\t\t//adds the show/hide time setting to the view model\n\t\tif (this.strTimeSettings) {\n\t\t\tthis.objModel.settings.timeSettings = 'show'\n\t\t} else {\n\t\t\tthis.objModel.settings.timeSettings = 'hidden'\n\t\t}\n\t}\n\n\t// render the component\n\trenderTemplate() {\n\t\ttry {\n\t\t\tthis.objModel.ready = true;\n\t\t\treturn this.Mustache.render(this.template, this.objModel)\n\t\t} catch (e) {\n\t\t\tconsole.log('Failed to expand Mustache template.', e)\n\t\t\treturn ''\n\t\t}\n\t}\n}\n","export default class ContentClient {\n constructor(pageState, channelToken) {\n this.pageState = pageState;\n if (pageState !== \"compiled\") {\n this.context = \"management\";\n } else {\n this.context = \"published\";\n }\n this.baseUrl = `/content/${this.context}/api/v1.1/items`;\n this.channelToken = channelToken;\n }\n\n async queryItems(payload) {\n const headers = {\n \"Content-Type\": \"application/json\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n \"Authorization\": \"session\"\n };\n\n const response = await fetch(`${this.baseUrl}?q=${payload.q}&fields=${payload.fields || \"all\"}&channelToken=${this.channelToken}`, {\n headers: headers,\n method: \"GET\",\n });\n const json = await response.json();\n return json;\n }\n}","import CommonUtils from './common.mjs';\nimport ContentClient from './contentClient.mjs';\n\n// The Custom Component class will be the \"default\" export from the module\nexport default class {\n\tconstructor(args) {\n\t\t// store the args\n\t\tthis.mode = args.viewMode\n\t\tthis.id = args.id\n\n\t\t// store the path to the /assets folder\n\t\tthis.assetsPath = import.meta.url.replace('/render.mjs', '')\n\n\t\t// get the OCM environment resources\n\t\tthis.sitesSDK = args.SitesSDK\n\t\tthis.Mustache = SCSRenderAPI.getMustache()\n\n\t\t// calls the event listeners\n\t\tthis.addEventListeners()\n\t}\n\n\t// add in the listeners for the triggers/actions and whenever the settings values change\n\t// in this case, we want to re-render the component on the screen\n\taddEventListeners() {\n\t\t// listen for settings update\n\t\tthis.sitesSDK.subscribe(this.sitesSDK.MESSAGE_TYPES.SETTINGS_UPDATED, (props) => {\n\t\t\tif (props.property === 'customSettingsData') {\n\t\t\t\tthis.renderComponent({\n\t\t\t\t\tcustomSettingsData: props.value,\n\t\t\t\t})\n\t\t\t} else if (props.property === 'componentLayout') {\n\t\t\t\tthis.renderComponent({\n\t\t\t\t\tcomponentLayout: props.value,\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n\n\t// insert the component's HTML into the page\n\t// after it has added the component, it applies any clickHandlers to elements that were added to the page\n\trenderComponent(args) {\n\t\tPromise.all([\n\t\t\tSCSRenderAPI.importText(this.assetsPath + '/layout.html'),\n\t\t\tSCSRenderAPI.importCSS(this.assetsPath + '/styles/design.css'),\n\t\t]).then(async (componentResources) => {\n\t\t\tconst componentTemplate = componentResources[0]\n\n\t\t\t// use the common code to generate the HTML for this component based on the componentLayout and customSettingsData\n\t\t\tconst utils = new CommonUtils(\n\t\t\t\t{\n\t\t\t\t\tMustache: this.Mustache,\n\t\t\t\t\tcomponentLayout: this.sitesSDK.getProperty('componentLayout'),\n\t\t\t\t\tcustomSettingsData: this.sitesSDK.getProperty('customSettingsData'),\n\t\t\t\t\tid: this.id,\n\t\t\t\t\ttemplate: componentTemplate,\n\t\t\t\t\t// nestedComponents: this.nestedComponents, // include any nested component definitions\n\t\t\t\t\tapi: SCSRenderAPI,\n\t\t\t\t\tcontentClient: new ContentClient(SCSRenderAPI.pageState, SCSRenderAPI.siteInfo.properties.channelAccessTokens.find(i=>i.name==\"defaultToken\").value),\n\t\t\t\t},\n\t\t\t\targs\n\t\t\t)\n\t\t\tutils.createHTML()\n\t\t\tawait utils.fetchEvent()\n\t\t\t// replace the content of the container with the rendered HTML\n\t\t\tthis.container.innerHTML = await utils.renderTemplate()\n\t\t\tconst loadingContainer = this.container.querySelector(\".events.loading\");\n\t\t\tloadingContainer && loadingContainer.remove();\n\t\t})\n\t}\n\n\t// the hydrate method is called when a component has been compiled into the page at runtime\n\t// this gives the opportunity to add any event handlers to the HTML that has been inserted into the page\n\thydrate(container) {\n\t\tthis.container = container\n\t\tthis.renderComponent(container)\n\t}\n\n\t// the render method is called to render the component dynamically onto the page\n\trender(container) {\n\t\tthis.container = container\n\t\tthis.renderComponent(container)\n\t}\n}\n"],"names":["constructor","context","this","Mustache","componentLayout","customSettingsData","id","template","contentClient","api","parse","parser","detailPageLinkId","getCustomSiteProperty","strTheme","theme","strTitle","nls","title","strToggle","toggle","strLinkText","linkText","strLinkUrl","linkUrl","strTarget","target","strTimeSettings","timeSettings","arChosenEventCategories","chosenCategories","bRadiusToggle","radiusToggle","objModel","layout","settings","async","strQueryDate","strNewDate","toISOString","split","map","category","value","join","objResponse","queryItems","q","concat","fields","arEvents","items","forEach","item","start","Date","strFullTimestamp","strNewStartDate","Intl","DateTimeFormat","dateStyle","timeZone","format","strDate","strFormattedTime","hours","getHours","timeHours","minutes","getMinutes","timeMinutes","am_pm","slug","getPageLinkData","contentId","contentSlug","contentType","objEvent","trim","time","href","newEventsArr","filter","date","length","events","push","obj","timestamp","sort","a","b","event","valueOf","cols","twoCols","slice","events2","createHTML","renderTemplate","ready","render","e","console","log","ContentClient","pageState","channelToken","baseUrl","payload","response","fetch","headers","Authorization","method","json","args","mode","viewMode","assetsPath","import","meta","url","replace","sitesSDK","SitesSDK","SCSRenderAPI","getMustache","addEventListeners","subscribe","MESSAGE_TYPES","SETTINGS_UPDATED","props","property","renderComponent","Promise","all","importText","importCSS","then","componentTemplate","componentResources","CommonUtils","getProperty","siteInfo","properties","channelAccessTokens","find","i","name","utils","fetchEvent","container","innerHTML","loadingContainer","querySelector","remove","hydrate"],"mappings":"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"}