{"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":""}