{"version":3,"file":"search.js","mappings":"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","sources":["webpack://cornell-engineering/./static/js/components/algolia/program-finder.js"],"sourcesContent":["import instantsearch from 'instantsearch.js';\nimport {\n  configure,\n  hits,\n  clearRefinements,\n  refinementList,\n  searchBox,\n} from 'instantsearch.js/es/widgets';\nimport searchClient from './search-client';\nimport { createDropdown } from './vendor/dropdown';\n\n/**\n * ProgramFinder\n *\n * Set up the Algolia filtering for degree programs\n */\nclass ProgramFinder {\n  constructor(rootEl) {\n    this.rootEl = rootEl;\n    if (!this.rootEl) {\n      throw new Error('Root program finder element not found.');\n    }\n\n    const indexName = this.rootEl.dataset['algoliaIndex'];\n\n    this.search = instantsearch({\n      indexName,\n      searchClient: searchClient,\n      routing: true,\n    });\n\n    this.init();\n    this.search.start();\n  }\n\n  init() {\n    this.configureSearchParams();\n    this.configureSearchBox();\n    this.configureClearRefinements();\n    this.configureDegreeTypeRefinementDropdown();\n    this.configureDepartmentRefinementDropdown();\n    this.configureResultsList();\n    this.addWidgets();\n  }\n\n  addWidgets() {\n    const widgets = [\n      this.searchParams,\n      this.searchBox,\n      this.clearRefinements,\n      this.degreeTypeRefinementDropdown,\n      this.departmentRefinementDropdown,\n      this.resultsList,\n    ];\n\n    this.search.addWidgets(widgets);\n  }\n\n  configureSearchParams() {\n    this.searchParams = configure({\n      distinct: true,\n      // Force faceting to be applied after de-duplication (via the Distinct setting)\n      facetingAfterDistinct: true,\n    });\n  }\n\n  configureSearchBox() {\n    this.searchBox = searchBox({\n      container: '.js-program-finder-search-input',\n      placeholder: 'Search by name',\n      showSubmit: false,\n    });\n  }\n\n  configureClearRefinements() {\n    this.clearRefinements = clearRefinements({\n      container: '.js-program-finder-clear',\n      templates: {\n        resetLabel(_options, { html }) {\n          return html`Reset filters`;\n        },\n      },\n    });\n  }\n\n  configureDegreeTypeRefinementDropdown() {\n    if (!document.querySelector('.js-program-finder-degree-types-input')) {\n      return;\n    }\n\n    const degreeTypeDropdown = createDropdown(refinementList, {\n      cssClasses: { root: 'ais-Dropdown-degree-types' },\n      buttonText: 'All Degree Types',\n    });\n\n    this.degreeTypeRefinementDropdown = degreeTypeDropdown({\n      container: '.js-program-finder-degree-types-input',\n      attribute: 'degrees.degree_type.abbrev',\n    });\n  }\n\n  configureDepartmentRefinementDropdown() {\n    if (!document.querySelector('.js-program-finder-departments-input')) {\n      return;\n    }\n\n    const departmentDropdown = createDropdown(refinementList, {\n      cssClasses: { root: 'ais-Dropdown-departments' },\n      buttonText: 'All Departments',\n    });\n\n    this.departmentRefinementDropdown = departmentDropdown({\n      container: '.js-program-finder-departments-input',\n      attribute: 'departments.name',\n      limit: 10,\n      showMore: true,\n      showMoreLimit: 100,\n      sortBy: ['name:asc'],\n    });\n  }\n\n  configureResultsList() {\n    this.resultsList = hits({\n      container: '.js-program-finder-hits',\n      cssClasses: {\n        list: 'program-table__list',\n        item: 'program-table__program',\n      },\n      templates: {\n        /* eslint-disable */\n        item: (hit, { html }) => {\n          const { title, description, degrees } = hit;\n          return html`\n            <div class=\"program-table__program-inner program-hit\">\n              <div class=\"program-table__program-titles\">\n                <button\n                  onClick=\"${e => this.handleProgramClick(e)}\"\n                  class=\"program-table__program-name\">\n                  <span class=\"program-table__program-name-text\">${title}</span>\n                </button>\n                <span class=\"program-table__program-name--mobile program-table__program-name-text\"\n                  >${title}</span\n                >\n                <button\n                  onClick=\"${e => this.closeDescription(e)}\"\n                  class=\"program-table__program-close-btn\">\n                  Close\n                  <svg\n                    width=\"8\"\n                    height=\"8\"\n                    viewBox=\"0 0 14 13\"\n                    fill=\"none\"\n                    xmlns=\"http://www.w3.org/2000/svg\">\n                    <path\n                      fill-rule=\"evenodd\"\n                      clip-rule=\"evenodd\"\n                      d=\"M7.00015 8.00015L2.00015 13.0002L0.585938 11.5859L5.58594 6.58594L1.00015 2.00015L2.41436 0.585938L7.00015 5.17172L11.5859 0.585938L13.0001 2.00015L8.41436 6.58594L13.4144 11.5859L12.0001 13.0002L7.00015 8.00015Z\"\n                      fill=\"#54565A\" />\n                  </svg>\n                </button>\n                <p class=\"program-table__program-description\">${description}</p>\n              </div>\n              <ul class=\"program-table__program-degrees\">\n                ${degrees.map(degree => {\n                  // CERTIFICATES: Remove the if statement below to display certificates\n                  if (!degree.degree_type || degree.degree_type['abbrev'] === 'Certificate') {\n                    return null;\n                  }\n\n                  return html`\n                    <li\n                      class=\"program-table__program-degree degree--${degree.degree_type['abbrev']\n                        .toLowerCase()\n                        .replaceAll('.', '')\n                        .split(' ')\n                        .join('-')}\">\n                      <a\n                        class=\"program-table__program-degree-link\"\n                        href=\"${degree.link}\"\n                        aria-label=\"${degree.degree_type['name']} in ${title}\">\n                        <span class=\"program-table__program-degree-link-text\"\n                          >${degree.degree_type['abbrev']}</span\n                        >\n                        <span class=\"program-table__program-degree-link-icon\">\n                          <svg class=\"arrow-icon\" aria-hidden=\"true\">\n                            <use xlink:href=\"#arrow\"></use>\n                          </svg>\n                        </span>\n                      </a>\n                    </li>\n                  `;\n                })}\n              </ul>\n            </div>\n          `;\n        },\n        /* eslint-enable */\n      },\n    });\n  }\n\n  openProgram(event) {\n    const program = event.target.closest('.program-table__program-inner');\n    program.classList.add('expanded');\n  }\n\n  closeDescription(event) {\n    const program = event.target.closest('.program-table__program-inner');\n    program.classList.remove('expanded');\n  }\n\n  handleProgramClick(event) {\n    const program = event.target.closest('.program-table__program-inner');\n\n    if (program.classList.contains('expanded')) {\n      this.closeDescription(event);\n    } else {\n      this.openProgram(event);\n    }\n  }\n}\n\nexport default ProgramFinder;\n"],"names":["ProgramFinder","rootEl","_classCallCheck","this","Error","indexName","dataset","search","instantsearch","searchClient","routing","init","start","key","value","configureSearchParams","configureSearchBox","configureClearRefinements","configureDegreeTypeRefinementDropdown","configureDepartmentRefinementDropdown","configureResultsList","addWidgets","widgets","searchParams","searchBox","clearRefinements","degreeTypeRefinementDropdown","departmentRefinementDropdown","resultsList","configure","distinct","facetingAfterDistinct","container","placeholder","showSubmit","templates","resetLabel","_options","_ref","html","_templateObject","_taggedTemplateLiteral","document","querySelector","degreeTypeDropdown","createDropdown","refinementList","cssClasses","root","buttonText","attribute","departmentDropdown","limit","showMore","showMoreLimit","sortBy","_this","hits","list","item","hit","_ref2","title","description","degrees","_templateObject2","e","handleProgramClick","closeDescription","map","degree","degree_type","_templateObject3","toLowerCase","replaceAll","split","join","link","event","target","closest","classList","add","remove","contains","openProgram"],"sourceRoot":""}