{"version":3,"file":"tooltipController-4bd4225a.js","sources":["../../../../app/frontend/components/b2c/directory/mapbox_map.js","../../../../app/frontend/components/shared/controllers/tooltipController.js"],"sourcesContent":["import { trackSegmentEvent, getContextProperties, getElementProperties, trackDOMEvent } from '~/components/shared/tracking/segmentAnalytics';\n\nimport { setUpModalsOnMap } from \"../../shared/controllers/modalController\";\n\nlet mapViewEl;\n\nexport function loadMap(override = false) {\n if (override || !mapViewEl) {\n mapViewEl = document.querySelector('[data-js-map]');\n\n // initial load\n if (window.innerWidth >= 768) {\n lazyLoadMap(mapViewEl);\n }\n }\n}\n\nfunction lazyLoadMap(mapTarget) {\n if (typeof mapboxgl !== 'undefined') {\n initializeMap(mapTarget);\n } else {\n const map_script = document.createElement('script');\n const map_styles = document.createElement('link');\n\n map_script.setAttribute(\"src\", \"https://api.mapbox.com/mapbox-gl-js/v2.9.1/mapbox-gl.js\")\n map_script.setAttribute(\"data-mapbox-source\", \"\");\n map_script.setAttribute(\"defer\", \"\")\n map_styles.setAttribute(\"href\", \"https://api.mapbox.com/mapbox-gl-js/v2.9.1/mapbox-gl.css\")\n map_styles.setAttribute(\"rel\", \"stylesheet\")\n\n document.head.appendChild(map_script);\n document.head.appendChild(map_styles);\n\n map_script.addEventListener('load', () => {\n initializeMap(mapTarget);\n }, { once: true });\n }\n}\n\nfunction removeClassFromNodes(nodes, className) {\n nodes.forEach(el => {\n el.classList.remove(className);\n })\n}\n\nfunction isInteractive(mapTarget) {\n const isSmallMap = mapTarget.classList.contains('small-map');\n const isNotExpanded = !mapTarget.classList.contains('expanded');\n const isNotMobile = window.innerWidth >= 768;\n return !(isSmallMap && isNotExpanded && isNotMobile)\n}\n\nfunction getMarkerClasses(isFeatured) {\n const classes = ['map-marker'];\n if (isFeatured) {\n classes.push('map-marker--featured');\n }\n return classes;\n}\n\nfunction getOffset(isFeatured) {\n if (isFeatured) {\n return [0, -18];\n } else {\n return [0, -12];\n }\n}\n\n// add all markers to the given map using the locations HTML node-list\nfunction addMarkers(mapObj, locations, mapTarget) {\n // set up marker with info window and add events and classes to card to mark as active\n const segmentEvent = mapTarget.dataset.segmentEvent || \"Directory - Map\";\n let activeWindow;\n const bounds = mapObj.getBounds();\n locations.forEach(locationCard => {\n const locData = locationCard.dataset;\n\n // don't show telemeds on map because some will be far away\n if (locData.telemed != \"true\") {\n\n const hasBoost = locData.hasBoost === 'true';\n const lngLat = [parseFloat(locData.longitude), parseFloat(locData.latitude)];\n\n // create the infowindow\n const locationCardNode = locationCard.cloneNode(true);\n locationCardNode.querySelectorAll('[data-src]').forEach(el => { el.src = el.dataset.src });\n const button = locationCardNode.querySelector('.unified-listing-card__primary-button');\n if (button) {\n button.classList.remove('md');\n button.classList.add('sm');\n }\n\n // move the star rating to the description\n const ratings = locationCardNode.querySelector('.unified-listing-card__rating');\n const details = locationCardNode.querySelector('.primary-content__details');\n if (ratings) {\n details.appendChild(ratings);\n }\n\n if (locationCardNode.dataset.modalActivator) {\n locationCardNode.dataset.mapModalActivator = true;\n }\n locationCardNode.querySelectorAll('a')\n .forEach(link => {\n link.dataset.segmentEvent = segmentEvent;\n link.dataset.segmentAction += ' within bubble in map';\n link.addEventListener('click', (e) => {\n trackDOMEvent(e);\n });\n });\n const popup = new mapboxgl.Popup({\n focusAfterOpen: false,\n offset: getOffset(hasBoost),\n });\n\n // Since the new card's markup differs from the existing card, we need to ensure\n // we handle the styles accordingly\n locationCardNode.dataset.isMapPopup = true;\n\n popup.setDOMContent(locationCardNode);\n popup.setMaxWidth('unset');\n\n popup.on('open', () => {\n if (activeWindow) {\n activeWindow.remove();\n }\n activeWindow = popup;\n setUpModalsOnMap();\n });\n\n popup.on('close', () => {\n activeWindow = null;\n })\n\n // create the marker\n const el = document.createElement('div');\n el.classList.add(...getMarkerClasses(hasBoost));\n const marker = new mapboxgl.Marker({\n element: el\n });\n\n marker.setLngLat(lngLat);\n marker.setPopup(popup);\n marker.addTo(mapObj);\n\n // extend the bounds to fit the marker\n bounds.extend(lngLat);\n\n\n // when marker is clicked open the infowindow and set the card active\n marker.on(\"click\", () => {\n if (!isInteractive(mapTarget)) {\n return\n }\n trackSegmentEvent(segmentEvent, {\n ...getContextProperties(), ...getElementProperties(locationCardNode),\n action: 'click pin'\n });\n // only allow a single window to be open at once\n removeClassFromNodes(locations, 'active');\n locationCard.classList.add('active');\n });\n\n\n\n // when a card is hovered, open the popup\n locationCard.addEventListener('mouseenter', () => {\n if (!isInteractive(mapTarget)) {\n return\n }\n if (!marker.getPopup().isOpen()) {\n marker.togglePopup();\n }\n el.classList.add('map-marker--grow');\n // only allow a single window to be open at once\n removeClassFromNodes(locations, 'active');\n locationCard.classList.add('active');\n });\n\n locationCard.addEventListener('mouseleave', () => {\n if (!isInteractive(mapTarget)) {\n return\n }\n el.classList.remove('map-marker--grow');\n });\n locationCard.classList.add(\"listing-card\")\n }\n\n });\n mapObj.fitBounds(bounds, { padding: 20 });\n}\n\n// Create the new map\nfunction initializeMap(mapTarget) {\n if (!mapTarget) return;\n const accessToken = document.getElementById('envKeys').dataset.mapboxKey;\n const mapData = mapTarget.dataset;\n let center = [0, 0];\n if (typeof mapData.noResultsLat !== 'undefined' && typeof mapData.noResultsLong !== 'undefined') {\n center = [\n parseFloat(mapData.noResultsLong),\n parseFloat(mapData.noResultsLat),\n ];\n }\n\n let mapParams = {\n accessToken,\n container: mapTarget,\n center,\n style: 'mapbox://styles/mapbox/streets-v11?optimize=true', // style URL\n zoom: 12\n };\n\n const locationMap = new mapboxgl.Map(mapParams);\n\n if (mapData.noResults === '') {\n return\n }\n\n const locations = document.querySelectorAll('.unified-listing-card:not(.exclude-from-map)');\n\n addMarkers(locationMap, locations, mapTarget);\n\n // We want the map initial zoom to be fixed to the expanded size. So we have to wait until it's initialized, then remove the expanded css to crop it.\n locationMap.on('load', (event) => {\n mapTarget.classList.remove('expanded');\n mapTarget.parentElement.parentElement.classList.remove('expanded');\n });\n\n}\n","document.querySelectorAll('[data-tooltip-controller]').forEach(el => {\n el.querySelector('[data-tooltip-activator]').addEventListener('click', (e) => {\n e.stopPropagation();\n const tooltipContentEl = el.querySelector('[data-tooltip-content]');\n const bodyHandler = (event) => {\n if (event.target.closest('[data-tooltip-content]') !== tooltipContentEl) {\n tooltipContentEl.classList.remove('opened');\n document.body.removeEventListener('click', bodyHandler);\n }\n }\n\n if (tooltipContentEl.classList.contains('opened')) {\n tooltipContentEl.classList.remove('opened');\n document.body.removeEventListener('click', bodyHandler);\n } else {\n tooltipContentEl.classList.add('opened');\n document.body.addEventListener('click', bodyHandler);\n }\n })\n});\n"],"names":["mapViewEl","loadMap","override","lazyLoadMap","mapTarget","initializeMap","map_script","map_styles","removeClassFromNodes","nodes","className","el","isInteractive","isSmallMap","isNotExpanded","isNotMobile","getMarkerClasses","isFeatured","classes","getOffset","addMarkers","mapObj","locations","segmentEvent","activeWindow","bounds","locationCard","locData","hasBoost","lngLat","locationCardNode","button","ratings","details","link","e","trackDOMEvent","popup","setUpModalsOnMap","marker","trackSegmentEvent","getContextProperties","getElementProperties","accessToken","mapData","center","mapParams","locationMap","event","tooltipContentEl","bodyHandler"],"mappings":"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"}