{"version":3,"file":"static/js/617.2d379823.chunk.js","mappings":"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","sources":["pages/findcare/index.js","pages/findcare/map-config.js","platformui/Breadcrumb/index.js","platformui/FindCare/findcare-categories-lists/alphabetical-list.js","platformui/FindCare/findcare-categories-lists/index.js","platformui/FindCare/findcare-categories-lists/topic-list.js","platformui/FindCare/findcare-form/CaretypeSuggestion.js","platformui/FindCare/findcare-form/LocationSuggestion.js","platformui/FindCare/findcare-form/UnitSuggestion.js","platformui/FindCare/findcare-form/helpers.js","platformui/FindCare/findcare-form/index.js","platformui/FindCare/findcare-form/inputLatLng.js","platformui/FindCare/findcare-header/index.js","platformui/FindCare/findcare-map/helpers.js","platformui/FindCare/findcare-map/index.js","platformui/FindCare/findcare-map/info-window.js","platformui/FindCare/findcare-map/map-controls.js","platformui/FindCare/findcare-map/map2.js","platformui/FindCare/findcare-search-list-item/index.js","platformui/FindCare/findcare-sort/index.js","platformui/FindCare/findcare-sort/sort-link.js","platformui/InfoBox/index.js","platformui/Matomo/matomo-track-dimensions.js","platformui/Modal/fullscreen-modal.js","platformui/Modal/index.js","platformui/Pages/findcare/constants.js","platformui/Pages/findcare/index.js","platformui/Pages/findcare/redirect.js","platformui/Pages/findcare/search-list.js","platformui/SuggestionsField/button.js","platformui/SuggestionsField/error.js","platformui/SuggestionsField/index.js","platformui/SuggestionsField/suggestions.js","platformui/SuggestionsField/useOpenClose.js","../node_modules/tiny-warning/dist/tiny-warning.esm.js","../node_modules/uuid/dist/esm-browser/regex.js","../node_modules/uuid/dist/esm-browser/rng.js","../node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/uuid/dist/esm-browser/v4.js","../node_modules/uuid/dist/esm-browser/validate.js"],"sourcesContent":["import React, { useEffect, useState } from 'react';\r\n\r\nimport * as mapConfig from './map-config';\r\nimport FindCare from '../../platformui/Pages/findcare';\r\nimport { loadScript } from '../../platformui/Base/Async';\r\nimport MatomoTrackDimensions from '../../platformui/Matomo/matomo-track-dimensions';\r\n\r\nconst isSelected = (o) => o.Selected === true;\r\n\r\nfunction getSelectedRegion({ Regions }) {\r\n if (!Regions && !Regions.Options) return null;\r\n const found = Regions.Options.find(isSelected);\r\n\r\n if (!found) {\r\n return null;\r\n }\r\n const { Label, Name, Value } = found;\r\n return {\r\n Label,\r\n Name,\r\n Value,\r\n };\r\n}\r\n\r\n/** Using imported local mapConfig */\r\nconst FindCarePage = (props) => {\r\n const [done, setDone] = useState(false);\r\n\r\n useEffect(() => {\r\n // Loads markerclusterer as static file with this specific version instead of npm lib due to problems with newer versions in IE.\r\n loadScript(\r\n 'pwt-markerclusterer-script',\r\n `/build/${props.Site}/static/markerclustererplus/index.min.js`,\r\n (e) => {\r\n if (e) {\r\n console.error(e.message);\r\n } else {\r\n setDone(true);\r\n console.log('loaded markerclusterer');\r\n }\r\n }\r\n );\r\n }, []);\r\n return (\r\n <>\r\n {done && (\r\n <FindCare\r\n getSelectedRegion={getSelectedRegion}\r\n selectedRegion={getSelectedRegion(props.Regionalization)}\r\n mapConfig={mapConfig}\r\n {...props}\r\n hasCareTypeFilter={true}\r\n />\r\n )}\r\n <MatomoTrackDimensions\r\n Region={props?.Regionalization?.CurrentRegionName}\r\n />\r\n ;\r\n </>\r\n );\r\n};\r\n\r\nexport default FindCarePage;\r\n","import markerImg from '../../framework/images/marker.png';\r\n\r\nexport const clusterMarkerIcons = () => [\r\n {\r\n textColor: '#fff',\r\n className: 'cluster1',\r\n height: 30,\r\n width: 30,\r\n },\r\n {\r\n textColor: '#fff',\r\n className: 'cluster2',\r\n height: 36,\r\n width: 36,\r\n },\r\n {\r\n textColor: '#fff',\r\n className: 'cluster3',\r\n height: 44,\r\n width: 44,\r\n },\r\n {\r\n textColor: '#fff',\r\n className: 'cluster4',\r\n height: 51,\r\n width: 51,\r\n },\r\n {\r\n textColor: '#fff',\r\n className: 'cluster5',\r\n height: 61,\r\n width: 61,\r\n },\r\n];\r\n\r\nexport const markerOptions = () => {\r\n return {\r\n icon: {\r\n url: markerImg,\r\n width: 36,\r\n height: 45,\r\n },\r\n };\r\n};\r\n\r\nexport const mapOption = (settings = {}) => {\r\n return {\r\n disableDefaultUI: true,\r\n clickableIcons: false,\r\n ...settings,\r\n };\r\n};\r\n","import React from 'react';\r\nimport { object, shape, arrayOf, string, node, bool } from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { useSweLang } from '../Helpers';\r\n\r\nconst BreadCrumb = (props) => {\r\n if (!props.Breadcrumbs) return null;\r\n\r\n const componentClasses = classNames({\r\n 'c-breadcrumb': true,\r\n ...props.Modifiers,\r\n });\r\n\r\n return (\r\n <nav\r\n aria-label={props.Name}\r\n aria-describedby=\"breadcrumb-label\"\r\n className={componentClasses}\r\n lang={useSweLang(props.Language)}\r\n >\r\n <span id=\"breadcrumb-label\" className=\"c-breadcrumb__label\">\r\n {props.Label}\r\n </span>\r\n <ol>\r\n {props.Breadcrumbs.map((breadcrumb, index) => {\r\n return (\r\n <li key={`breadcrumb${index}`} className=\"c-breadcrumb__item\">\r\n {!breadcrumb.CurrentPage ? (\r\n <a href={breadcrumb.Url}>{breadcrumb.Text}</a>\r\n ) : (\r\n <a aria-current=\"page\" href={breadcrumb.Url}>\r\n {breadcrumb.Text}\r\n </a>\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </nav>\r\n );\r\n};\r\n\r\nBreadCrumb.propTypes = {\r\n Breadcrumbs: arrayOf(\r\n shape({\r\n /** Breadcrumb text */\r\n Text: node.isRequired,\r\n /** Should item be rendered as a link */\r\n HasLink: bool,\r\n /** Link - required if HasLink is true */\r\n Url: string,\r\n })\r\n ),\r\n /** First item in the list */\r\n Label: string,\r\n /** Classnames compatible object */\r\n Modifiers: object,\r\n /**Language for screen reader purpose */\r\n Language: string,\r\n};\r\n\r\nexport default BreadCrumb;\r\n","import React, { useRef, useEffect } from 'react';\r\nimport classNames from 'classnames';\r\n\r\nconst AlphabeticalList = (props) => {\r\n const firstLetter = useRef();\r\n\r\n const enterHandler = (e) => {\r\n if (e.keyCode === 13) {\r\n props.returnToAlphabeticListHandler();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n firstLetter?.current?.focus();\r\n }, [props.modalIsOpen, props.alphabeticalListActive]);\r\n\r\n const { list, currentActiveLetter } = props;\r\n\r\n const listItems = list.map((letter, index) => (\r\n <li\r\n key={`${index}--${letter.Key}`}\r\n className={classNames({\r\n 'categories-alphabetical-list__item': true,\r\n 'categories-alphabetical-list__item--is-active':\r\n currentActiveLetter === letter.Key,\r\n })}\r\n >\r\n <a\r\n onKeyDown={(e) => enterHandler(e)}\r\n ref={letter.Key === 'a' ? firstLetter : null}\r\n href={`#${letter.Key}`}\r\n >\r\n {letter.Key.toUpperCase()}\r\n </a>\r\n </li>\r\n ));\r\n\r\n return <ul className=\"categories-alphabetical-list\">{listItems}</ul>;\r\n};\r\n\r\nexport default AlphabeticalList;\r\n","import React, { useRef, useEffect, useState, Fragment } from 'react';\r\n\r\nimport TopicList from './topic-list';\r\nimport AlphabeticalList from './alphabetical-list';\r\n\r\nconst CategoriesLists = (props) => {\r\n let ticking = false;\r\n let lists = [];\r\n const topics = useRef();\r\n const [currentActiveLetter, setCurrentActiveLetterState] = useState('');\r\n const [alphabeticalListActive, setAlphabeticalListActive] = useState(\r\n !props.modalIsOpen\r\n );\r\n\r\n const addTopicListToHandles = (topicList) => {\r\n lists.push(topicList);\r\n };\r\n\r\n const throttleScroll = (container) => {\r\n ticking =\r\n ticking ||\r\n requestAnimationFrame(() => {\r\n ticking = false;\r\n\r\n //Magic!\r\n lists.forEach((topic) => {\r\n topic.isTopicInRange(container);\r\n });\r\n });\r\n };\r\n\r\n const setCurrentActiveLetter = (letter) => {\r\n setCurrentActiveLetterState(letter);\r\n };\r\n\r\n const returnToAlphabeticListHandler = () => {\r\n setAlphabeticalListActive(!alphabeticalListActive);\r\n };\r\n\r\n useEffect(() => {\r\n const elm = topics.current;\r\n elm.addEventListener('scroll', () => throttleScroll(elm), false);\r\n }, []);\r\n\r\n useEffect(() => {\r\n setAlphabeticalListActive(props.modalIsOpen);\r\n }, []);\r\n\r\n const topicLists = props.Content.AOCareTypes.map((letter, index) => {\r\n return (\r\n <TopicList\r\n key={`${letter.Key}-${index}`}\r\n isInRange={letter.Key === currentActiveLetter}\r\n addTopicListToHandles={(topicList) => addTopicListToHandles(topicList)}\r\n setCurrentActiveLetter={(letter) => setCurrentActiveLetter(letter)}\r\n letter={letter.Key}\r\n categories={letter.Categories}\r\n returnToAlphabetic={() => returnToAlphabeticListHandler()}\r\n selectedCareType={props.selectedCareType}\r\n careTypeChangeHandler={props.careTypeChangeHandler}\r\n />\r\n );\r\n });\r\n\r\n return (\r\n <Fragment>\r\n <header className=\"categories-lists__header\">\r\n <h2 className=\"categories-lists__heading\" tabIndex=\"0\">\r\n {props.Content.Translations.all}\r\n </h2>\r\n <span className=\"show-for-sr\">\r\n {props.Content.Translations.aodescription}\r\n </span>\r\n </header>\r\n <div className=\"categories-lists__list-wrapper\">\r\n <AlphabeticalList\r\n currentActiveLetter={currentActiveLetter}\r\n list={props.Content.AOCareTypes}\r\n modalIsOpen={props.modalIsOpen}\r\n alphabeticalListActive={alphabeticalListActive}\r\n returnToAlphabeticListHandler={() => returnToAlphabeticListHandler()}\r\n aodescription={props.Content.Translations.aodescription}\r\n />\r\n <div ref={topics} className=\"categories-lists__topics\">\r\n {topicLists}\r\n </div>\r\n </div>\r\n </Fragment>\r\n );\r\n};\r\n\r\nexport default CategoriesLists;\r\n","import React, { Component } from 'react';\r\nimport { Consumer } from '../../Modal';\r\n\r\nclass TopicList extends Component {\r\n isInRange = this.props.isInRange;\r\n topic = React.createRef();\r\n\r\n isTopicInRange(container) {\r\n const top = this.getBoundingClientRectHandler().top - container.scrollTop;\r\n const bottom =\r\n this.getBoundingClientRectHandler().bottom - container.scrollTop;\r\n\r\n if (top < 1 && bottom > 0 && !this.isInRange) {\r\n this.props.setCurrentActiveLetter(this.props.letter);\r\n this.isInRange = true;\r\n } else {\r\n this.isInRange = false;\r\n }\r\n }\r\n\r\n getBoundingClientRectHandler() {\r\n return {\r\n bottom: this.topic.current.offsetTop + this.topic.current.clientHeight,\r\n top: this.topic.current.offsetTop,\r\n };\r\n }\r\n\r\n enterHandler(e) {\r\n if (e.keyCode === 13) {\r\n this.props.returnToAlphabetic();\r\n }\r\n }\r\n\r\n enterHandlerClose(e) {\r\n if (e.keyCode === 13) {\r\n e.preventDefault();\r\n e.currentTarget.click();\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.props.addTopicListToHandles(this);\r\n }\r\n\r\n render() {\r\n const props = this.props;\r\n\r\n const topicList =\r\n props.categories &&\r\n props.categories.map((topic, index) => {\r\n return (\r\n <Consumer key={`${topic.CategoryName}--${index}`}>\r\n {({ closeModal, activeModalId }) => (\r\n <li className=\"categories-topic-list__item\">\r\n <label\r\n onKeyDown={(e) => this.enterHandlerClose(e)}\r\n className=\"categories-topic-list__item-label\"\r\n tabIndex=\"0\"\r\n >\r\n <input\r\n tabIndex=\"-1\"\r\n type=\"radio\"\r\n name=\"caretype-list\"\r\n defaultChecked={\r\n topic.CategoryName === props.selectedCareType\r\n }\r\n onChange={() => {\r\n props.careTypeChangeHandler(topic.CategoryName.trim());\r\n closeModal(activeModalId);\r\n }}\r\n value={topic.CategoryName.trim()}\r\n />\r\n {topic.CategoryName}\r\n </label>\r\n </li>\r\n )}\r\n </Consumer>\r\n );\r\n });\r\n\r\n return (\r\n <div\r\n className=\"categories-topic-list__wrapper\"\r\n ref={this.topic}\r\n id={props.letter}\r\n >\r\n <div className=\"categories-topic-list__heading\">\r\n <h3>{props.letter.toUpperCase()}</h3>\r\n </div>\r\n <ul className=\"categories-topic-list\">\r\n {topicList}\r\n <li className=\"categories-topic-list__item categories-topic-list__item--focus-only\">\r\n <label\r\n className=\"categories-topic-list__item-label categories-topic-list__item-label--focus-only\"\r\n tabIndex=\"0\"\r\n onKeyDown={(e) => this.enterHandler(e)}\r\n onClick={(e) => this.enterHandler(e)}\r\n >\r\n Tillbaka till alfabetisk lista\r\n </label>\r\n </li>\r\n </ul>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default TopicList;\r\n","import SuggestionsField from '../../SuggestionsField';\r\nimport withAutocomplete from '../../Containers/withAutocomplete';\r\n\r\nconst createQueryString = (props) => {\r\n let qs = `&st=${props.st}&g=${props.g}`;\r\n if (props.nearby === true) {\r\n qs += `&lng=${props.lng}&lat=${props.lat}&nearby=true`;\r\n }\r\n return qs;\r\n};\r\n\r\nconst CaretypeSuggestion = withAutocomplete(\r\n SuggestionsField,\r\n '/api/hjv/suggestcaretype',\r\n (hits) => (hits?.Hits ? hits.Hits : hits),\r\n () => '',\r\n (_, value) => value,\r\n 1,\r\n createQueryString,\r\n 2\r\n);\r\n\r\nexport default CaretypeSuggestion;\r\n","import SuggestionsField from '../../SuggestionsField';\r\nimport withAutocomplete from '../../Containers/withAutocomplete';\r\n\r\nconst LocationSuggestion = withAutocomplete(\r\n SuggestionsField,\r\n '/api/hjv/suggestlocation',\r\n (hits) => {\r\n if ((hits && hits.Items) || !!hits?.length) {\r\n return [\r\n { Name: 'Nära mig', IsNearBy: true },\r\n ...(hits?.Items ? hits?.Items : hits),\r\n ];\r\n }\r\n\r\n return [{ Name: 'Nära mig', IsNearBy: true }];\r\n },\r\n (selectedObject) => (selectedObject ? selectedObject.Name : ''),\r\n (_, value) => value,\r\n 1,\r\n // queryparamstring\r\n (props) => `&st=${props.sessiontoken}`,\r\n // min string length before we request the api\r\n () => 3\r\n);\r\n\r\nexport default LocationSuggestion;\r\n\r\nexport const getNearby = () => ({\r\n text: 'Nära mig',\r\n className: 'nearby',\r\n IsNearBy: true,\r\n excludeAutoselect: true,\r\n});\r\n\r\nexport const getCountry = (country) => ({\r\n text: country,\r\n Value: '',\r\n IsNearBy: false,\r\n});\r\n\r\nexport const getRegion = (r) => ({\r\n text: r.Name,\r\n Value: r.Value,\r\n Type: r.Type,\r\n IsNearBy: false,\r\n});\r\n\r\nexport function getDefaultLocations(region, country) {\r\n let items = [getNearby(), getCountry(country)];\r\n return !region ? items : [...items, getRegion(region)];\r\n}\r\n","import { withRouter } from 'react-router';\r\nimport SuggestionsField from '../../SuggestionsField';\r\nimport withAutocomplete from '../../Containers/withAutocomplete';\r\nimport { getCurrentRegion } from '../../Helpers';\r\n\r\nconst createRegionSlug = (path) => {\r\n const region = getCurrentRegion();\r\n if (!region) return path;\r\n\r\n return `/api/${region.Slug}/hjv/suggest`;\r\n};\r\n\r\nconst createQueryString = (props) => {\r\n let qs = `&st=${props.st}&g=${props.g}&caretype=${props.caretype}`;\r\n if (props.nearby === true) {\r\n qs += `&lng=${props.lng}&lat=${props.lat}&nearby=true`;\r\n }\r\n\r\n return qs;\r\n};\r\n\r\nconst UnitSuggestion = withRouter(\r\n withAutocomplete(\r\n SuggestionsField,\r\n createRegionSlug('/api/hjv/suggest'),\r\n (hits) => (hits && hits.Units ? [...hits.Units] : []),\r\n (selectedObject) => {\r\n if (selectedObject.FriendlyUrl) {\r\n window.location.href = selectedObject.FriendlyUrl;\r\n return '';\r\n } else {\r\n return selectedObject.DisplayName;\r\n }\r\n },\r\n (item, value) => value,\r\n -1,\r\n createQueryString,\r\n 3\r\n )\r\n);\r\n\r\nexport default UnitSuggestion;\r\n","export function getAOCategories(types) {\r\n let a = [];\r\n if (!types) {\r\n return [];\r\n }\r\n types.forEach((item) => {\r\n item.Categories.forEach(({ CategoryName }) => a.push(CategoryName));\r\n });\r\n return a;\r\n}\r\n\r\nexport function isTrue(b) {\r\n return b === 'true' || b === true;\r\n}\r\n\r\nexport function isFalse(b) {\r\n return b === 'false' || b === false || !b;\r\n}\r\n","// TODO: Use formik status for when suggestion item is\r\n// selected and use with validation\r\n\r\nimport React, { useState, useEffect, Fragment, useRef } from 'react';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { log } from '../../Helpers/helpers';\r\nimport withGeolocation from '../../Containers/withGeolocation';\r\nimport classNames from 'classnames';\r\nimport { shape, object, string } from 'prop-types';\r\nimport { Formik } from 'formik';\r\nimport { withRouter } from 'react-router';\r\nimport queryString from 'qs';\r\nimport FullscreenModal from '../../Modal/fullscreen-modal';\r\nimport CONSTANTS from '../../Pages/findcare/constants';\r\nimport { isFalseOrEmpty } from '../../Helpers/helpers';\r\nimport { OpenModalButton } from '../../Modal';\r\nimport CategoriesLists from '../findcare-categories-lists';\r\nimport UnitSuggestion from './UnitSuggestion';\r\nimport CaretypeSuggestion from './CaretypeSuggestion';\r\nimport LocationSuggestion, {\r\n getDefaultLocations,\r\n getNearby,\r\n} from './LocationSuggestion';\r\nimport InputLatLng from './inputLatLng';\r\nimport { isTrue, isFalse, getAOCategories } from './helpers';\r\n\r\n// This is a work around for uuid 8.1.0 / react-native not supporting crypto API in node.js. We don't really need\r\n// cryptographically strong sequences, but they should be non-repeating since they are meant to be unique for Google API\r\n// session token.\r\nfunction get16RandomBytes() {\r\n var random = new Array(16);\r\n for (var i = 0; i < 16; ++i) {\r\n var d = new Date();\r\n random[i] = (Math.floor(Math.random() * 256) + d.getTime()) % 256;\r\n }\r\n return random;\r\n}\r\n\r\nconst FindCareForm = (props) => {\r\n const translations = props.Content.Translations;\r\n\r\n const hjvSearchForm = useRef(null);\r\n const caretypeWrapper = useRef(null);\r\n\r\n const [activeElement, setActiveElement] = useState(\r\n typeof document !== 'undefined' ? document.activeElement : null\r\n );\r\n const [sessionToken, setSessionToken] = useState(\r\n uuidv4({ rng: () => get16RandomBytes() })\r\n );\r\n\r\n const handleFocusIn = () => {\r\n setActiveElement(document.activeElement);\r\n };\r\n\r\n useEffect(() => {\r\n document.addEventListener('focusin', handleFocusIn);\r\n return () => {\r\n document.removeEventListener('focusin', handleFocusIn);\r\n };\r\n }, [handleFocusIn]);\r\n\r\n useEffect(() => {\r\n const newSessionToken = uuidv4({ rng: () => get16RandomBytes() });\r\n setSessionToken(newSessionToken);\r\n }, []);\r\n\r\n const setSortField = (formik) => {\r\n let sort = CONSTANTS.SORT_NAME;\r\n const { values } = formik;\r\n\r\n if (values.nearby && values.lat && values.lng) {\r\n sort = CONSTANTS.SORT_DISTANCE;\r\n } else if (values.q !== '' && values.location === '') {\r\n sort = CONSTANTS.SORT_REL;\r\n } else if ((values.lat && values.lng) || values.location !== '') {\r\n sort = CONSTANTS.SORT_DISTANCE;\r\n } else if (values.location === '') {\r\n sort = CONSTANTS.SORT_NAME;\r\n } else {\r\n sort = CONSTANTS.SORT_NAME;\r\n }\r\n\r\n formik.setFieldValue('s', sort);\r\n };\r\n\r\n const handleSubmit = (/* values */) => {\r\n hjvSearchForm.current.submit();\r\n };\r\n\r\n const handleChange = (formik) => (e) => {\r\n setSortField(formik);\r\n formik.handleChange(e);\r\n };\r\n\r\n const getFieldProps = (formik, name) => {\r\n return {\r\n setValue: formik.setFieldValue,\r\n setStatus: (value) =>\r\n formik.setStatus({ ...formik.status, [name]: value }),\r\n clearField: () => formik.setFieldValue(name, ''),\r\n error: formik.errors[name],\r\n isTouched: formik.touched[name],\r\n value: formik.values[name],\r\n onChange: handleChange(formik),\r\n onBlur: formik.handleBlur,\r\n name: name,\r\n };\r\n };\r\n\r\n const validate = (values) => {\r\n let errors = {};\r\n if (\r\n (values.location === 'Nära mig' || isTrue(values.nearby)) &&\r\n (!values.lat || !values.lng)\r\n ) {\r\n // TODO: Translation\r\n errors.location =\r\n 'Sortering pÃ¥ avstÃ¥nd är inte möjligt eftersom vi inte kan fastställa din position. Se till att aktivera platstjänster.';\r\n }\r\n if (\r\n values.region.length === 0 &&\r\n values.location.length > 0 &&\r\n values.ls === false &&\r\n values.location !== 'Hela landet'\r\n ) {\r\n errors.ls = 'No location set';\r\n }\r\n if (values.caretype.length > 0 && values.caretypeSet === false) {\r\n errors.caretypeSet = 'No caretype selected';\r\n }\r\n\r\n return errors;\r\n };\r\n\r\n const getCaretypeGValue = (formik) => {\r\n if (formik.values.g) {\r\n return formik.values.g;\r\n }\r\n if (props.Content.Region) {\r\n return props.Content.Region.Value;\r\n }\r\n return '';\r\n };\r\n\r\n const {\r\n location,\r\n Content: { SearchResult },\r\n } = props;\r\n\r\n const query = queryString.parse(location.search, {\r\n ignoreQueryPrefix: true,\r\n });\r\n\r\n const HasCareTypeFilter = props.hasCareTypeFilter;\r\n\r\n // use query param by default if they are available as initial values.\r\n const initialValues = {\r\n q: query.q || '',\r\n g: query.g || '',\r\n lat: query.lat || '',\r\n lng: query.lng || '',\r\n region: query.region || '',\r\n // ls: locationSet: use for validation when a value is selected\r\n // When we have a value caretypeSet should be true initially.\r\n ls: query.location ? true : false,\r\n // caretypeSet: use for validation when a value is selected.\r\n // When we have a value caretypeSet should be true initially.\r\n // Either Hardcorded value or querystring.\r\n caretypeSet: query.caretype ? true : false,\r\n nearby: query.nearby || false,\r\n s: query.s,\r\n location: query.location || '', // sry\r\n caretype: query.caretype || '',\r\n st: sessionToken,\r\n };\r\n\r\n return (\r\n <Fragment>\r\n <div\r\n className={classNames('findcare-form', {\r\n 'findcare-form--has-searchresult': SearchResult,\r\n })}\r\n >\r\n <Formik\r\n initialStatus={{}}\r\n validate={validate}\r\n onSubmit={handleSubmit}\r\n initialValues={initialValues}\r\n >\r\n {(formik) => (\r\n <form\r\n action={location.pathname}\r\n method=\"get\"\r\n ref={hjvSearchForm}\r\n onSubmit={formik.handleSubmit}\r\n >\r\n <input type=\"hidden\" defaultValue={formik.values.st} name=\"st\" />\r\n <input\r\n type=\"hidden\"\r\n defaultValue={formik.values.nearby}\r\n name=\"nearby\"\r\n />\r\n <input type=\"hidden\" defaultValue={formik.values.s} name=\"s\" />\r\n <input type=\"hidden\" defaultValue={formik.values.g} name=\"g\" />\r\n\r\n <InputLatLng\r\n coords={props.coords}\r\n formik={formik}\r\n handleChange={() => handleChange(formik)}\r\n lat={getFieldProps(formik, 'lat')}\r\n lng={getFieldProps(formik, 'lng')}\r\n />\r\n\r\n <fieldset className=\"findcare-form__fieldset\">\r\n <legend className=\"show-for-sr\">Hitta vÃ¥rd</legend>\r\n\r\n <div className=\"findcare-form__wrapper\">\r\n {HasCareTypeFilter && props.Content.CommonCareTypes && (\r\n <FullscreenModal\r\n hideWithCss={true}\r\n id=\"findcare-dropdown__category-lists\"\r\n classModifier=\"category-lists-modal\"\r\n >\r\n <CategoriesLists\r\n {...props}\r\n careTypeChangeHandler={(careType) => {\r\n formik.setFieldValue('caretype', careType);\r\n formik.setFieldValue('caretypeSet', true);\r\n // next tick\r\n setTimeout(() => {\r\n caretypeWrapper.current.focus();\r\n }, 0);\r\n }}\r\n selectedCareType={formik.values.caretype}\r\n />\r\n </FullscreenModal>\r\n )}\r\n\r\n {/* \r\n\r\n Plats: Var vill du söka vÃ¥rd \r\n\r\n */}\r\n <div\r\n className=\"form-field findcare-searchfield__location-wrapper\"\r\n data-cy=\"ui-location-field\"\r\n >\r\n <LocationSuggestion\r\n activeElement={activeElement}\r\n isSelected={formik.values.ls}\r\n inputClassName={\r\n isFalse(formik.values.nearby)\r\n ? 'region'\r\n : 'nearby region'\r\n }\r\n innerClassName=\"findcare-search__field__query\"\r\n errorClassName=\"findcare-region-search-field__error\"\r\n className=\"findcare-searchfield\"\r\n zeroHitsMessage={\r\n formik.values.nearby ||\r\n formik.values.ls ||\r\n formik.values.location === 'Hela landet'\r\n ? false\r\n : 'Vi kan inte hitta den platsen'\r\n }\r\n {...getFieldProps(formik, 'location')}\r\n onValueChange={() => {\r\n // location changes\r\n formik.setFieldValue('ls', false, false);\r\n formik.setFieldValue('g', '', false);\r\n formik.setFieldValue('nearby', false, true);\r\n // formik.validateForm().then(() => {});\r\n }}\r\n onSuggestionSelect={(item) => {\r\n if (item.IsNearBy && props.coords === null) {\r\n log('error')('No geoposition!');\r\n formik.setFieldValue('nearby', true, true);\r\n } else {\r\n // location selected\r\n formik.setFieldValue('ls', true, true);\r\n formik.setFieldValue(\r\n 's',\r\n CONSTANTS.SORT_DISTANCE,\r\n false\r\n );\r\n formik.setFieldValue('nearby', !!item.IsNearBy, true);\r\n const g = item.Type === 'g' ? item.Value : '';\r\n formik.setFieldValue('g', g);\r\n\r\n // Make sure all `setFieldValues` have run.\r\n // They use setState internally and are async.\r\n setTimeout(function delayedValidate() {\r\n formik.validateForm();\r\n }, 0);\r\n }\r\n }}\r\n clearField={() => {\r\n // location text cleared\r\n formik.setValues({\r\n ...formik.values,\r\n location: '',\r\n g: '',\r\n nearby: false,\r\n });\r\n\r\n formik.validateForm().then(() => {});\r\n }}\r\n getItems={(item) => {\r\n let extra = [getNearby()];\r\n if (\r\n formik.values.location === 'Hela landet' ||\r\n isTrue(formik.values.nearby)\r\n ) {\r\n extra = getDefaultLocations(\r\n props.Content.Region,\r\n props.Content.Translations.allcounties\r\n );\r\n }\r\n if (item.Suggestions && item.Suggestions.Hits) {\r\n const items = item.Suggestions.Hits.Items || [];\r\n const itemsWithExtra = extra.concat(items);\r\n return itemsWithExtra.map((item) => ({\r\n text: item.Name,\r\n key: item.Value,\r\n ...item,\r\n }));\r\n }\r\n return [];\r\n }}\r\n sessiontoken={sessionToken}\r\n defaultSuggestionsTitle={'Förslag pÃ¥ platser'}\r\n defaultSuggestions={getDefaultLocations(\r\n props.Content.Region,\r\n props.Content.Translations.allcounties\r\n )}\r\n label={translations.where}\r\n labelClassName=\"findcare-form__label\"\r\n placeholder={translations.whereinputfield}\r\n />\r\n </div>\r\n\r\n {/* \r\n\r\n VÃ¥rdtyp: Vilken typ av vÃ¥rd söker du\r\n \r\n */}\r\n {!HasCareTypeFilter ? (\r\n <input\r\n type=\"hidden\"\r\n name=\"caretype\"\r\n value={formik.values.caretype}\r\n />\r\n ) : (\r\n <div\r\n ref={caretypeWrapper}\r\n tabIndex=\"-1\"\r\n className=\"form-field findcare-searchfield__caretype-wrapper\"\r\n data-cy=\"ui-caretype-field\"\r\n >\r\n <CaretypeSuggestion\r\n activeElement={activeElement}\r\n isSelected={formik.values.caretypeSet}\r\n nearby={isTrue(formik.values.nearby)}\r\n st={formik.values.st}\r\n g={getCaretypeGValue(formik)}\r\n lat={formik.values.lat}\r\n lng={formik.values.lng}\r\n innerClassName=\"findcare-search__field__query\"\r\n className=\"findcare-searchfield\"\r\n errorClassName=\"findcare-region-search-field__error\"\r\n zeroHitsMessage={\r\n formik.values.caretypeSet\r\n ? null\r\n : 'Det finns ingen vÃ¥rdtyp med detta namn'\r\n }\r\n onSuggestionSelect={() => {\r\n formik.setFieldValue('caretypeSet', true);\r\n // Make sure all `setFieldValues` have run.\r\n // They use setState internally and are async.\r\n setTimeout(function delayedValidate() {\r\n formik.validateForm();\r\n }, 0);\r\n }}\r\n onValueChange={() => {\r\n formik.setFieldValue('caretypeSet', false);\r\n }}\r\n clearField={() => {\r\n formik.setFieldValue('caretypeSet', false);\r\n }}\r\n suggestionsFallback={getAOCategories(\r\n props.Content.AOCareTypes\r\n )}\r\n getItems={(props) => {\r\n if (\r\n props.Suggestions &&\r\n props.Suggestions.Hits &&\r\n props.Suggestions.Hits.length > 0\r\n ) {\r\n return props.Suggestions.Hits.map((item) => {\r\n return typeof item === 'string'\r\n ? {\r\n text: item,\r\n key: item,\r\n }\r\n : {\r\n text: item.Value,\r\n key: item.Value,\r\n };\r\n });\r\n }\r\n return [];\r\n }}\r\n hightlightTitle={props.Content.Translations.within}\r\n suggestionsTitle={null}\r\n defaultSuggestionsTitle={'Vanliga vÃ¥rdtyper'}\r\n defaultSuggestions={props.Content.CommonCareTypes.Options.map(\r\n (item) => ({\r\n text: item.Label,\r\n value: item.Name,\r\n key: item.Value,\r\n })\r\n )}\r\n {...getFieldProps(formik, 'caretype')}\r\n suggestionsFooter={(isOpen) => (\r\n <div className=\"findcare-searchfield__autocomplete__item caretype-footer\">\r\n <OpenModalButton\r\n tabIndex={isOpen ? 0 : -1}\r\n className=\"findcare-dropdown__panel__footer\"\r\n id=\"findcare-dropdown__category-lists\"\r\n clickCallback={() => {\r\n //setState({ isOpen: false });\r\n setTimeout(() => {\r\n document\r\n .querySelector('.categories-lists__heading')\r\n .focus();\r\n }, 0);\r\n }}\r\n fullScreen={true}\r\n >\r\n {translations.more}\r\n </OpenModalButton>\r\n </div>\r\n )}\r\n labelClassName=\"findcare-form__label\"\r\n placeholder={translations.choiceunitinputfield}\r\n highlightSelection={true}\r\n label={translations.choiceunit}\r\n />\r\n </div>\r\n )}\r\n {/* \r\n\r\n Mottagning: Vilken mottagning söker du? \r\n\r\n */}\r\n <div className=\"form-field findcare-searchfield__unit-wrapper\">\r\n <UnitSuggestion\r\n activeElement={activeElement}\r\n doNotAutoselectFirstItemOnClose={true}\r\n zeroHitsMessage={null}\r\n nearby={isTrue(formik.values.nearby)}\r\n st={formik.values.st}\r\n g={formik.values.g}\r\n caretype={\r\n formik.values.caretypeSet &&\r\n formik.values.caretype !==\r\n props.Content.Translations.allunits\r\n ? formik.values.caretype\r\n : ''\r\n }\r\n lat={formik.values.lat}\r\n lng={formik.values.lng}\r\n innerClassName=\"findcare-search__field__query\"\r\n className=\"findcare-searchfield\"\r\n {...getFieldProps(formik, 'q')}\r\n getItems={(props) => {\r\n if (props.Suggestions && props.Suggestions.Hits) {\r\n const { Units } = props.Suggestions.Hits;\r\n return Units\r\n ? Units.map((item) => ({\r\n ...item,\r\n value: item.DisplayName,\r\n text: (\r\n <>\r\n <span style={{ display: 'block' }}>\r\n {item.DisplayName}\r\n </span>\r\n <small className=\"findcare-autocomplete__sublabel\">\r\n {item.Address}\r\n </small>\r\n </>\r\n ),\r\n key: `suggestion_unit_${item.HsaId}`,\r\n }))\r\n : [];\r\n }\r\n return [];\r\n }}\r\n label={translations.unit}\r\n labelClassName=\"findcare-form__label\"\r\n onSuggestionSelect={(selectedObject) => {\r\n if (selectedObject.FriendlyUrl) {\r\n window.location.href = selectedObject.FriendlyUrl;\r\n return '';\r\n } else {\r\n return selectedObject.DisplayName;\r\n }\r\n }}\r\n suggestCloseButton={true}\r\n suggestionsTitle={translations.suggestions}\r\n placeholder={translations.unitinputfield}\r\n />\r\n </div>\r\n <button\r\n type=\"submit\"\r\n className={classNames({\r\n 'findcare-form__button': true,\r\n 'findcare-form__button--is-disabled': !isFalseOrEmpty(\r\n formik.errors\r\n ),\r\n })}\r\n >\r\n {translations.searchbutton}\r\n </button>\r\n </div>\r\n </fieldset>\r\n </form>\r\n )}\r\n </Formik>\r\n </div>\r\n </Fragment>\r\n );\r\n};\r\n\r\nFindCareForm.defaultProps = {\r\n Regionalization: {},\r\n};\r\n\r\nFindCareForm.propTypes = {\r\n Content: shape({\r\n Translations: shape({\r\n choiceunit: string,\r\n }),\r\n }),\r\n /** From react-router withRouter() higher order component */\r\n history: object,\r\n /** From react-router withRouter() higher order component */\r\n location: object,\r\n};\r\n\r\nexport default withRouter(withGeolocation(FindCareForm));\r\n","import React from 'react';\r\n/**\r\n * This component will make sure that coords are updated in formik\r\n * state when a position is received or changed.\r\n */\r\nconst InputLatLng = ({ formik, handleChange, coords }) => {\r\n React.useEffect(\r\n function updateCoords() {\r\n if (coords) {\r\n formik.setFieldValue('lat', coords.latitude);\r\n formik.setFieldValue('lng', coords.longitude);\r\n }\r\n },\r\n [coords]\r\n );\r\n return (\r\n <>\r\n <input\r\n id=\"inputLat\"\r\n onChange={handleChange}\r\n type=\"hidden\"\r\n name=\"lat\"\r\n value={formik.values.lat}\r\n />\r\n <input\r\n id=\"inputLng\"\r\n onChange={handleChange}\r\n type=\"hidden\"\r\n name=\"lng\"\r\n value={formik.values.lng}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nexport default InputLatLng;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst FindCareHeader = (props) => {\r\n if (!props.Heading) return null;\r\n\r\n const formatHeadingHtml = (heading) => ({\r\n __html: heading.replace('domsmottagning', 'doms­mottagning'),\r\n });\r\n\r\n return (\r\n <div className=\"row\">\r\n <div className=\"large-8 large-centered columns\">\r\n <div className=\"findcare-header\">\r\n <h1 dangerouslySetInnerHTML={formatHeadingHtml(props.Heading)} />\r\n {props.Preamble && (\r\n <p className=\"findcare-header__preamble\">{props.Preamble}</p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nFindCareHeader.propTypes = {\r\n /** `h1` element */\r\n Heading: PropTypes.string,\r\n /** `p.findcare-header__preamble` */\r\n Preamble: PropTypes.string,\r\n};\r\n\r\nexport default FindCareHeader;\r\n","/** If we have bounds, return total hits, otherwise return batchsize */\r\nexport function getTakeParam(SearchResult) {\r\n const { TotalHits, BatchSize, Bounds } = SearchResult;\r\n return Bounds ? Number(TotalHits) : Number(BatchSize);\r\n}\r\n\r\nexport function setMaxZoom(map) {\r\n if (map.getZoom() >= 22) {\r\n map.setZoom(18);\r\n }\r\n}\r\n\r\nexport function isEqPositionTo(compare) {\r\n return function(compareWith) {\r\n return Boolean(\r\n compareWith.data.Latitude === compare.data.Latitude &&\r\n compareWith.data.Longitude === compare.data.Longitude\r\n );\r\n };\r\n}\r\n\r\nexport function onlyHitsOutsideBounds(qs, bounds) {\r\n if (!bounds && qs.location) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Return { ne, sw } from SearchResult if available */\r\nexport function getInitialBounds(SearchResult) {\r\n if (!SearchResult.Bounds) {\r\n return null;\r\n }\r\n const { topLeft, bottomRight } = SearchResult.Bounds;\r\n return {\r\n ne: { latitude: topLeft.latitude, longitude: bottomRight.longitude },\r\n sw: { latitude: bottomRight.latitude, longitude: topLeft.longitude },\r\n };\r\n}\r\n\r\nexport function getDefaultCenter(SearchResult) {\r\n return {\r\n lat: SearchResult.Latitude || 61.2291259,\r\n lng: SearchResult.Longitude || 16.0703703,\r\n };\r\n}\r\n\r\nexport function getHsaIdsPiped(SearchResult) {\r\n let hsaIds = '';\r\n SearchResult &&\r\n SearchResult.SearchHits.forEach((item) => {\r\n hsaIds = hsaIds + `${item.HsaId}|`;\r\n });\r\n return hsaIds;\r\n}\r\n\r\nexport function getZoomLevel(qs) {\r\n return !isNaN(parseInt(qs.z, 10)) ? parseInt(qs.z, 10) : 16;\r\n}\r\n\r\n/** Extract location data and HsaId from an object. */\r\nexport function getLocationData({ HsaId, Latitude, Longitude }) {\r\n return {\r\n HsaId,\r\n Latitude,\r\n Longitude,\r\n };\r\n}\r\n\r\nexport function getCoordsFromBoundaryQuery(boundaryQuery) {\r\n let coords = boundaryQuery.split('|');\r\n const sw = { lat: parseFloat(coords[3]), lng: parseFloat(coords[0]) };\r\n const ne = { lat: parseFloat(coords[1]), lng: parseFloat(coords[2]) };\r\n return [sw, ne];\r\n}\r\n\r\nexport function shouldDoInitialBoundaryQuery(qs, SearchResult) {\r\n return (qs.location || qs.nearby === 'true') && !SearchResult.Bounds;\r\n}\r\n\r\nexport function shouldRedirectToLatLng(qs) {\r\n return !('lat' in qs) && !('lng' in qs) && qs.nearby === 'true';\r\n}\r\n\r\nexport function sanitizeHeading(heading) {\r\n if (!heading) return;\r\n return heading.replace(/<\\/strong>/g, '|||').replace(/<strong>/g, '||');\r\n}\r\n\r\nexport function parseSanitizedHeading(heading) {\r\n if (!heading) return;\r\n return heading.replace(/\\|\\|\\|/g, '</strong>').replace(/\\|\\|/g, '<strong>');\r\n}\r\n\r\nexport function noSearchHits(SearchResult) {\r\n return (\r\n !SearchResult ||\r\n !SearchResult.SearchHits ||\r\n SearchResult.SearchHits.length === 0\r\n );\r\n}\r\n\r\nexport function shouldDisplayMap(qs, SearchResult) {\r\n return !(!qs.b && noSearchHits(SearchResult));\r\n}\r\n\r\nexport function shouldDisplaySort({ SearchResult, IsPost }) {\r\n if (IsPost) {\r\n return false;\r\n }\r\n if (noSearchHits(SearchResult)) {\r\n return false;\r\n }\r\n if (!SearchResult.Bounds) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n","import React from 'react';\r\nimport { withRouter } from 'react-router';\r\nimport { bool, shape, object, string, array } from 'prop-types';\r\nimport useMedia from '../../Hooks/useMedia';\r\nimport queryString from 'qs';\r\nimport classNames from 'classnames';\r\nimport { OpenModalButton } from '../../Modal';\r\nimport FullscreenModal from '../../Modal/fullscreen-modal';\r\nimport * as utils from './helpers';\r\nimport Map from './map2';\r\n\r\nconst FindCareMap = (props) => {\r\n const qs = queryString.parse(props.location.search, {\r\n ignoreQueryPrefix: true,\r\n });\r\n\r\n if (!utils.shouldDisplayMap(qs, props.SearchResult)) {\r\n return null;\r\n }\r\n\r\n const isMediumOrLarger = useMedia(\r\n ['print, screen and (min-width: 40em)'],\r\n [true],\r\n false\r\n );\r\n\r\n return (\r\n <div\r\n className={classNames({\r\n 'findcare-map': true,\r\n 'findcare-map--is-loading': props.SearchResult.isLoading,\r\n })}\r\n >\r\n {/* <Small devices only> */}\r\n <OpenModalButton\r\n className=\"findcare-map__map-modal-trigger\"\r\n id=\"searchmap-small\"\r\n >\r\n {props.Translations.showhitsonmap}\r\n </OpenModalButton>\r\n <FullscreenModal\r\n hideWithCss={false}\r\n id=\"searchmap-small\"\r\n classModifier=\"findcare-fullscreen\"\r\n >\r\n <Map\r\n {...props}\r\n modifiers={{ 'findcare-map__gmap--modal': true }}\r\n expand={false}\r\n />\r\n </FullscreenModal>\r\n {/* </Small devices only> */}\r\n {isMediumOrLarger && (\r\n <div className=\"findcare-map__container\">\r\n <Map {...props} />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nFindCareMap.propTypes = {\r\n SearchResult: shape({\r\n SearchHits: array,\r\n isLoading: bool,\r\n }),\r\n Translations: shape({\r\n showhitsonmap: string,\r\n }),\r\n /** From react-router withRouter() higher order component */\r\n location: object,\r\n};\r\n\r\nexport default withRouter(FindCareMap);\r\n","import { search } from '../../Api';\r\n\r\nconst centerMapToInfoWindow = (map, marker, popup) => {\r\n if (!popup.getProjection()) return;\r\n\r\n const popupPosition = popup\r\n .getProjection()\r\n .fromLatLngToDivPixel(popup.position);\r\n\r\n const posX = map.getDiv().offsetWidth / 2;\r\n\r\n //If popup is outside map then center the marker within map\r\n if (\r\n popupPosition.y < 90 ||\r\n posX * -1 > popupPosition.x - 150 ||\r\n posX < popupPosition.x + 150\r\n ) {\r\n const offsetx = 0;\r\n const offsety = -100;\r\n const scale = Math.pow(2, map.getZoom());\r\n\r\n const worldCoordinateCenter = map\r\n .getProjection()\r\n .fromLatLngToPoint(marker.position);\r\n const pixelOffset = new global.google.maps.Point(\r\n offsetx / scale || 0,\r\n offsety / scale || 0\r\n );\r\n\r\n const worldCoordinateNewCenter = new global.google.maps.Point(\r\n worldCoordinateCenter.x - pixelOffset.x,\r\n worldCoordinateCenter.y + pixelOffset.y\r\n );\r\n\r\n const newCenter = map\r\n .getProjection()\r\n .fromPointToLatLng(worldCoordinateNewCenter);\r\n map.setCenter(newCenter);\r\n }\r\n};\r\n\r\nconst Infowindow = (location, marker, map, isCluster = false) => {\r\n if (typeof window === 'undefined') return null;\r\n if (typeof global.google === 'undefined') return null;\r\n\r\n //Create popup. Code from googleplex\r\n const Popup = function (position, content, closeBtn) {\r\n this.position = position;\r\n\r\n this.anchor = document.createElement('div');\r\n this.anchor.classList.add('findcare-map__map__popup');\r\n this.anchor.appendChild(content);\r\n\r\n closeBtn.addEventListener('click', () => {\r\n this.close();\r\n });\r\n\r\n // Optionally stop clicks, etc., from bubbling up to the map.\r\n this.stopEventPropagation();\r\n };\r\n\r\n // NOTE: google.maps.OverlayView is only defined once the Maps API has\r\n // loaded. That is why Popup is defined inside initMap().\r\n Popup.prototype = Object.create(global.google.maps.OverlayView.prototype);\r\n\r\n /** Called when the popup is added to the map. */\r\n Popup.prototype.onAdd = function () {\r\n this.getPanes().floatPane.appendChild(this.anchor);\r\n };\r\n\r\n /** Called when the popup is removed from the map. */\r\n Popup.prototype.onRemove = function () {\r\n if (this.anchor.parentElement) {\r\n this.anchor.parentElement.removeChild(this.anchor);\r\n }\r\n };\r\n\r\n /** Called when the popup needs to draw itself. */\r\n Popup.prototype.draw = function () {\r\n var divPosition = this.getProjection().fromLatLngToDivPixel(this.position);\r\n // Hide the popup when it is far out of view.\r\n this.anchor.style.left = divPosition.x + 'px';\r\n this.anchor.style.top = divPosition.y + 'px';\r\n };\r\n\r\n /** Stops clicks/drags from bubbling up to the map. */\r\n Popup.prototype.stopEventPropagation = function () {\r\n var anchor = this.anchor;\r\n anchor.style.cursor = 'auto';\r\n\r\n [\r\n 'click',\r\n 'dblclick',\r\n 'contextmenu',\r\n 'wheel',\r\n 'mousedown',\r\n 'touchstart',\r\n 'pointerdown',\r\n ].forEach(function (event) {\r\n anchor.addEventListener(event, function (e) {\r\n e.stopPropagation();\r\n });\r\n });\r\n };\r\n\r\n Popup.prototype.close = function () {\r\n this.anchor.className = 'findcare-map__map__popup';\r\n };\r\n //End Popup\r\n\r\n // Remove marker from map\r\n if (marker.infoWindow) {\r\n marker.infoWindow.setMap(null);\r\n }\r\n\r\n const infoBubble = document.createElement('div');\r\n infoBubble.className =\r\n 'findcare-map__map__popup__office findcare-map__map__popup__content';\r\n const receptionCount = document.createElement('p');\r\n infoBubble.appendChild(receptionCount);\r\n const infoBubbleInner = document.createElement('div');\r\n infoBubbleInner.className = 'findcare-map__map__popup__content__inner';\r\n infoBubble.appendChild(infoBubbleInner);\r\n\r\n var scrollBtn = document.createElement('button');\r\n scrollBtn.setAttribute('type', 'button');\r\n scrollBtn.className = 'findcare-map__map__popup__scroll';\r\n scrollBtn.innerHTML = '<span class=\"show-for-sr\">Scrolla ner</span>';\r\n infoBubble.appendChild(scrollBtn);\r\n\r\n var closeBtn = document.createElement('button');\r\n closeBtn.setAttribute('type', 'button');\r\n closeBtn.className = 'findcare-map__map__popup__close';\r\n closeBtn.innerHTML = '<span class=\"show-for-sr\">Stäng</span>';\r\n infoBubble.appendChild(closeBtn);\r\n\r\n const infoBubbleOuter = document.createElement('div');\r\n\r\n if (isCluster) {\r\n infoBubbleOuter.className =\r\n 'findcare-map__map__popup__bubble findcare-map__map__popup__bubble--is-cluster findcare-map__map__popup__bubble--is-loading';\r\n } else {\r\n infoBubbleOuter.className =\r\n 'findcare-map__map__popup__bubble findcare-map__map__popup__bubble--is-loading';\r\n }\r\n\r\n infoBubbleOuter.appendChild(infoBubble);\r\n\r\n //Spinner\r\n const spinner = document.createElement('span');\r\n spinner.className = 'c-spinner';\r\n\r\n const bounce1 = document.createElement('span');\r\n bounce1.className = 'bounce1';\r\n spinner.appendChild(bounce1);\r\n\r\n const bounce2 = document.createElement('span');\r\n bounce2.className = 'bounce2';\r\n spinner.appendChild(bounce2);\r\n\r\n const bounce3 = document.createElement('span');\r\n bounce3.className = 'bounce1';\r\n spinner.appendChild(bounce3);\r\n\r\n infoBubbleOuter.appendChild(spinner);\r\n\r\n const popup = new Popup(\r\n new global.google.maps.LatLng(location.Latitude, location.Longitude),\r\n infoBubbleOuter,\r\n closeBtn,\r\n scrollBtn\r\n );\r\n\r\n popup.setMap(map);\r\n marker.infoWindow = popup;\r\n\r\n popup.anchor.className =\r\n 'findcare-map__map__popup findcare-map__map__popup--is-open';\r\n centerMapToInfoWindow(map, marker, popup);\r\n\r\n search(`/api/hjv/search?id=${location.HsaId}`)\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (isCluster) {\r\n infoBubbleOuter.className =\r\n 'findcare-map__map__popup__bubble findcare-map__map__popup__bubble--is-cluster';\r\n receptionCount.textContent = `Mottagningar (${data.SearchHits.length})`;\r\n } else {\r\n infoBubbleOuter.className = 'findcare-map__map__popup__bubble';\r\n }\r\n\r\n data.SearchHits.forEach((receptionData) => {\r\n const receptionWrapper = document.createElement('div');\r\n receptionWrapper.className = 'findcare-map__map__popup__wrapper';\r\n if (isCluster) {\r\n receptionWrapper.setAttribute('aria-expanded', false);\r\n }\r\n receptionWrapper.id = 'wrapper-' + receptionData.HsaId;\r\n\r\n if (receptionData.Heading) {\r\n const heading = document.createElement('h4');\r\n heading.className = 'findcare-map__map__popup__heading';\r\n const headingLink = document.createElement('a');\r\n headingLink.href = receptionData.Url;\r\n headingLink.innerText = receptionData.Heading;\r\n\r\n heading.appendChild(headingLink);\r\n receptionWrapper.appendChild(heading);\r\n\r\n if (isCluster) {\r\n const chevron = document.createElement('button');\r\n chevron.className = 'findcare-map__chevron';\r\n chevron.id = receptionData.HsaId;\r\n chevron.setAttribute('aria-control', receptionWrapper.id);\r\n chevron.addEventListener('click', () => {\r\n let b =\r\n receptionWrapper.getAttribute('aria-expanded') === 'false'\r\n ? 'true'\r\n : 'false';\r\n receptionWrapper.setAttribute('aria-expanded', b);\r\n });\r\n heading.appendChild(chevron);\r\n }\r\n }\r\n\r\n if (receptionData.Address) {\r\n const address = document.createElement('p');\r\n address.innerText = receptionData.Address;\r\n receptionWrapper.appendChild(address);\r\n }\r\n\r\n if (receptionData.PhoneNumber) {\r\n const phone = document.createElement('p');\r\n phone.className = 'findcare-map__map__popup__phone';\r\n const phoneLink = document.createElement('a');\r\n phoneLink.setAttribute(\r\n 'href',\r\n `tel:${receptionData.InternationalPhoneNumber}`\r\n );\r\n phoneLink.innerText = receptionData.PhoneNumber;\r\n phone.appendChild(phoneLink);\r\n receptionWrapper.appendChild(phone);\r\n }\r\n\r\n let serviceList = null;\r\n const translations = window.__PRELOADED_STATE__.Content.Translations;\r\n\r\n const createListItem = (titleText) => {\r\n const elem = document.createElement('li');\r\n elem.className = 'findcare-search-list-item__list__item';\r\n const titleElem = document.createElement('p');\r\n titleElem.className = 'findcare-search-list-item__list__item__title';\r\n titleElem.innerText = titleText;\r\n elem.appendChild(titleElem);\r\n serviceList.appendChild(elem);\r\n };\r\n\r\n if (\r\n receptionData.HasLovContract ||\r\n receptionData.VideoOrChat ||\r\n receptionData.HasMvkServices ||\r\n receptionData.VaccinatesForFlu ||\r\n receptionData.VaccinatesForCovid19 ||\r\n receptionData.HasListing\r\n ) {\r\n serviceList = document.createElement('ul');\r\n serviceList.className =\r\n 'findcare-search-list-item__list findcare-search-list-item__list--info-popup';\r\n }\r\n\r\n receptionData.HasLovContract &&\r\n createListItem(receptionData.LovContractLinkText);\r\n\r\n receptionData.HasMvkServices &&\r\n createListItem(translations.haseservices);\r\n\r\n receptionData.VaccinatesForCovid19 &&\r\n createListItem(translations.vaccinatescovid19);\r\n\r\n receptionData.VaccinatesForFlu &&\r\n createListItem(translations.vaccinatesflu);\r\n\r\n receptionData.VideoOrChat && createListItem(translations.videoorchat);\r\n\r\n receptionData.HasListing &&\r\n createListItem(\r\n receptionData.HasListingQueue\r\n ? translations.haslistingqueue\r\n : translations.haslisting\r\n );\r\n\r\n if (serviceList) receptionWrapper.appendChild(serviceList);\r\n\r\n //Is content higher then info popup\r\n if (receptionWrapper.offsetHeight >= 190) {\r\n infoBubble.className =\r\n 'findcare-map__map__popup__office findcare-map__map__popup__content findcare-map__map__popup__content--overflow';\r\n }\r\n infoBubbleInner.appendChild(receptionWrapper);\r\n\r\n centerMapToInfoWindow(map, marker, popup);\r\n });\r\n //Scroll inside info popup\r\n scrollBtn.addEventListener('click', scrollDown);\r\n\r\n function scrollDown() {\r\n var height = infoBubbleInner.offsetHeight;\r\n infoBubbleInner.scrollBy(0, height * 0.1);\r\n }\r\n });\r\n};\r\n\r\nexport default Infowindow;\r\n","import React, { Component } from 'react';\r\nimport proptypes from 'prop-types';\r\nimport queryString from 'qs';\r\nimport Spinner from '../../Spinner';\r\nimport { OpenModalButton } from '../../Modal';\r\nimport FullscreenModal from '../../Modal/fullscreen-modal';\r\nimport CONSTANTS from '../../Pages/findcare/constants';\r\nimport Map from './map2';\r\n\r\nexport function getBoundaryQuery(map, api) {\r\n const bounds = map.getBounds();\r\n const ne = bounds.getNorthEast(); // LatLng of the north-east corner\r\n const sw = bounds.getSouthWest(); // LatLng of the south-west corder\r\n const nw = new api.maps.LatLng(ne.lat(), sw.lng());\r\n const se = new api.maps.LatLng(sw.lat(), ne.lng());\r\n return `${nw.lng()}|${nw.lat()}|${se.lng()}|${se.lat()}`;\r\n}\r\n\r\nclass MapControls extends Component {\r\n translations = this.props.Translations;\r\n\r\n /**\r\n * Constructs the query as a query string object.\r\n * Pushes to history so that the map component will recognise the update\r\n * and do a search for `api/hjv/pins` in `componentWillUpdate`.\r\n *\r\n * The list `api/hjv/search` is done from `withSearch` container\r\n * called from the list component.\r\n */\r\n searchWithBoundaries() {\r\n if (this.props.isLoading === true) {\r\n return false;\r\n }\r\n if (typeof this.props.googleAPI !== 'undefined') {\r\n //search query\r\n const qs = queryString.parse(this.props.location.search, {\r\n ignoreQueryPrefix: true,\r\n });\r\n const boundaryQuery = getBoundaryQuery(\r\n this.props.map,\r\n this.props.googleAPI\r\n );\r\n const zoom = this.props.map.getZoom();\r\n const center = this.props.map.getCenter().toJSON();\r\n delete qs.p;\r\n delete qs.location;\r\n delete qs.region;\r\n delete qs.heading;\r\n delete qs.g;\r\n delete qs.m;\r\n delete qs.nearby;\r\n qs.b = boundaryQuery;\r\n qs.z = zoom;\r\n qs.mlat = center.lat;\r\n qs.mlng = center.lng;\r\n\r\n this.props.history.push(\r\n `${this.props.location.pathname}?${queryString.stringify(qs)}`\r\n );\r\n\r\n //When boundarySearch is clicked, location inout field should be cleared\r\n let locationClearButton = document.querySelectorAll(\r\n '#field_location>.findcare-search__field__query>.findcare-searchfield__clear-field'\r\n )[0];\r\n locationClearButton && locationClearButton.click();\r\n }\r\n }\r\n\r\n zoomIn() {\r\n this.props.map.setZoom(this.props.map.getZoom() + 1);\r\n }\r\n\r\n zoomOut() {\r\n this.props.map.setZoom(this.props.map.getZoom() - 1);\r\n }\r\n\r\n render() {\r\n const {\r\n zoom,\r\n boundarySearch,\r\n expand,\r\n plannerLink,\r\n plannerLinkText,\r\n lat,\r\n lng,\r\n ...props\r\n } = this.props;\r\n\r\n return (\r\n <div className=\"findcare-map__map__controls\">\r\n {expand && (\r\n <div>\r\n <OpenModalButton\r\n className=\"findcare-map__map__controls__expand\"\r\n id=\"searchmap\"\r\n fullScreen={true}\r\n >\r\n <span className=\"show-for-sr\">Expandera karta</span>\r\n </OpenModalButton>\r\n <FullscreenModal id=\"searchmap\" classModifier=\"findcare-fullscreen\">\r\n <Map\r\n {...props}\r\n modifiers={{ 'findcare-map__gmap--modal': true }}\r\n expand={false}\r\n />\r\n </FullscreenModal>\r\n </div>\r\n )}\r\n\r\n {boundarySearch && (\r\n <button\r\n disabled={boundarySearch === CONSTANTS.BOUNDARY_QUERY_DISABLED}\r\n className=\"findcare-map__map__controls__boundaries\"\r\n onClick={() => this.searchWithBoundaries()}\r\n >\r\n <span className=\"findcare-map__map__controls__boundaries__text\">\r\n {this.translations.searchinarea}\r\n </span>\r\n <Spinner Modifiers={{ 'c-spinner--map': true }} />\r\n </button>\r\n )}\r\n {zoom && (\r\n <div className=\"findcare-map__map__controls__zoom\">\r\n <button\r\n type=\"button\"\r\n className=\"findcare-map__map__controls__zoom-out\"\r\n onClick={() => this.zoomOut()}\r\n >\r\n <span className=\"show-for-sr\">Zooma ut</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"findcare-map__map__controls__zoom-in\"\r\n onClick={() => this.zoomIn()}\r\n >\r\n <span className=\"show-for-sr\">Zooma in</span>\r\n </button>\r\n </div>\r\n )}\r\n\r\n {plannerLink && (\r\n <a\r\n className=\"findcare-map__map__controls__planner-link\"\r\n href={`https://www.google.se/maps/dir/?api=1&destination=${lat},${lng}`}\r\n >\r\n <span>{plannerLinkText}</span>\r\n </a>\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nMapControls.propTypes = {\r\n Translations: proptypes.shape({\r\n searchinarea: proptypes.string,\r\n }),\r\n EnableSearchClosestUnits: proptypes.bool,\r\n location: proptypes.object,\r\n isLoading: proptypes.bool,\r\n map: proptypes.object,\r\n googleAPI: proptypes.object,\r\n zoom: proptypes.bool,\r\n boundarySearch: proptypes.oneOfType([proptypes.string, proptypes.bool]),\r\n expand: proptypes.bool,\r\n plannerLink: proptypes.bool,\r\n plannerLinkText: proptypes.string,\r\n lat: proptypes.number,\r\n lng: proptypes.number,\r\n};\r\n\r\nexport default MapControls;\r\n","import React, { Component } from 'react';\r\nimport pt from 'prop-types';\r\nimport {\r\n log,\r\n jsonStringifyIsEqual as isEqual,\r\n} from '../../Helpers/helpers';\r\nimport { fetchByQuery, fetchByPost } from '../../Actions/search';\r\nimport { search } from '../../Reducers/search';\r\nimport queryString from 'qs';\r\nimport { withRouter } from 'react-router';\r\nimport Maps from '../../Maps';\r\nimport CONSTANTS from '../../Pages/findcare/constants';\r\nimport MapControls, { getBoundaryQuery } from './map-controls';\r\nimport Infowindow from './info-window';\r\nimport * as util from './helpers';\r\n\r\nclass Map extends Component {\r\n // Google api reference\r\n api = null;\r\n map = null;\r\n\r\n // We pass some custom config to the mapoption for the \"new\" map. Not used by the old one.\r\n // https://developers.google.com/maps/documentation/javascript/reference/map#MapOptions\r\n mapOptions = this.props.mapConfig.mapOption({ minZoom: 4 });\r\n\r\n // Bind `this` so the function can be passed to platformui component.\r\n handleClusterClick = this.handleClusterClick.bind(this);\r\n fetchInitialPins = this.fetchInitialPins.bind(this);\r\n onBoundsChanged = this.onBoundsChanged.bind(this);\r\n afterFitBounds = this.afterFitBounds.bind(this);\r\n\r\n //Set initial state\r\n state = search({\r\n bounds: util.getInitialBounds(this.props.SearchResult),\r\n center: util.getDefaultCenter(this.props.SearchResult),\r\n b: null, // fetch pins bounds\r\n pinsFetchedCenter: null, // check if we should enable/disable area search button\r\n boundarySearch: CONSTANTS.BOUNDARY_QUERY_ENABLED, // is area search button enabled\r\n zoom: null, // keep track of zoom level\r\n initialPinsFetched: false, // set to true after first fetch to pins api\r\n googleApiLoaded: false, // set to true when api is loaded\r\n mapIsLoaded: false,\r\n isLoading: false, // set to true when fetching pins (handled in platform search class)\r\n SearchHits: [], // locations to be displayed on map\r\n });\r\n\r\n dispatch(action) {\r\n this.setState(search(this.getState(), action));\r\n }\r\n\r\n getState() {\r\n return this.state;\r\n }\r\n\r\n fetchPins(query, config) {\r\n let center = config.center || {};\r\n\r\n if (this.props.IsPost) {\r\n const hsaIds = util.getHsaIdsPiped(this.props.SearchResult);\r\n const formData = new FormData();\r\n formData.append('HSAIDs', hsaIds);\r\n fetchByPost('/api/hjv/pins', formData)(\r\n this.dispatch.bind(this),\r\n this.getState.bind(this)\r\n );\r\n } else {\r\n const qs = queryString.parse(query, {\r\n ignoreQueryPrefix: true,\r\n });\r\n if (!qs.location) {\r\n qs.location = '';\r\n }\r\n if (!qs.s) {\r\n qs.s = CONSTANTS.SORT_DISTANCE;\r\n }\r\n // Overwrite lat and lng values in querystring.\r\n // We use the map center and not user location center to calculate\r\n // disatance when fetchning pins when not nearby search.\r\n if (qs.nearby !== 'true') {\r\n qs.lat = center.lat;\r\n qs.lng = center.lng;\r\n } else {\r\n center.lat = qs.lat;\r\n center.lng = qs.lng;\r\n }\r\n // t = Take\r\n // Use take variable or use default take 10 pins.\r\n qs.t = qs.t || 10;\r\n fetchByQuery(`/api/hjv/pins?${queryString.stringify(qs)}`)(\r\n this.dispatch.bind(this),\r\n this.getState.bind(this)\r\n );\r\n }\r\n // Save the center location to state when pins where fetched\r\n // To toggle \"search in area\" button.\r\n this.setState({\r\n pinsFetchedCenter: center,\r\n });\r\n }\r\n\r\n componentDidUpdate(prevProps, prevState) {\r\n const qsPrev = queryString.parse(prevProps.location.search, {\r\n ignoreQueryPrefix: true,\r\n });\r\n const qs = queryString.parse(this.props.location.search, {\r\n ignoreQueryPrefix: true,\r\n });\r\n const [, setFindCareState] = this.props.findCareState;\r\n\r\n // Remove pagination variable.\r\n delete qsPrev.p;\r\n delete qs.p;\r\n\r\n if (\r\n this.state.googleApiLoaded &&\r\n this.state.mapIsLoaded &&\r\n this.state.b &&\r\n this.map &&\r\n this.api &&\r\n !this.state.initialPinsFetched &&\r\n !this.state.isLoading\r\n ) {\r\n this.setState({ isLoading: true });\r\n // Make sure we make the fetch when map has got good bounds.\r\n // not a very good solution.\r\n // TODO:\r\n // we should check when the map has settled after the\r\n // very first (10) pins are loaded.\r\n setTimeout(() => {\r\n this.fetchInitialPins({ map: this.map, api: this.api });\r\n }, 300);\r\n }\r\n\r\n if (prevState.isLoading === true && this.state.isLoading === false) {\r\n // log()(\"just loaded pins.\", this.props.SearchResult, this.state);\r\n\r\n // If we need to modify search result inside the list component we\r\n // can do this here.\r\n let searchResultModifiers = {};\r\n setFindCareState('searchResultModifiers', searchResultModifiers);\r\n\r\n // We just finished loading pins.\r\n // Check if current center is equal to the center where we fetched pins.\r\n this.setState((state) => ({\r\n // If the positions are equal we disable the boundarySearch button.\r\n boundarySearch: isEqual(state.pinsFetchedCenter, state.center)\r\n ? state.boundarySearch\r\n : CONSTANTS.BOUNDARY_QUERY_ENABLED,\r\n // Set pin fetch center to null.\r\n pinsFetchedCenter: null,\r\n }));\r\n }\r\n\r\n // We look at the query string if it has changed we fetch new pins.\r\n // Not counting the pagination.\r\n if (!isEqual(qsPrev, qs)) {\r\n if (qs.b && qsPrev.b !== qs.b) {\r\n // New bounds\r\n setFindCareState('sortWithBoundary', null);\r\n }\r\n\r\n this.fetchPins(queryString.stringify(qs), {\r\n center: this.state.center,\r\n });\r\n }\r\n\r\n if (\r\n prevProps.SearchResult.SearchHits !== this.props.SearchResult.SearchHits\r\n ) {\r\n const locations = [];\r\n const hsaids = [];\r\n\r\n const addLocation = (location) => {\r\n if (!hsaids.includes(location.HsaId)) {\r\n hsaids.push(location.HsaId);\r\n locations.push(util.getLocationData(location));\r\n }\r\n };\r\n this.state.SearchHits.forEach(addLocation);\r\n this.props.SearchResult.SearchHits.forEach(addLocation);\r\n\r\n // Only update state if we added any results.\r\n if (locations.length > this.state.SearchHits.length) {\r\n this.setState({\r\n SearchHits: locations,\r\n });\r\n }\r\n }\r\n }\r\n\r\n handleMarkerClick(markerData, marker, map) {\r\n Infowindow(markerData, marker, map);\r\n }\r\n\r\n handleClusterClick(clusterData, cluster, map) {\r\n if (map.getZoom() > 7) {\r\n const isEqPosition = clusterData.every(\r\n util.isEqPositionTo(clusterData[0])\r\n );\r\n\r\n if (isEqPosition || map.getZoom() >= 18) {\r\n //We have more then one marker on this position, build up request object\r\n let hsaId = '';\r\n clusterData.forEach((position) => {\r\n hsaId = hsaId + `${position.data.HsaId}|`;\r\n });\r\n\r\n const pos = {\r\n HsaId: hsaId,\r\n Latitude: clusterData[0].data.Latitude,\r\n Longitude: clusterData[0].data.Longitude,\r\n };\r\n\r\n Infowindow(pos, cluster.getMarkers()[0], map, true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Will run after markers are drawn and directly after\r\n * map.setCenter() and map.fitBounds()\r\n */\r\n afterFitBounds(map) {\r\n // Make sure that the map does not get zoomed in to much\r\n util.setMaxZoom(map);\r\n }\r\n\r\n fetchInitialPins({ map, api }) {\r\n const [, setFindCareState] = this.props.findCareState;\r\n if (!this.state.initialPinsFetched) {\r\n let pinsQuery = queryString.parse(this.props.location.search, {\r\n ignoreQueryPrefix: true,\r\n });\r\n // t = (Take) Number of items to get from server\r\n // If we have a search with bounds we will plot all the pins on the map\r\n pinsQuery.t = util.getTakeParam(this.props.SearchResult);\r\n // p = (Page) Initial request is always first page\r\n pinsQuery.p = 1;\r\n let boundarySearch = CONSTANTS.BOUNDARY_QUERY_ENABLED;\r\n //\r\n // Location search without bounds is when we do not get hits inside the bounds\r\n // so we get 10 [BatchSize] results.\r\n if (\r\n util.shouldDoInitialBoundaryQuery(pinsQuery, this.props.SearchResult)\r\n ) {\r\n // Get current bounds in the query format we send to backend.\r\n // add/overwrite [b]\r\n try {\r\n pinsQuery.b = getBoundaryQuery(map, api);\r\n } catch (e) {\r\n console.log('error', e);\r\n }\r\n // Make sure sort component can use boundaries\r\n setFindCareState('sortWithBoundary', pinsQuery.b);\r\n // remove [g] and [z]\r\n delete pinsQuery.g;\r\n delete pinsQuery.z;\r\n delete pinsQuery.nearby;\r\n } else {\r\n setFindCareState('sortWithBoundary', null);\r\n }\r\n\r\n if (pinsQuery.b) {\r\n // disable the \"search in area button\"\r\n boundarySearch = CONSTANTS.BOUNDARY_QUERY_DISABLED;\r\n }\r\n\r\n this.fetchPins(queryString.stringify(pinsQuery), {\r\n center: map.getCenter().toJSON(),\r\n });\r\n\r\n this.setState({ initialPinsFetched: true, boundarySearch });\r\n }\r\n }\r\n\r\n /** Check if pins are loading or search list is loading */\r\n isLoading() {\r\n return Boolean(this.props.SearchResult.isLoading || this.state.isLoading);\r\n }\r\n\r\n isNewCenter(map) {\r\n return !isEqual(map.getCenter().toJSON(), this.state.center);\r\n }\r\n\r\n isZoomOut(map) {\r\n return Boolean(map.getZoom() < this.state.zoom);\r\n }\r\n\r\n isBoundarySearchEnabled(map) {\r\n return Boolean(\r\n (this.isNewCenter(map) || this.isZoomOut(map)) && !this.isLoading()\r\n );\r\n }\r\n\r\n handleMapChange = ({ map }) => {\r\n this.setState((state) => ({\r\n center: map.getCenter().toJSON(),\r\n zoom: map.getZoom(),\r\n boundarySearch: this.isBoundarySearchEnabled(map)\r\n ? CONSTANTS.BOUNDARY_QUERY_ENABLED\r\n : state.boundarySearch,\r\n }));\r\n };\r\n\r\n onIdle = ({ map }) => {\r\n this.handleMapChange({ map });\r\n };\r\n\r\n onBoundsChanged({ map }) {\r\n const bounds = map.getBounds();\r\n if (!this.state.b && bounds) {\r\n this.setState({ b: bounds });\r\n }\r\n }\r\n\r\n createEventListeners() {\r\n return {\r\n idle: this.onIdle,\r\n zoom_changed: this.handleMapChange,\r\n bounds_changed: this.onBoundsChanged,\r\n };\r\n }\r\n\r\n render() {\r\n const props = this.props;\r\n const qs = queryString.parse(props.location.search, {\r\n ignoreQueryPrefix: true,\r\n });\r\n // use zoom level from queryparam if used.\r\n const zoomLevel = util.getZoomLevel(qs);\r\n const googleMapEventListeners = this.createEventListeners();\r\n const { lat, lng } = this.state.center;\r\n // Do not fit bounds when we do \"search in area\" ie. queryparam \"b\" is set.\r\n const disableFitBounds = Boolean(qs.b);\r\n return (\r\n <Maps\r\n className=\"findcare-map__gmap\"\r\n mapApiKey={props.apiKey}\r\n modifiers={{\r\n ...props.modifiers,\r\n 'findcare-map__gmap--api-loaded': this.state.googleApiLoaded,\r\n 'findcare-map__gmap--is-loading': this.state.isLoading,\r\n 'findcare-map__gmap--is-markers-loading': this.isLoading(),\r\n }}\r\n zoom={zoomLevel}\r\n lat={lat}\r\n lng={lng}\r\n initialBounds={this.state.bounds}\r\n disableFitBounds={disableFitBounds}\r\n afterFitBounds={this.afterFitBounds}\r\n useClusters={true}\r\n eventListeners={googleMapEventListeners}\r\n onMarkerClick={this.handleMarkerClick}\r\n onClusterClick={this.handleClusterClick}\r\n onMapInit={({ map }) => {\r\n this.map = map;\r\n this.setState({ mapIsLoaded: true });\r\n }}\r\n onGoogleAPILoad={(api) => {\r\n //Ladda första 10 pinsen\r\n const SearchHits = props.SearchResult.SearchHits.map(\r\n util.getLocationData\r\n );\r\n this.api = api;\r\n\r\n this.setState(\r\n {\r\n googleApiLoaded: true,\r\n SearchHits,\r\n },\r\n () => {\r\n log()('SearchHits state set', SearchHits);\r\n }\r\n );\r\n }}\r\n options={this.mapOptions}\r\n markerOptions={props.mapConfig.markerOptions()}\r\n Locations={this.state.SearchHits}\r\n clusterMarkerIcons={props.mapConfig.clusterMarkerIcons()}\r\n >\r\n {(map, googleAPI) => (\r\n <MapControls\r\n {...props}\r\n map={map}\r\n isLoading={this.isLoading()}\r\n googleAPI={googleAPI}\r\n zoom={true}\r\n boundarySearch={this.state.boundarySearch}\r\n expand={props.expand}\r\n />\r\n )}\r\n </Maps>\r\n );\r\n }\r\n}\r\n\r\nMap.propTypes = {\r\n IsPost: pt.bool,\r\n\r\n SearchResult: pt.shape({\r\n BatchSize: pt.number,\r\n SearchHits: pt.arrayOf(\r\n pt.shape({\r\n HsaId: pt.string,\r\n Latitude: pt.number,\r\n Longitude: pt.number,\r\n })\r\n ).isRequired,\r\n }).isRequired,\r\n /** Google maps api key */\r\n apiKey: pt.string,\r\n /** If true <MapControls> will show expand button */\r\n expand: pt.bool,\r\n /** From withRouter() in 'react-router' */\r\n location: pt.object,\r\n};\r\n\r\nexport default withRouter(Map);\r\n","import classNames from 'classnames';\r\nimport T from 'prop-types';\r\nimport React, { useState } from 'react';\r\nimport Maps from '../../Maps';\r\n\r\nimport { CloseModalButton, ModalPanel, OpenModalButton } from '../../Modal';\r\nimport FullscreenModal from '../../Modal/fullscreen-modal';\r\nimport Infowindow from '../findcare-map/info-window';\r\nimport MapControls from '../findcare-map/map-controls';\r\n\r\nconst SearchListItem = (props) => {\r\n let showServices =\r\n props.HasLovContract ||\r\n props.HasMvkServices ||\r\n props.VaccinatesForFlu ||\r\n props.VaccinatesForCovid19 ||\r\n props.VideoOrChat ||\r\n props.HasListing ||\r\n props.HasListingQueue;\r\n\r\n const [linkHasFocus, setLinkHasFocus] = useState(false);\r\n\r\n const focusHandler = {\r\n onFocus: () => setLinkHasFocus(true),\r\n onBlur: () => setLinkHasFocus(false),\r\n };\r\n\r\n const wrapperClasses = classNames({\r\n 'findcare-search-list-item': true,\r\n 'findcare-search-list-item--focus': linkHasFocus,\r\n });\r\n\r\n return (\r\n <div className={wrapperClasses}>\r\n <div className=\"c-related__item\">\r\n <div className=\"c-related__item__container c-related__item__container--no-z-index\">\r\n <div className=\"row\">\r\n <div className=\"medium-8 columns\">\r\n <div className=\"findcare-search-list-item__info\">\r\n <a {...focusHandler} href={props.Url}>\r\n <h3 className=\"findcare-search-list-item__heading\">\r\n {props.Heading}\r\n </h3>\r\n <p className=\"findcare-search-list-item__address\">\r\n {props.Address}\r\n </p>\r\n </a>\r\n </div>\r\n <ul className=\"findcare-search-list-item__contact-list\">\r\n {props.PhoneNumber && (\r\n <li>\r\n <a\r\n className=\"findcare-search-list-item__contact-list__phone\"\r\n href={`tel:${props.InternationalPhoneNumber}`}\r\n >\r\n <span>{props.PhoneNumber}</span>\r\n </a>\r\n </li>\r\n )}\r\n {props.Latitude && props.Longitude && (\r\n <li>\r\n <OpenModalButton\r\n className=\"findcare-fullscreen__modal-open\"\r\n id={`${props.HsaId}__findcare-fullscreen`}\r\n fullScreen={true}\r\n >\r\n <span>Visa pÃ¥ karta</span>\r\n </OpenModalButton>\r\n\r\n <FullscreenModal\r\n id={`${props.HsaId}__findcare-fullscreen`}\r\n classModifier=\"findcare-fullscreen\"\r\n >\r\n <Maps\r\n className=\"findcare-map__gmap\"\r\n modifiers={{ 'findcare-map__gmap--modal': true }}\r\n mapApiKey={props.apiKey}\r\n zoom={15}\r\n options={{\r\n disableDefaultUI: true,\r\n }}\r\n markerOptions={props.markerOptions}\r\n markerData={props}\r\n onMarkerClick={(markerData, marker, map) => {\r\n Infowindow(markerData, marker, map);\r\n }}\r\n lat={props.Latitude}\r\n lng={props.Longitude}\r\n >\r\n {(map, googleAPI) => (\r\n <MapControls\r\n map={map}\r\n googleAPI={googleAPI}\r\n zoom={true}\r\n plannerLink={true}\r\n plannerLinkText={\r\n props.Translations.biggermaptravelplanner\r\n }\r\n lat={props.Latitude}\r\n lng={props.Longitude}\r\n />\r\n )}\r\n </Maps>\r\n </FullscreenModal>\r\n </li>\r\n )}\r\n {props.HasMvkServices && props.hasAltLayout && (\r\n <li className=\"findcare-search-list-item__eservices\">\r\n <p>{props.Translations.haseservices}</p>\r\n </li>\r\n )}\r\n </ul>\r\n </div>\r\n <div className=\"medium-4 columns\">\r\n {showServices && (\r\n <ul className=\"findcare-search-list-item__list\">\r\n {props.HasLovContract && (\r\n <li className=\"findcare-search-list-item__list__item\">\r\n {props.LovContractLinkText}\r\n <OpenModalButton\r\n open={`${props.HsaId}__lov-contract`}\r\n id={`${props.HsaId}__lov-contract`}\r\n className={'findcare-tooltip__modal-open'}\r\n >\r\n <span />\r\n </OpenModalButton>\r\n <div className=\"findcare-tooltip__modal-container\">\r\n <ModalPanel whenActive={`${props.HsaId}__lov-contract`}>\r\n <div\r\n className={classNames({\r\n 'findcare-tooltip__modal-panel': true,\r\n })}\r\n >\r\n <CloseModalButton\r\n id={`${props.HsaId}__lov-contract`}\r\n className={'findcare-tooltip__modal-close'}\r\n >\r\n <span className=\"show-for-sr\">Stäng</span>\r\n </CloseModalButton>\r\n\r\n <div className=\"findcare-tooltip__modal-panel__content\">\r\n <div\r\n dangerouslySetInnerHTML={{\r\n __html: props.LovContractDescription,\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </ModalPanel>\r\n </div>\r\n </li>\r\n )}\r\n {props.HasMvkServices && !props.hasAltLayout && (\r\n <li className=\"findcare-search-list-item__list__item\">\r\n <p>{props.Translations.haseservices}</p>\r\n </li>\r\n )}\r\n {props.HasListing && (\r\n <li className=\"findcare-search-list-item__list__item\">\r\n <p>\r\n {props.HasListingQueue\r\n ? props.Translations.haslistingqueue\r\n : props.Translations.haslisting}\r\n </p>\r\n </li>\r\n )}\r\n {props.VaccinatesForCovid19 && (\r\n <li className=\"findcare-search-list-item__list__item\">\r\n <p> {props.Translations.vaccinatescovid19}</p>\r\n </li>\r\n )}\r\n {props.VaccinatesForFlu && (\r\n <li className=\"findcare-search-list-item__list__item\">\r\n <p>{props.Translations.vaccinatesflu}</p>\r\n </li>\r\n )}\r\n {props.VideoOrChat && (\r\n <li className=\"findcare-search-list-item__list__item\">\r\n <p>{props.Translations.videoorchat}</p>\r\n </li>\r\n )}\r\n </ul>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nSearchListItem.propTypes = {\r\n Address: T.string,\r\n Heading: T.string,\r\n Url: T.string,\r\n HasLovContract: T.bool,\r\n HasMvkServices: T.bool,\r\n HsaId: T.string,\r\n Latitude: T.number,\r\n Longitude: T.number,\r\n LovContractDescription: T.string,\r\n LovContractLinkText: T.string,\r\n PhoneNumber: T.string,\r\n Translations: T.shape({\r\n vaccinatesflu: T.string,\r\n vaccinatescovid19: T.string,\r\n haseservices: T.string,\r\n haslisting: T.string,\r\n haslistingqueue: T.string,\r\n }),\r\n VaccinatesForFlu: T.bool,\r\n VaccinatesForCovid19: T.bool,\r\n HasListing: T.bool,\r\n HasListingQueue: T.bool,\r\n apiKey: T.string,\r\n markerImage: T.string,\r\n};\r\n\r\nexport default SearchListItem;\r\n","import React, { useState } from 'react';\r\nimport SortLink from './sort-link';\r\nimport queryString from 'qs';\r\nimport classNames from 'classnames';\r\nimport withGeolocation from '../../Containers/withGeolocation';\r\nimport CONSTANTS from '../../Pages/findcare/constants';\r\nimport * as utils from '../findcare-map/helpers';\r\n\r\nfunction trimStringOrArrayHead(s) {\r\n if (typeof s === 'string') {\r\n return s.trim();\r\n }\r\n return s[0].trim();\r\n}\r\n\r\nconst isEmpty = (value) => {\r\n if (value && trimStringOrArrayHead(value) !== '') return false;\r\n return true;\r\n};\r\n\r\nconst sortByRelVisible = (query) => !isEmpty(query.q);\r\n\r\nconst GeoLocationErrorLink = () => {\r\n const [isHidden, setIsHidden] = useState(true);\r\n\r\n const handleClick = () => {\r\n setIsHidden(!isHidden);\r\n };\r\n\r\n return (\r\n <li>\r\n <button\r\n aria-expanded={!isHidden}\r\n aria-controls=\"findcare-sort-error\"\r\n className=\"findcare-sort__link\"\r\n onClick={() => handleClick()}\r\n >\r\n AvstÃ¥nd\r\n </button>\r\n <div\r\n id=\"findcare-sort-error\"\r\n aria-hidden={isHidden}\r\n className={classNames({\r\n 'findcare-sort__error': true,\r\n 'findcare-sort__error--is-visible': !isHidden,\r\n })}\r\n >\r\n Sortering pÃ¥ avstÃ¥nd är inte möjligt eftersom vi inte kan fastställa din\r\n position. Se till att aktivera platstjänster.\r\n </div>\r\n </li>\r\n );\r\n};\r\n\r\nconst hasLatLng = (query) => query.lat && query.lng;\r\n\r\nconst CoordsContainer = (props) => {\r\n if ((props.coords && props.coords.latitude) || props.query.g) {\r\n const o = {\r\n query: {\r\n lat: props.coords && props.coords.latitude,\r\n lng: props.coords && props.coords.longitude,\r\n q: props.query ? props.query.g : undefined,\r\n },\r\n };\r\n return <SortLink {...o} {...props} />;\r\n }\r\n\r\n return <GeoLocationErrorLink {...props} />;\r\n};\r\n\r\nconst DistanceSortLink = (props) => {\r\n if (hasLatLng(props.query)) return <SortLink {...props} />;\r\n\r\n const DistanceSortLinkContainer = withGeolocation(CoordsContainer);\r\n return <DistanceSortLinkContainer {...props} />;\r\n};\r\n\r\nconst FindCareSort = (props) => {\r\n if (\r\n !utils.shouldDisplaySort({\r\n SearchResult: props.SearchResult,\r\n IsPost: props.IsPost,\r\n })\r\n ) {\r\n return null;\r\n }\r\n const [findCareState] = props.findCareState;\r\n const query = queryString.parse(props.location.search, {\r\n ignoreQueryPrefix: true,\r\n });\r\n if (findCareState.sortWithBoundary) {\r\n query.b = findCareState.sortWithBoundary;\r\n delete query.g;\r\n }\r\n\r\n //Remove page param\r\n if (query.p) delete query.p;\r\n\r\n // Show name sort only when we have bounds.\r\n // Other case is we sort all of sweden and that does not make sence.\r\n // (If we are searching all of sweden we do get bounds).\r\n const showNameSort = true; // props.SearchResult.Bounds;\r\n\r\n return (\r\n <ul className=\"findcare-sort\">\r\n <li>{props.Translations.sortlabel}</li>\r\n <DistanceSortLink\r\n s={query.s}\r\n query={query}\r\n type={CONSTANTS.SORT_DISTANCE}\r\n >\r\n {props.Translations.distance}\r\n </DistanceSortLink>\r\n {sortByRelVisible(query) && (\r\n <SortLink s={query.s} query={query} type={CONSTANTS.SORT_REL}>\r\n {props.Translations.relevance}\r\n </SortLink>\r\n )}\r\n {showNameSort && (\r\n <SortLink\r\n s={!query.s ? CONSTANTS.SORT_NAME : query.s}\r\n query={query}\r\n type={CONSTANTS.SORT_NAME}\r\n >\r\n {props.Translations.ao}\r\n </SortLink>\r\n )}\r\n </ul>\r\n );\r\n};\r\n\r\nexport default FindCareSort;\r\n","import React from 'react';\r\nimport T from 'prop-types';\r\nimport queryString from 'qs';\r\nimport { Link } from 'react-router-dom';\r\nimport * as utils from '../findcare-map/helpers';\r\n\r\nconst SortLink = (props) => {\r\n if (props.s === props.type) return <li>{props.children}</li>;\r\n\r\n const query = {\r\n ...props.query,\r\n s: props.type,\r\n };\r\n\r\n if (props.coords && !query.g) {\r\n query.lat = props.coords.latitude;\r\n query.lng = props.coords.longitude;\r\n }\r\n\r\n query.heading = utils.sanitizeHeading(props.heading);\r\n\r\n return (\r\n <li>\r\n <Link to={`?${queryString.stringify(query)}`}>{props.children}</Link>\r\n </li>\r\n );\r\n};\r\n\r\nSortLink.propTypes = {\r\n heading: T.string,\r\n children: T.node,\r\n type: T.string,\r\n s: T.string,\r\n query: T.object,\r\n coords: T.shape({\r\n latitude: T.number,\r\n longitude: T.number,\r\n }),\r\n};\r\n\r\nexport default SortLink;\r\n","import React from 'react';\r\nimport T from 'prop-types';\r\nimport LinkList from '../Linklist';\r\n\r\n/**\r\n * Will wrap a `<LinkList>` component with a `div.info-box`\r\n * and a `h2` heading inside `div.info-box__heading`.\r\n *\r\n */\r\nconst InfoBox = (props) => {\r\n const { InfoText, LinkCollection } = props;\r\n return (\r\n <div className=\"info-box\">\r\n {InfoText && (\r\n <div className=\"info-box__heading\">\r\n <h2>{InfoText}</h2>\r\n </div>\r\n )}\r\n {LinkCollection && <LinkList Links={LinkCollection} />}\r\n </div>\r\n );\r\n};\r\n\r\nInfoBox.propTypes = {\r\n /** Heading */\r\n InfoText: T.string,\r\n /** Will be passed as prop `Links` to `<LinkList>` component */\r\n LinkCollection: T.array,\r\n};\r\n\r\nexport default InfoBox;\r\n","import { string } from 'prop-types';\r\nimport { useEffect } from 'react';\r\n\r\nconst MatomoTrackDimensions = ({ Region }) => {\r\n useEffect(() => {\r\n const sendEventData = (isAppUser, region) => {\r\n if (window?._paq) {\r\n window._paq.push(\r\n ['setCustomDimension', 1, region],\r\n ['setCustomDimension', 2, isAppUser]\r\n );\r\n }\r\n };\r\n\r\n if (\r\n typeof window !== 'undefined' &&\r\n window?.navigator?.userAgent.includes('1177-appen')\r\n ) {\r\n sendEventData('true', Region);\r\n } else if (typeof window !== 'undefined') {\r\n sendEventData('false', Region);\r\n }\r\n }, []);\r\n return null;\r\n};\r\n\r\nMatomoTrackDimensions.propTypes = {\r\n Region: string,\r\n};\r\n\r\nexport default MatomoTrackDimensions;\r\n","import React, { Fragment } from 'react';\r\nimport { ModalPanel, CloseModalButton } from './index';\r\n\r\nconst FullscreenModalInner = ({\r\n classModifier,\r\n id,\r\n children,\r\n showCloseModalText,\r\n ...props\r\n}) => {\r\n return (\r\n <div className={`${classModifier}__modal-container`}>\r\n <div className={`${classModifier}__modal-panel`}>\r\n <div className={`${classModifier}__modal-panel__content`}>\r\n <CloseModalButton id={id} className={`${classModifier}__modal-close`}>\r\n <span className={showCloseModalText ? classModifier + '__modal-close__text' : \"show-for-sr\"}>Stäng</span>\r\n </CloseModalButton>\r\n {React.cloneElement(children, { ...props })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst FullscreenModal = ({\r\n classModifier,\r\n id,\r\n children,\r\n closeModal,\r\n showCloseModalText = false,\r\n hideWithCss = false,\r\n}) => {\r\n return (\r\n <Fragment>\r\n <ModalPanel hideWithCss={hideWithCss} whenActive={id}>\r\n <FullscreenModalInner\r\n classModifier={classModifier}\r\n closeModal={closeModal}\r\n showCloseModalText={showCloseModalText}\r\n >\r\n {children}\r\n </FullscreenModalInner>\r\n </ModalPanel>\r\n </Fragment>\r\n );\r\n};\r\n\r\nexport default FullscreenModal;\r\n","import React, { useState, useEffect, createContext } from 'react';\r\nimport withKeepTabFocus from '../Containers/withKeepTabFocus';\r\nimport classNames from 'classnames';\r\n\r\nconst context = createContext({});\r\n\r\nconst { Provider, Consumer } = context;\r\n\r\nconst OpenModalButton = ({\r\n id,\r\n children,\r\n className,\r\n clickCallback,\r\n fullScreen,\r\n tabIndex,\r\n ariaLabel,\r\n}) => {\r\n const clickHandler = (changeModal) => {\r\n changeModal(id);\r\n if (clickCallback !== undefined) clickCallback();\r\n if (fullScreen) document.body.classList.add('no-scroll');\r\n };\r\n\r\n return (\r\n <Consumer>\r\n {({ changeModal, activeModalId }) => (\r\n <button\r\n tabIndex={tabIndex}\r\n data-buttonid={`open${id}`}\r\n id={`button-${id}--opener`}\r\n type=\"button\"\r\n className={classNames({\r\n [`${className}`]: true,\r\n [`${className}--open`]: activeModalId === id,\r\n })}\r\n aria-label={ariaLabel}\r\n onClick={() => clickHandler(changeModal)}\r\n >\r\n {children}\r\n </button>\r\n )}\r\n </Consumer>\r\n );\r\n};\r\n\r\nconst CloseModalButton = ({ children, className, id }) => (\r\n <Consumer>\r\n {({ closeModal }) => (\r\n <button\r\n autoFocus={id}\r\n type=\"button\"\r\n className={className}\r\n onClick={() => closeModal(id)}\r\n >\r\n {children}\r\n </button>\r\n )}\r\n </Consumer>\r\n);\r\n\r\nconst ModalPanelInner = withKeepTabFocus(({ children, ...props }) => {\r\n return React.cloneElement(children, { ...props });\r\n});\r\n\r\nconst ModalPanel = ({ whenActive, children, hideWithCss }) => (\r\n <Consumer>\r\n {({ activeModalId }) =>\r\n activeModalId === whenActive || hideWithCss ? (\r\n <div\r\n className={classNames({\r\n 'modal-is-closed': activeModalId !== whenActive,\r\n })}\r\n >\r\n <ModalPanelInner>{children}</ModalPanelInner>\r\n </div>\r\n ) : null\r\n }\r\n </Consumer>\r\n);\r\n\r\nconst Modal = (props) => {\r\n const [activeModalId, setActiveModalId] = useState('');\r\n const fullScreenModal = props.fullScreen;\r\n\r\n const changeModal = (newModalId) => {\r\n setActiveModalId(activeModalId === newModalId ? '' : newModalId);\r\n };\r\n\r\n const closeModal = (id) => {\r\n setActiveModalId('');\r\n if (\r\n props.noScroll === true &&\r\n document.body.classList.contains('no-scroll')\r\n )\r\n document.body.classList.remove('no-scroll');\r\n if (document.querySelector(`[data-buttonid='open${id}']`))\r\n document.querySelector(`[data-buttonid='open${id}']`).focus();\r\n };\r\n\r\n const escCloseHandler = (e) => {\r\n if (activeModalId !== '') {\r\n if (e.keyCode === 27) {\r\n e.preventDefault();\r\n closeModal();\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const handleClick = (e) => {\r\n if (activeModalId !== '') {\r\n if (e.target.className === 'category-lists-modal__modal-panel') {\r\n closeModal();\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n useEffect(() => {\r\n document.addEventListener('keydown', (e) => escCloseHandler(e));\r\n document.addEventListener('mousedown', (e) => handleClick(e));\r\n }, [activeModalId]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n document.removeEventListener('keydown', escCloseHandler());\r\n document.removeEventListener('mousedown', handleClick());\r\n };\r\n }, []);\r\n\r\n return (\r\n <Provider\r\n value={{\r\n activeModalId,\r\n fullScreenModal,\r\n changeModal,\r\n closeModal,\r\n }}\r\n >\r\n {props.children}\r\n </Provider>\r\n );\r\n};\r\n\r\nModal.defaultProps = {\r\n noScroll: true,\r\n};\r\n\r\nexport default Modal;\r\nexport { OpenModalButton, CloseModalButton, ModalPanel, Consumer };\r\n","export default {\r\n SORT_DISTANCE: 'distance',\r\n SORT_NAME: 'name',\r\n SORT_REL: 'rel',\r\n BOUNDARY_QUERY_ENABLED: 'enabled',\r\n BOUNDARY_QUERY_DISABLED: 'disabled',\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\nimport Breadcrumb from '../../Breadcrumb';\r\nimport InfoBox from '../../InfoBox';\r\nimport Modal from '../../Modal';\r\nimport MatomoTrackSearch from '../../Matomo/matomo-track-search';\r\nimport FindCareHeader from '../../FindCare/findcare-header';\r\nimport FindCareForm from '../../FindCare/findcare-form';\r\nimport SearchList from './search-list';\r\nimport queryString from 'qs';\r\n\r\nconst FindCarePage = (props) => {\r\n const location = useLocation();\r\n const qs = queryString.parse(location.search, {\r\n ignoreQueryPrefix: true,\r\n });\r\n\r\n // Shared state handling for Find Care components.\r\n // TODO: useContext\r\n const [findCareState, _setFindCareState] = useState({\r\n searchResultModifiers: {},\r\n });\r\n\r\n const setFindCareState = (key, value) => {\r\n if (!key || typeof key !== 'string') {\r\n throw new Error('You need to pass a valid key to find care state.');\r\n }\r\n _setFindCareState((state) => ({\r\n ...state,\r\n [key]: value,\r\n }));\r\n };\r\n\r\n return (\r\n <>\r\n <div className=\"row\">\r\n <div className=\"columns\">\r\n <Breadcrumb {...props.Breadcrumbs} Language={props.Language} />\r\n </div>\r\n </div>\r\n <main className=\"main\">\r\n <div className=\"row\">\r\n <Modal>\r\n <div id=\"content\">\r\n <div className=\"small-12 columns\">\r\n <FindCareHeader {...props.Content} />\r\n <FindCareForm {...props} />\r\n </div>\r\n\r\n <SearchList\r\n mapConfig={props.mapConfig}\r\n findCareState={[findCareState, setFindCareState]}\r\n SearchResult={props.Content && props.Content.SearchResult}\r\n location={props.location}\r\n IsPost={props.Content.IsPost}\r\n apiConfig={props.apiConfig}\r\n Translations={props.Content && props.Content.Translations}\r\n EmptySearchResultText={props.Content.EmptySearchResultText}\r\n hasAltLayout={props.hasAltLayout}\r\n />\r\n </div>\r\n </Modal>\r\n {props.Content &&\r\n (props.Content.InfoText || props.Content.LinkCollection) && (\r\n <div className=\"small-12 columns\">\r\n <InfoBox {...props.Content} />\r\n </div>\r\n )}\r\n </div>\r\n </main>\r\n <MatomoTrackSearch\r\n Search={qs?.q}\r\n SearchCategory={qs?.caretype || 'Alla mottagningar'}\r\n SearchHits={props.Content?.SearchResult?.TotalHits}\r\n SearchLocation={qs?.location}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nexport default FindCarePage;\r\n","import React from 'react';\r\nimport queryString from 'qs';\r\nimport PropTypes from 'prop-types';\r\nimport { Redirect as ReactRouterRedirect } from 'react-router-dom';\r\n\r\nimport { log } from '../../Helpers/helpers';\r\nimport withGeoLocation from '../../Containers/withGeolocation';\r\nimport * as utils from '../../FindCare/findcare-map/helpers';\r\n\r\nimport CONSTANTS from './constants';\r\n\r\nconst RedirectWithCoords = (props) => {\r\n const { coords, location, geoLocationError } = props;\r\n let qs = queryString.parse(location.search, {\r\n ignoreQueryPrefix: true,\r\n });\r\n if (coords === null) {\r\n if (geoLocationError) {\r\n delete qs.nearby;\r\n qs.s = CONSTANTS.SORT_NAME;\r\n qs.lat = '';\r\n qs.lng = '';\r\n } else {\r\n // while wating for geoLocation\r\n return null;\r\n }\r\n } else {\r\n qs.s = CONSTANTS.SORT_DISTANCE;\r\n qs.lat = coords.latitude;\r\n qs.lng = coords.longitude;\r\n }\r\n const url = `${location.pathname}?${queryString.stringify(qs)}`;\r\n\r\n log()(`Redirect to: %c${url}`, 'font-weight: bold; color: #007;', qs);\r\n return <ReactRouterRedirect to={url} />;\r\n};\r\n\r\nconst RedirectToLatLng = ({ qs, location }) => {\r\n if (!utils.shouldRedirectToLatLng(qs)) return null;\r\n // Use container to access lat & lng props.\r\n const Redirect = withGeoLocation(RedirectWithCoords);\r\n return <Redirect location={location} />;\r\n};\r\n\r\nRedirectToLatLng.propTypes = {\r\n qs: PropTypes.object,\r\n location: PropTypes.object,\r\n};\r\n\r\nexport default RedirectToLatLng;\r\n","import React, { Fragment } from 'react';\r\nimport classNames from 'classnames';\r\nimport { shape, object, string, bool, number } from 'prop-types';\r\nimport queryString from 'qs';\r\n\r\nimport Alert from '../../Alert';\r\nimport List from '../../SearchBlock/list';\r\nimport Spinner from '../../Spinner';\r\nimport withSearch from '../../Containers/withSearch';\r\nimport Pagination from '../../Pagination';\r\n\r\nimport FindCareMap from '../../FindCare/findcare-map';\r\nimport FindCareSort from '../../FindCare/findcare-sort';\r\nimport SearchListItem from '../../FindCare/findcare-search-list-item';\r\nimport RedirectToLatLng from './redirect';\r\nimport * as utils from '../../FindCare/findcare-map/helpers';\r\n\r\nconst getHtml = (html) => ({ __html: html });\r\n\r\nconst SearchList = (props) => {\r\n const {\r\n Translations,\r\n SearchResult,\r\n findCareState,\r\n apiConfig,\r\n EmptySearchResultText,\r\n location,\r\n } = props;\r\n\r\n const qs = queryString.parse(location.search, {\r\n ignoreQueryPrefix: true,\r\n });\r\n\r\n const searchResult = {\r\n ...SearchResult,\r\n ...findCareState[0].searchResultModifiers,\r\n };\r\n\r\n // Translations is from the scope of this SearchList component.\r\n // ListProps are sent from the child where the component/function is run.\r\n const ListItem = (listProps) => (\r\n <SearchListItem\r\n {...listProps}\r\n markerOptions={props.mapConfig.markerOptions()}\r\n apiKey={apiConfig.googleMapsClientApiKey}\r\n Translations={Translations}\r\n hasAltLayout={props.hasAltLayout}\r\n />\r\n );\r\n\r\n let heading = searchResult.isLoading ? '...' : searchResult.Heading;\r\n if (searchResult.HasZeroHits) {\r\n heading = Translations.zerohits;\r\n }\r\n return (\r\n <div\r\n className={classNames({\r\n 'is-loading': searchResult.isLoading,\r\n })}\r\n >\r\n {\r\n // When url is calling for nearby but we have no lat and lng\r\n // we will try to get geolocastion and redirect user\r\n // to a search query with lat and lng.\r\n }\r\n <RedirectToLatLng qs={qs} location={props.location} />\r\n <div className=\"row\">\r\n <div className=\"large-8 large-centered columns\">\r\n \r\n {SearchResult.IsSimpleFallbackSearch && (\r\n <Alert type={'warning'} alert={props}>\r\n {props.SearchResult.ResultDisclaimer}\r\n </Alert>\r\n )}\r\n\r\n {searchResult.Heading && utils.shouldDisplayMap(qs, searchResult) && (\r\n <div className=\"c-searchlist__heading__container\">\r\n <h2\r\n className=\"c-searchlist__heading\"\r\n dangerouslySetInnerHTML={getHtml(\r\n utils.parseSanitizedHeading(heading)\r\n )}\r\n ></h2>\r\n </div>\r\n )}\r\n\r\n <FindCareMap\r\n findCareState={findCareState}\r\n mapConfig={props.mapConfig}\r\n apiKey={props.apiConfig.googleMapsClientApiKey}\r\n expand={true}\r\n SearchResult={searchResult}\r\n IsPost={props.IsPost}\r\n Translations={Translations}\r\n />\r\n\r\n {searchResult.HasZeroHits && (\r\n <>\r\n <Alert Modifiers={{ 'findcare-zerohits': true }} type=\"warning\">\r\n <p\r\n className=\"findcare-zerohits__text\"\r\n dangerouslySetInnerHTML={getHtml(SearchResult.Heading)}\r\n />\r\n </Alert>\r\n {EmptySearchResultText && (\r\n <div\r\n className=\"findcare-zerohits__body\"\r\n dangerouslySetInnerHTML={getHtml(EmptySearchResultText)}\r\n ></div>\r\n )}\r\n </>\r\n )}\r\n\r\n {!searchResult.HasZeroHits && (\r\n <Fragment>\r\n <FindCareSort\r\n findCareState={props.findCareState}\r\n SearchResult={searchResult}\r\n location={props.location}\r\n IsPost={props.IsPost}\r\n Translations={props.Translations}\r\n />\r\n\r\n <List\r\n {...searchResult}\r\n query={qs.q}\r\n CustomSearchListItem={ListItem}\r\n >\r\n <Pagination\r\n onClick={() =>\r\n document.getElementById('search-list-last').focus()\r\n }\r\n {...searchResult}\r\n Spinner={\r\n <Spinner Modifiers={{ 'c-spinner--search': true }} />\r\n }\r\n >\r\n {searchResult && searchResult.BatchText}\r\n </Pagination>\r\n </List>\r\n </Fragment>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nSearchList.propTypes = {\r\n IsPost: bool,\r\n Translations: shape({\r\n zerohits: string,\r\n }),\r\n apiConfig: shape({\r\n googleMapsClientApiKey: string,\r\n }),\r\n SearchResult: shape({\r\n isLoading: bool,\r\n BatchText: string,\r\n Heading: string,\r\n Query: string,\r\n TotalHits: number,\r\n HasZeroHits: bool,\r\n }),\r\n /** From react-router withRouter() higher order component */\r\n location: object,\r\n};\r\n\r\nexport default withSearch(SearchList, null, '/api/hjv/search');\r\n","import React from 'react';\r\nimport T from 'prop-types';\r\n\r\nfunction Button(props) {\r\n const { text, textOnlySr, ...rest } = props;\r\n return (\r\n <button {...rest}>\r\n {textOnlySr ? <span className=\"show-for-sr\">{text}</span> : text}\r\n </button>\r\n );\r\n}\r\n\r\nButton.defaultProps = {\r\n type: 'button',\r\n};\r\n\r\nButton.propTypes = {\r\n type: T.oneOf(['button', 'submit', 'reset']),\r\n onClick: T.func,\r\n textOnlySr: T.bool,\r\n text: T.node,\r\n};\r\n\r\nexport default Button;\r\n","import React from 'react';\r\n\r\nconst ErrorMessage = (props) => (\r\n <div className={props.className}>{props.text}</div>\r\n);\r\n\r\nexport default ErrorMessage;\r\n","import React, { useRef, useEffect, useCallback } from 'react';\r\nimport T from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport Spinner from '../Spinner';\r\nimport Suggestions from './suggestions';\r\nimport useOpenClose from './useOpenClose';\r\nimport Button from './button';\r\nimport ErrorMessage from './error';\r\n\r\nfunction Field(props) {\r\n const {\r\n placeholder,\r\n label,\r\n labelClassName,\r\n id,\r\n value,\r\n name,\r\n isLoading,\r\n highlightSelection,\r\n inputClassName,\r\n innerClassName,\r\n hightlightTitle,\r\n className,\r\n } = props;\r\n\r\n // Create DOM refs to elements\r\n const containerElement = useRef(null);\r\n const inputElement = useRef(null);\r\n const suggestionsElement = useRef(null);\r\n\r\n const [\r\n suggestionIsOpen,\r\n openSuggestion,\r\n closeSuggestion,\r\n setSuggestionIsOpen,\r\n ] = useOpenClose(false);\r\n\r\n useEffect(() => {\r\n props.setStatus({ isLoading: isLoading });\r\n }, [isLoading]);\r\n\r\n // About why useCallback here\r\n // https://reactjs.org/docs/hooks-faq.html#is-it-safe-to-omit-functions-from-the-list-of-dependencies\r\n const delayedClose = useCallback(\r\n () => setTimeout(() => closeSuggestion(), 0),\r\n [closeSuggestion]\r\n );\r\n\r\n const handleBlur = (e) => {\r\n props.onBlur(e);\r\n };\r\n\r\n const handleChange = (e) => {\r\n // from find-care-form\r\n props.onValueChange(e);\r\n // Autocomplete\r\n props.handleChange(e);\r\n // Formik\r\n props.onChange(e);\r\n openSuggestion();\r\n };\r\n /* callback when clear field is clicked */\r\n const clearField = () => {\r\n if (props.clearField) {\r\n props.clearField();\r\n }\r\n props.setValue(name, '');\r\n };\r\n\r\n const handleClickOutside = (el, fn) => (e) => {\r\n // Do nothing when we click inside the element\r\n if (el && el.current && el.current.contains(e.target)) {\r\n return;\r\n }\r\n fn();\r\n };\r\n\r\n const getItems = (props) => {\r\n if (typeof props.getItems === 'function') {\r\n return props.getItems(props);\r\n }\r\n return props.items;\r\n };\r\n\r\n const b = Boolean(value.length > 0);\r\n\r\n const displayZeroHitsMessage = Boolean(\r\n props.zeroHits && props.zeroHitsMessage\r\n );\r\n\r\n const suggestionsProps = {\r\n highlightSelection: highlightSelection && props.isSelected,\r\n hightlightTitle,\r\n id: `suggestions_${name}`,\r\n ref: suggestionsElement,\r\n className: `${className}__autocomplete`,\r\n selected: value,\r\n isDefault: !b,\r\n useCloseButton: props.suggestCloseButton,\r\n isOpen: suggestionIsOpen && !displayZeroHitsMessage && !props.error,\r\n footer: props.suggestionsFooter,\r\n items: b ? getItems(props) : props.defaultSuggestions,\r\n defaultItems: props.defaultSuggestions,\r\n defaultTitle: props.defaultSuggestionsTitle,\r\n title: b ? props.suggestionsTitle : props.defaultSuggestionsTitle,\r\n };\r\n\r\n useEffect(() => {\r\n document.addEventListener(\r\n 'mousedown',\r\n handleClickOutside(containerElement, delayedClose)\r\n );\r\n return () => {\r\n document.removeEventListener(\r\n 'mousedown',\r\n handleClickOutside(containerElement, delayedClose)\r\n );\r\n };\r\n }, [containerElement, delayedClose]);\r\n\r\n const hasDefaults = props.defaultSuggestions.length > 0;\r\n\r\n const outerClassName = classnames(className, {\r\n [`${className}--is-loading`]: value.length > 0 && props.isLoading,\r\n [`${className}--has-defaults`]: hasDefaults,\r\n [`${className}--has-error`]: props.error,\r\n [`${className}--has-value`]: value.length > 0,\r\n [`${className}--suggestions-is-open`]: suggestionIsOpen && value.length > 2,\r\n });\r\n\r\n useEffect(() => {\r\n if (\r\n !props.doNotAutoselectFirstItemOnClose &&\r\n !suggestionIsOpen &&\r\n !props.isSelected &&\r\n props.value.length >= props.minStringLength\r\n ) {\r\n const items = getItems(props).filter((item) => !item.excludeAutoselect);\r\n if (items.length > 0) {\r\n const item = items[0];\r\n props.setValue(name, item.text || item.value);\r\n if (typeof props.onSuggestionSelect === 'function') {\r\n props.onSuggestionSelect(item);\r\n }\r\n }\r\n }\r\n }, [suggestionIsOpen]);\r\n\r\n useEffect(() => {\r\n if (\r\n containerElement &&\r\n containerElement.current &&\r\n !containerElement.current.contains(props.activeElement)\r\n ) {\r\n if (suggestionIsOpen) {\r\n delayedClose();\r\n }\r\n }\r\n }, [props.activeElement]);\r\n\r\n return (\r\n <div className={outerClassName} ref={containerElement} id={`field_${name}`}>\r\n <label className={labelClassName} htmlFor={id || name}>\r\n {label}\r\n </label>\r\n <div className={innerClassName}>\r\n <input\r\n aria-controls={suggestionsProps.id}\r\n className={inputClassName}\r\n ref={inputElement}\r\n id={id || name}\r\n name={name}\r\n value={value}\r\n onChange={handleChange}\r\n onBlur={handleBlur}\r\n placeholder={placeholder}\r\n type=\"text\"\r\n autoComplete=\"off\"\r\n />\r\n\r\n {props.error && (\r\n <ErrorMessage\r\n className={props.errorClassName || `${className}__error`}\r\n text={props.error}\r\n />\r\n )}\r\n {displayZeroHitsMessage && (\r\n <ErrorMessage\r\n className={props.errorClassName || `${className}__error`}\r\n text={props.zeroHitsMessage}\r\n />\r\n )}\r\n\r\n <Suggestions\r\n {...suggestionsProps}\r\n close={(event) => {\r\n delayedClose();\r\n event.target.blur();\r\n }}\r\n handleClick={(item) => (event) => {\r\n props.setValue(name, item.value);\r\n delayedClose();\r\n event.target.blur();\r\n if (typeof props.onSuggestionSelect === 'function') {\r\n props.onSuggestionSelect(item);\r\n }\r\n }}\r\n />\r\n\r\n <Spinner />\r\n\r\n {value.length > 0 && (\r\n <Button\r\n textOnlySr={true}\r\n className={`${className}__clear-field ${\r\n props.defaultSuggestions.length > 0\r\n ? `${className}__clear-field--toggle-sibling`\r\n : ''\r\n }`}\r\n text=\"Rensa fält\"\r\n onClick={clearField}\r\n />\r\n )}\r\n {props.defaultSuggestions.length > 0 && (\r\n <Button\r\n textOnlySr={true}\r\n aria-controls={`container_${suggestionsProps.id}`}\r\n aria-haspopup=\"true\"\r\n aria-expanded={suggestionIsOpen}\r\n className={classnames({\r\n [`${className}__toggle-suggestion`]: true,\r\n [`${className}__toggle-suggestion--is-open`]: suggestionIsOpen,\r\n })}\r\n text={suggestionIsOpen ? 'Dölj förslag' : 'Visa förslag'}\r\n onClick={() => {\r\n if (!suggestionIsOpen) {\r\n // Set focus to the first button\r\n // in the suggestions panel\r\n const firstButton =\r\n suggestionsElement.current.querySelector('[data-element]');\r\n\r\n if (firstButton) {\r\n firstButton.focus();\r\n } else {\r\n inputElement.current.focus();\r\n }\r\n }\r\n // Toggle suggestion panel\r\n setSuggestionIsOpen(!suggestionIsOpen);\r\n }}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nField.propTypes = {\r\n id: T.string,\r\n onBlur: T.func,\r\n onChange: T.func,\r\n /** Function is run when an item is clicked in suggestions. */\r\n onSuggestionSelect: T.func,\r\n value: T.string,\r\n suggestionsFooter: T.func,\r\n suggestions: T.array,\r\n defaultSuggestionsTitle: T.string,\r\n\r\n suggestionsTitle: T.string,\r\n defaultSuggestions: T.array,\r\n suggestCloseButton: T.bool,\r\n setValue: T.func,\r\n /* input element placeholder attribute */\r\n placeholder: T.string,\r\n /* div with buttons and field */\r\n innerClassName: T.string,\r\n /* input element */\r\n inputClassname: T.string,\r\n /* html label element */\r\n labelClassName: T.string,\r\n /* input element name attribute */\r\n name: T.string.isRequired,\r\n /* callback when clear field is clicked */\r\n clearField: T.func,\r\n /* should selected item be highlighed before other items */\r\n highlightSelection: T.bool,\r\n};\r\n\r\nField.defaultProps = {\r\n className: 'field',\r\n labelClassName: 'field__label',\r\n suggestionsFooter: null,\r\n placeholder: '',\r\n suggestions: [],\r\n defaultSuggestions: [],\r\n onValueChange: () => {},\r\n suggestCloseButton: false,\r\n};\r\n\r\nexport default Field;\r\n","import React, { useEffect } from 'react';\r\nimport T from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport Button from './button';\r\n\r\n// We forward the suggestions ref from parent field component\r\n// https://reactjs.org/docs/forwarding-refs.html\r\n\r\nconst Suggestions = React.forwardRef(function Suggestions(props, ref) {\r\n const {\r\n items,\r\n isDefault,\r\n defaultItems,\r\n selected,\r\n isOpen,\r\n close,\r\n useCloseButton,\r\n footer,\r\n handleClick,\r\n hightlightTitle,\r\n highlightSelection,\r\n defaultTitle,\r\n title,\r\n className,\r\n } = props;\r\n\r\n function handleKeyboard(e) {\r\n // Here we handle keyboard input.\r\n // Should only trigger when suggestionfield is visible.\r\n // If we need to handle Enter click - we do that here.\r\n\r\n if (isDefault) {\r\n return;\r\n }\r\n\r\n const buttons = Array.prototype.slice.call(\r\n ref.current.querySelectorAll('[data-element=suggestion]')\r\n );\r\n\r\n // If the current element is one of the buttons.\r\n const selectedIndex = buttons.findIndex(\r\n (btn) => btn === document.activeElement\r\n );\r\n\r\n let newIndex = selectedIndex;\r\n\r\n // up\r\n if (e.keyCode === 38) {\r\n e.preventDefault();\r\n newIndex = selectedIndex - 1;\r\n }\r\n\r\n // down\r\n if (e.keyCode === 40) {\r\n e.preventDefault();\r\n newIndex = selectedIndex + 1;\r\n }\r\n\r\n // enter\r\n if (e.keyCode === 13) {\r\n if (\r\n document &&\r\n document.activeElement &&\r\n document.activeElement.tagName === 'INPUT'\r\n ) {\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n if (buttons[newIndex]) {\r\n buttons[newIndex].focus();\r\n }\r\n }\r\n\r\n // We have a selected option.\r\n const selectedText = [...items, ...defaultItems].find(\r\n (item) => item.text === selected\r\n );\r\n\r\n const isHighlight = Boolean(highlightSelection && selectedText);\r\n\r\n const isVisible = Boolean(isOpen && (items.length > 0 || isHighlight));\r\n\r\n // Classname for the wrapper\r\n const classNames = classnames(className, {\r\n [`${className}--is-open`]: isVisible,\r\n });\r\n\r\n // We do not want focus when the list is hidden\r\n const btnTabIndex = {\r\n tabIndex: isVisible ? 0 : -1,\r\n };\r\n\r\n // When a selections is made and we hightligt that.\r\n // We also display the default/fallback items below.\r\n const listItems = isHighlight ? defaultItems : items;\r\n\r\n useEffect(() => {\r\n if (isVisible) {\r\n window.addEventListener('keydown', handleKeyboard);\r\n } else {\r\n window.removeEventListener('keydown', handleKeyboard);\r\n }\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyboard);\r\n };\r\n }, [handleKeyboard, isVisible]);\r\n\r\n return (\r\n <div\r\n tabIndex=\"-1\"\r\n ref={ref}\r\n id={`container_${props.id}`}\r\n className={classNames}\r\n >\r\n {useCloseButton && (\r\n <Button\r\n className={`${className}__close`}\r\n {...btnTabIndex}\r\n onClick={close}\r\n text=\"Stäng\"\r\n />\r\n )}\r\n {title && <span className={`${className}__title`}>{title}</span>}\r\n\r\n <ul>\r\n {isHighlight && (\r\n <>\r\n <li className=\"highlight\">\r\n <div>\r\n <p>\r\n {hightlightTitle}:\r\n <br />\r\n <b>{selectedText.text}</b>\r\n </p>\r\n </div>\r\n </li>\r\n {defaultTitle && (\r\n <li className={`${className}__title`}>{defaultTitle}</li>\r\n )}\r\n </>\r\n )}\r\n {listItems.map((item, i) => (\r\n <li\r\n className={`${className}__item ${\r\n item.className ? item.className : ''\r\n }`}\r\n key={`${props.id}_${item.key}_${i}`}\r\n >\r\n <Button\r\n data-element={isDefault || isHighlight ? 'default' : 'suggestion'}\r\n type=\"button\"\r\n tabIndex={isDefault && isVisible ? 0 : -1}\r\n text={item.text}\r\n onClick={handleClick({ ...item, value: item.value || item.text })}\r\n />\r\n </li>\r\n ))}\r\n </ul>\r\n {footer && footer(isVisible)}\r\n <div\r\n className=\"show-for-sr\"\r\n id={props.id}\r\n role=\"status\"\r\n aria-atomic=\"true\"\r\n aria-live=\"assertive\"\r\n >\r\n {isVisible && !isDefault && items.length > 0 && (\r\n <span>{items.length} förslag</span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\nSuggestions.defaultProps = {\r\n footer: null,\r\n className: 'suggestions',\r\n defaultItems: [],\r\n items: [],\r\n};\r\n\r\nSuggestions.propTypes = {\r\n id: T.string.isRequired,\r\n hightlightTitle: T.string,\r\n items: T.array,\r\n defaultItems: T.array,\r\n isOpen: T.bool,\r\n handleClick: T.func,\r\n close: T.func,\r\n /** render prop with argument `isVisibile` */\r\n footer: T.func,\r\n highlightSelection: T.bool,\r\n selected: T.string,\r\n useCloseButton: T.bool,\r\n title: T.string,\r\n};\r\n\r\nexport default Suggestions;\r\n","import { useState } from 'react';\r\n\r\nfunction useOpenClose(initialState) {\r\n const [isOpen, setIsOpen] = useState(initialState);\r\n return [\r\n isOpen,\r\n () => setIsOpen(true),\r\n () => setIsOpen(false),\r\n () => setIsOpen(!isOpen),\r\n ];\r\n}\r\n\r\nexport default useOpenClose;\r\n","var isProduction = process.env.NODE_ENV === 'production';\nfunction warning(condition, message) {\n if (!isProduction) {\n if (condition) {\n return;\n }\n\n var text = \"Warning: \" + message;\n\n if (typeof console !== 'undefined') {\n console.warn(text);\n }\n\n try {\n throw Error(text);\n } catch (x) {}\n }\n}\n\nexport default warning;\n","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;"],"names":["isSelected","o","Selected","getSelectedRegion","_ref","Regions","Options","found","find","Label","Name","Value","props","_props$Regionalizatio","done","setDone","useState","useEffect","loadScript","concat","Site","e","console","error","message","log","_jsxs","_Fragment","children","_jsx","FindCare","_objectSpread","selectedRegion","Regionalization","mapConfig","hasCareTypeFilter","MatomoTrackDimensions","Region","CurrentRegionName","clusterMarkerIcons","textColor","className","height","width","markerOptions","icon","url","markerImg","mapOption","settings","arguments","length","undefined","disableDefaultUI","clickableIcons","Breadcrumbs","componentClasses","classNames","Modifiers","lang","useSweLang","Language","id","map","breadcrumb","index","CurrentPage","href","Url","Text","firstLetter","useRef","_firstLetter$current","current","focus","modalIsOpen","alphabeticalListActive","list","currentActiveLetter","listItems","letter","Key","onKeyDown","keyCode","returnToAlphabeticListHandler","enterHandler","ref","toUpperCase","ticking","lists","topics","setCurrentActiveLetterState","setAlphabeticalListActive","elm","addEventListener","throttleScroll","container","requestAnimationFrame","forEach","topic","isTopicInRange","topicLists","Content","AOCareTypes","TopicList","isInRange","addTopicListToHandles","topicList","push","setCurrentActiveLetter","categories","Categories","returnToAlphabetic","selectedCareType","careTypeChangeHandler","Fragment","tabIndex","Translations","all","aodescription","AlphabeticalList","Component","constructor","this","React","top","getBoundingClientRectHandler","scrollTop","bottom","offsetTop","clientHeight","enterHandlerClose","preventDefault","currentTarget","click","componentDidMount","render","Consumer","closeModal","activeModalId","type","name","defaultChecked","CategoryName","onChange","trim","value","onClick","withAutocomplete","SuggestionsField","hits","Hits","_","qs","st","g","nearby","lng","lat","Items","IsNearBy","selectedObject","sessiontoken","getNearby","text","excludeAutoselect","getCountry","country","getRegion","r","Type","getDefaultLocations","region","items","withRouter","path","getCurrentRegion","Slug","createRegionSlug","Units","FriendlyUrl","window","location","DisplayName","item","caretype","getAOCategories","types","a","isTrue","b","isFalse","get16RandomBytes","random","Array","i","d","Date","Math","floor","getTime","FindCareForm","translations","hjvSearchForm","caretypeWrapper","activeElement","setActiveElement","document","sessionToken","setSessionToken","uuidv4","rng","handleFocusIn","removeEventListener","newSessionToken","handleChange","formik","sort","CONSTANTS","SORT_NAME","values","SORT_DISTANCE","q","SORT_REL","setFieldValue","setSortField","getFieldProps","setValue","setStatus","status","clearField","errors","isTouched","touched","onBlur","handleBlur","getCaretypeGValue","SearchResult","query","queryString","search","ignoreQueryPrefix","HasCareTypeFilter","initialValues","ls","caretypeSet","s","Formik","initialStatus","validate","onSubmit","handleSubmit","submit","action","pathname","method","defaultValue","InputLatLng","coords","CommonCareTypes","FullscreenModal","hideWithCss","classModifier","CategoriesLists","careType","setTimeout","LocationSuggestion","inputClassName","innerClassName","errorClassName","zeroHitsMessage","onValueChange","onSuggestionSelect","validateForm","setValues","then","getItems","extra","allcounties","Suggestions","key","defaultSuggestionsTitle","defaultSuggestions","label","where","labelClassName","placeholder","whereinputfield","CaretypeSuggestion","suggestionsFallback","hightlightTitle","within","suggestionsTitle","suggestionsFooter","isOpen","OpenModalButton","clickCallback","querySelector","fullScreen","more","choiceunitinputfield","highlightSelection","choiceunit","UnitSuggestion","doNotAutoselectFirstItemOnClose","allunits","style","display","Address","HsaId","unit","suggestCloseButton","suggestions","unitinputfield","isFalseOrEmpty","searchbutton","defaultProps","withGeolocation","latitude","longitude","Heading","dangerouslySetInnerHTML","heading","__html","replace","Preamble","getTakeParam","TotalHits","BatchSize","Bounds","Number","setMaxZoom","getZoom","setZoom","isEqPositionTo","compare","compareWith","Boolean","data","Latitude","Longitude","getInitialBounds","topLeft","bottomRight","ne","sw","getDefaultCenter","getHsaIdsPiped","hsaIds","SearchHits","getZoomLevel","isNaN","parseInt","z","getLocationData","shouldDoInitialBoundaryQuery","shouldRedirectToLatLng","sanitizeHeading","parseSanitizedHeading","noSearchHits","shouldDisplayMap","shouldDisplaySort","_ref2","IsPost","utils","isMediumOrLarger","useMedia","isLoading","showhitsonmap","Map","modifiers","expand","centerMapToInfoWindow","marker","popup","getProjection","popupPosition","fromLatLngToDivPixel","position","posX","getDiv","offsetWidth","y","x","offsetx","offsety","scale","pow","worldCoordinateCenter","fromLatLngToPoint","pixelOffset","global","google","maps","Point","worldCoordinateNewCenter","newCenter","fromPointToLatLng","setCenter","isCluster","Popup","content","closeBtn","anchor","createElement","classList","add","appendChild","close","stopEventPropagation","prototype","Object","create","OverlayView","onAdd","getPanes","floatPane","onRemove","parentElement","removeChild","draw","divPosition","left","cursor","event","stopPropagation","infoWindow","setMap","infoBubble","receptionCount","infoBubbleInner","scrollBtn","setAttribute","innerHTML","infoBubbleOuter","spinner","bounce1","bounce2","bounce3","LatLng","response","json","textContent","receptionData","receptionWrapper","headingLink","innerText","chevron","getAttribute","address","PhoneNumber","phone","phoneLink","InternationalPhoneNumber","serviceList","__PRELOADED_STATE__","createListItem","titleText","elem","titleElem","HasLovContract","VideoOrChat","HasMvkServices","VaccinatesForFlu","VaccinatesForCovid19","HasListing","LovContractLinkText","haseservices","vaccinatescovid19","vaccinatesflu","videoorchat","HasListingQueue","haslistingqueue","haslisting","offsetHeight","scrollBy","getBoundaryQuery","api","bounds","getBounds","getNorthEast","getSouthWest","nw","se","MapControls","searchWithBoundaries","googleAPI","boundaryQuery","zoom","center","getCenter","toJSON","p","m","mlat","mlng","history","locationClearButton","querySelectorAll","zoomIn","zoomOut","_this$props","boundarySearch","plannerLink","plannerLinkText","_objectWithoutProperties","_excluded","disabled","BOUNDARY_QUERY_DISABLED","searchinarea","Spinner","mapOptions","minZoom","handleClusterClick","bind","fetchInitialPins","onBoundsChanged","afterFitBounds","state","util","pinsFetchedCenter","BOUNDARY_QUERY_ENABLED","initialPinsFetched","googleApiLoaded","mapIsLoaded","handleMapChange","setState","isBoundarySearchEnabled","onIdle","dispatch","getState","fetchPins","config","formData","FormData","append","fetchByPost","t","fetchByQuery","componentDidUpdate","prevProps","prevState","qsPrev","setFindCareState","findCareState","isEqual","locations","hsaids","addLocation","includes","handleMarkerClick","markerData","Infowindow","clusterData","cluster","every","hsaId","pos","getMarkers","_ref3","pinsQuery","isNewCenter","isZoomOut","_ref4","createEventListeners","idle","zoom_changed","bounds_changed","zoomLevel","googleMapEventListeners","disableFitBounds","Maps","mapApiKey","apiKey","initialBounds","useClusters","eventListeners","onMarkerClick","onClusterClick","onMapInit","_ref5","onGoogleAPILoad","options","Locations","showServices","linkHasFocus","setLinkHasFocus","focusHandler","onFocus","wrapperClasses","biggermaptravelplanner","hasAltLayout","open","ModalPanel","whenActive","CloseModalButton","LovContractDescription","sortByRelVisible","isEmpty","GeoLocationErrorLink","isHidden","setIsHidden","CoordsContainer","SortLink","DistanceSortLink","DistanceSortLinkContainer","sortWithBoundary","sortlabel","distance","relevance","ao","Link","to","InfoText","LinkCollection","LinkList","Links","_window2","_window2$navigator","sendEventData","isAppUser","_window","_paq","navigator","userAgent","propTypes","string","FullscreenModalInner","showCloseModalText","context","createContext","Provider","ariaLabel","changeModal","body","clickHandler","autoFocus","ModalPanelInner","withKeepTabFocus","_ref6","_ref7","Modal","setActiveModalId","fullScreenModal","noScroll","contains","remove","escCloseHandler","handleClick","target","newModalId","_props$Content","_props$Content$Search","useLocation","_setFindCareState","searchResultModifiers","Breadcrumb","FindCareHeader","SearchList","Error","apiConfig","EmptySearchResultText","InfoBox","MatomoTrackSearch","Search","SearchCategory","SearchLocation","RedirectWithCoords","geoLocationError","ReactRouterRedirect","Redirect","withGeoLocation","getHtml","html","withSearch","searchResult","HasZeroHits","zerohits","RedirectToLatLng","IsSimpleFallbackSearch","Alert","alert","ResultDisclaimer","FindCareMap","googleMapsClientApiKey","FindCareSort","List","CustomSearchListItem","listProps","SearchListItem","Pagination","getElementById","BatchText","Button","textOnlySr","rest","Field","containerElement","inputElement","suggestionsElement","suggestionIsOpen","openSuggestion","closeSuggestion","setSuggestionIsOpen","useOpenClose","delayedClose","useCallback","handleClickOutside","el","fn","displayZeroHitsMessage","zeroHits","suggestionsProps","selected","isDefault","useCloseButton","footer","defaultItems","defaultTitle","title","hasDefaults","outerClassName","classnames","minStringLength","filter","htmlFor","autoComplete","ErrorMessage","blur","firstButton","handleKeyboard","buttons","slice","call","selectedIndex","findIndex","btn","newIndex","tagName","selectedText","isHighlight","isVisible","btnTabIndex","role","initialState","setIsOpen","condition","getRandomValues","rnds8","Uint8Array","crypto","msCrypto","byteToHex","toString","substr","arr","offset","uuid","toLowerCase","TypeError","buf","rnds","stringify","REGEX","test"],"sourceRoot":""}