{"version":3,"file":"course-search-app.js","mappings":"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","sources":["webpack://@upstatement/harvard-law-school-wp-theme/./static/js/components/algolia/course-search.js"],"sourcesContent":["import SearchApp from './search-app';\n\nimport { courseTease } from './render';\nimport algoliaClient from '@src/components/algolia/algolia-client';\n\nconst { ALGOLIA_TYPE_INDEX_NAME } = window.algoliaSettings || {};\n\nclass CourseSearch extends SearchApp {\n constructor(el) {\n super(el);\n\n this.defaultAcademicYear = this.controls.controlsEl.dataset.defaultAcademicYear;\n this.nonce = this.controls.controlsEl.querySelector(\n 'input[name=\"nonce_hls_course_query\"]',\n )?.value;\n this.courseCatalogLinks = this.controls.controlsEl.querySelectorAll(\n '[data-search-course-catalog]',\n );\n\n // Set up facets for the Course query.\n this.facets = [\n 'hls_course_term',\n 'hls_interest_area',\n 'instructor_reverse',\n 'hls_course_delivery_mode',\n 'hls_course_requirement',\n 'hls_course_day',\n ];\n\n this.setupHooks();\n }\n\n getIndexName() {\n return ALGOLIA_TYPE_INDEX_NAME;\n }\n\n setupHooks() {\n // Filter query params.\n this.addFilter('filterParams', params => {\n const newParams = { ...params };\n newParams.type = 'hls_course';\n\n if (!newParams.hls_course_academic_period && this.defaultAcademicYear) {\n newParams.hls_course_academic_period = this.defaultAcademicYear;\n }\n\n if (newParams.hls_course_day) {\n newParams.hls_course_day_string = newParams.hls_course_day;\n delete newParams.hls_course_day;\n }\n\n return newParams;\n });\n\n // Customize the new parameters after a select change.\n this.controls.addFilter('selectChangeParams', (params, name) => {\n const newParams = { ...params };\n\n // If the change is on the academic period, remove all other params and reset.\n if ('hls_course_academic_period' === name) {\n delete newParams.hls_course_term;\n delete newParams.hls_course_delivery_mode;\n delete newParams.hls_course_day;\n this.state.set('lastChanged', null);\n this.state.set('triggerLookup', true);\n }\n\n return newParams;\n });\n\n // Custom sort incoming facet values.\n this.controls.addFilter('facetValues', (facetValues, facetName) => {\n const newValues = [...facetValues];\n\n if (facetName === 'hls_course_term') {\n const seasonOrder = [\n 'fall',\n 'fall-winter',\n 'fall-spring',\n 'winter',\n 'winter-spring',\n 'spring',\n ];\n newValues.sort((a, b) => {\n a = a.toLowerCase().replace(/\\d|\\s/g, '');\n b = b.toLowerCase().replace(/\\d|\\s/g, '');\n return seasonOrder.indexOf(a) - seasonOrder.indexOf(b);\n });\n }\n\n if (facetName === 'hls_course_day') {\n const weekOrder = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday'];\n newValues.sort(\n (a, b) => weekOrder.indexOf(a.toLowerCase()) - weekOrder.indexOf(b.toLowerCase()),\n );\n }\n\n return newValues;\n });\n }\n\n /**\n * Override the main query method so we can run our own specific query in certain cases.\n *\n * @returns {Promise}\n */\n doQuery() {\n const mainQuery = super.doQuery();\n const shouldDoLookup = this.state.get('triggerLookup');\n const { hls_course_academic_period } = this.state.get('params');\n\n this.state.set('triggerLookup', null);\n\n // If we don't need to do a lookup (because the academic period hasn't been changed) or there is no academic period\n // change, then we can just return the main query.\n if (!shouldDoLookup || !hls_course_academic_period) {\n return mainQuery;\n }\n\n const catalogLookup = this.updateCatalogLink();\n\n const lookupQuery = algoliaClient.search([\n {\n indexName: window['algoliaSettings']['ALGOLIA_TYPE_INDEX_NAME'],\n filters: `type:hls_course AND hls_course_academic_period:${hls_course_academic_period}`,\n responseFields: ['nbHits'],\n },\n ]);\n\n return new Promise(resolve => {\n Promise.all([mainQuery, lookupQuery, catalogLookup]).then(([mainQueryResp, lookupResp]) => {\n this.state.set('noFilterCount', lookupResp?.results[0]['nbHits']);\n resolve(mainQueryResp);\n });\n });\n }\n\n /**\n * Fetch the updated course catalog PDF.\n *\n * @returns {Promise}\n */\n updateCatalogLink() {\n if (this.courseCatalogLinks.length === 0) {\n return Promise.resolve();\n }\n\n const { hls_course_academic_period } = this.state.get('params');\n const catalogRequestData = new FormData();\n catalogRequestData.append('action', 'get_course_catalog_pdf');\n catalogRequestData.append('nonce', this.nonce);\n catalogRequestData.append('hls_course_academic_period', hls_course_academic_period);\n\n return fetch(window.hlsSite?.ajaxurl, {\n method: 'POST',\n credentials: 'same-origin',\n body: catalogRequestData,\n })\n .then(response => response.json())\n .then(({ success, data }) => {\n if (!success) {\n throw new Error(data);\n }\n\n this.courseCatalogLinks.forEach(el => {\n if (data) {\n el.removeAttribute('style');\n } else {\n el.style.display = 'none';\n }\n\n const span = el.querySelector('span') || el;\n span.innerText = `${hls_course_academic_period} Course Catalog (PDF)`;\n el.href = data || '#';\n });\n })\n .catch(error => console.error(error));\n }\n\n /**\n * Render the course tease.\n *\n * @param {array} hits Hits from Algolia.\n *\n * @return void\n */\n render(hits) {\n const hitsMarkup = hits.map(courseTease).join('');\n this.resultsEl.innerHTML = ``;\n }\n}\n\nexport default CourseSearch;\n"],"names":["ALGOLIA_TYPE_INDEX_NAME","window","algoliaSettings","CourseSearch","_SearchApp","el","_this$controls$contro","_this","_classCallCheck","_callSuper","defaultAcademicYear","controls","controlsEl","dataset","nonce","querySelector","value","courseCatalogLinks","querySelectorAll","facets","setupHooks","_inherits","key","_this2","this","addFilter","params","newParams","_objectSpread","type","hls_course_academic_period","hls_course_day","hls_course_day_string","name","hls_course_term","hls_course_delivery_mode","state","set","facetValues","facetName","newValues","_toConsumableArray","seasonOrder","sort","a","b","toLowerCase","replace","indexOf","weekOrder","_this3","mainQuery","shouldDoLookup","get","catalogLookup","updateCatalogLink","lookupQuery","algoliaClient","search","indexName","filters","concat","responseFields","Promise","resolve","all","then","_ref2","_ref3","_slicedToArray","mainQueryResp","lookupResp","results","_window$hlsSite","_this4","length","catalogRequestData","FormData","append","fetch","hlsSite","ajaxurl","method","credentials","body","response","json","_ref4","success","data","Error","forEach","removeAttribute","style","display","innerText","href","catch","error","console","hits","hitsMarkup","map","courseTease","join","resultsEl","innerHTML","SearchApp"],"sourceRoot":""}