{"version":3,"file":"index-g_C8BKXo.js","sources":["../../Assets/Scripts/components/filterableFeed/constants.ts","../../Assets/Scripts/components/filterableFeed/filters/checkboxes.ts","../../Assets/Scripts/components/filterableFeed/filters/dateRange.ts","../../Assets/Scripts/components/filterableFeed/filters/dropdown.ts","../../Assets/Scripts/components/filterableFeed/filters/filterTypes.ts","../../Assets/Scripts/components/filterableFeed/populateHtml.ts","../../Assets/Scripts/components/filterableFeed/filters.ts","../../Assets/Scripts/components/filterableFeed/filtersModal.ts","../../Assets/Scripts/components/filterableFeed/freeTextFilter.ts","../../Assets/Scripts/components/filterableFeed/helpers/pageUrl.ts","../../Assets/Scripts/components/filterableFeed/listing.ts","../../Assets/Scripts/components/filterableFeed/loading.ts","../../Assets/Scripts/components/filterableFeed/pager.ts","../../Assets/Scripts/components/filterableFeed/services/searchService.ts","../../Assets/Scripts/components/filterableFeed/index.ts"],"sourcesContent":["export const contentTypeUmbracoBasedFilterKey = \"contentType\";\r\nexport const contentTypeCustomFilterKey = \"content-type\";","import { CSS } from \"../../../constants/css\";\r\n\r\nimport IDataFilter from \"../models/dataFilter\";\r\nimport IDataFilterOption from \"../models/dataFilterOption\";\r\nimport IFilterType from \"./filterType\";\r\n\r\ntype CollapseFunction = (filterId: string) => void;\r\ntype ExpandFunction = (filterId: string) => void;\r\ntype UpdateFunction = () => void;\r\n\r\nexport interface ICheckboxFilterOptions {\r\n expandedFilters: string[];\r\n filterOptionsLimit: number;\r\n onCollapse: CollapseFunction;\r\n onExpand: ExpandFunction;\r\n onUpdate: UpdateFunction;\r\n}\r\n\r\nexport default (\r\n $el: HTMLElement,\r\n filter: IDataFilter,\r\n options: ICheckboxFilterOptions,\r\n): IFilterType => {\r\n const addListeners = () => {\r\n $el\r\n .querySelectorAll(\r\n \".js-filterable-feed-filter-group-collapse-toggle\",\r\n )\r\n .forEach(($button) => {\r\n $button.addEventListener(\"click\", toggleCollapsibleFilter);\r\n });\r\n\r\n $el\r\n .querySelectorAll(\"input[type='checkbox']\")\r\n .forEach(($input) => {\r\n $input.addEventListener(\"change\", () => options.onUpdate());\r\n });\r\n };\r\n\r\n const renderExpandCollapse = () => {\r\n if ((filter.options?.length ?? 0) <= options.filterOptionsLimit) {\r\n return;\r\n }\r\n\r\n const $visibleOptions = $el.querySelectorAll(\r\n `.js-filterable-feed-item-choice:nth-child(-n+${options.filterOptionsLimit})`,\r\n );\r\n\r\n $visibleOptions?.forEach(($option) => $option.classList.add(CSS.visible));\r\n\r\n $el.classList.add(CSS.collapsible);\r\n\r\n if (options.expandedFilters.includes(filter.id)) {\r\n $el.classList.add(CSS.expanded);\r\n }\r\n };\r\n\r\n const toggleCollapsibleFilter = (event: MouseEvent) => {\r\n event.preventDefault();\r\n\r\n if (!(event.currentTarget instanceof HTMLButtonElement)) {\r\n return false;\r\n }\r\n\r\n const $button = event.currentTarget;\r\n\r\n $button.parentElement?.classList.toggle(CSS.expanded);\r\n\r\n const filterId = $button.dataset.id || \"\";\r\n\r\n if (!filterId) {\r\n return false;\r\n }\r\n\r\n if ($button.parentElement?.classList.contains(CSS.expanded)) {\r\n options.onExpand(filterId);\r\n return false;\r\n }\r\n\r\n options.onCollapse(filterId);\r\n return false;\r\n };\r\n\r\n addListeners();\r\n renderExpandCollapse();\r\n\r\n return {\r\n clear: () => {\r\n $el\r\n .querySelectorAll(\"input[type='checkbox']\")\r\n .forEach(($input) => {\r\n $input.checked = false;\r\n });\r\n },\r\n getName: (): string => {\r\n return filter.id;\r\n },\r\n getSelectedOptions: (): IDataFilterOption[] => {\r\n const $filterGroupCheckboxes = $el?.querySelectorAll(\r\n 'input[type=\"checkbox\"]',\r\n );\r\n\r\n if ($filterGroupCheckboxes?.length === 0) {\r\n return [];\r\n }\r\n\r\n const selectedOptions: IDataFilterOption[] = [];\r\n\r\n $filterGroupCheckboxes.forEach(($checkbox) => {\r\n if (!$checkbox.checked) {\r\n return;\r\n }\r\n\r\n selectedOptions.push({ id: $checkbox.value, selected: true });\r\n });\r\n\r\n return selectedOptions;\r\n },\r\n };\r\n};\r\n","import IDataFilter from \"../models/dataFilter\";\r\nimport IDataFilterOption from \"../models/dataFilterOption\";\r\nimport IFilterType from \"./filterType\";\r\n\r\ntype UpdateFunction = () => void;\r\n\r\nexport default (\r\n $el: HTMLElement,\r\n filter: IDataFilter,\r\n onUpdate: UpdateFunction,\r\n): IFilterType => {\r\n // TODO: Using blur ensures the filter doesn't re-render\r\n // while you're typing in it. But breaks browser input autofill\r\n // with the datepicker.\r\n $el\r\n .querySelectorAll(\"input[type='date']\")\r\n .forEach(($input) => {\r\n $input.addEventListener(\"blur\", () => onUpdate());\r\n });\r\n\r\n return {\r\n clear: () => {\r\n $el\r\n .querySelectorAll('input[type=\"date\"]')\r\n .forEach(($input) => ($input.value = \"\"));\r\n },\r\n getName: (): string => {\r\n return filter.id;\r\n },\r\n getSelectedOptions: () => {\r\n const $filterGroupDates =\r\n $el.querySelectorAll('input[type=\"date\"]');\r\n\r\n const selectedOptions: IDataFilterOption[] = [];\r\n\r\n if ($filterGroupDates.length) {\r\n $filterGroupDates.forEach((filter) => {\r\n selectedOptions.push({\r\n id: filter.id,\r\n value: filter.value,\r\n });\r\n });\r\n }\r\n\r\n return selectedOptions;\r\n },\r\n };\r\n};\r\n","import IDataFilter from \"../models/dataFilter\";\r\nimport IDataFilterOption from \"../models/dataFilterOption\";\r\nimport IFilterType from \"./filterType\";\r\n\r\ntype UpdateFunction = () => void;\r\n\r\nexport default (\r\n $el: HTMLElement,\r\n filter: IDataFilter,\r\n onUpdate: UpdateFunction,\r\n): IFilterType => {\r\n const $select = $el.querySelector(\"select\");\r\n\r\n const addListeners = () => {\r\n $select?.addEventListener(\"change\", () => onUpdate());\r\n };\r\n\r\n addListeners();\r\n\r\n return {\r\n clear: () => {\r\n if ($select) {\r\n $select.value = \"\";\r\n }\r\n },\r\n getName: (): string => {\r\n return filter.id;\r\n },\r\n getSelectedOptions: (): IDataFilterOption[] => {\r\n if (!$select || $select.value === \"\") {\r\n return [];\r\n }\r\n\r\n return [{ id: $select.value, selected: true }];\r\n },\r\n };\r\n};\r\n","export default {\r\n checkboxes: 5,\r\n dateRange: 2,\r\n};\r\n","import { createElementFromTemplate } from \"../../utils/dom\";\r\nimport { CSS } from \"../../constants/css\";\r\nimport IDataFilter from \"./models/dataFilter\";\r\nimport IDataFilterOption from \"./models/dataFilterOption\";\r\nimport IDataItem from \"./models/dataItem\";\r\n\r\nconst fillTextExclusions = [\r\n \"contentPage\",\r\n \"TextContentPage\",\r\n \"siteSegment\",\r\n \"homePage\",\r\n \"searchPage\",\r\n \"htmlSitemap\",\r\n \"person\",\r\n];\r\n\r\nexport default (\r\n $template: HTMLTemplateElement,\r\n $container: HTMLElement,\r\n data: IDataItem | IDataFilter | IDataFilterOption,\r\n) => {\r\n const $html = createElementFromTemplate($template);\r\n\r\n if (!$html) {\r\n return;\r\n }\r\n\r\n const isSingleElement = $html.children.length === 0;\r\n\r\n const $hrefs =\r\n $html.hasAttribute(\"data-href\") && $html instanceof HTMLAnchorElement\r\n ? [$html]\r\n : $html.querySelectorAll(\"[data-href]\");\r\n\r\n $hrefs.forEach(($href: HTMLAnchorElement) => {\r\n const key = $href.dataset.href;\r\n const prefix = $href.dataset.prefix || \"\";\r\n const suffix = $href.dataset.suffix || \"\";\r\n\r\n $href.removeAttribute(\"data-href\");\r\n\r\n if (key && key in data && typeof data[key] === \"string\") {\r\n $href.href = prefix + (data[key] as string) + suffix;\r\n } else {\r\n // If no URL, swap element for a div\r\n const d = document.createElement(\"div\");\r\n d.innerHTML = $href.innerHTML;\r\n for (let i = 0; i < $href.attributes.length; i++) {\r\n const a = $href.attributes[i];\r\n d.setAttribute(a.name, a.value);\r\n }\r\n\r\n $href.parentNode?.replaceChild(d, $href);\r\n }\r\n });\r\n\r\n const $fills = isSingleElement\r\n ? $html.hasAttribute(\"data-fill\")\r\n ? [$html]\r\n : []\r\n : $html.querySelectorAll(\"[data-fill]\");\r\n\r\n const $fillLists = $html.querySelectorAll(\"[data-fill-list]\");\r\n\r\n const $alts = $html.querySelectorAll(\"[data-alt]\");\r\n const $srcs = $html.querySelectorAll(\"[data-src]\");\r\n const $names = $html.querySelectorAll(\"[data-name]\");\r\n const $valueInputs = $html.querySelectorAll(\"[data-value]\");\r\n const $valueOptions =\r\n isSingleElement && $html instanceof HTMLOptionElement\r\n ? $html.hasAttribute(\"data-value\")\r\n ? [$html]\r\n : []\r\n : $html.querySelectorAll(\"[data-value]\");\r\n const $fors = $html.querySelectorAll(\"[data-for]\");\r\n const $ids = $html.querySelectorAll(\"[data-id]\");\r\n const $checkeds = $html.querySelectorAll(\"[data-checked]\");\r\n const $dataTargets =\r\n $html.querySelectorAll(\"[data-data-target]\");\r\n const $selecteds =\r\n isSingleElement && $html instanceof HTMLOptionElement\r\n ? $html.hasAttribute(\"data-selected\")\r\n ? [$html]\r\n : []\r\n : $html.querySelectorAll(\"[data-selected]\");\r\n const $tags = $html.querySelectorAll(\"[data-tags]\");\r\n const $removeEmpty = $html.querySelectorAll(\r\n \"[data-remove-empty]\",\r\n );\r\n\r\n $fills.forEach(($fill: HTMLElement) => {\r\n const key = $fill.dataset.fill;\r\n const prefix = $fill.dataset.prefix || \"\";\r\n const suffix = $fill.dataset.suffix || \"\";\r\n if (\r\n key &&\r\n key in data &&\r\n [\"string\", \"number\"].indexOf(typeof data[key]) > -1\r\n ) {\r\n let fillText = data[key]?.toString() || \"\";\r\n\r\n if (fillTextExclusions.includes(fillText)) {\r\n fillText = \"Content\";\r\n $fill.classList.add(CSS.hideContentMeta);\r\n }\r\n\r\n if ($fill.dataset.format == \"padStart\") {\r\n fillText = fillText.padStart(2, \"0\");\r\n }\r\n\r\n if ($fill.dataset.format == \"spanWrap\") {\r\n const words = fillText.split(\" \");\r\n fillText = words.map((word) => `${word}`).join(\" \");\r\n }\r\n\r\n $fill.innerHTML = prefix + fillText + suffix;\r\n } else {\r\n $fill.remove();\r\n }\r\n\r\n $fill.removeAttribute(\"data-fill\");\r\n $fill.removeAttribute(\"data-prefix\");\r\n $fill.removeAttribute(\"data-suffix\");\r\n });\r\n\r\n $fillLists.forEach(($fillList: HTMLElement) => {\r\n const key = $fillList.dataset.fillList;\r\n const listKey = $fillList.dataset.fillListItem;\r\n const prefix = $fillList.dataset.prefix || \"\";\r\n const suffix = $fillList.dataset.suffix || \"\";\r\n\r\n if (key && key in data) {\r\n const itemData = data[key] as Array;\r\n\r\n if (!itemData) {\r\n return;\r\n }\r\n\r\n itemData.forEach((item: IDataItem) => {\r\n if (listKey && listKey in item && typeof item[listKey] === \"string\") {\r\n const fillText = item[listKey] as string;\r\n const $item = document.createElement(\"span\");\r\n $item.textContent = prefix + fillText + suffix;\r\n\r\n $fillList.appendChild($item);\r\n }\r\n });\r\n } else {\r\n $fillList.remove();\r\n }\r\n });\r\n\r\n $srcs.forEach(($src: HTMLImageElement) => {\r\n const key = $src.dataset.src;\r\n const prefix = $src.dataset.prefix || \"\";\r\n const suffix = $src.dataset.suffix || \"\";\r\n if (key && key in data && typeof data[key] === \"string\") {\r\n $src.src = prefix + (data[key] as string) + suffix;\r\n } else {\r\n $src.remove();\r\n }\r\n\r\n $src.removeAttribute(\"data-src\");\r\n $src.removeAttribute(\"data-prefix\");\r\n $src.removeAttribute(\"data-suffix\");\r\n });\r\n\r\n $alts.forEach(($alt: HTMLImageElement) => {\r\n const key = $alt.dataset.alt;\r\n if (key && key in data && typeof data[key] === \"string\") {\r\n $alt.alt = data[key] as string;\r\n }\r\n\r\n $alt.removeAttribute(\"data-alt\");\r\n });\r\n\r\n $names.forEach(($name: HTMLInputElement) => {\r\n const key = $name.dataset.name;\r\n const prefix = $name.dataset.prefix || \"\";\r\n const suffix = $name.dataset.suffix || \"\";\r\n if (key && key in data && typeof data[key] === \"string\") {\r\n $name.name = prefix + (data[key] as string) + suffix;\r\n }\r\n });\r\n\r\n $valueInputs.forEach(($value: HTMLInputElement) => {\r\n const key = $value.dataset.value;\r\n const prefix = $value.dataset.prefix || \"\";\r\n const suffix = $value.dataset.suffix || \"\";\r\n if (key && key in data && typeof data[key] === \"string\") {\r\n $value.value = prefix + (data[key] as string) + suffix;\r\n }\r\n });\r\n\r\n $valueOptions.forEach(($value: HTMLOptionElement) => {\r\n const key = $value.dataset.value;\r\n const prefix = $value.dataset.prefix || \"\";\r\n const suffix = $value.dataset.suffix || \"\";\r\n if (key && key in data && typeof data[key] === \"string\") {\r\n $value.value = prefix + (data[key] as string) + suffix;\r\n }\r\n\r\n $value.removeAttribute(\"data-value\");\r\n });\r\n\r\n $fors.forEach(($forEl: HTMLLabelElement) => {\r\n const key = $forEl.dataset.for;\r\n const prefix = $forEl.dataset.prefix || \"\";\r\n const suffix = $forEl.dataset.suffix || \"\";\r\n if (key && key in data && typeof data[key] === \"string\") {\r\n $forEl.htmlFor = prefix + (data[key] as string) + suffix;\r\n }\r\n });\r\n\r\n $ids.forEach(($id: HTMLElement) => {\r\n const key = $id.dataset.id;\r\n const prefix = $id.dataset.prefix || \"\";\r\n const suffix = $id.dataset.suffix || \"\";\r\n if (key && key in data && typeof data[key] === \"string\") {\r\n $id.id = prefix + (data[key] as string) + suffix;\r\n }\r\n });\r\n\r\n $dataTargets.forEach(($dataTarget: HTMLElement) => {\r\n const key = $dataTarget.dataset.dataTarget;\r\n const prefix = $dataTarget.dataset.prefix || \"\";\r\n const suffix = $dataTarget.dataset.suffix || \"\";\r\n if (key && key in data && typeof data[key] === \"string\") {\r\n $dataTarget.dataset[key] = prefix + (data[key] as string) + suffix;\r\n }\r\n });\r\n\r\n $checkeds.forEach(($checked: HTMLInputElement) => {\r\n const key = $checked.dataset.checked;\r\n if (key && key in data && typeof data[key] === \"boolean\") {\r\n $checked.checked = data[key] as boolean;\r\n }\r\n });\r\n\r\n $selecteds.forEach(($selected: HTMLOptionElement) => {\r\n const key = $selected.dataset.selected;\r\n if (key && key in data && typeof data[key] === \"boolean\") {\r\n $selected.selected = data[key] as boolean;\r\n }\r\n\r\n $selected.removeAttribute(\"data-selected\");\r\n });\r\n\r\n $tags.forEach(($tag: HTMLElement) => {\r\n const key = $tag.dataset.tags;\r\n\r\n if (key && key in data && Array.isArray(data[key])) {\r\n (data[key] as string[]).forEach((tag: string) => {\r\n const $item = document.createElement(\"li\");\r\n $item.innerHTML = tag;\r\n $tag.appendChild($item);\r\n });\r\n }\r\n\r\n $tag.removeAttribute(\"data-tags\");\r\n\r\n if ($tag.childElementCount === 0) {\r\n $tag.remove();\r\n }\r\n });\r\n\r\n $removeEmpty.forEach(($empty: HTMLElement) => {\r\n if ($empty.childElementCount === 0) {\r\n $empty.remove();\r\n }\r\n });\r\n\r\n $container.appendChild($html);\r\n\r\n return $html;\r\n};\r\n","import checkboxes from \"./filters/checkboxes\";\r\nimport dateRange from \"./filters/dateRange\";\r\nimport dropdown from \"./filters/dropdown\";\r\nimport IFilterType from \"./filters/filterType\";\r\nimport filterTypes from \"./filters/filterTypes\";\r\nimport IDataFilter from \"./models/dataFilter\";\r\nimport IDataFilterOption from \"./models/dataFilterOption\";\r\nimport { IFeedData } from \"./models/feedData\";\r\nimport { IRequestFilter } from \"./models/requestFilter\";\r\nimport populateHtml from \"./populateHtml\";\r\n\r\ntype UpdateFunction = () => void;\r\n\r\ninterface IFilterDomElements {\r\n $filters: HTMLElement | null;\r\n}\r\n\r\ninterface IFilterState {\r\n activeFilters: IFilterType[];\r\n expandedFilters: string[];\r\n}\r\n\r\nconst domSelectors = {\r\n filterGroup: \".js-filterable-feed-filter-group\",\r\n};\r\n\r\nexport interface IFilter {\r\n getSelectedOptions: () => IRequestFilter[];\r\n updateView: (data: IFeedData) => void;\r\n}\r\n\r\nexport default ($el: HTMLElement, onUpdate: UpdateFunction): IFilter => {\r\n const state: IFilterState = {\r\n activeFilters: [],\r\n expandedFilters: [],\r\n };\r\n\r\n const dom: IFilterDomElements = {\r\n $filters: $el.querySelector(\".js-filterable-feed-filters\"),\r\n };\r\n\r\n const clear = () => {\r\n if (dom.$filters) {\r\n dom.$filters.innerHTML = \"\";\r\n }\r\n };\r\n\r\n const clearSelectedFilter = () => {\r\n state.activeFilters.forEach((filter) => {\r\n filter.clear();\r\n });\r\n\r\n onUpdate();\r\n };\r\n\r\n const createFilterGroup = ($container: HTMLElement, filter: IDataFilter) => {\r\n let $template = $el.querySelector(\r\n `.js-filterable-feed-filter-group-template[data-type=\"${filter.type}\"]`,\r\n );\r\n\r\n if (!$template) {\r\n $template = $el.querySelector(\r\n `.js-filterable-feed-filter-group-template[data-default=\"true\"]`,\r\n );\r\n }\r\n\r\n if (!$template) {\r\n return;\r\n }\r\n\r\n const $filterGroup = populateHtml($template, $container, filter);\r\n\r\n if (!$filterGroup) {\r\n return;\r\n }\r\n\r\n $filterGroup\r\n .querySelector(domSelectors.filterGroup)\r\n ?.setAttribute(\"data-name\", filter.id);\r\n\r\n renderFilterOptions($filterGroup, filter);\r\n\r\n if (filter.type === filterTypes.dateRange) {\r\n state.activeFilters.push(dateRange($filterGroup, filter, onUpdate));\r\n return;\r\n }\r\n\r\n if ($el.dataset.allowMultipleSelection === \"true\") {\r\n state.activeFilters.push(\r\n checkboxes($filterGroup, filter, {\r\n expandedFilters: state.expandedFilters,\r\n filterOptionsLimit: parseInt(\r\n $el.dataset.visibleFilterOptions ?? \"8\",\r\n 10,\r\n ),\r\n onCollapse: (filterId: string) => {\r\n state.expandedFilters = state.expandedFilters.filter(\r\n (id) => id !== filterId,\r\n );\r\n },\r\n onExpand: (filterId: string) => {\r\n state.expandedFilters.push(filterId);\r\n },\r\n onUpdate: onUpdate,\r\n }),\r\n );\r\n\r\n return;\r\n }\r\n\r\n state.activeFilters.push(dropdown($filterGroup, filter, onUpdate));\r\n };\r\n\r\n const getFilterOptionTempate = (filter: IDataFilter) => {\r\n return (\r\n $el.querySelector(\r\n `.js-filterable-feed-filter-item-template[data-type=\"${filter.type}\"]`,\r\n ) ||\r\n $el.querySelector(\r\n `.js-filterable-feed-filter-item-template[data-default=\"true\"]`,\r\n )\r\n );\r\n };\r\n\r\n const render = (data: IDataFilter[]) => {\r\n state.activeFilters = [];\r\n\r\n data.forEach((filter: IDataFilter) => {\r\n if (!dom.$filters || !filter.options?.length) {\r\n return;\r\n }\r\n\r\n createFilterGroup(dom.$filters, filter);\r\n });\r\n };\r\n\r\n const renderFilterOptions = (\r\n $filterGroup: HTMLElement,\r\n filter: IDataFilter,\r\n ) => {\r\n const $filterOptions = $filterGroup.querySelector(\r\n domSelectors.filterGroup,\r\n );\r\n\r\n if (!$filterOptions || !filter.options) {\r\n return;\r\n }\r\n\r\n const $filterItemTemplate = getFilterOptionTempate(filter);\r\n\r\n if (!$filterItemTemplate) {\r\n return;\r\n }\r\n\r\n filter.options.forEach((filterOption: IDataFilterOption) => {\r\n filterOption.passdown = filter[\r\n $filterOptions.dataset.passdown || \"\"\r\n ] as string;\r\n\r\n populateHtml($filterItemTemplate, $filterOptions, filterOption);\r\n });\r\n };\r\n\r\n $el\r\n .querySelector(\".js-filterable-feed-clear-filters\")\r\n ?.addEventListener(\"click\", clearSelectedFilter);\r\n\r\n return {\r\n getSelectedOptions: (): IRequestFilter[] => {\r\n const filters: IRequestFilter[] = [];\r\n\r\n state.activeFilters.forEach((filter) => {\r\n const selectedOptions = filter.getSelectedOptions();\r\n\r\n if (\r\n selectedOptions !== null &&\r\n selectedOptions.length > 0 &&\r\n filter.getName()\r\n ) {\r\n filters.push({\r\n id: filter.getName(),\r\n name: filter.getName(),\r\n options: selectedOptions,\r\n });\r\n }\r\n });\r\n\r\n return filters;\r\n },\r\n updateView: (data: IFeedData) => {\r\n clear();\r\n render(data.filters || []);\r\n },\r\n };\r\n};\r\n","import { CSS } from \"../../constants/css\";\r\nimport { createElementFromTemplate } from \"../../utils/dom\";\r\n\r\ninterface IFiltersModalDomElements {\r\n $area: HTMLElement | null;\r\n $itemsAndFilters: HTMLElement | null;\r\n $showBtn: HTMLButtonElement | null;\r\n $template: HTMLTemplateElement | null;\r\n}\r\n\r\ninterface IFiltersModalState {\r\n $activeModal: HTMLElement | null;\r\n}\r\n\r\nexport interface IFiltersModal {}\r\n\r\nexport default ($el: HTMLElement): IFiltersModal => {\r\n const dom: IFiltersModalDomElements = {\r\n $area: $el.querySelector(\".js-filterable-feed-filter-area\"),\r\n $itemsAndFilters: $el.querySelector(\r\n \".js-filterable-feed-items-and-filters\",\r\n ),\r\n $showBtn: $el.querySelector(\r\n \".js-filterable-feed-show-filters-btn\",\r\n ),\r\n $template: $el.querySelector(\r\n \".js-filterable-feed-filter-modal-template\",\r\n ),\r\n };\r\n\r\n const state: IFiltersModalState = { $activeModal: null };\r\n\r\n const checkEscapeKeyForClose = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") {\r\n close();\r\n }\r\n };\r\n\r\n const close = () => {\r\n if (!state.$activeModal) {\r\n return;\r\n }\r\n\r\n state.$activeModal.classList.remove(CSS.visible);\r\n\r\n if (dom.$itemsAndFilters && dom.$area instanceof Node) {\r\n dom.$itemsAndFilters.prepend(dom.$area);\r\n }\r\n\r\n document.body.removeChild(state.$activeModal);\r\n document.documentElement.classList.remove(CSS.overflowHidden);\r\n\r\n document.removeEventListener(\"keydown\", checkEscapeKeyForClose);\r\n\r\n state.$activeModal = null;\r\n };\r\n\r\n const show = () => {\r\n if (!dom.$template) {\r\n return;\r\n }\r\n\r\n state.$activeModal = createElementFromTemplate(dom.$template);\r\n\r\n if (!state.$activeModal) {\r\n return;\r\n }\r\n\r\n document.body.appendChild(state.$activeModal);\r\n\r\n const $modalContent = state.$activeModal.querySelector(\r\n \".js-filter-modal-content\",\r\n );\r\n\r\n if (dom.$area instanceof Node) {\r\n $modalContent?.appendChild(dom.$area);\r\n }\r\n\r\n state.$activeModal.classList.add(CSS.visible);\r\n document.documentElement.classList.add(CSS.overflowHidden);\r\n\r\n state.$activeModal\r\n .querySelectorAll(\".js-close-btn\")\r\n ?.forEach(($closeBtn) => $closeBtn.addEventListener(\"click\", close));\r\n\r\n document.addEventListener(\"keydown\", checkEscapeKeyForClose);\r\n };\r\n\r\n if (dom.$showBtn) {\r\n dom.$showBtn.addEventListener(\"click\", show);\r\n }\r\n\r\n return {};\r\n};\r\n","import { IFeedData } from \"./models/feedData\";\r\n\r\ninterface IFreeTextFilterDomElements {\r\n $clearBtn: HTMLButtonElement | null;\r\n $input: HTMLInputElement | null;\r\n $submitBtn: HTMLButtonElement | null;\r\n}\r\n\r\ntype UpdateFunction = () => void;\r\n\r\nexport interface IFreeTextFilter {\r\n getTerm: () => string;\r\n updateView: (data: IFeedData) => void;\r\n}\r\n\r\nexport default (\r\n $el: HTMLElement,\r\n onUpdate: UpdateFunction,\r\n): IFreeTextFilter => {\r\n const dom: IFreeTextFilterDomElements = {\r\n $clearBtn: $el.querySelector(\r\n \".js-filterable-feed-search-clear\",\r\n ),\r\n $input: $el.querySelector(\r\n \".js-filterable-feed-search-field\",\r\n ),\r\n $submitBtn: $el.querySelector(\r\n \".js-filterable-feed-search-submit\",\r\n ),\r\n };\r\n\r\n const addListeners = () => {\r\n dom.$clearBtn?.addEventListener(\"click\", clear);\r\n dom.$submitBtn?.addEventListener(\"click\", submit);\r\n dom.$input?.addEventListener(\"keydown\", checkEnterKeyForSubmit);\r\n };\r\n\r\n const checkEnterKeyForSubmit = (event: KeyboardEvent) => {\r\n if (event.key === \"Enter\") {\r\n onUpdate();\r\n }\r\n };\r\n\r\n const clear = () => {\r\n dom.$input!.value = \"\";\r\n onUpdate();\r\n dom.$input?.focus();\r\n };\r\n\r\n const submit = () => {\r\n onUpdate();\r\n };\r\n\r\n addListeners();\r\n\r\n return {\r\n getTerm: (): string => {\r\n return dom.$input?.value || \"\";\r\n },\r\n updateView: (data: IFeedData): void => {\r\n if (dom.$input) {\r\n dom.$input.value = data.term;\r\n }\r\n },\r\n };\r\n};\r\n","import IDataFilterOption from \"../models/dataFilterOption\";\r\nimport IEditableRequestPayload from \"../models/editableRequestPayload\";\r\nimport { IRequestFilter } from \"../models/requestFilter\";\r\n\r\nexport const updatePageUrl = (\r\n payload: IEditableRequestPayload,\r\n fixedFilters: IRequestFilter[],\r\n preFilters: IRequestFilter[],\r\n) => {\r\n const url = new URL(window.location.href);\r\n\r\n url.search = \"\";\r\n\r\n if (payload.page !== 1) {\r\n url.searchParams.append(\"page\", payload.page.toString());\r\n }\r\n\r\n payload.filters.forEach((filter: IRequestFilter) => {\r\n if (\r\n filter.options?.length === 0 ||\r\n fixedFilters.map((f) => f.id).includes(filter.id)\r\n ) {\r\n return;\r\n }\r\n\r\n if (\r\n filter.options?.length === 2 &&\r\n filter.options[0].id === \"min\" &&\r\n filter.options[1].id === \"max\"\r\n ) {\r\n let dateUrlParameter = \",\";\r\n\r\n if (filter.options[0].value) {\r\n dateUrlParameter = filter.options[0].value + dateUrlParameter;\r\n }\r\n\r\n if (filter.options[1].value) {\r\n dateUrlParameter = dateUrlParameter + filter.options[1].value;\r\n }\r\n\r\n if (dateUrlParameter !== \",\") {\r\n url.searchParams.append(filter.id, dateUrlParameter);\r\n }\r\n\r\n return;\r\n }\r\n\r\n url.searchParams.append(\r\n filter.id,\r\n filter.options\r\n ?.map((option: IDataFilterOption) => option.id.toString())\r\n .join(\",\") || \"\",\r\n );\r\n });\r\n\r\n preFilters.forEach((filter: IRequestFilter) => {\r\n if (payload.filters.some((f) => f.id === filter.id)) {\r\n return;\r\n }\r\n\r\n url.searchParams.append(filter.id, \"\");\r\n });\r\n\r\n if (payload.term) {\r\n url.searchParams.append(\"term\", payload.term);\r\n }\r\n\r\n history.pushState(payload, \"\", url.toString());\r\n};\r\n","import { CSS } from \"../../constants/css\";\r\nimport { contentTypeUmbracoBasedFilterKey } from \"./constants\";\r\nimport IDataItem from \"./models/dataItem\";\r\nimport { IFeedData } from \"./models/feedData\";\r\nimport populateHtml from \"./populateHtml\";\r\n\r\ninterface IListingDomElements {\r\n $items: HTMLElement | null;\r\n $itemTemplate: HTMLTemplateElement | null;\r\n}\r\n\r\nexport interface IListing {\r\n updateView: (data: IFeedData) => void;\r\n}\r\n\r\nexport default ($el: HTMLElement, shouldHideMeta: boolean): IListing => {\r\n const dom: IListingDomElements = {\r\n $items: $el.querySelector(\".js-filterable-feed-items\"),\r\n $itemTemplate: $el.querySelector(\r\n \".js-filterable-feed-item-template\",\r\n ),\r\n };\r\n\r\n const clear = () => {\r\n if (dom.$items) {\r\n dom.$items.innerHTML = \"\";\r\n }\r\n };\r\n\r\n const render = (data: IFeedData) => {\r\n if (data.pagination?.total === 0) {\r\n $el.classList.add(CSS.empty);\r\n return;\r\n }\r\n\r\n $el.classList.remove(CSS.empty);\r\n\r\n data.items?.forEach((item: IDataItem) => {\r\n if (!dom.$items || !dom.$itemTemplate) {\r\n return;\r\n }\r\n\r\n populateHtml(dom.$itemTemplate, dom.$items, item);\r\n });\r\n\r\n setMetaVisibility(data);\r\n };\r\n\r\n const setMetaVisibility = (data: IFeedData) => {\r\n const contentTypeFilter = data.filters?.find((obj) => {\r\n return obj.id === contentTypeUmbracoBasedFilterKey;\r\n });\r\n\r\n const selectedContentTypes = contentTypeFilter?.options?.filter((obj) => {\r\n return obj.selected;\r\n });\r\n\r\n if ((!selectedContentTypes && shouldHideMeta) || selectedContentTypes?.length === 1) {\r\n $el.classList.add(CSS.hideContentMeta);\r\n return;\r\n }\r\n\r\n $el.classList.remove(CSS.hideContentMeta);\r\n };\r\n\r\n return {\r\n updateView: (data: IFeedData) => {\r\n clear();\r\n render(data);\r\n },\r\n };\r\n};\r\n","import { CSS } from \"../../constants/css\";\r\n\r\nexport interface ILoading {\r\n hide: () => void;\r\n show: () => void;\r\n}\r\n\r\nexport default ($el: HTMLElement): ILoading => {\r\n return {\r\n hide: () => {\r\n $el.classList.remove(CSS.loading);\r\n $el.style.height = \"auto\";\r\n },\r\n show: () => {\r\n $el.classList.add(CSS.loading);\r\n $el.style.height = `${$el.offsetHeight}px`;\r\n },\r\n };\r\n};\r\n","import { CSS } from \"../../constants/css\";\r\nimport { createElementFromTemplate } from \"../../utils/dom\";\r\nimport { IFeedData } from \"./models/feedData\";\r\n\r\ntype UpdateFunction = () => void;\r\n\r\ninterface IPagerDomElements {\r\n $pagination: HTMLElement | null;\r\n $paginationTemplate: HTMLTemplateElement | null;\r\n $paginationItemTemplate: HTMLTemplateElement | null;\r\n}\r\n\r\ninterface IPagerState {\r\n selectedPage: number;\r\n}\r\n\r\nconst ellipsis = `...`;\r\n\r\nexport interface IPager {\r\n getSelectedPage: () => number;\r\n updateView: (data: IFeedData) => void;\r\n}\r\n\r\nexport default ($el: HTMLElement, onUpdate: UpdateFunction): IPager => {\r\n const state: IPagerState = {\r\n selectedPage: parseInt($el.dataset.page || \"1\", 10),\r\n };\r\n const dom: IPagerDomElements = {\r\n $pagination: $el.querySelector(\r\n \".js-filterable-feed-pagination\",\r\n ),\r\n $paginationTemplate: $el.querySelector(\r\n \".js-filterable-feed-pagination-template\",\r\n ),\r\n $paginationItemTemplate: $el.querySelector(\r\n \".js-filterable-feed-pagination-item-template\",\r\n ),\r\n };\r\n\r\n const configureCurrentButton = ($pager: HTMLElement, data: IPagination) => {\r\n const $currentButton = $pager.querySelector(\r\n \".js-filterable-feed-pagination-current\",\r\n );\r\n\r\n const $parent = $currentButton?.parentElement;\r\n\r\n if (!$currentButton || !$parent) {\r\n return;\r\n }\r\n\r\n if (data.totalPages <= 3) {\r\n $parent.remove();\r\n return;\r\n }\r\n\r\n let targetPage = data.page;\r\n\r\n if (data.page > 3 && data.page < data.totalPages - 1) {\r\n targetPage = data.page;\r\n }\r\n else if (data.page > 4 && data.page > data.totalPages - 2) {\r\n targetPage = data.totalPages - 2;\r\n }\r\n else {\r\n targetPage = 3;\r\n }\r\n\r\n if (targetPage === data.page) {\r\n $currentButton.classList.add(CSS.active);\r\n }\r\n\r\n $currentButton.innerHTML = targetPage.toString();\r\n $currentButton.dataset.page = targetPage.toString();\r\n $currentButton.addEventListener(\"click\", navigateToPage);\r\n };\r\n\r\n const configureFirstButton = ($pager: HTMLElement, data: IPagination) => {\r\n const $firstButton = $pager.querySelector(\r\n \".js-filterable-feed-pagination-first\",\r\n );\r\n\r\n if (!$firstButton) {\r\n return;\r\n }\r\n\r\n if (data.page === 1) {\r\n $firstButton.classList.add(CSS.active);\r\n }\r\n\r\n $firstButton.dataset.page = \"1\";\r\n $firstButton.addEventListener(\"click\", navigateToPage);\r\n };\r\n\r\n const configureSecondButton = ($pager: HTMLElement, data: IPagination) => {\r\n const $secondButton = $pager.querySelector(\r\n \".js-filterable-feed-pagination-second\",\r\n );\r\n\r\n const $parent = $secondButton?.parentElement;\r\n\r\n if (!$secondButton || !$parent) {\r\n return;\r\n }\r\n\r\n if (data.totalPages <= 2) {\r\n $parent.remove();\r\n return;\r\n }\r\n\r\n if (data.page > 3) {\r\n $parent.innerHTML = ellipsis;\r\n return;\r\n }\r\n\r\n if (data.page === 2) {\r\n $secondButton.classList.add(CSS.active);\r\n }\r\n\r\n $secondButton.dataset.page = \"2\";\r\n $secondButton.addEventListener(\"click\", navigateToPage);\r\n };\r\n\r\n const configureLastButton = ($pager: HTMLElement, data: IPagination) => {\r\n const $lastButton = $pager.querySelector(\r\n \".js-filterable-feed-pagination-last\",\r\n );\r\n\r\n if (!$lastButton) {\r\n return;\r\n }\r\n\r\n if (data.page === data.totalPages) {\r\n $lastButton.classList.add(CSS.active);\r\n }\r\n\r\n $lastButton.dataset.page = $lastButton.innerHTML =\r\n data.totalPages.toString();\r\n $lastButton.addEventListener(\"click\", navigateToPage);\r\n };\r\n\r\n const configureNextButton = ($pager: HTMLElement, data: IPagination) => {\r\n const $nextButton = $pager.querySelector(\r\n \".js-filterable-feed-pagination-next\",\r\n );\r\n\r\n if (!$nextButton) {\r\n return;\r\n }\r\n\r\n if (data.page === data.totalPages) {\r\n setOptionAsDisabled($nextButton);\r\n return;\r\n }\r\n\r\n $nextButton.dataset.page = (data.page + 1).toString();\r\n $nextButton.addEventListener(\"click\", navigateToPage);\r\n };\r\n\r\n const configurePenultimateButton = (\r\n $pager: HTMLElement,\r\n data: IPagination,\r\n ) => {\r\n const $penultimateButton = $pager.querySelector(\r\n \".js-filterable-feed-pagination-penultimate\",\r\n );\r\n\r\n const $parent = $penultimateButton?.parentElement;\r\n\r\n if (!$penultimateButton || !$parent) {\r\n return;\r\n }\r\n\r\n if (data.totalPages <= 4) {\r\n $parent.remove();\r\n return;\r\n }\r\n\r\n if (data.page < data.totalPages - 2) {\r\n $parent.innerHTML = ellipsis;\r\n return;\r\n }\r\n\r\n const targetPage = data.totalPages - 1;\r\n\r\n if (data.page === targetPage) {\r\n $penultimateButton.classList.add(CSS.active);\r\n }\r\n\r\n $penultimateButton.innerHTML = targetPage.toString();\r\n $penultimateButton.dataset.page = targetPage.toString();\r\n $penultimateButton.addEventListener(\"click\", navigateToPage);\r\n };\r\n\r\n const configurePreviousButton = ($pager: HTMLElement, data: IPagination) => {\r\n const $previousButton = $pager.querySelector(\r\n \".js-filterable-feed-pagination-previous\",\r\n );\r\n\r\n if (!$previousButton) {\r\n return;\r\n }\r\n\r\n if (data.page === 1) {\r\n setOptionAsDisabled($previousButton);\r\n return;\r\n }\r\n\r\n $previousButton.dataset.page = (data.page - 1).toString();\r\n $previousButton.addEventListener(\"click\", navigateToPage);\r\n };\r\n\r\n const clear = () => {\r\n if (dom.$pagination) {\r\n dom.$pagination.innerHTML = \"\";\r\n }\r\n };\r\n\r\n const navigateToPage = (event: MouseEvent) => {\r\n event.preventDefault();\r\n\r\n if (!(event.currentTarget instanceof HTMLButtonElement)) {\r\n return false;\r\n }\r\n\r\n state.selectedPage = parseInt(event.currentTarget.dataset.page || \"1\", 10);\r\n onUpdate();\r\n\r\n return false;\r\n };\r\n\r\n const render = (data: IFeedData) => {\r\n if (\r\n !data.pagination ||\r\n data.pagination.totalPages <= 1 ||\r\n !dom.$pagination ||\r\n !dom.$paginationTemplate\r\n ) {\r\n clear();\r\n return;\r\n }\r\n\r\n const $pager = createElementFromTemplate(dom.$paginationTemplate);\r\n\r\n if (!$pager) {\r\n return;\r\n }\r\n\r\n state.selectedPage = data.pagination.page;\r\n\r\n if (data.pagination) {\r\n configureCurrentButton($pager, data.pagination);\r\n configureFirstButton($pager, data.pagination);\r\n configureLastButton($pager, data.pagination);\r\n configureNextButton($pager, data.pagination);\r\n configurePenultimateButton($pager, data.pagination);\r\n configurePreviousButton($pager, data.pagination);\r\n configureSecondButton($pager, data.pagination);\r\n }\r\n\r\n dom.$pagination.appendChild($pager);\r\n };\r\n\r\n const setOptionAsDisabled = ($button: HTMLButtonElement) => {\r\n $button.setAttribute(\"disabled\", \"\");\r\n };\r\n\r\n return {\r\n getSelectedPage: () => state.selectedPage,\r\n\r\n updateView: (data: IFeedData) => {\r\n clear();\r\n render(data);\r\n },\r\n };\r\n};\r\n","import { IRequestPayload } from \"../models/requestPayload\";\r\n\r\nexport const search = async (options: IRequestPayload): Promise => {\r\n try {\r\n const response = await fetch(\"/api/advanced-search\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(options),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch data. Status: ${response.status}`);\r\n }\r\n\r\n const fetchedData = (await response.json()) as T;\r\n\r\n return fetchedData;\r\n } catch (error) {\r\n console.error(\"Error fetching data:\", error);\r\n throw error;\r\n }\r\n};\r\n","import { contentTypeCustomFilterKey, contentTypeUmbracoBasedFilterKey } from \"./constants\";\r\nimport filters from \"./filters\";\r\nimport filtersModal from \"./filtersModal\";\r\nimport freeTextFilter from \"./freeTextFilter\";\r\nimport { updatePageUrl } from \"./helpers/pageUrl\";\r\nimport listing from \"./listing\";\r\nimport loading from \"./loading\";\r\nimport IEditableRequestPayload from \"./models/editableRequestPayload\";\r\nimport { IFeedData } from \"./models/feedData\";\r\nimport { IRequestFilter } from \"./models/requestFilter\";\r\nimport { IRequestPayload } from \"./models/requestPayload\";\r\nimport pager from \"./pager\";\r\nimport { search } from \"./services/searchService\";\r\n\r\ninterface IDefaultRequestPayload {\r\n culture: string;\r\n pageSize: number;\r\n}\r\n\r\ninterface IFilterableFeedOptions {\r\n preFilters: IRequestFilter[];\r\n supportedFilters: string[];\r\n};\r\n\r\nconst defaults: IDefaultRequestPayload = {\r\n culture: \"en-gb\",\r\n pageSize: 12,\r\n};\r\n\r\nconst instance = async ($el: HTMLElement) => {\r\n const state = {\r\n hasFetchedData: false,\r\n };\r\n\r\n const options: IFilterableFeedOptions = {\r\n preFilters: window.JSON.parse($el.dataset.preFilters || \"[]\"),\r\n supportedFilters: window.JSON.parse($el.dataset.supportedFilters || \"[]\"),\r\n };\r\n\r\n const getFilters = (): IRequestFilter[] => {\r\n const selectedFilters = state.hasFetchedData\r\n ? filtersInstance.getSelectedOptions()\r\n : getPreSelectedFilters();\r\n\r\n return [...selectedFilters, ...getFixedFilters()];\r\n };\r\n\r\n /**\r\n * Returns filters that have been configured on the filterable feed block\r\n * but can't be modified by the user via the UI. These filters are always\r\n * included in the request payload to the server.\r\n */\r\n const getFixedFilters = (): IRequestFilter[] => {\r\n return (options.preFilters || []).filter((filter: IRequestFilter) => {\r\n return (\r\n options.supportedFilters.length > 0 &&\r\n !options.supportedFilters.includes(filter.id)\r\n );\r\n });\r\n };\r\n\r\n /**\r\n * Returns filters that have been configured on the filterable feed block\r\n * and can be modified by the user via the UI.\r\n */\r\n const getPreSelectedFilters = (): IRequestFilter[] => {\r\n return (options.preFilters || []).filter((filter: IRequestFilter) => {\r\n return (\r\n options.supportedFilters.length === 0 ||\r\n options.supportedFilters.includes(filter.id)\r\n );\r\n });\r\n };\r\n\r\n const onPageChange = () => {\r\n update(\r\n {\r\n filters: getFilters(),\r\n page: pagerInstance.getSelectedPage(),\r\n term: freeTextFilterInstance.getTerm(),\r\n },\r\n true,\r\n true\r\n );\r\n };\r\n\r\n const onUiChange = (page: number = 1) => {\r\n update(\r\n {\r\n filters: getFilters(),\r\n page: page,\r\n term: freeTextFilterInstance.getTerm(),\r\n },\r\n true,\r\n );\r\n };\r\n\r\n const onUrlChange = (event: PopStateEvent) => {\r\n if (!event.state) {\r\n state.hasFetchedData = false;\r\n onUiChange();\r\n return;\r\n }\r\n\r\n update(event.state, false);\r\n };\r\n\r\n const requestData = async (\r\n payload: IEditableRequestPayload,\r\n ): Promise => {\r\n const requestOptions: IRequestPayload = {\r\n ...payload,\r\n culture: $el.dataset.culture || defaults.culture,\r\n listingId: $el.dataset.listingId || \"\",\r\n pageSize: parseInt(\r\n $el.dataset.pageSize || defaults.pageSize.toString(),\r\n 10,\r\n ),\r\n useAllIndexedData: $el.dataset.useAllIndexedData === \"true\",\r\n sorts: window.JSON.parse($el.dataset.sorts || \"[]\"),\r\n visibleFilters: options.supportedFilters || [],\r\n };\r\n\r\n return await search(requestOptions);\r\n };\r\n\r\n const shouldHideMeta = () => {\r\n if (options.supportedFilters.includes(contentTypeCustomFilterKey)) {\r\n return false;\r\n }\r\n\r\n const contentTypeFilter = options.preFilters.find((filter) => filter.id === contentTypeUmbracoBasedFilterKey);\r\n\r\n return contentTypeFilter?.options?.length === 1;\r\n };\r\n\r\n const update = async (\r\n payload: IEditableRequestPayload,\r\n shouldUpdatePageUrl: boolean,\r\n shouldScrollToTop: boolean = false\r\n ) => {\r\n loadingInstance.show();\r\n\r\n if (state.hasFetchedData && shouldUpdatePageUrl) {\r\n updatePageUrl(payload, getFixedFilters(), options.preFilters);\r\n }\r\n\r\n const data: IFeedData = await requestData(payload);\r\n\r\n state.hasFetchedData = true;\r\n\r\n filtersInstance.updateView(data);\r\n listingInstance.updateView(data);\r\n pagerInstance.updateView(data);\r\n freeTextFilterInstance.updateView(data);\r\n\r\n loadingInstance.hide();\r\n\r\n if (shouldScrollToTop) {\r\n $el.scrollIntoView({ behavior: \"smooth\" })\r\n }\r\n };\r\n\r\n const loadingInstance = loading($el);\r\n const listingInstance = listing($el, shouldHideMeta());\r\n const filtersInstance = filters($el, onUiChange);\r\n const freeTextFilterInstance = freeTextFilter($el, onUiChange);\r\n const pagerInstance = pager($el, onPageChange);\r\n filtersModal($el);\r\n\r\n onUiChange(parseInt($el.dataset.page || \"1\", 10));\r\n\r\n window.addEventListener(\"popstate\", onUrlChange);\r\n};\r\n\r\nexport default () => {\r\n document\r\n .querySelectorAll(\".js-filterable-feed\")\r\n .forEach(($el: HTMLElement) => {\r\n instance($el);\r\n });\r\n};\r\n"],"names":["contentTypeUmbracoBasedFilterKey","contentTypeCustomFilterKey","checkboxes","$el","filter","options","addListeners","$button","toggleCollapsibleFilter","$input","renderExpandCollapse","_a","$visibleOptions","$option","CSS","event","filterId","_b","$filterGroupCheckboxes","selectedOptions","$checkbox","dateRange","onUpdate","$filterGroupDates","dropdown","$select","filterTypes","fillTextExclusions","populateHtml","$template","$container","data","$html","createElementFromTemplate","isSingleElement","$href","key","prefix","suffix","d","i","a","$fills","$fillLists","$alts","$srcs","$names","$valueInputs","$valueOptions","$fors","$ids","$checkeds","$dataTargets","$selecteds","$tags","$removeEmpty","$fill","fillText","word","$fillList","listKey","itemData","item","$item","$src","$alt","$name","$value","$forEl","$id","$dataTarget","$checked","$selected","$tag","tag","$empty","domSelectors","filters","state","dom","clear","clearSelectedFilter","createFilterGroup","$filterGroup","renderFilterOptions","id","getFilterOptionTempate","render","$filterOptions","$filterItemTemplate","filterOption","filtersModal","checkEscapeKeyForClose","close","show","$modalContent","$closeBtn","freeTextFilter","submit","_c","checkEnterKeyForSubmit","updatePageUrl","payload","fixedFilters","preFilters","url","f","dateUrlParameter","option","listing","shouldHideMeta","setMetaVisibility","contentTypeFilter","obj","selectedContentTypes","loading","ellipsis","pager","configureCurrentButton","$pager","$currentButton","$parent","targetPage","navigateToPage","configureFirstButton","$firstButton","configureSecondButton","$secondButton","configureLastButton","$lastButton","configureNextButton","$nextButton","setOptionAsDisabled","configurePenultimateButton","$penultimateButton","configurePreviousButton","$previousButton","search","response","error","defaults","instance","getFilters","filtersInstance","getPreSelectedFilters","getFixedFilters","onPageChange","update","pagerInstance","freeTextFilterInstance","onUiChange","page","onUrlChange","requestData","requestOptions","shouldUpdatePageUrl","shouldScrollToTop","loadingInstance","listingInstance","index"],"mappings":"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"}