{"mappings":"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","sources":["src/ts/components/savingsFilters.ts"],"sourcesContent":["import _ from 'lodash';\n\ntype Access = 'instant' | 'limited' | 'fixed' | undefined;\ntype Type = 'cash-isa' | 'fixed-rate-bond' | 'notice' | 'easy-access' | 'childrens-savings' | 'regular-saver';\n\ntype Opening = 'branch' | 'online' | 'post';\n\ntype Sort = 'ob' | 'ir' | undefined;\n\ninterface Data {\n access: Access;\n isa: boolean;\n type: Type[];\n opening: Opening[];\n withdrawals: boolean;\n}\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const container = document.querySelector('.compare') as HTMLElement;\n const filtersPanel = document.querySelector('.filters__panel') as HTMLElement;\n const filtersBtn = document.querySelector('#filters-btn') as HTMLElement;\n const sortingSelect = document.querySelector('#sorting') as HTMLSelectElement;\n const resetBtn = document.querySelector('#reset-btn') as HTMLElement;\n\n sortingSelect?.addEventListener('change', (event: Event) => {\n const select = event.target as HTMLSelectElement;\n sort = select.value as Sort;\n filter();\n });\n\n if (filtersBtn && filtersPanel) {\n filtersBtn.addEventListener('click', () => {\n filtersBtn.classList.toggle('filters__control__right__filter--active');\n filtersPanel.classList.toggle('hidden');\n });\n }\n resetBtn.addEventListener('click', () => {\n sortingSelect.selectedIndex = 0; // Reset sorting select to default option\n access = undefined;\n isa = false;\n withdrawals = undefined;\n sort = undefined;\n\n // Reset opening to true for all keys\n Object.entries(opening).forEach(([key, value]) => {\n opening[key as keyof typeof opening] = true;\n });\n\n // Reset type to true for all keys\n Object.entries(type).forEach(([key, value]) => {\n type[key as keyof typeof type] = true;\n });\n\n const radioGroups = document.querySelectorAll('.radio-group input[type=\"radio\"]');\n const checkboxGroups = document.querySelectorAll('.radio-group input[type=\"checkbox\"]');\n\n radioGroups.forEach((radio) => ((radio as HTMLInputElement).checked = false));\n checkboxGroups.forEach((checkbox) => ((checkbox as HTMLInputElement).checked = true));\n\n filter();\n });\n\n // ITEMS\n const compareItems = document.querySelectorAll('.compare__item');\n\n const data = Array.from(compareItems).map((item) => {\n const ob = item.getAttribute('data-sort-ob') || '';\n const ir = item.getAttribute('data-sort-ir') || '';\n return {\n item: item,\n data: {\n access: (item.dataset.access as Access) || undefined,\n isa: item.dataset.isa === 'true',\n type: (item.dataset.type?.split(',') || []) as Type[],\n opening: (item.dataset.opening?.split(',') || []) as Opening[],\n withdrawals: item.dataset.withdrawals === 'true',\n } as Data,\n values: {\n ob: isNaN(+ob) ? undefined : +ob,\n ir: isNaN(+ir) ? undefined : +ir,\n },\n };\n });\n\n let sort: Sort = undefined;\n\n let access: Access = undefined;\n let isa: boolean = false;\n let withdrawals: boolean | undefined = undefined;\n const opening = {\n branch: true,\n online: true,\n post: true,\n };\n const type = {\n 'cash-isa': true,\n 'fixed-rate-bond': true,\n notice: true,\n 'easy-access': true,\n 'childrens-savings': true,\n 'regular-saver': true,\n };\n\n const accessGroup = document.querySelector('#access') as Element;\n const isaGroup = document.querySelector('#isa') as Element;\n const withdrawalsGroup = document.querySelector('#withdrawals') as Element;\n const openingGroup = document.querySelector('#opening') as Element;\n const typeGroup = document.querySelector('#type') as Element;\n\n if (accessGroup) {\n const onChange = (event: Event) => {\n const target = event.target as HTMLInputElement;\n\n if (target && target.type === 'radio') {\n access = (target.value || undefined) as Access;\n filter();\n }\n };\n\n accessGroup.addEventListener('change', onChange);\n }\n if (isaGroup) {\n const onChange = (event: Event) => {\n const target = event.target as HTMLInputElement;\n\n if (target && target.type === 'radio') {\n isa = target.value === 'true';\n filter();\n }\n };\n\n isaGroup.addEventListener('change', onChange);\n }\n if (withdrawalsGroup) {\n const onChange = (event: Event) => {\n const target = event.target as HTMLInputElement;\n\n if (target && target.type === 'radio') {\n withdrawals = target.value === '' ? undefined : target.value === 'true';\n filter();\n }\n };\n\n withdrawalsGroup.addEventListener('change', onChange);\n }\n if (openingGroup) {\n const onChange = (event: Event) => {\n const target = event.target as HTMLInputElement;\n\n if (target && target.type === 'checkbox') {\n const value = target.value as Opening;\n const checked = target.checked;\n opening[value] = checked;\n filter();\n }\n };\n\n openingGroup.addEventListener('change', onChange);\n }\n if (typeGroup) {\n const onChange = (event: Event) => {\n const target = event.target as HTMLInputElement;\n\n if (target && target.type === 'checkbox') {\n const value = target.value as Type;\n const checked = target.checked;\n type[value] = checked;\n filter();\n }\n };\n\n typeGroup.addEventListener('change', onChange);\n }\n\n const filter = () => {\n const criteria = { isa, access, withdrawals, opening, type };\n\n const filteredList = _.filter(data, ({ data }) =>\n _.every(criteria, (value, key) => {\n switch (key) {\n case 'isa':\n return value === false ? true : value === data.isa;\n case 'access':\n return !value ? true : value === data.access;\n case 'withdrawals':\n if (value === undefined) return true;\n return value === data.withdrawals;\n case 'opening':\n const openingKeys = _.keys(_.pickBy(value as {}, (el) => el === true));\n return _.some(openingKeys, (el) => data.opening.includes(el as Opening));\n case 'type':\n const typeKeys = _.keys(_.pickBy(value as {}, (el) => el === true));\n return _.some(typeKeys, (el) => data.type.includes(el as Type));\n default:\n return value === data[key as keyof Data];\n }\n }),\n );\n\n const orderedData = _.orderBy(filteredList, [`values.${sort}`], [sort === 'ob' ? 'asc' : 'desc']);\n\n data.forEach((el) => {\n el.item.remove();\n });\n\n orderedData.forEach((el) => {\n container.appendChild(el.item);\n });\n\n const mortgageNotice = document.querySelector('.mortgages__notice') as HTMLElement | null;\n const compareHead = document.querySelector('.compare__head') as HTMLElement | null;\n const noResultsDiv = document.querySelector('.no-results-message') as HTMLElement | null;\n\n if (orderedData.length === 0) {\n if (compareHead) {\n compareHead.style.display = 'none';\n }\n if (mortgageNotice) {\n mortgageNotice.style.display = 'none';\n }\n if (noResultsDiv === null) {\n const newNoResultsDiv = document.createElement('div');\n newNoResultsDiv.className = 'no-results-message';\n newNoResultsDiv.textContent = 'No results found. Try adjusting your filters to see more options.';\n container.appendChild(newNoResultsDiv);\n } else {\n noResultsDiv.style.display = 'block';\n }\n } else {\n if (noResultsDiv) {\n noResultsDiv.style.display = 'none';\n }\n if (compareHead) {\n compareHead.style.display = 'grid';\n }\n if (mortgageNotice) {\n mortgageNotice.style.display = 'block';\n }\n }\n };\n\n filter();\n});\n"],"names":[],"version":3,"file":"compare.fcdf46d8.js.map"}