{"version":3,"file":"faculty-search-app.js","mappings":"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","sources":["webpack://@upstatement/harvard-law-school-wp-theme/./static/js/components/algolia/faculty-controls.js","webpack://@upstatement/harvard-law-school-wp-theme/./static/js/components/algolia/faculty-search.js"],"sourcesContent":["import SearchControls from './search-controls';\nimport { on } from '@src/utils';\n\nclass FacultyControls extends SearchControls {\n constructor(el, state) {\n super(el, state);\n\n // DOM.\n this.appEl = el;\n this.facultyTypeEls = Array.from(el.querySelectorAll('input[name][type=\"checkbox\"]'));\n this.resetButtons = Array.from(el.querySelectorAll('[data-search-reset]'));\n\n // Callback bindings.\n this.handleCheckChange = this.handleCheckChange.bind(this);\n this.handleReset = this.handleReset.bind(this);\n\n // Init.\n this.setupExtraListeners();\n\n // Ensure that state is in line with default checkboxes and other linked parameters.\n const params = this.state.get('params');\n const newParams = this.scanCheckboxes('faculty_type', Array.from(this.facultyTypeEls));\n params.faculty_type = newParams.faculty_type;\n this.state.set('params', params);\n }\n\n /**\n * Sets up event listeners on the control elements.\n *\n * @return void\n */\n setupExtraListeners() {\n this.listeners = [...this.listeners];\n\n // Specifically attach the checkbox and reset listeners so we can reattach them later.\n this.checkboxListenerOff = on(this.facultyTypeEls, 'change', this.handleCheckChange);\n this.resetListenerOff = on(this.resetButtons, 'click', this.handleReset);\n }\n\n /**\n * Some listeners need to be refreshed after results and facets get injected.\n *\n * @return void\n */\n refreshListeners() {\n // Reset the event listeners.\n if (this.checkboxListenerOff) {\n this.checkboxListenerOff();\n }\n this.checkboxes = Array.from(this.controlsEl.querySelectorAll('input[name][type=\"checkbox\"]'));\n this.checkboxListenerOff = on(this.checkboxes, 'change', this.handleCheckChange);\n\n if (this.resetListenerOff) {\n this.resetListenerOff();\n }\n this.resetButtons = Array.from(this.appEl.querySelectorAll('[data-search-reset]'));\n this.resetListenerOff = on(this.resetButtons, 'click', this.handleReset);\n }\n\n /**\n * Updates the reset buttons after a query change.\n *\n * @return void\n */\n updateResetButtons() {\n const foundPosts = this.state.get('foundPosts');\n const noFilterCount = this.state.get('noFilterCount');\n const isFiltered = parseInt(foundPosts) !== parseInt(noFilterCount);\n\n this.resetButtons\n .filter(btn => btn.dataset.searchReset === 'conditional')\n .forEach(btn => {\n if (isFiltered) {\n btn.removeAttribute('style');\n } else {\n btn.style.display = 'none';\n }\n });\n }\n\n /**\n * Hit the reset button.\n *\n * @return void\n */\n handleReset() {\n const oldParams = { ...this.state.get('params') };\n\n const newParams = {\n page: 1,\n };\n\n // Don't reset some parameters.\n const keepParams = ['view', 'perPage'];\n keepParams.forEach(param => {\n if (oldParams[param]) {\n newParams[param] = oldParams[param];\n }\n });\n\n if (oldParams.hls_course_academic_period) {\n newParams.hls_course_academic_period = oldParams.hls_course_academic_period;\n }\n\n if (this.searchInput) {\n this.searchInput.value = '';\n }\n\n this.selects.forEach(select => {\n // Special cases for the academic period selector.\n if (select.name !== 'hls_course_academic_period') {\n select.value = '';\n select.dataset.chosen = '';\n }\n });\n\n this.checkboxes.forEach(checkbox => (checkbox.checked = false));\n this.state.set('lastChanged', null);\n this.state.set('params', newParams);\n this.ariaState.innerText = 'All filters have been reset';\n this.triggerChange(true, false);\n }\n\n scanCheckboxes(name, group) {\n const checked = group.filter(checkbox => checkbox.checked).map(checkbox => checkbox.value);\n const newParams = { ...this.state.get('params') };\n\n if (checked.length > 0) {\n newParams[name] = checked;\n } else {\n delete newParams[name];\n }\n\n return newParams;\n }\n\n /**\n * Handles the change of a checkbox element.\n *\n * @param {object} event\n *\n * @erturn void\n */\n handleCheckChange(event) {\n const name = event.target.name;\n const group = this.checkboxes.filter(checkbox => checkbox.name === name);\n const newParams = this.scanCheckboxes(name, group);\n\n newParams.page = 1;\n\n this.state.set('params', newParams);\n this.state.set('lastChanged', name);\n this.triggerChange();\n }\n\n /**\n * Triggers the change event.\n *\n * @param {boolean} runChangeFns Whether to trigger the onchange functions or not.\n * @param {boolean} updateAriaState Whether to trigger a change to the aria state.\n *\n * @return void\n */\n triggerChange(runChangeFns = true, updateAriaState = true) {\n super.triggerChange(runChangeFns, updateAriaState);\n\n window.scrollTo({\n top: 0,\n left: 0,\n behavior: 'smooth',\n });\n }\n}\n\nexport default FacultyControls;\n","import SearchApp from './search-app';\nimport { on } from '@src/utils';\nimport FacultyControls from './faculty-controls';\nimport { facultyTease } from './render';\n\nconst { ALGOLIA_TYPE_INDEX_NAME } = window.algoliaSettings || {};\n\nclass FacultySearch extends SearchApp {\n TYPE_ORDER = [\n 'HLS Professors',\n 'Emeritus Professors',\n 'Lecturers',\n 'Visiting Professors',\n 'Harvard University Affiliated Professors',\n ];\n\n facultyListeners = [];\n\n constructor(el) {\n super(el);\n\n // Bindings.\n this.handleInterestFilter = this.handleInterestFilter.bind(this);\n\n // Set up facets for the faculty query.\n this.facets = ['faculty_type', 'searchable_interest_areas'];\n\n this.setupHooks();\n this.afterQueryComplete();\n }\n\n /**\n * @inheritdoc\n */\n setupControls() {\n this.controls = new FacultyControls(this.el, this.state);\n }\n\n deinit() {\n super.deinit();\n this.facultyListeners.forEach(listener =>\n typeof listener.off === 'function' ? listener.off : null,\n );\n }\n\n getTypeOrder(facType) {\n const order = this.TYPE_ORDER.indexOf(facType);\n return order >= 0 ? order : 999;\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_faculty';\n return newParams;\n });\n\n this.controls.addFilter('optionFacetText', (facetValue, facetName) => {\n if (facetName !== 'instructor_reverse') {\n return facetValue;\n }\n return facetValue;\n });\n\n // Custom sort incoming facet values.\n this.controls.addFilter('facetValues', (facetValues, facetName) => {\n const newValues = [...facetValues];\n\n if (facetName === 'faculty_type') {\n newValues.sort((a, b) => this.getTypeOrder(a) - this.getTypeOrder(b));\n }\n\n return newValues;\n });\n }\n\n /**\n * Handle a click of an interest pill in a faculty tease.\n *\n * @param {object} event Click event.\n *\n * @return void\n */\n handleInterestFilter(event) {\n const filter = event.target.dataset.searchFacultyInterestArea;\n\n if (!filter) {\n return;\n }\n\n const { searchable_interest_areas } = this.state.get('params');\n\n // If clicked filter is already active, don't do anything.\n if (searchable_interest_areas === filter) {\n return;\n }\n\n this.controls.setFilterControl('searchable_interest_areas', filter);\n }\n\n /**\n * Reset faculty types to unchecked.\n *\n * @return void\n */\n resetFacultyType() {\n const elements = document.querySelectorAll('input[name=faculty_type]');\n for (const element of elements) {\n element.checked = false;\n }\n this.controls.clearFilterControlState('faculty_type');\n }\n\n /**\n * Render the faculty tease.\n *\n * @param {array} hits Hits from Algolia.\n *\n * @return void\n */\n render(hits) {\n const hitsMarkup = hits.map(facultyTease).join('');\n this.resultsEl.innerHTML = ``;\n }\n\n /**\n * Attach new listeners for interest areas on the injected tease markup.\n * Also removes any 'inert' attributes on select and checkbox facets and divs\n * (so certain screen readers like NVDA don't prematurely announce facets).\n *\n * @return void\n */\n afterQueryComplete() {\n const inertSelectFields = this.controls.controlsEl.querySelectorAll('select[inert=\"true\"]');\n if (inertSelectFields) {\n inertSelectFields.forEach(field => {\n field.removeAttribute('inert');\n });\n }\n const inertCheckboxFields = this.controls.controlsEl.querySelectorAll('input[type=\"checkbox\"]');\n if (inertCheckboxFields) {\n inertCheckboxFields.forEach(field => {\n field.removeAttribute('inert');\n });\n }\n\n if (this.facultyListeners) {\n this.facultyListeners.forEach(listener =>\n typeof listener.off === 'function' ? listener.off : null,\n );\n }\n this.facultyListeners = [];\n\n // Custom listeners.\n this.facultyListeners = [\n on(\n Array.from(this.el.querySelectorAll('[data-search-faculty-interest-area]')),\n 'click',\n this.handleInterestFilter,\n ),\n on(Array.from(this.el.querySelectorAll('button.form__faculty-reset')), 'click', () => {\n this.resetFacultyType();\n }),\n ];\n }\n}\n\nexport default FacultySearch;\n"],"names":["FacultyControls","_SearchControls","el","state","_this","_classCallCheck","_callSuper","appEl","facultyTypeEls","Array","from","querySelectorAll","resetButtons","handleCheckChange","bind","handleReset","setupExtraListeners","params","get","newParams","scanCheckboxes","faculty_type","set","_inherits","key","value","this","listeners","_toConsumableArray","checkboxListenerOff","on","resetListenerOff","checkboxes","controlsEl","foundPosts","noFilterCount","isFiltered","parseInt","filter","btn","dataset","searchReset","forEach","removeAttribute","style","display","oldParams","_objectSpread","page","param","hls_course_academic_period","searchInput","selects","select","name","chosen","checkbox","checked","ariaState","innerText","triggerChange","group","map","length","event","target","runChangeFns","arguments","undefined","updateAriaState","window","scrollTo","top","left","behavior","SearchControls","ALGOLIA_TYPE_INDEX_NAME","algoliaSettings","FacultySearch","_SearchApp","_defineProperty","handleInterestFilter","facets","setupHooks","afterQueryComplete","controls","facultyListeners","listener","off","facType","order","TYPE_ORDER","indexOf","_this2","addFilter","type","facetValue","facetName","facetValues","newValues","sort","a","b","getTypeOrder","searchFacultyInterestArea","searchable_interest_areas","setFilterControl","_step","_iterator","_createForOfIteratorHelper","document","s","n","done","err","e","f","clearFilterControlState","hits","hitsMarkup","facultyTease","join","resultsEl","innerHTML","concat","_this3","inertSelectFields","field","inertCheckboxFields","resetFacultyType","SearchApp"],"sourceRoot":""}