{"version":3,"file":"facetedFilterController-4223c32c.js","sources":["../../../../app/frontend/components/shared/controllers/facetedFilterController.js"],"sourcesContent":["import {trackSegmentEvent, getContextProperties} from '~/components/shared/tracking/segmentAnalytics';\nimport {moveFacetedFilters} from '~/components/shared/moveFacetedFilters.js';\n\n// this needs to be here to update the header when the filters are applied\nconst directoryHeroHeader = document.querySelector('[data-directory-new-header-title]');\n\ndocument.querySelectorAll('[data-controller=\"faceted-filter-form\"]').forEach(facetedFilterFormEl => {\n facetedFilterFormEl.addEventListener('submit', async (e) => {\n\n e.preventDefault();\n\n const fireSegmentEvent = () => {\n const properties = {\n action: 'apply filter'\n };\n const propertiesToDelete = {};\n const inputTargets = Array.from(facetedFilterFormEl.querySelectorAll('input'));\n inputTargets.forEach(input => {\n const inputSegmentDataAttr = input.dataset.segmentPropName;\n if (!inputSegmentDataAttr) {\n return;\n }\n\n const segment_name = inputSegmentDataAttr.replace('data-segment-', '').replace('-', '_');\n\n if (!input.checked) {\n propertiesToDelete[segment_name] = true;\n return;\n }\n\n if (properties.hasOwnProperty(segment_name)) {\n properties[segment_name] += `, ${input.value}`;\n } else {\n properties[segment_name] = input.value;\n }\n });\n\n for (const key of Object.keys(propertiesToDelete)) {\n if (typeof properties[key] === 'undefined') {\n properties[key] = undefined;\n }\n }\n trackSegmentEvent('Directory - Results', {...getContextProperties(), ...properties});\n }\n\n fireSegmentEvent();\n facetedFilterFormEl.submit();\n });\n});\n\ndocument.querySelectorAll('[data-controller=\"faceted-filter\"]')\n .forEach(controllerElement => {\n // These are necessary until we actually have stimulus set up to take care of this for us\n const activatorTextValue = controllerElement.dataset.facetedFilterActivatorTextValue;\n const filterPanelShowClass = controllerElement.dataset.facetedFilterPanelShowClass;\n const activatorActiveClass = controllerElement.dataset.facetedFilterActivatorActiveClass;\n const activatorWithSelectionClass = controllerElement.dataset.facetedFilterActivatorWithSelectionClass;\n const generalNav = document.querySelector(\"[data-general-nav]\")\n const activatorTarget = controllerElement.querySelector('[data-faceted-filter-target=\"activator\"]');\n const panelTarget = controllerElement.querySelector('[data-faceted-filter-target=\"panel\"]');\n const singleValueButton = controllerElement.querySelector('[data-single-value]');\n\n const activatorTextElement = activatorTarget.querySelector('.activator__text');\n\n const inputTargets = Array.from(controllerElement.querySelectorAll('[data-faceted-filter-target=\"input\"]'));\n\n function getOverlayElement() {\n let overlay = document.querySelector('.generic-modal__overlay');\n if (overlay) return overlay;\n overlay = document.createElement('DIV');\n overlay.classList.add('generic-modal__overlay');\n document.body.prepend(overlay);\n return overlay;\n }\n\n function uncheckSameNameWithDifferentValue() {\n const inputName = inputTargets[0].name;\n const inputs = document.querySelectorAll(`input[name=\"${inputName}\"]`);\n inputs.forEach(input => {\n if (input.value !== inputTargets[0].value) {\n input.checked = false;\n }\n });\n }\n\n function setSingleValueCheckbox() {\n if (!singleValueButton) return;\n\n inputTargets[0].checked = !inputTargets[0].checked;\n\n if (inputTargets[0].checked === false) {\n uncheckSameName();\n }\n\n if (inputTargets[0].checked === true) {\n uncheckSameNameWithDifferentValue();\n }\n }\n\n function singleValueIsChecked() {\n if (!singleValueButton) return false;\n return inputTargets[0].checked;\n }\n\n function getCheckedOptions() {\n return inputTargets.filter(input => input.checked)\n }\n\n function getActivatorTextFormLabel(label) {\n if (!label) return activatorTextElement.innerHTML;\n\n return label.dataset.displayText || label.textContent;\n }\n\n function setCurrentSelections(checkedOptions) {\n if (checkedOptions.length === 0) return;\n\n const values = [];\n\n checkedOptions.forEach((input) => {\n values.push(input.id);\n })\n controllerElement.dataset.facetedFilterCurrentFilterValue = values.join(',');\n }\n\n function getCurrentFilterValues() {\n return controllerElement.dataset.facetedFilterCurrentFilterValue;\n }\n\n function clearCurrentFilterValues() {\n // this is to make sure all the single action buttons are cleared\n document.querySelectorAll('[data-single-value]').forEach(el => {\n el.dataset.facetedFilterCurrentFilterValue = '';\n el.classList.remove('faceted-filter__activator--with-selection');\n el.dataset.facetedFilterActivatorWithSelectionClass = '';\n const checkboxes = Array.from(el.querySelectorAll('[data-faceted-filter-target=\"input\"]'));\n checkboxes.forEach(checkbox => {\n checkbox.checked = false;\n });\n });\n controllerElement.dataset.facetedFilterCurrentFilterValue = '';\n }\n\n function filtersClearedValue() {\n return controllerElement.dataset.facetedFilterFiltersClearedValue;\n }\n\n function filtersCleared() {\n return filtersClearedValue() === 'true';\n }\n\n function setFiltersClearedValue(bool) {\n controllerElement.dataset.facetedFilterFiltersClearedValue = bool.toString();\n }\n\n function revert() {\n uncheckAllOptions();\n revertSelections();\n }\n\n function updatePageHeader() {\n if (singleValueIsChecked() && directoryHeroHeader.innerHTML.includes(' in ')) {\n const activatorText = activatorTextElement.innerHTML;\n const city = directoryHeroHeader.innerHTML.split('in ')[1].split('<')[0];\n // this is necessary because the method can be called twice (if multiple single value filters are active, which makes the city value blank)\n if (city) {\n switch (activatorText) {\n case 'Open Now':\n directoryHeroHeader.innerHTML = `Book same-day urgent care open now in ${city}`;\n break;\n case 'Accepts Kids':\n directoryHeroHeader.innerHTML = `Book same-day urgent care that accepts kids in ${city}`;\n break;\n case 'Telemedicine':\n directoryHeroHeader.innerHTML = `Book same-day telemedicine in ${city}`;\n break;\n default:\n return;\n }\n }\n }\n }\n\n function newOptionsSelected() {\n let checkedInputs = getCheckedOptions();\n\n if (checkedInputs.length > 0) {\n checkedInputs = checkedInputs.map(input => input.id)\n }\n\n const currentFilterSelection = getCurrentFilterValues();\n\n return checkedInputs.join(',') !== currentFilterSelection;\n }\n\n function shouldRevert() {\n const currentFilters = getCurrentFilterValues();\n return currentFilters.length > 0 && newOptionsSelected() && filtersCleared() === false;\n }\n\n function uncheckAllOptions() {\n getCheckedOptions().forEach((input) => input.checked = false);\n }\n\n function revertSelections() {\n const currentValues = getCurrentFilterValues().split(',');\n const targetInputs = inputTargets.filter((input) => currentValues.includes(input.id));\n targetInputs.forEach(input => input.checked = true);\n }\n\n function updateActivatorState() {\n const checkedInputs = getCheckedOptions();\n const checkedCount = checkedInputs.length;\n\n if (checkedCount === 0) {\n activatorTarget.classList.remove(activatorWithSelectionClass);\n activatorTextElement.innerHTML = activatorTextValue;\n } else {\n if (shouldRevert()) {\n revert();\n return;\n }\n activatorTarget.classList.add(activatorWithSelectionClass);\n const firstChecked = checkedInputs[0];\n let activatorTextHTML = getActivatorTextFormLabel(firstChecked.labels[0]);\n\n const additionalCount = checkedCount - 1;\n\n if (additionalCount > 0) {\n activatorTextHTML += ` +${additionalCount}`\n }\n activatorTextElement.innerHTML = activatorTextHTML;\n }\n }\n\n function uncheckSameName() {\n const inputName = inputTargets[0].name;\n const inputs = document.querySelectorAll(`input[name=\"${inputName}\"]`);\n inputs.forEach(input => input.checked = false);\n }\n\n let opened = false;\n\n function close(e) {\n document.removeEventListener('click', onClickOutside)\n\n if (e && e.target.type === 'submit') {\n return;\n }\n\n activatorTarget.classList.remove(activatorActiveClass);\n generalNav.classList.remove(\"faceted-panel-open\")\n\n // this is a fix for ios, as it doesn't fire scroll event when you scroll to the top\n if ((window.pageYOffset <= 0) || (window.pageYOffset <= 0 && window.innerHeight < 356)) {\n generalNav.classList.remove('is-sticking');\n moveFacetedFilters(generalNav);\n }\n\n panelTarget.classList.remove(filterPanelShowClass)\n if (window.innerWidth < 768) {\n document.body.classList.remove('no-scroll');\n getOverlayElement().classList.remove('opened');\n }\n opened = !opened;\n window.facetedFilterOpen = false;\n }\n\n const onClickOutside = (e) => {\n e.stopPropagation();\n const isOutside = !controllerElement.contains(e.target) && e.target !== controllerElement;\n if (isOutside) {\n close();\n document.removeEventListener('click', onClickOutside)\n }\n }\n\n function open() {\n document.addEventListener('click', onClickOutside)\n generalNav.classList.add(\"faceted-panel-open\")\n generalNav.classList.add(\"is-sticking\")\n panelTarget.classList.add(filterPanelShowClass);\n activatorTarget.classList.add(activatorActiveClass);\n if (window.innerWidth < 768) {\n document.body.classList.add('no-scroll');\n getOverlayElement().classList.add('opened');\n moveFacetedFilters(generalNav);\n }\n opened = !opened;\n window.facetedFilterOpen = true;\n }\n\n function deselectOther(e) {\n inputTargets.forEach(input => {\n if (e.target !== input) {\n input.checked = false;\n }\n });\n }\n\n function singleSelect(e) {\n if (singleValueButton) {\n setSingleValueCheckbox();\n updateActivatorState();\n }\n }\n\n const actions = {\n deselectOther,\n close,\n toggle: async () => {\n if (opened) {\n close();\n } else {\n if (activatorTarget.disabled === true) return;\n if (window.facetedFilterOpen) return;\n open();\n }\n },\n clear: () => {\n inputTargets.forEach(input => {\n input.checked = false;\n });\n setFiltersClearedValue(true);\n clearCurrentFilterValues();\n },\n singleSelect: () => {\n singleSelect();\n }\n }\n\n\n controllerElement.querySelectorAll(\"[data-action]\").forEach(el => {\n const actionName = el.dataset.action.split('#')[1];\n\n if (actionName === 'deselectOther') {\n el.addEventListener('change', actions[actionName]);\n } else {\n el.addEventListener('click', actions[actionName]);\n }\n })\n\n setCurrentSelections(getCheckedOptions());\n updateActivatorState();\n updatePageHeader();\n\n });\n"],"names":["directoryHeroHeader","facetedFilterFormEl","e","properties","propertiesToDelete","input","inputSegmentDataAttr","segment_name","key","trackSegmentEvent","getContextProperties","controllerElement","activatorTextValue","filterPanelShowClass","activatorActiveClass","activatorWithSelectionClass","generalNav","activatorTarget","panelTarget","singleValueButton","activatorTextElement","inputTargets","getOverlayElement","overlay","uncheckSameNameWithDifferentValue","inputName","setSingleValueCheckbox","uncheckSameName","singleValueIsChecked","getCheckedOptions","getActivatorTextFormLabel","label","setCurrentSelections","checkedOptions","values","getCurrentFilterValues","clearCurrentFilterValues","el","checkbox","filtersClearedValue","filtersCleared","setFiltersClearedValue","bool","revert","uncheckAllOptions","revertSelections","updatePageHeader","activatorText","city","newOptionsSelected","checkedInputs","currentFilterSelection","shouldRevert","currentValues","updateActivatorState","checkedCount","firstChecked","activatorTextHTML","additionalCount","opened","close","onClickOutside","moveFacetedFilters","open","deselectOther","singleSelect","actions","actionName"],"mappings":"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"}