{"version":3,"sources":["modules.locations.js"],"names":["app","locations","let","section","template","districtFilter","typeFilter","expertiseFilters","serviceFilters","extraFilters","listContainer","listToggle","mapContainer","resultsContainer","mapInitialized","map","markerCluster","markers","locationData","loadingOverlay","activeFilter","type","locality","expertises","expertisesNames","services","servicesNames","previousLocations","localityFilter","util","debounce","setAttribute","filter","initFilters","district","length","querySelector","id","trigger","preventDefault","closeFilters","forEach","substring","target","loadDistrictFilter","iconAnchor","districts","optionAll","querySelectorAll","option","remove","markerClusterGroup","spiderfyOnMaxZoom","createElement","showCoverageOnHover","emptyOption","zoomToBoundsOnClick","disableClusteringAtZoom","loadMarkers","document","clearMarkers","removeEventListener","newOption","name","appendChild","location","initMap","initMarkers","addEventListener","newMarker","matchMedia","matches","ljs","load","L","addLayer","fitBounds","padding","maxZoom","scrollWheelZoom","activeListItem","latLng","classList","maxBounds","latLngBounds","southWest","northEast","listItem","setMaxBounds","add","on","applyFilters","animate","timeout","markerIcon","icon","window","locationIds","areEqualArrays","addTo","innerHTML","filterLocations","init","marker","mapMarker","latitude","longitude","bindPopup","displayName","clickMarker","openPopup","closePopup","push","getBounds","event","options","scrollContainerTo","clearTimeout","setTimeout","jsonPath","then","console","removeLayer","Mustache","render","close","listWrapper","nodeName","value","display","showDistrictFilter","style","LoadingOverlay","fetchData","dataset","fetch","method","headers","Content-Type","Culture","uiCulture","HomePageId","homePageId","response","json","data","catch","error","warn","finally","timeout1","timeout2","item","container","pageUrl","pathname","content","contains","center","closeText","slideUp","panInsideBounds","openText","iconUrl","pushEvent","JSON","parse","atob","selectedIndex","dataLayer","text","indexOf","checked","index","splice","prefillFilters","isNaN","qsLocality","selectedLocality","join","qsDistrict","selectedDistrict","positionTop","top","slideDown","getQueryString","parseInt","selected","toString","pageYOffset","initMapAfterWindowResize"],"mappings":"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","file":"../modules.locations.min.js","sourcesContent":["/* ========================================================================\r\n Locations\r\n ========================================================================== */\r\n\r\napp.locations = (function () {\r\n 'use strict';\r\n\r\n let section = null;\r\n let template = null;\r\n\r\n let localityFilter = null;\r\n let districtFilter = null;\r\n let typeFilter = null;\r\n let expertiseFilters = null;\r\n let serviceFilters = null;\r\n\r\n let extraFilters = null;\r\n let listWrapper = null;\r\n let listContainer = null;\r\n let listToggle = null;\r\n let mapContainer = null;\r\n let resultsContainer = null;\r\n\r\n let mapInitialized = false;\r\n let map = null;\r\n let markerIcon = null;\r\n let markerCluster = null;\r\n let markers = [];\r\n let locationData = null;\r\n let loadingOverlay = null;\r\n\r\n const activeFilter = {\r\n type: null,\r\n locality: null,\r\n district: null,\r\n expertises: [],\r\n expertisesNames: [],\r\n services: [],\r\n servicesNames: [],\r\n };\r\n\r\n let timeout = null;\r\n let previousLocations = [];\r\n\r\n function init() {\r\n section = document.querySelector('[data-locations]');\r\n template = document.getElementById('locationTemplate').innerHTML;\r\n\r\n localityFilter = section.querySelector('[data-filter-locality]');\r\n districtFilter = section.querySelector('[data-filter-district]');\r\n typeFilter = section.querySelector('[data-filter-type]');\r\n\r\n extraFilters = section.querySelectorAll('[data-extra-filters]');\r\n listWrapper = section.querySelector('[data-list-wrapper]');\r\n listContainer = section.querySelector('[data-list]');\r\n listToggle = section.querySelector('[data-list-toggle]');\r\n mapContainer = section.querySelector('[data-map]');\r\n resultsContainer = section.querySelector('[data-results]');\r\n\r\n expertiseFilters = section.querySelectorAll('[data-filter-expertise]');\r\n serviceFilters = section.querySelectorAll('[data-filter-service]');\r\n\r\n if (typeFilter.nodeName === 'INPUT') {\r\n activeFilter.type = typeFilter.value;\r\n }\r\n\r\n // Hide extra filters for 'Buurtteams'\r\n if (activeFilter.type === '1250') {\r\n extraFilters.forEach((filter) => {\r\n filter.style.display = 'none';\r\n });\r\n }\r\n\r\n // Hide district filter if none of the localities have districts\r\n let showDistrictFilter = false;\r\n localityFilter.querySelectorAll('option').forEach((option) => {\r\n // 'W10=' is Base64 encode for '[]'\r\n if (option.value !== '*' && option.dataset.districts !== 'W10=') {\r\n showDistrictFilter = true;\r\n }\r\n });\r\n\r\n if (showDistrictFilter === false) {\r\n districtFilter.style.display = 'none';\r\n }\r\n\r\n loadingOverlay = LoadingOverlay(section);\r\n fetchData();\r\n\r\n listToggle.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n\r\n if (listWrapper.classList.contains('is-open') === false) {\r\n openList();\r\n } else {\r\n closeList();\r\n }\r\n });\r\n\r\n window.addEventListener(\r\n 'resize',\r\n () => {\r\n initMapAfterWindowResize();\r\n },\r\n { passive: true }\r\n );\r\n }\r\n\r\n const initMapAfterWindowResize = util.debounce(() => {\r\n initMap(true);\r\n }, 250);\r\n\r\n function openList() {\r\n mapContainer.classList.add('is-disabled');\r\n listWrapper.classList.add('is-open');\r\n listToggle.classList.add('is-open');\r\n\r\n // a11y: update aria attributes\r\n listToggle.setAttribute('aria-label', listToggle.dataset.closeText);\r\n listToggle.setAttribute('aria-expanded', true);\r\n }\r\n\r\n function closeList() {\r\n mapContainer.classList.remove('is-disabled');\r\n listWrapper.classList.remove('is-open');\r\n listToggle.classList.remove('is-open');\r\n\r\n // a11y: update aria attributes\r\n listToggle.setAttribute('aria-label', listToggle.dataset.openText);\r\n listToggle.setAttribute('aria-expanded', false);\r\n }\r\n\r\n function filterLocations() {\r\n var filter = '';\r\n\r\n if (activeFilter.type != null) {\r\n filter += `@.locationTypeId == ${activeFilter.type} && `;\r\n }\r\n\r\n if (activeFilter.locality != null) {\r\n filter += `@.localities.indexOf(${activeFilter.locality}) > -1 && `;\r\n }\r\n\r\n if (activeFilter.district != null) {\r\n filter += `@.districts.indexOf(${activeFilter.district}) > -1 && `;\r\n }\r\n\r\n if (activeFilter.expertises.length > 0) {\r\n filter += '(';\r\n activeFilter.expertises.forEach((id) => {\r\n filter += `@.expertises.indexOf(${id}) > -1 || `;\r\n });\r\n filter = filter.substring(0, filter.length - 4) + ') && ';\r\n }\r\n\r\n if (activeFilter.services.length > 0) {\r\n filter += '(';\r\n activeFilter.services.forEach((id) => {\r\n filter += `@.services.indexOf(${id}) > -1 || `;\r\n });\r\n filter = filter.substring(0, filter.length - 4) + ') && ';\r\n }\r\n\r\n if (filter !== '') {\r\n filter = `$[?(${filter.substring(0, filter.length - 4)})]`;\r\n return jsonPath(locationData, `${filter}`);\r\n } else {\r\n return locationData;\r\n }\r\n }\r\n\r\n function initFilters() {\r\n let timeout1 = null;\r\n let timeout2 = null;\r\n\r\n // Initialize extra filters\r\n extraFilters.forEach((item) => {\r\n const trigger = item.querySelector('[data-filter-trigger]');\r\n const container = item.querySelector('[data-filter-container]');\r\n\r\n trigger.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n\r\n if (item.classList.contains('is-active') === false) {\r\n openFilters(item, trigger, container);\r\n } else {\r\n closeFilters(item, trigger, container);\r\n }\r\n });\r\n });\r\n\r\n // Add event listener to 'Locality' filter\r\n localityFilter.addEventListener('change', (event) => {\r\n if (event.target.value === '*') {\r\n activeFilter.locality = null;\r\n loadDistrictFilter([]);\r\n } else {\r\n activeFilter.locality = event.target.value;\r\n\r\n try {\r\n var districtsJson = JSON.parse(\r\n atob(\r\n event.target.options[event.target.selectedIndex].dataset.districts\r\n )\r\n );\r\n loadDistrictFilter(districtsJson);\r\n } catch {\r\n loadDistrictFilter([]);\r\n }\r\n }\r\n\r\n activeFilter.district = null;\r\n applyFilters();\r\n\r\n // DATALAYER\r\n app.dataLayer.pushEvent('locationFilterPlaats', {\r\n pageUrl: window.location.pathname,\r\n option: event.target.options[event.target.selectedIndex].text,\r\n });\r\n });\r\n\r\n // Add event listener to 'District' filter\r\n districtFilter.addEventListener('change', (event) => {\r\n if (event.target.value === '*') {\r\n activeFilter.district = null;\r\n } else {\r\n activeFilter.district = event.target.value;\r\n }\r\n\r\n applyFilters();\r\n\r\n // DATALAYER\r\n app.dataLayer.pushEvent('locationFilterWijk', {\r\n pageUrl: window.location.pathname,\r\n option: event.target.options[event.target.selectedIndex].text,\r\n });\r\n });\r\n\r\n // Add event listener to 'Type' filter\r\n typeFilter.addEventListener('change', (event) => {\r\n if (event.target.value === '*') {\r\n activeFilter.type = null;\r\n } else {\r\n activeFilter.type = event.target.value;\r\n }\r\n\r\n applyFilters();\r\n\r\n // DATALAYER\r\n app.dataLayer.pushEvent('locationFilterType', {\r\n pageUrl: window.location.pathname,\r\n option: event.target.options[event.target.selectedIndex].text,\r\n });\r\n });\r\n\r\n // Add event listener to 'Expertise' filters\r\n expertiseFilters.forEach((filter) => {\r\n filter.addEventListener('change', (event) => {\r\n var index = activeFilter.expertises.indexOf(event.target.value);\r\n\r\n if (event.target.checked === true && index === -1) {\r\n activeFilter.expertises.push(event.target.value);\r\n activeFilter.expertisesNames.push(event.target.dataset.value);\r\n applyFilters();\r\n }\r\n if (event.target.checked === false && index > -1) {\r\n activeFilter.expertises.splice(index, 1);\r\n activeFilter.expertisesNames.splice(index, 1);\r\n applyFilters();\r\n }\r\n\r\n if (timeout1 != null) {\r\n window.clearTimeout(timeout1);\r\n }\r\n\r\n timeout1 = window.setTimeout(() => {\r\n // DATALAYER\r\n app.dataLayer.pushEvent('locationFilterExpertises', {\r\n pageUrl: window.location.pathname,\r\n option: activeFilter.expertisesNames.join(';'),\r\n });\r\n }, 500);\r\n });\r\n });\r\n\r\n // Add event listener to 'Service' filters\r\n serviceFilters.forEach((filter) => {\r\n filter.addEventListener('change', (event) => {\r\n var index = activeFilter.services.indexOf(event.target.value);\r\n\r\n if (event.target.checked === true && index === -1) {\r\n activeFilter.services.push(event.target.value);\r\n activeFilter.servicesNames.push(event.target.dataset.value);\r\n applyFilters();\r\n }\r\n if (event.target.checked === false && index > -1) {\r\n activeFilter.services.splice(index, 1);\r\n activeFilter.servicesNames.splice(index, 1);\r\n applyFilters();\r\n }\r\n\r\n if (timeout2 != null) {\r\n window.clearTimeout(timeout2);\r\n }\r\n\r\n timeout2 = window.setTimeout(() => {\r\n // DATALAYER\r\n app.dataLayer.pushEvent('locationFilterDiensten', {\r\n pageUrl: window.location.pathname,\r\n option: activeFilter.servicesNames.join(';'),\r\n });\r\n }, 500);\r\n });\r\n });\r\n }\r\n\r\n function prefillFilters() {\r\n // Prefill filters based on query string\r\n const qsLocality = parseInt(util.getQueryString('plaats'));\r\n const qsDistrict = parseInt(util.getQueryString('wijk'));\r\n\r\n // If locality is set, pre-select the filter\r\n if (isNaN(qsLocality) === false) {\r\n const selectedLocality = localityFilter.querySelector(\r\n 'option[value = \"' + qsLocality + '\"]'\r\n );\r\n\r\n if (selectedLocality !== null) {\r\n selectedLocality.selected = true;\r\n activeFilter.locality = qsLocality.toString();\r\n\r\n try {\r\n var districtsJson = JSON.parse(\r\n atob(selectedLocality.dataset.districts)\r\n );\r\n loadDistrictFilter(districtsJson);\r\n } catch {\r\n loadDistrictFilter([]);\r\n }\r\n\r\n // If district is set, pre-select the filter\r\n if (isNaN(qsDistrict) === false) {\r\n const selectedDistrict = districtFilter.querySelector(\r\n 'option[value = \"' + qsDistrict + '\"]'\r\n );\r\n\r\n if (selectedDistrict !== null) {\r\n selectedDistrict.selected = true;\r\n activeFilter.district = qsDistrict.toString();\r\n }\r\n }\r\n\r\n // Scroll into view\r\n const positionTop =\r\n section.getBoundingClientRect().top + window.pageYOffset - 32;\r\n window.scrollTo({ top: positionTop });\r\n }\r\n }\r\n }\r\n\r\n function openFilters(item, trigger, content) {\r\n item.classList.add('is-active');\r\n trigger.classList.add('is-active');\r\n\r\n util.slideDown(content, 250);\r\n\r\n // a11y: update aria attributes\r\n trigger.setAttribute('aria-label', trigger.dataset.closeText);\r\n trigger.setAttribute('aria-expanded', true);\r\n }\r\n\r\n function closeFilters(item, trigger, content) {\r\n trigger.classList.remove('is-active');\r\n\r\n util.slideUp(content, 250, () => {\r\n item.classList.remove('is-active');\r\n });\r\n\r\n // a11y: update aria attributes\r\n trigger.setAttribute('aria-label', trigger.dataset.openText);\r\n trigger.setAttribute('aria-expanded', false);\r\n }\r\n\r\n function loadDistrictFilter(districts) {\r\n // Remove all options\r\n districtFilter.querySelectorAll('option').forEach((option) => {\r\n option.remove();\r\n });\r\n\r\n // If there are no options disable dropdown and return\r\n if (districts.length === 0) {\r\n districtFilter.setAttribute('disabled', '');\r\n let emptyOption = document.createElement('option');\r\n emptyOption.value = '';\r\n emptyOption.text = 'Selecteer een wijk';\r\n districtFilter.appendChild(emptyOption);\r\n return;\r\n }\r\n\r\n // Enable dropdown\r\n districtFilter.removeAttribute('disabled');\r\n\r\n // Add select all\r\n let optionAll = document.createElement('option');\r\n optionAll.value = '*';\r\n optionAll.text = 'Alle wijken';\r\n\r\n districtFilter.appendChild(optionAll);\r\n\r\n // Add options\r\n districts.forEach((district) => {\r\n let newOption = document.createElement('option');\r\n newOption.value = district.id;\r\n newOption.text = district.name;\r\n districtFilter.appendChild(newOption);\r\n });\r\n }\r\n\r\n function initMap(initMarkers) {\r\n initMarkers = initMarkers ?? false;\r\n\r\n if (mapInitialized === true) return;\r\n if (window.matchMedia('(min-width: 992px)').matches === false) return;\r\n\r\n ljs.load(\r\n 'https://unpkg.com/leaflet@1.9.2/dist/leaflet.css',\r\n 'https://unpkg.com/leaflet.markercluster@1.4.1/dist/MarkerCluster.css',\r\n 'https://unpkg.com/leaflet@1.9.2/dist/leaflet.js',\r\n 'https://unpkg.com/leaflet.markercluster@1.4.1/dist/leaflet.markercluster.js',\r\n () => {\r\n map = L.map(mapContainer, {\r\n center: [51.6257, 4.937],\r\n zoom: 11,\r\n minZoom: 10,\r\n maxZoom: 18,\r\n scrollWheelZoom: false,\r\n });\r\n\r\n let southWest = L.latLng(51.2808, 4.054); // Hulst\r\n let northEast = L.latLng(51.8914, 5.4281); // Tiel\r\n let maxBounds = L.latLngBounds(southWest, northEast);\r\n\r\n map.setMaxBounds(maxBounds);\r\n\r\n map.on('drag', function () {\r\n map.panInsideBounds(maxBounds, { animate: false });\r\n });\r\n\r\n markerIcon = L.icon({\r\n iconUrl: '/icons/marker.svg',\r\n\r\n iconSize: [25, 40], // size of the icon\r\n iconAnchor: [12.5, 40], // point of the icon which will correspond to marker's location\r\n popupAnchor: [0, -40], // point from which the popup should open relative to the iconAnchor\r\n });\r\n\r\n L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {\r\n attribution:\r\n '© OpenStreetMap',\r\n }).addTo(map);\r\n\r\n markerCluster = L.markerClusterGroup({\r\n spiderfyOnMaxZoom: false,\r\n showCoverageOnHover: false,\r\n zoomToBoundsOnClick: true,\r\n disableClusteringAtZoom: 17,\r\n });\r\n\r\n mapInitialized = true;\r\n\r\n if (initMarkers === true) {\r\n let locations = filterLocations();\r\n if (locations !== false) loadMarkers(locations);\r\n }\r\n }\r\n );\r\n }\r\n\r\n function clearMarkers() {\r\n if (mapInitialized === false) return;\r\n\r\n markers.forEach((marker) => {\r\n marker.removeEventListener('click', clickMarker);\r\n markerCluster.removeLayer(marker);\r\n });\r\n\r\n markers = [];\r\n }\r\n\r\n function loadMarkers(locations) {\r\n if (mapInitialized === false) return;\r\n\r\n locations.forEach((location) => {\r\n if (location.mapMarker == null) return;\r\n\r\n var newMarker = L.marker(\r\n [location.mapMarker.latitude, location.mapMarker.longitude],\r\n {\r\n icon: markerIcon,\r\n id: location.id,\r\n }\r\n );\r\n\r\n newMarker.bindPopup(location.displayName);\r\n newMarker.addEventListener('click', clickMarker);\r\n\r\n newMarker.addEventListener('mouseover', () => {\r\n newMarker.openPopup();\r\n });\r\n\r\n newMarker.addEventListener('mouseout', () => {\r\n newMarker.closePopup();\r\n });\r\n\r\n markers.push(newMarker);\r\n markerCluster.addLayer(newMarker);\r\n });\r\n\r\n map.addLayer(markerCluster);\r\n map.fitBounds(markerCluster.getBounds(), { padding: [20, 20] });\r\n }\r\n\r\n function clickMarker(event) {\r\n var activeListItem = listContainer.querySelector('.is-active');\r\n if (activeListItem) {\r\n activeListItem.classList.remove('is-active');\r\n }\r\n\r\n var listItem = listContainer.querySelector(\r\n '[data-id=\"' + event.target.options.id + '\"]'\r\n );\r\n\r\n listItem.classList.add('is-active');\r\n util.scrollContainerTo(listContainer, listItem, 16);\r\n }\r\n\r\n function applyFilters() {\r\n if (timeout != null) {\r\n window.clearTimeout(timeout);\r\n }\r\n\r\n timeout = window.setTimeout(() => {\r\n let locations = filterLocations();\r\n let locationIds = locations !== false ? jsonPath(locations, '$..id') : [];\r\n\r\n if (util.areEqualArrays(locationIds, previousLocations)) return;\r\n\r\n previousLocations = locationIds;\r\n clearMarkers();\r\n\r\n if (locations !== false) {\r\n listContainer.innerHTML = Mustache.render(template, locations);\r\n resultsContainer.innerHTML =\r\n locations.length === 1\r\n ? '1 resultaat'\r\n : `${locations.length} resultaten`;\r\n loadMarkers(locations);\r\n } else {\r\n listContainer.innerHTML =\r\n '
Geen locaties gevonden.
';\r\n resultsContainer.innerHTML = '';\r\n }\r\n\r\n if (loadingOverlay != null) {\r\n loadingOverlay.close();\r\n loadingOverlay = null;\r\n }\r\n }, 500);\r\n }\r\n\r\n function fetchData() {\r\n fetch('/api/locations/GetLocations', {\r\n method: 'GET',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Culture: util.uiCulture,\r\n HomePageId: util.homePageId,\r\n },\r\n })\r\n .then((response) => {\r\n return response.json();\r\n })\r\n .then((data) => {\r\n locationData = data;\r\n })\r\n .catch((error) => {\r\n console.warn(error);\r\n })\r\n .finally(() => {\r\n initFilters();\r\n prefillFilters();\r\n initMap();\r\n applyFilters();\r\n });\r\n }\r\n\r\n // Expose public functions and variables\r\n return {\r\n init: init,\r\n };\r\n})();\r\n"]}