{"version":3,"file":"event-search.js","mappings":"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","sources":["webpack://cornell-engineering/./static/js/components/algolia/event-search.js"],"sourcesContent":["import { searchBox } from 'instantsearch.js/es/widgets';\nimport { connectHits } from 'instantsearch.js/es/connectors';\n\nimport GlobalSearch from './global-search';\n\n/**\n * EventSearch\n */\nclass EventSearch extends GlobalSearch {\n constructor(rootEl) {\n super(rootEl);\n\n // Filter events to only show upcoming events\n const now = new Date();\n this.preFilter = `timestamp > ${Math.floor(now / 1000)}`;\n this.resultsLabel = {\n singular: 'event',\n plural: 'events',\n };\n\n this.searchParams.filters = this.preFilter;\n }\n\n /**\n * Initialize the search\n *\n * @override GlobalSearch\n */\n init() {\n this.configureWidgets();\n this.configureCustomHits();\n this.setWidgets();\n this.setEventsWidgets();\n this.addWidgets();\n this.search.start();\n }\n\n /**\n * Configure event-specific widgets\n */\n setEventsWidgets() {\n this.widgets.push(this.customEventHits);\n }\n\n /**\n * Configure a custom hits widget for displaying events\n */\n configureCustomHits() {\n const customHits = connectHits(this.renderHits.bind(this));\n\n this.customEventHits = customHits({\n container: document.querySelector('.js-event-hits'),\n });\n }\n\n /**\n * Configure the search box\n *\n * @override GlobalSearch\n */\n configureSearchBox() {\n this.searchBox = searchBox({\n container: '.js-event-search-input',\n placeholder: 'Search for an event',\n showSubmit: false,\n });\n }\n\n /**\n * Returns a mapping of events by month and day.\n * Ex.\n * {\n * 'January': {\n * 1: [event1, event2],\n * 2: [event3]\n * }\n * 'February': {\n * 1: [event4]\n * }\n * }\n *\n * @param {array} hits\n * @returns object\n */\n getEventsByMonth(hits) {\n return hits.reduce((acc, hit) => {\n hit.dates.forEach(dateObj => {\n const timestamp = dateObj.start;\n const date = new Date(timestamp * 1000);\n const month = date.toLocaleString('default', { month: 'long' });\n const day = date.getDate();\n\n if (!acc[month]) {\n acc[month] = {};\n }\n\n if (!acc[month][day]) {\n acc[month][day] = [];\n }\n\n acc[month][day].push(hit);\n });\n\n return acc;\n }, {});\n }\n\n /**\n * Get the event template.\n *\n * @param {object} hit\n * @returns\n */\n getEventTemplate(hit) {\n const { date_time, link, title, thumbnail, description } = hit;\n const truncatedDescription =\n description.length > 200 ? `${description.substring(0, 200)}...` : description;\n\n const screenReaderDateTime = date_time.time\n ? date_time.time.replace('-', 'to').replaceAll('pm', 'p.m.').replaceAll('am', 'a.m.')\n : null;\n\n return `\n <article class=\"hit ${thumbnail && thumbnail.src ? 'hit--has-image' : ''}\">\n <p class=\"hit__time\">\n <time ${screenReaderDateTime ? `aria-label=\"${screenReaderDateTime}\"` : ''}>${\n date_time.time ? `<span>${date_time.time}</span>` : ''\n}</time>\n </p>\n <div class=\"hit__text\">\n <h4 class=\"hit__name\">\n <a class=\"hit__link\" href=\"${link}\">${title}</a>\n </h4>\n <p class=\"hit__excerpt\">${truncatedDescription}</p>\n </div>\n ${\n thumbnail && thumbnail.src\n ? ` <div class=\"hit__art\">\n <a class=\"hit__link\" href=\"${link}\" aria-hidden=\"true\">\n <figure class=\"hit__figure\">\n <img src=\"${thumbnail.src}\" alt=\"${thumbnail.alt}\" class=\"hit__img\" />\n </figure>\n </a>\n </div>`\n : ''\n}\n </article>`;\n }\n\n /**\n * Render the hits for the event search\n *\n * @param {object} renderOptions\n */\n renderHits(renderOptions) {\n const { hits, widgetParams } = renderOptions;\n\n // Create mapping of month to day to events\n const eventsByMonth = this.getEventsByMonth(hits);\n\n // Render the widget\n widgetParams.container.innerHTML = `\n ${Object.keys(eventsByMonth)\n .map(\n month => `\n <h2 class=\"event-hits__month-heading\">${month}</h2>\n <ul class=\"event-hits__month-group\">\n ${Object.keys(eventsByMonth[month])\n .map(\n day => `\n <li class=\"event-hits__month-item\">\n <h3 class=\"event-hits__day-heading\" aria-label=\"${month}, ${day}\">${day}</h3>\n <ul class=\"event-hits__day-group\">\n ${eventsByMonth[month][day]\n .map(\n event => `\n <li class=\"event-hits__day-item\">\n ${this.getEventTemplate(event)}\n </li>\n `,\n )\n .join('')}\n </ul>\n </li>\n `,\n )\n .join('')}\n </ul>\n `,\n )\n .join('')}`;\n }\n}\n\nexport default EventSearch;\n"],"names":["EventSearch","_GlobalSearch","rootEl","_this","_classCallCheck","_callSuper","now","Date","preFilter","concat","Math","floor","resultsLabel","singular","plural","searchParams","filters","_inherits","key","value","this","configureWidgets","configureCustomHits","setWidgets","setEventsWidgets","addWidgets","search","start","widgets","push","customEventHits","customHits","connectHits","renderHits","bind","container","document","querySelector","searchBox","placeholder","showSubmit","hits","reduce","acc","hit","dates","forEach","dateObj","timestamp","date","month","toLocaleString","day","getDate","date_time","link","title","thumbnail","description","truncatedDescription","length","substring","screenReaderDateTime","time","replace","replaceAll","src","alt","renderOptions","_this2","widgetParams","eventsByMonth","getEventsByMonth","innerHTML","Object","keys","map","event","getEventTemplate","join","GlobalSearch"],"sourceRoot":""}