{"version":3,"file":"946.adad6dbdb965373e4436.js","mappings":"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","sources":["webpack://pratt-main/../pratt/static/js/utils/constants.js","webpack://pratt-main/../pratt/static/js/components/tabs.js","webpack://pratt-main/./static/js/components/program-tabs.js"],"sourcesContent":["export const KEY_CODES = {\n ARROW_LEFT: 'ArrowLeft',\n ARROW_LEFT_IE11: 'Left',\n ARROW_RIGHT: 'ArrowRight',\n ARROW_RIGHT_IE11: 'Right',\n ESCAPE: 'Escape',\n ESCAPE_IE11: 'Esc',\n TAB: 'Tab',\n SPACE: ' ',\n SPACE_IE11: 'Spacebar',\n ENTER: 'Enter',\n};\n","import { KEY_CODES } from '@pratt/js/utils/constants';\n\n/**\n * Interactivity for accessible tabs\n * @see https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/Tab_Role\n */\nclass Tabs {\n constructor(tabsWrapper, orientation = 'horizontal', withHashes = false, onTabChange = null) {\n // Any element containing tablist and tabpanels\n this.tabsWrapper = tabsWrapper;\n this.orientation = orientation;\n this.withHashes = withHashes;\n this.onTabChange = onTabChange;\n\n this.tabList = this.tabsWrapper.querySelector('[role=\"tablist\"]');\n this.tabs = Array.from(this.tabList.querySelectorAll('[role=\"tab\"]'));\n this.tabPanels = Array.from(this.tabsWrapper.querySelectorAll('[role=\"tabpanel\"]'));\n\n this.departmentSelector = document.querySelector('.archive-program__departments');\n\n this.tabFocus = 0;\n this.tabMap = {};\n\n this.init();\n }\n\n /**\n * Add event listeners\n *\n * @returns void\n */\n init() {\n // Enable arrow navigation between tabs in the tab list\n this.tabList.addEventListener('keydown', e => this.handleKeydown(e));\n\n // Add a click event handler to each tab\n this.tabs.forEach(tab => {\n tab.addEventListener('click', e => this.changeTabs(e.target));\n });\n\n if (this.withHashes) {\n this.tabs.forEach(tab => {\n const hash = this.getTabHashFromId(tab.id);\n this.tabMap[hash] = tab;\n });\n\n window.addEventListener('load', () => this.handleHash(), false);\n window.addEventListener('hashchange', () => this.handleHash(), false);\n }\n }\n\n // Example: 'tab-foo' -> '#foo'\n getTabHashFromId(id) {\n return `#${id.replace('tab-', '')}`.toLowerCase();\n }\n\n // Programmatically clicks a tab depending on the location hash\n handleHash() {\n const { hash } = window.location;\n if (hash) {\n setTimeout(() => {\n const tabEl = this.tabMap[hash];\n if (tabEl) {\n tabEl.click();\n }\n }, 0);\n }\n }\n\n /**\n * Increment tab focus index and make active tab focusable\n *\n * @returns void\n */\n incrementTabFocus() {\n this.tabs[this.tabFocus].setAttribute('tabindex', -1);\n this.tabFocus++;\n // If we're at the end, go to the start\n if (this.tabFocus >= this.tabs.length) {\n this.tabFocus = 0;\n }\n this.tabs[this.tabFocus].setAttribute('tabindex', 0);\n this.tabs[this.tabFocus].focus();\n }\n\n /**\n * Decrement tab focus index and make active tab focusable\n *\n * @returns void\n */\n decrementTabFocus() {\n this.tabs[this.tabFocus].setAttribute('tabindex', -1);\n this.tabFocus--;\n // If we're at the start, move to the end\n if (this.tabFocus < 0) {\n this.tabFocus = this.tabs.length - 1;\n }\n this.tabs[this.tabFocus].setAttribute('tabindex', 0);\n this.tabs[this.tabFocus].focus();\n }\n\n /**\n * Handle keyboard navigation with arrows\n *\n * @param {KeyboardEvent} e Keyboard event from tablist keyboard event listener\n *\n * @returns void\n */\n handleKeydown(e) {\n switch (e.key) {\n case KEY_CODES.ARROW_LEFT:\n case KEY_CODES.ARROW_LEFT_IE11: {\n e.preventDefault();\n if (this.orientation === 'horizontal') {\n this.decrementTabFocus();\n }\n break;\n }\n\n case KEY_CODES.ARROW_RIGHT:\n case KEY_CODES.ARROW_RIGHT_IE11: {\n e.preventDefault();\n if (this.orientation === 'horizontal') {\n this.incrementTabFocus();\n }\n break;\n }\n\n case KEY_CODES.ARROW_UP:\n case KEY_CODES.ARROW_UP_IE11: {\n e.preventDefault();\n if (this.orientation === 'vertical') {\n this.decrementTabFocus();\n }\n break;\n }\n\n case KEY_CODES.ARROW_DOWN:\n case KEY_CODES.ARROW_DOWN_IE11: {\n e.preventDefault();\n if (this.orientation === 'vertical') {\n this.incrementTabFocus();\n }\n break;\n }\n\n default: {\n break;\n }\n }\n }\n\n /**\n * Handle changing tabs when clicking on a tab\n *\n * @param {HTMLElement} target HTML element with role=\"tab\"\n *\n * @returns void\n */\n changeTabs(target) {\n // Remove all current selected tabs\n Array.from(this.tabList.querySelectorAll('[aria-selected=\"true\"]')).forEach(tab =>\n tab.setAttribute('aria-selected', false),\n );\n\n // Set this tab as selected\n target.setAttribute('aria-selected', true);\n\n // Mark the selected tab index on the parent (for desktop pill transaition)\n const selectedTabIndex = this.tabs.indexOf(target);\n this.tabList.dataset.selectedTabIndex = selectedTabIndex;\n\n // Hide all tab panels\n this.tabPanels.forEach(panel => panel.setAttribute('hidden', true));\n\n // Hide department selector if SCPS tab.\n if (this.departmentSelector && target.id === 'tab-Continuing') {\n this.departmentSelector.setAttribute('hidden', true);\n } else if (this.departmentSelector && target.id !== 'tab-Continuing') {\n this.departmentSelector.removeAttribute('hidden');\n }\n\n // Show the selected panel\n this.tabsWrapper\n .querySelector(`#${target.getAttribute('aria-controls')}`)\n .removeAttribute('hidden');\n\n // Change URL based on selected tab\n if (this.withHashes && window.history && window.history.pushState) {\n const hash = this.getTabHashFromId(target.id);\n window.history.pushState({}, '', hash);\n }\n\n // Run an optional function on change\n if (this.onTabChange) {\n this.onTabChange();\n }\n\n // Dispatch custom event in order to subscribe to state changes\n target.dispatchEvent(\n new CustomEvent('tab-state', {\n bubbles: true,\n detail: {\n index: selectedTabIndex,\n target: target,\n tabPanel: this.tabsWrapper.querySelector(`#${target.getAttribute('aria-controls')}`),\n },\n }),\n );\n }\n\n /**\n * Select the first tab to \"reset\" the tabs\n *\n * @returns void\n */\n resetTabs() {\n const firstTab = this.tabs[0];\n this.changeTabs(firstTab);\n }\n}\n\nexport default Tabs;\n","import Tabs from '@pratt/js/components/tabs';\n\nclass ProgramTabs {\n constructor(rootEl) {\n this.rootEl = rootEl;\n if (!this.rootEl) {\n throw new Error('Root program tabs element not found.');\n }\n\n const isFilterable = this.rootEl.dataset['filterable'];\n\n this.tabs = new Tabs(this.rootEl, 'horizontal', !!isFilterable);\n\n if (isFilterable) {\n this.departmentSelect = this.rootEl.querySelector('.js-program-tabs-departments-select');\n this.filterReset = this.rootEl.querySelector('.js-program-tabs-departments-clear');\n this.schoolSections = this.rootEl.querySelectorAll('.archive-programs__school-section');\n this.programs = this.rootEl.querySelectorAll('.archive-programs__school-item');\n this.programSections = this.rootEl.querySelectorAll('.archive-programs__programs-section');\n\n const urlParams = new URLSearchParams(window.location.search);\n this.schoolSlugToFilter = urlParams.get('school');\n this.departmentSlugToFilter = urlParams.get('department');\n\n this.bindEvents();\n this.filter();\n }\n }\n\n bindEvents() {\n this.filterReset.addEventListener('click', () => {\n this.tabs.resetTabs();\n window.history.pushState({}, '', `${window.location.origin}${window.location.pathname}`);\n this.schoolSlugToFilter = null;\n this.departmentSlugToFilter = null;\n this.filter();\n });\n\n this.departmentSelect.addEventListener('change', e => {\n let optionValue = e.target.value;\n if (!optionValue) {\n optionValue = `${window.location.origin}${window.location.pathname}`;\n }\n window.history.pushState({}, '', `${optionValue}${window.location.hash}`);\n const params = new URLSearchParams(optionValue);\n this.schoolSlugToFilter = params.get('school');\n this.departmentSlugToFilter = params.get('department');\n this.filter();\n });\n }\n\n filter() {\n if (this.schoolSlugToFilter || this.departmentSlugToFilter) {\n this.filterReset.removeAttribute('disabled');\n } else {\n this.filterReset.setAttribute('disabled', '');\n }\n\n this.departmentSelect.value =\n this.schoolSlugToFilter && this.departmentSlugToFilter\n ? `?school=${this.schoolSlugToFilter}&department=${this.departmentSlugToFilter}`\n : '';\n\n this.schoolSections.forEach(section => {\n section.removeAttribute('hidden');\n\n if (this.schoolSlugToFilter) {\n const schoolSlug = section.dataset['school'];\n if (schoolSlug !== this.schoolSlugToFilter) {\n section.setAttribute('hidden', '');\n }\n }\n });\n\n this.programs.forEach(program => {\n program.removeAttribute('hidden');\n\n if (this.departmentSlugToFilter) {\n const departmentSlug = program.dataset['department'];\n if (departmentSlug !== this.departmentSlugToFilter) {\n program.setAttribute('hidden', '');\n }\n }\n });\n\n this.programSections.forEach(section => {\n const emptyText = section.querySelector('.archive-programs__empty');\n emptyText.setAttribute('hidden', '');\n\n const programs = Array.from(section.querySelectorAll('.archive-programs__school-item'));\n const shownPrograms = programs.filter(program => !program.hasAttribute('hidden'));\n\n // If all programs items are hidden, show empty text\n if (!shownPrograms.length) {\n emptyText.removeAttribute('hidden');\n }\n });\n }\n}\n\nexport default ProgramTabs;\n"],"names":["KEY_CODES","ARROW_LEFT","ARROW_LEFT_IE11","ARROW_RIGHT","ARROW_RIGHT_IE11","ESCAPE","ESCAPE_IE11","TAB","SPACE","SPACE_IE11","ENTER","constructor","tabsWrapper","orientation","withHashes","onTabChange","this","tabList","querySelector","tabs","Array","from","querySelectorAll","tabPanels","departmentSelector","document","tabFocus","tabMap","init","addEventListener","e","handleKeydown","forEach","tab","changeTabs","target","hash","getTabHashFromId","id","window","handleHash","replace","toLowerCase","location","setTimeout","tabEl","click","incrementTabFocus","setAttribute","length","focus","decrementTabFocus","key","preventDefault","ARROW_UP","ARROW_UP_IE11","ARROW_DOWN","ARROW_DOWN_IE11","selectedTabIndex","indexOf","dataset","panel","removeAttribute","getAttribute","history","pushState","dispatchEvent","CustomEvent","bubbles","detail","index","tabPanel","resetTabs","firstTab","rootEl","Error","isFilterable","Tabs","departmentSelect","filterReset","schoolSections","programs","programSections","urlParams","URLSearchParams","search","schoolSlugToFilter","get","departmentSlugToFilter","bindEvents","filter","origin","pathname","optionValue","value","params","section","program","emptyText","hasAttribute"],"sourceRoot":""}