,\n mapElement:
,\n })),\n withScriptjs,\n withGoogleMap,\n)((props) => (\n
\n));\n\nexport default MainMap;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { GoogleMap } from 'react-google-maps';\n\nimport { requestBuilder } from '../../api/httpService';\nimport { apiProvider } from '../../api/core';\nimport { SvgIco } from \"../SharedComponents/Icons\";\nimport MapWrapper from './MapWrapper';\n\nimport mapStyles from './style.json';\n\n\nconst url = '/lease/api/frontend/locations/map_markers';\n\n\nclass MainMapWrapper extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n isMapReady: false,\n markersArray: [],\n turnOnDrag: false,\n showLoader: false\n };\n };\n\n\n componentDidMount() {\n if (this.props.mapOptions.root.length === 0) {\n apiProvider.post(this.mapMarkersUrl(), requestBuilder(this.props.requestParams))\n .then((data) => {\n this.setState({ markersArray: data.locations || [] });\n this.boundsMap(data.locations)\n })\n } else {\n this.boundsMap();\n this.setState({markersArray: []})\n }\n\n google.maps.event.addListener(this.map,'idle',function(){\n if(!this.get('dragging') && this.get('oldCenter') && this.get('oldCenter')!== this.getCenter()) {\n }\n if(!this.get('dragging')){\n this.set('oldCenter',this.getCenter())\n }\n });\n\n google.maps.event.addListener(this.map,'dragstart',function(){\n this.set('dragging',true);\n });\n\n google.maps.event.addListener(this.map,'dragend',function(){\n this.set('dragging',false);\n google.maps.event.trigger(this,'idle',{});\n });\n };\n\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n if (this.props.markersArray !== prevProps.markersArray) {\n this.setState({markersArray: this.props.markersArray});\n this.boundsMap(this.props.markersArray)\n }\n };\n\n\n onDragEnd = () => {\n if (this.props.mapOptions.root.length === 0) {\n this.setState({showLoader: true})\n const { requestParams } = this.props;\n let ne = this.map.getBounds().getNorthEast();\n let sw = this.map.getBounds().getSouthWest();\n let viewportString = `${sw.lat()},${sw.lng()},${ne.lat()},${ne.lng()}`;\n const searchData = {...requestParams, viewport_string: viewportString, postal_districts: []};\n\n apiProvider.post(this.mapMarkersUrl(), requestBuilder(searchData))\n .then((data) => {\n this.setState({ showLoader: false });\n data.locations && data.locations.length > 0 && this.setState({ markersArray: data.locations });\n });\n }\n };\n\n\n boundsMap(markersArray) {\n const markers = markersArray ? markersArray : this.props.markersArray;\n if (markers.length > 0) {\n const bounds = new window.google.maps.LatLngBounds();\n\n markers.map((elem) => {\n bounds.extend(new window.google.maps.LatLng(\n elem.location.lat,\n elem.location.lon,\n ));\n return elem;\n });\n if (bounds.getNorthEast().equals(bounds.getSouthWest())) {\n const extendPoint1 = new window.google.maps.LatLng(bounds.getNorthEast().lat() + 0.001,\n bounds.getNorthEast().lng() + 0.001);\n const extendPoint2 = new window.google.maps.LatLng(bounds.getNorthEast().lat() - 0.001,\n bounds.getNorthEast().lng() - 0.001);\n\n bounds.extend(extendPoint1);\n bounds.extend(extendPoint2);\n }\n this.map.fitBounds(bounds);\n }\n };\n\n\n mapMarkersUrl = () => {\n const { countryAlpha2 } = this.props.keywords;\n\n return url + '?country_alpha2=' + countryAlpha2;\n };\n\n\n changeDragAndDropFunction = () => {\n this.setState({turnOnDrag: !this.state.turnOnDrag})\n };\n\n\n render() {\n const markersArray = this.state.markersArray.length > 0 ? this.state.markersArray : this.props.markersArray;\n const defaultCenter = { lat: 0, lng: 0 };\n const onlyAnonymusocation = markersArray.length === 0;\n\n const {\n comparableLocations,\n favouriteLocationsIds,\n section,\n showSearchButton,\n toggleMap,\n updateComparableLocations,\n updateFavouriteLocations,\n } = this.props;\n\n\n return (\n
{ this.map = map; }}\n zoom={ !onlyAnonymusocation ? 8 : 2 }\n maxZoom={ 15 }\n defaultOptions={{ mapTypeControl: false }}\n options={{ scrollwheel: true, mapTypeControl: false, gestureHandling: 'greedy', styles: mapStyles }}\n defaultCenter={ defaultCenter }\n onDragEnd={ this.state.turnOnDrag ? this.onDragEnd : () => null}\n onZoomChanged={this.state.turnOnDrag ? this.onDragEnd : () => null}\n >\n \n\n { !onlyAnonymusocation\n ?\n \n
\n\n { showSearchButton &&\n
\n
{ I18n.t('generic.search-displayed-area') }
\n
\n
\n }\n\n { this.state.showLoader &&\n
\n }\n
\n :\n \n }\n \n );\n }\n}\n\nMainMapWrapper.propTypes = {\n markersArray: PropTypes.arrayOf(PropTypes.shape),\n};\n\nMainMapWrapper.defaultProps = {\n markersArray: [],\n};\n\nexport default MainMapWrapper;\n","import React, { Component } from 'react';\nimport MarkerClusterer from \"react-google-maps/lib/components/addons/MarkerClusterer\";\n\nimport { apiProvider } from '../../api/core';\nimport MarkerWrapper from './MarkerWrapper';\nimport MarkerContent from './MarkerContent';\n\n\nclass MapWrapper extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n markerInfoLocation: false,\n markerFullInfo: null\n };\n }\n\n onMarkerInfoToggle = (locationId, coords) => {\n\n if (locationId === this.state.markerInfoLocation) {\n return this.setState(() => ({\n markerInfoLocation: false,\n markerFullInfo: null,\n }));\n } else {\n this.setState({ markerFullInfo: null });\n\n apiProvider.getAll(`/lease/api/frontend/locations/${locationId}/map_markers_marker_info`)\n .then(response => response && this.setState({ markerFullInfo: response }));\n\n return this.setState(() => ({\n markerInfoLocation: locationId,\n }));\n }\n };\n\n getMarkers() {\n const { markerInfoLocation, markerFullInfo } = this.state;\n return this.props.markersArray.filter(e => (e.location.lat && e.location.lon)).map((data) => {\n const openByClick = (markerInfoLocation === (data.location.id ? data.location.id : data.id));\n\n\n return (\n
\n { markerFullInfo && (\n \n )}\n \n );\n });\n }\n\n render() {\n const markers = this.getMarkers();\n\n return (\n
\n { markers }
\n \n );\n }\n}\n\nexport default MapWrapper;\n","import React, { Component, Fragment } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { CrawledBadge, RentedOutBadge, AnonymousBadge } from \"../SharedComponents/Badges\";\nimport { mappedMonths } from '../helpers/danishMonths';\nimport FavouriteIcon from '../SharedComponents/FavouriteIcon';\nimport CompareIcon from \"../SharedComponents/CompareIcon\";\nimport Tooltip from '../SharedComponents/Tooltip';\nimport { SvgIco } from \"../SharedComponents/Icons\";\n\nimport './MarkerInfoWindow.sass';\n\n\nclass MarkerContent extends Component {\n\n state ={\n showToolTip: false\n };\n\n showTooltip = () => {\n this.setState({showToolTip: true})\n };\n\n hideTooltip = () => {\n this.setState({showToolTip: false})\n };\n\n render() {\n const {\n address,\n areaIcon,\n anonymous,\n area,\n areaLabel,\n closedMonth,\n comparableLocations,\n favouriteLocationsIds,\n id,\n imageUrl,\n isInternal,\n kind,\n link,\n onInfoToggle,\n postalCode,\n postalName,\n price,\n priceLabel,\n rentedOut,\n secondaryKinds,\n section,\n showFullAddress,\n siteKey,\n streetName,\n suitableFor,\n updateFavouriteLocations,\n updateComparableLocations,\n } = this.props;\n\n const parsedLocImageStyle = { backgroundImage: `url(${imageUrl})` };\n const imageStyle = {\n backgroundImage: `url(${imageUrl})`,\n filter: rentedOut ? 'grayscale(100%)' : 'none',\n };\n\n const closedMonthName = mappedMonths(closedMonth);\n const suitableForList = suitableFor.length ? (suitableFor.length > 1 ? suitableFor.slice(0, 1) : suitableFor) : null;\n const translated = suitableFor.map(elem => I18n.t(`lb_showroom.showroom.suitable.for.mapview.tooltip.${elem}`));\n const updatedTranslation = translated.join(', ');\n\n\n return (\n
\n );\n }\n}\n\nMarkerContent.propTypes = {\n address: PropTypes.string,\n area: PropTypes.string,\n areaLabel: PropTypes.string,\n features: PropTypes.object,\n id: PropTypes.number,\n imageUrl: PropTypes.string,\n kind: PropTypes.string,\n link: PropTypes.string,\n postalCode: PropTypes.string,\n postalName: PropTypes.string,\n price: PropTypes.string,\n priceLabel: PropTypes.string,\n rentedOut: PropTypes.bool,\n uuid: PropTypes.string,\n countryAlpha2: PropTypes.string,\n showFullAddress: PropTypes.bool,\n};\n\nMarkerContent.defaultProps = {\n address: '',\n area: '',\n areaLabel: '',\n features: {},\n id: null,\n imageUrl: '',\n kind: '',\n link: '',\n postalCode: '',\n postalName: '',\n price: '',\n priceLabel: '',\n rentedOut: false,\n uuid: '',\n countryAlpha2: '',\n suitableFor: [],\n secondaryKinds: [],\n showFullAddress: false,\n};\n\nexport default React.memo(MarkerContent);\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { Marker, InfoWindow } from 'react-google-maps';\nimport { isMobileOnly } from 'react-device-detect';\n\nimport pin from '../../src/images/listview-pin-png.png';\nimport hoverPin from '../../src/images/hover-listview-pin-png.png';\n\n\nclass MarkerWrapper extends Component {\n\n getPixelCoords = (lat, lng) => {\n const { map } = this.props;\n const projection = map.getProjection(),\n topRight = projection.fromLatLngToPoint(map.getBounds().getNorthEast()),\n bottomLeft = projection.fromLatLngToPoint(map.getBounds().getSouthWest()),\n scale = Math.pow(2, map.getZoom());\n\n // Create our point.\n const point = projection.fromLatLngToPoint(new google.maps.LatLng(lat,lng));\n\n // Get the x/y based on the scale.\n const x = Math.floor((point.x - bottomLeft.x) * scale);\n const y = Math.floor((point.y - topRight.y) * scale);\n\n return { x, y };\n }\n\n setMarkerOffset = () => {\n const { lat, lng, map } = this.props;\n\n const windowWidth = Math.floor(window.innerWidth),\n windowHeight = Math.floor(window.innerHeight) - 70,\n topMapOffset = 70, // the distances are different as we have an optional map controls on the top and right parts\n rightMapOffset = 70,\n bottomMapOffset = 30,\n leftMapOffset = 30,\n infoWindowHeight = 342,\n infoWindowWidth = 270,\n topInfoWindowOffset = 23,\n centerPoint = this.getPixelCoords(map.getCenter().lat(), map.getCenter().lng()),\n markerPoint = this.getPixelCoords(lat, lng);\n\n // these are the offsets from central point of the marker to InfoWindow\n // including inner distance inside the image (and 8px padding from img for top and bottom)\n const offsetCoords = {\n top: markerPoint.y - 15 - 8,\n right: markerPoint.x + 20,\n bottom: markerPoint.y + 25,\n left: markerPoint.x - 20 - 8,\n };\n\n // TODO: make it count dynamically\n const infoWindowCenterOffsets = {\n offsetTop: { x: 0, y: 2 },\n offsetRight: { x: 155, y: 201 },\n offsetBottom: { x: 0, y: 400 },\n offsetLeft: { x: -155, y: 201 },\n };\n\n const { top, right, bottom, left } = offsetCoords;\n const { offsetTop, offsetRight, offsetBottom, offsetLeft } = infoWindowCenterOffsets;\n\n const fitTop = (offsetHeight) => top - topMapOffset - offsetHeight > 0,\n fitBottom = (offsetHeight) => bottom + offsetHeight < windowHeight - bottomMapOffset,\n fitLeft = (offsetWidth) => left - leftMapOffset - offsetWidth > 0,\n fitRight = (offsetWidth) => right + offsetWidth < windowWidth - rightMapOffset,\n fitsLeftRight = (offsetWidth) => fitRight(offsetWidth) && fitLeft(offsetWidth),\n fitsTopBottom = (offsetHeight) => fitTop(offsetHeight) && fitBottom(offsetHeight),\n fitCenterTop = () => fitTop(infoWindowHeight) && fitsLeftRight(infoWindowWidth / 2),\n fitCenterBottom = () => fitBottom(infoWindowHeight) && fitsLeftRight(infoWindowWidth / 2),\n fitCenterLeft = () => fitLeft(infoWindowWidth) && fitsTopBottom(infoWindowHeight / 2),\n fitCenterRight = () => fitRight(infoWindowWidth) && fitsTopBottom(infoWindowHeight / 2),\n setInfoWindowOffset = (offset) => new google.maps.Size(offset.x, offset.y);\n\n // In case we dont fit the center position of the InfoWindow against marker pin\n const recalculateOffset = (quadrant) => {\n const topDistance = markerPoint.y - topMapOffset,\n bottomDistance = windowHeight - bottomMapOffset - markerPoint.y;\n\n switch (quadrant) {\n case \"tr\":\n return { x: offsetLeft.x, y: infoWindowHeight - topDistance + topInfoWindowOffset };\n case \"tl\":\n return { x: offsetRight.x, y: infoWindowHeight - topDistance + topInfoWindowOffset };\n case 'br':\n return { x: offsetLeft.x, y: bottomDistance };\n case 'bl':\n return { x: offsetRight.x, y: bottomDistance };\n }\n }\n\n // The quadrant in witch the we have marker\n let quadrant = \"\";\n\n quadrant += (markerPoint.y > centerPoint.y) ? \"b\" : \"t\";\n quadrant += (markerPoint.x < centerPoint.x) ? \"l\" : \"r\";\n\n const offset = () => {\n let offsetCoords;\n\n switch (quadrant) {\n case 'tr':\n offsetCoords = fitCenterTop() ? offsetTop\n : fitCenterBottom() ? offsetBottom\n : fitCenterLeft() ? offsetLeft\n : recalculateOffset('tr');\n break;\n case 'tl':\n offsetCoords = fitCenterTop() ? offsetTop\n : fitCenterBottom() ? offsetBottom\n : fitCenterRight() ? offsetRight\n : recalculateOffset('tl');\n break;\n case \"br\":\n offsetCoords = fitCenterTop() ? offsetTop\n : fitCenterBottom() ? offsetBottom\n : fitCenterLeft() ? offsetLeft\n : recalculateOffset('br');\n break;\n case \"bl\":\n offsetCoords = fitCenterTop() ? offsetTop\n : fitCenterBottom() ? offsetBottom\n : fitCenterRight() ? offsetRight\n : recalculateOffset('bl');\n }\n\n return setInfoWindowOffset(offsetCoords);\n }\n\n return offset();\n }\n\n render() {\n\n const { isActive, lat, lng, children, onInfoToggle, locationId } = this.props;\n const pixelOffset = !isMobileOnly && isActive && this.setMarkerOffset();\n\n const getInfo = () => isActive\n ?
\n { children }
\n \n : null;\n\n const toggleInfo = () => onInfoToggle(locationId, { lat: lat, lng: lng });\n\n return (\n
{ this.marker = marker; }}\n noRedraw={true}\n position={{ lat, lng }}\n onClick={toggleInfo}\n icon={ isActive\n ? {url: hoverPin, scaledSize: { width: 28, height: 40}, anchor: { x: 15, y: 15 }}\n : {url: pin, scaledSize: { width: 28, height: 40}, anchor: { x: 15, y: 15 }} }\n >\n { getInfo() }\n \n )\n }\n}\n\nMarkerWrapper.propTypes = {\n lat: PropTypes.number,\n lng: PropTypes.number,\n children: PropTypes.node,\n isActive: PropTypes.bool,\n locationId: PropTypes.number,\n colsY: PropTypes.number,\n rowX: PropTypes.number,\n onInfoToggle: PropTypes.func,\n};\n\nMarkerWrapper.defaultProps = {\n lat: 0,\n lng: 0,\n children: null,\n isActive: false,\n locationId: 0,\n colsY: 0,\n rowX: 0,\n onInfoToggle: () => true,\n};\n\n\nexport default MarkerWrapper;\n","import React, { Component } from 'react';\nimport { Marker, InfoWindow } from '@react-google-maps/api';\nimport parkingPin from '../../src/images/icons/p_marker.png';\n\nimport './ParkingMarker.sass';\n\n\nclass ParkingMarker extends Component {\n handleClick = (element) => {\n switch (element) {\n case 'marker':\n if(this.props.markerOpenedId == this.props.marker.id) {\n this.props.updateMarkerOpenedId(null);\n } else {\n this.props.updateMarkerOpenedId(this.props.marker.id);\n }\n break;\n case 'close_icon':\n this.props.updateMarkerOpenedId(null);\n break;\n }\n };\n renderPrice = (priceFrom, priceTo) => {\n if (priceFrom && priceTo) {\n return (\n
\n
\n {I18n.t(\n 'parking.parking_lots.parking_interval_row.monthly_rent_per_space'\n ) + ': '}\n
\n {priceFrom + ' - ' + priceTo}\n
\n
\n
\n );\n } else if (priceFrom && !priceTo) {\n return (\n
\n
\n {I18n.t(\n 'parking.parking_lots.parking_interval_row.monthly_rent_per_space'\n ) + ': '}\n
{priceFrom}
\n
\n
\n );\n }\n return null;\n };\n render() {\n const position = {\n lat: this.props.marker.latitude,\n lng: this.props.marker.longitude,\n };\n const {\n marker: {\n url,\n title,\n kind,\n monthly_rent_per_space_amount_from,\n monthly_rent_per_space_amount_to,\n primary_photo_url,\n },\n } = this.props;\n return (\n
this.handleClick('marker')}\n >\n {this.props.markerOpenedId == this.props.marker.id && (\n this.handleClick('close_icon')}\n options={{ pixelOffset: new google.maps.Size(0, 0) }}\n >\n \n
\n
\n
\n
\n
\n {I18n.t(`parking.generic.${kind}`)}\n
\n {this.renderPrice(\n monthly_rent_per_space_amount_from,\n monthly_rent_per_space_amount_to\n )}\n
\n
\n\n
\n

\n
\n
\n
\n \n )}\n \n );\n }\n}\n\nexport default ParkingMarker;\n","import React, { Component } from 'react';\nimport { getParkingLotsNear } from '../../utils/api';\n\nimport BaseMap from './BaseMap';\nimport ParkingMarker from './ParkingMarker';\n\nfunction loadingElement() {\n return
;\n}\n\nclass ParkingMarkerMap extends Component {\n updateMarkerOpenedId = (marker_id) => {\n this.setState({ markerOpenedId: marker_id });\n };\n markers = () => {\n return this.state.parkingLots.map(marker => (\n
\n ));\n };\n\n constructor(props) {\n super(props);\n this.state = {\n parkingLots: [],\n markerOpenedId: null\n };\n }\n\n componentDidMount() {\n const { coordinates: { latitude, longitude }, clickHandler } = this.props;\n\n getParkingLotsNear(latitude, longitude)\n .then(res => {\n const parkingLots = res.data.parking_lots;\n this.setState({ parkingLots });\n })\n .catch(error => {\n console.error(error);\n });\n }\n\n render() {\n const { coordinates: { latitude, longitude }, clickHandler, googleApiKey } = this.props;\n const coordinatesObj = { lat: latitude, lng: longitude };\n\n return (\n
}\n mapElement={
}\n coordinates={coordinatesObj}\n markers={this.markers()}\n />\n );\n }\n}\n\nexport default ParkingMarkerMap;\n","import React from 'react';\nimport { GoogleMap, useJsApiLoader, Marker } from '@react-google-maps/api';\n\nimport mapPin from '../../src/images/details-page-pin.svg';\nimport { SvgIco } from '../SharedComponents/Icons';\nimport mapStyles from \"../../src/stylesheets/map_styles.json\";\n\nimport './DetailsMap.sass';\n\n\nfunction DetailMap({ containerClass,\n googleApiKey,\n orientationHorizontalMobile,\n coordinates,\n isFullscreenMobile,\n isGalleryMobileComponent,\n handleFullscreenMobile,\n isMobile,\n markers}) {\n\n const { isLoaded, loadError } = useJsApiLoader({\n googleMapsApiKey: googleApiKey,\n });\n\n const containerStyle = {\n width: '100%',\n height: '100%',\n };\n\n const renderMap = () => {\n\n return (\n
{}}\n mapContainerClassName={containerClass}\n options={{\n gestureHandling: 'cooperative',\n fullscreenControl: !isFullscreenMobile && !isGalleryMobileComponent,\n mapTypeControl: !isFullscreenMobile || !isGalleryMobileComponent,\n streetViewControl: !isFullscreenMobile && !isMobile,\n styles: mapStyles,\n }}\n >\n \n
\n { I18n.t('lb_showroom.detailed.asset_box.new_map_button') }\n \n { isGalleryMobileComponent &&\n
\n { isFullscreenMobile\n ? \n : \n }\n
\n }\n
\n \n { markers }\n \n )\n };\n\n if (loadError) {\n return
Map cannot be loaded right now, sorry.
\n }\n\n return isLoaded ? renderMap() :
Loading..\n}\n\nexport default DetailMap;\n\n\n","import React, { Component } from 'react';\nimport { isMobile, isTablet } from \"react-device-detect\";\nimport DetailMap from './DetailMap';\n\nclass DetailsMapWrapper extends Component {\n state = {\n isGalleryMobileComponent: false,\n isFullscreenMobile: false,\n orientationHorizontalMobile: false,\n };\n handleFullscreenMobile = () => this.setState({ isFullscreenMobile: !this.state.isFullscreenMobile });\n\n componentDidMount() {\n this.props.isGalleryComponent && isMobile && this.setState({ isGalleryMobileComponent: true });\n }\n\n render() {\n const { latitude, longitude , googleApiKey, orientationHorizontalMobile } = this.props;\n const { isFullscreenMobile, isGalleryMobileComponent } = this.state;\n const coordinatesObj = { lat: latitude, lng: longitude };\n const containerClass = `map-container${isFullscreenMobile ? ' fullscreen-mobile' : ''}`;\n\n\n return (\n
\n );\n }\n}\n\nexport default DetailsMapWrapper;\n","import React, { Component } from 'react';\nimport { getParkingLotsNear } from '../../utils/api';\n\nimport DetailMap from './DetailMap';\nimport ParkingMarker from '../Map/ParkingMarker';\nimport { isMobile, isTablet } from 'react-device-detect';\n\nclass ParkingMarkerMap extends Component {\n handleOrientationChange = () => {\n this.setState({ orientationHorizontalMobile: !this.state.orientationHorizontalMobile })\n };\n handleFullscreenMobile = () => this.setState({ isFullscreenMobile: !this.state.isFullscreenMobile });\n\n constructor(props) {\n super(props);\n this.state = {\n parkingLots: [],\n markerOpenedId: null,\n isGalleryMobileComponent: false,\n isFullscreenMobile: false,\n orientationHorizontalMobile: false,\n };\n }\n\n componentDidMount() {\n const { coordinates: { latitude, longitude } } = this.props;\n isMobile && this.setState({ isGalleryMobileComponent: true });\n if (isMobile && !isTablet) {\n window.innerHeight < window.innerWidth && this.setState({\n orientationHorizontalMobile: true\n });\n window.addEventListener('orientationchange', this.handleOrientationChange);\n }\n\n getParkingLotsNear(latitude, longitude)\n .then(res => {\n const parkingLots = res.data.parking_lots;\n this.setState({ parkingLots });\n })\n .catch(error => {\n console.error(error);\n });\n }\n\n\n updateMarkerOpenedId = (marker_id) => {\n this.setState({ markerOpenedId: marker_id });\n };\n\n\n markers = () => {\n return this.state.parkingLots.map(marker => (\n
\n ));\n };\n\n render() {\n const { coordinates: { latitude, longitude }, googleApiKey } = this.props;\n const { isFullscreenMobile, isGalleryMobileComponent, orientationHorizontalMobile } = this.state;\n const coordinatesObj = { lat: latitude, lng: longitude };\n const containerClass = `map-container${isFullscreenMobile ? ' fullscreen-mobile' : ''}`;\n\n return (\n
}\n mapElement={
}\n coordinates={coordinatesObj}\n markers={this.markers()}\n isGalleryMobileComponent={isGalleryMobileComponent}\n isMobile={isMobile && !isTablet}\n handleFullscreenMobile={this.handleFullscreenMobile}\n isFullscreenMobile={isFullscreenMobile}\n orientationHorizontalMobile={orientationHorizontalMobile}\n containerClass={containerClass}\n />\n );\n }\n}\n\nexport default ParkingMarkerMap;\n","import React from 'react';\n\nimport './styles/virtual-tour.sass';\n\nexport const VirtualTourModal = (props) => {\n return (\n
\n { props.isOpen &&\n
\n }\n
\n )\n};\n","import React, { Component, Fragment } from 'react';\nimport axios from 'axios';\n\nimport placeHolderImage from '../../../assets/images/photo_on_its_way.png';\nimport GoogleReviewsWidget from \"../SharedComponents/GoogleReviewsWidget\";\nimport { DetailedViewSet, SvgIco } from '../SharedComponents/Icons';\nimport { loadTawkTo } from '../TawkTo/TawkTo';\nimport { VirtualTourModal } from './VirtualTourModal.jsx';\nimport SearchOfferModal from \"../SharedComponents/SearchOptionsModal\";\n\nimport './styles/style.sass';\n\n\nclass OrderConfirmationContainer extends Component {\n\n state = {\n virtualTourIsOpen: false,\n downloadPdfUrl: \"\",\n statusPdfFile: \"\",\n loadingProspectus: false,\n serverError: false,\n generateButton: true,\n };\n\n\n componentDidMount() {\n loadTawkTo(this.props.siteKey);\n };\n\n\n toggleVirtualTour = () =>\n this.setState({ virtualTourIsOpen: !this.state.virtualTourIsOpen });\n\n\n generateProspectus = () => {\n const { createLocationPatternedPropsectus } = this.props;\n let checkPdf = this.props.locationProspectus || this.state.downloadPdfUrl.length > 0;\n this.setState({generateButton: false})\n\n if (!checkPdf) {\n this.setState({loadingProspectus: true, serverError: false});\n axios({method: \"post\", url: createLocationPatternedPropsectus})\n .then(response => {\n let pdfUrl = response.data.pdf_url;\n let statusUrl = response.data.status_url;\n\n let pdfTimer = () => axios({method: \"get\", url: statusUrl})\n .then(response => {\n if (response.data.status === \"finished\") {\n this.setState({statusPdfFile: response.data.status, downloadPdfUrl: pdfUrl, loadingProspectus: false})\n } else {\n setTimeout(pdfTimer, 7000);\n }\n });\n setTimeout(pdfTimer, 100);\n\n })\n .catch(error => {\n console.log(error)\n this.setState({loadingProspectus: false, serverError: true, generateButton: true});\n });\n }\n };\n\n\n render() {\n\n const { userEmail,\n currency,\n ourEmail,\n googleApiKey,\n locationImage,\n locationAddress,\n locationProspectus,\n virtualTour,\n districtName,\n locationKind,\n locationType,\n linkToListView,\n siteName,\n linkFromEmail,\n siteKey,\n isInternal,\n newSearchAgentPath,\n orderId,\n apiCreateOrderDetailsPath } = this.props;\n\n const { statusPdfFile, downloadPdfUrl, loadingProspectus, serverError, generateButton } = this.state;\n\n let pageTitle;\n let pageTextHint;\n let pageText;\n let prospectusTitle;\n let pageNotFound = false;\n\n switch(this.props.page) {\n case 'order_confirmation':\n pageTitle = `${I18n.t('order_confirmations.show.header')}`;\n pageText = `${I18n.t('order_confirmations.show.status', {'email': userEmail, 'our_email_address': ourEmail})}`;\n prospectusTitle = `${I18n.t('order_confirmations.show.summary')}`;\n break;\n case 'internal_provider_order':\n pageTitle = `${I18n.t('order_confirmations.show.header')}`;\n pageText = `${I18n.t('order_confirmations.show.status', {'email': userEmail, 'our_email_address': ourEmail})}`;\n prospectusTitle = `${I18n.t('order_confirmations.show.summary')}`;\n break;\n case 'provider_messages':\n pageTitle = `${I18n.t('provider_messages.thank_you.header')}`;\n pageText = `${I18n.t('provider_messages.thank_you.status')}`;\n prospectusTitle = `${I18n.t('provider_messages.thank_you.summary')}`;\n break;\n case 'showcase_orders':\n pageTitle = `${I18n.t('showcase_orders.thank_you.header')}`;\n pageTextHint = `${I18n.t('showcase_orders.thank_you.status_warning')}`;\n pageText = `${I18n.t('showcase_orders.thank_you.status', {'email': userEmail})}`;\n prospectusTitle = `${I18n.t('showcase_orders.thank_you.summary')}`;\n break;\n default:\n pageTitle = `${I18n.t('error_pages.404_page.header')}`;\n pageText = `${I18n.t('controllers.location_adverts.flash.location_deactivated')}`;\n pageNotFound = true;\n }\n\n const pageTitleFromEmail = I18n.t(\"order_confirmations.show.header-from-email\");\n const generateProspectusTitle = I18n.t(\"order_confirmations.show.generate-prospectus-location\");\n const checkSiteKey = siteKey === \"dk\" || siteKey === \"global\";\n\n\n const spinner =\n
\n
\n
{I18n.t(\"order_confirmations.show.please-wait-few-seconds\")} ...
\n
;\n\n\n return (\n
\n\n
\n\n
\n
\n
{ linkFromEmail ? pageTitleFromEmail : pageTitle }
\n { pageTextHint &&
{ pageTextHint }
}\n {!linkFromEmail &&
{ pageText }
}\n\n\n { !pageNotFound && (\n
\n
\n
\n
\n
\n
{ linkFromEmail ? generateProspectusTitle : prospectusTitle }
\n
{ locationAddress }\n
\n
\n {(checkSiteKey && !isInternal) &&\n
\n\n {(generateButton && !locationProspectus) &&\n }\n\n {serverError && (\n Some server error try later
\n )}\n \n }\n\n { loadingProspectus\n ? spinner\n :
\n {!isInternal && (locationProspectus || statusPdfFile === \"finished\") && (\n \n )}\n \n }\n\n { siteKey !== 'dk' && siteKey !== 'global' && !virtualTour && !locationProspectus && (\n
\n
{ I18n.t('order_confirmations.show.other_materials') }\n
{ I18n.t('order_confirmations.show.hint_instead_of_prospectus') }
\n
\n )}\n\n\n { virtualTour && (\n
\n { DetailedViewSet['virtual_tour'] }\n { I18n.t('order_confirmations.show.see_virtual_tour') }\n \n )}\n
\n
\n
\n
)}\n\n
\n \n
\n
\n\n
\n
\n
\n
{ I18n.t('order_confirmations.show.browse_more_header') }
\n
\n { I18n.t('order_confirmations.show.browse_more_in_district', {'district_name': districtName, 'location_kind': locationKind }) }\n
\n
\n
\n
\n\n
\n
\n
{ I18n.t('order_confirmations.show.search_agent_header')}
\n
\n { I18n.t('order_confirmations.show.search_agent_benefits', {'site_name': siteName }) }\n
\n
\n
\n
\n
\n\n
\n
\n
\n )\n }\n}\n\nexport default OrderConfirmationContainer;\n","import React, { Component } from 'react';\nimport Modal from 'react-modal';\n\nconst customStyles = {\n overlay: {\n backgroundColor: 'rgba(0,0,0,0.5)',\n zIndex: '9999',\n },\n content: {\n top: '50%',\n left: '50%',\n right: 'auto',\n bottom: 'auto',\n marginRight: '-50%',\n transform: 'translate(-50%, -50%)',\n padding: 0,\n pointerEvents: 'visible',\n },\n};\n\n\nclass InfoModal extends Component {\n constructor(props) {\n super(props);\n this.state = {\n isShowingModal: this.props.isShowingModal,\n };\n }\n\n componentWillReceiveProps(nextProps) {\n this.setState(prevState => ({ isShowingModal: nextProps.isShowingModal }));\n }\n\n render() {\n\n const privacyPolicyPath = 'https://' + window.location.host + '/' + I18n.t('routes.privacy_url');\n\n return (\n
\n
\n \n
(this.subtitle = subtitle)}>\n {I18n.t('apps.lb_showroom.detailed.order_form.data_protection')}\n
\n \n \n \n \n
\n \n
\n );\n }\n}\n\nexport default InfoModal;\n","import { gql } from \"@apollo/client\";\n\nexport const LOCATION_INFO_FIELDS = gql`\n fragment locationInfoFields on Location {\n address\n areaFrom\n areaTo\n currencyId\n enquiries\n enquiriesCountInteger\n explainLocationIncomplete\n floorPlans { thumbnailW600 }\n floorPlansCount\n infoMessage\n initialState\n isComplete\n latitude\n locationShownDatapoints\n locationUrl\n longitude\n monthlyRentPerSpaceWithCentsFrom\n monthlyRentPerSpaceWithCentsTo\n photos { thumbnailW600 }\n photosCount\n prospectusCount\n scoreInPercents\n scoreItemsList\n section\n sectionTranslated\n state\n stateInfo\n stateTranslated\n vimeoId\n virtualTour\n yearlyRentPerM2WithCentsFrom\n yearlyRentPerM2WithCentsTo\n }\n`;\n","import React, { useEffect } from 'react';\n\n\nexport const InteriorDesignForm = () => {\n\n useEffect(() => {\n (function() {\n let js, q,\n d = document,\n gi = d.getElementById,\n ce = d.createElement,\n gt = d.getElementsByTagName,\n id = \"type_form_share\",\n b = \"https://embed.typeform.com/\";\n\n if (!gi.call(d, id)) {\n js = ce.call(d, \"script\");\n js.id = id;\n js.src = b+ \"embed.js\";\n q = gt.call(d, \"script\")[0];\n q.parentNode.insertBefore(js,q);\n }\n })();\n }, []);\n\n\n return (\n
\n )\n}\n\nexport default InteriorDesignForm;\n","import React, { Component } from 'react';\nimport { apiProvider } from '../../api/core';\nimport { loadTawkTo } from '../TawkTo/TawkTo';\nimport RecoveryPasswordForm from './RecoveryPasswordForm';\nimport './RecoveryPassword.sass';\n\n\nclass ForgotPassword extends Component {\n state = {\n submitSuccess: false,\n errorMessage: false,\n };\n handleFormSubmit = (values) => {\n const { recoveryPasswordUrl } = this.props;\n const bodyFormData = new FormData();\n const searchParams = new URLSearchParams(window.location.search);\n const token = searchParams.get('reset_password_token');\n\n bodyFormData.append('password', values.password);\n bodyFormData.append('reset_password_token', token);\n\n apiProvider.post(recoveryPasswordUrl, bodyFormData, true)\n .then(response => {\n response.success && this.setState({\n submitSuccess: true,\n emailServerError: false,\n });\n response.error &&\n this.setState({\n errorMessage: true,\n submitSuccessMessage: false,\n });\n });\n };\n handleError = () => this.setState({ emailServerError: false, submitSuccess: false });\n\n componentDidMount() {\n loadTawkTo(this.props.siteKey);\n };\n\n render() {\n const {loginUrl} = this.props;\n const { submitSuccess, errorMessage } = this.state;\n\n return (\n
\n )\n }\n}\n\nexport default ForgotPassword;\n","import React, { Component } from 'react';\nimport { withFormik } from 'formik';\nimport Yup from 'yup';\nimport { passwordValidation } from '../SharedComponents/Forms/ValidationSchemaPattern';\nimport { SvgIco } from \"../SharedComponents/Icons\";\n\n\n\nclass RecoveryPasswordFormWrapper extends Component {\n state = {\n passwordVisibility: false,\n };\n\n togglePasswordVisibility = () => {\n this.setState({\n passwordVisibility: !this.state.passwordVisibility,\n });\n };\n\n errorValidator = (field) => {\n const { errors, touched } = this.props;\n const fieldError = errors[field] && touched[field] && 'recovery-password-form__form-group-error';\n\n return fieldError;\n };\n\n render() {\n\n const { values, handleChange, handleBlur, errors, handleSubmit, submitSuccessMessage, handleError, setFieldValue } = this.props;\n const { passwordVisibility } = this.state;\n\n return (\n
\n )\n }\n}\n\nconst RecoveryPasswordForm = withFormik({\n enableReinitialize: true,\n mapPropsToValues: () => ({\n password: '',\n }),\n validationSchema: Yup.object().shape({\n password: passwordValidation\n }),\n\n handleSubmit: (values, bag) => {\n bag.resetForm();\n bag.props.handleSubmit(values);\n },\n\n displayName: 'LoginForm',\n})(RecoveryPasswordFormWrapper);\n\nexport default RecoveryPasswordForm;\n","import React from 'react';\nimport InformationUnavailable from '../SharedComponents/InformationUnavailable';\nimport { loadTawkTo } from '../TawkTo/TawkTo';\n\nclass InformationUnavailablePage extends Component {\n\n componentDidMount() {\n loadTawkTo(this.props.siteKey);\n }\n\n render() {\n const { similarLocationsHeadline, similarLocationsList, siteKey } = this.props;\n const headline = I18n.t('search_agent.information_unavailable.headline');\n const content = I18n.t('search_agent.information_unavailable.content');\n\n\n return (\n
\n )\n }\n}\n\nexport default InformationUnavailablePage;\n","import React from 'react';\nimport disposalBadge from '../../src/images/icons/disposal-icon.svg';\n\nimport './Badges.sass';\n\n\nexport const SpecialOffer = ({ root }) =>\n
\n { I18n.t('generic.special_offer') }\n
;\n\nexport const NewBadge = ({ root }) =>\n
\n { I18n.t(\"apps.lb_showroom.showroom.list.new_item_label\") }\n
;\n\nexport const RentedOutBadge = ({ label, root, month, sale }) =>\n
\n { label ||\n ( sale\n ? I18n.t('activerecord.attributes.location.states.sold_out')\n : `${ I18n.t('activerecord.attributes.location.states.rented_out', {count: month ? 1 : 0}) } ${ month || '' }`\n )\n }\n
;\n\nexport const AnonymousBadge = ({ root }) =>\n
\n { I18n.t('generic.anonymous_location.detailed.label') }\n
;\n\nexport const CrawledBadge = ({ root, missingImagesUrl }) => {\n const bottomText = root !== 'detail'\n ? I18n.t('generic.photos_are_not_available')\n : I18n.t('generic.parsed_copyright');\n const readMoreLink = root === 'detail'\n ?
\n \n { I18n.t('generic.read_more_about_scraped') }\n \n \n : null;\n\n return (\n
\n
\n { I18n.t('generic.parsed_location') }\n
\n
\n
\n { bottomText } \n { readMoreLink }\n
\n
\n
\n )\n};\n\nexport const DisposalBadge = ({ root }) =>\n
\n

\n
{ I18n.t('generic.disposal') }
\n
;\n","import React from 'react';\n\nimport './CircularChart.sass';\n\n\nconst CircularChart = ({ percents, color }) => {\n\n return (\n
\n
\n
\n )\n}\n\nexport default CircularChart;\n","import React from 'react';\nimport { Pie, PieChart, Cell } from \"recharts\";\n\nimport './PercentagePieChart.sass';\n\n\nconst PercentagePieChart = ({ filledPercents }) => {\n\n const data = [\n { name: 'filled', value: filledPercents },\n { name: 'empty', value: 100 - filledPercents },\n ];\n\n const RADIAN = Math.PI / 180;\n const renderCustomizedLabel = (props) => {\n const {cx, cy, midAngle, innerRadius, outerRadius, payload} = props;\n\n if (payload && payload.name !== 'empty') {\n const radius = innerRadius + (outerRadius - innerRadius) * 0.4;\n const x = cx + radius * Math.cos(-midAngle * RADIAN);\n const y = cy + radius * Math.sin(-midAngle * RADIAN);\n\n return (\n
cx ? 'start' : 'end'}\n dominantBaseline=\"central\"\n fontWeight={900}\n fontSize={34}>\n { filledPercents }%\n \n );\n }\n\n return null;\n };\n\n return (\n
\n
\n \n { data.map((entry, index) => (\n | \n ))}\n \n \n { data.map((entry, index) => (\n | \n ))}\n \n \n
\n )\n}\n\nexport default PercentagePieChart;\n","import React, { Component } from 'react';\n\nimport './index.sass';\n\n\nclass CollapsibleSection extends Component {\n state = {\n uncollapsed: false,\n };\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n if (this.props.uncollapse !== prevProps.uncollapse) {\n if (this.props.uncollapse) {\n this.setState({ uncollapsed: true }, () =>\n this.collapsibleSection.classList.toggle('uncollapsed'),\n );\n } else {\n this.collapsibleSection.classList.toggle('uncollapsed');\n setTimeout(() => this.setState({ uncollapsed: false }), 400);\n }\n }\n }\n\n render() {\n\n const delimiter = this.props.isRequestFromPrerender ? ' uncollapsed ' : ' ';\n const defaultDelimiter = this.props.isRequestFromPrerender ? ' uncollapsed' : '';\n\n return (\n
(this.collapsibleSection = el)}>\n { (this.state.uncollapsed || this.props.isRequestFromPrerender) && this.props.children }\n
\n );\n }\n}\n\nexport default CollapsibleSection;\n","import React from 'react';\nimport cookie from 'react-cookies';\nimport ReactTooltip from 'react-tooltip';\n\nimport { updateComparables } from \"../../../utils/ComparableLocations\";\nimport Portal from '../Portal';\nimport Notification from '../Notification';\nimport { SvgIco } from \"../Icons\";\n\nimport './index.sass';\n\n\nexport class CompareIcon extends React.PureComponent {\n\n handleIsActive = () => {\n const { siteKey, locationId } = this.props;\n const retrievedComparableLocations = localStorage && localStorage.getItem(`my.comparable_lease_${siteKey}`);\n const comparableLocations = JSON.parse(retrievedComparableLocations) || {};\n let allIds = [];\n\n for (let prop in comparableLocations) {\n if (comparableLocations.hasOwnProperty(prop)) {\n allIds = allIds.concat(comparableLocations[prop]);\n }\n }\n const isActive = allIds.indexOf(`${locationId}`) >= 0;\n\n this.setState({ isActive });\n };\n\n componentDidMount() {\n this.handleIsActive();\n };\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { comparableLimitExceededError, showLimitExceedMessage } = this.state;\n\n comparableLimitExceededError && comparableLimitExceededError !== prevState.comparableLimitExceededError && this.showLimitExceedMessage();\n this.props.comparableLocations !== prevProps.comparableLocations && this.handleIsActive();\n showLimitExceedMessage && showLimitExceedMessage !== prevState.showLimitExceedMessage && document.addEventListener('click', this.handleClickOutside);\n };\n\n handleClickOutside = () => {\n const { showLimitExceedMessage } = this.state;\n\n document.removeEventListener('click', this.handleClickOutside);\n showLimitExceedMessage && this.hideLimitExceedMessage();\n }\n\n constructor(props) {\n super(props);\n this.typingTimer = null;\n\n this.state = {\n policyIsAccepted: cookie.load('cookie_consent_shown'),\n comparableLimitExceededError: false,\n showLimitExceedMessage: false,\n descriptionPopup: false,\n isActive: false,\n };\n }\n\n\n handleClick = () => {\n const { comparableLimitExceededError, isActive } = this.state;\n const { updateComparableLocations, siteKey, locationId, hideTooltip, kind } = this.props;\n\n if (comparableLimitExceededError && !isActive) {\n this.showLimitExceedMessage();\n } else {\n const showInfoPopup = !(localStorage && localStorage.getItem(`my.comparable_message_shown`));\n const newComparablesList = updateComparables(locationId, siteKey, kind, this.bounce);\n\n showInfoPopup &&\n this.setState({ descriptionPopup: true }, () => {\n clearTimeout(this.typingTimer);\n localStorage && localStorage.setItem(`my.comparable_message_shown`, 'true')\n this.typingTimer = setTimeout(() => this.setState({ descriptionPopup: false }), 6000);\n });\n\n if (newComparablesList.limitExceededError) {\n this.setState({ comparableLimitExceededError: !this.state.comparableLimitExceededError });\n } else {\n const { comparableLocations } = newComparablesList;\n const kindPresent = comparableLocations[kind] && comparableLocations[kind].length;\n\n this.setState({ isActive: kindPresent && comparableLocations[kind].indexOf(`${locationId}`) >= 0 });\n updateComparableLocations && updateComparableLocations(comparableLocations);\n }\n\n !hideTooltip && ReactTooltip.hide(this[`compareIcon${locationId}`]);\n }\n };\n\n\n bounce = () => {\n const iconWrapper = document.getElementById(`iconWrapper${this.props.locationId}`);\n\n iconWrapper.classList.add('bounce');\n setTimeout(() => iconWrapper.classList.remove('bounce'), 1000);\n };\n\n\n showLimitExceedMessage = () =>\n this.setState({ showLimitExceedMessage: true }, () => {\n this.typingTimer = setTimeout(() => this.setState({ showLimitExceedMessage: false }), 6000);\n });\n\n\n hideLimitExceedMessage = () => {\n clearTimeout(this.typingTimer);\n this.setState({ showLimitExceedMessage: false });\n };\n\n\n closeDescriptionPopup = () => {\n clearTimeout(this.typingTimer);\n this.setState({ descriptionPopup: false });\n localStorage && localStorage.setItem(`my.comparable_message_shown`, 'true');\n };\n\n\n render() {\n\n const { descriptionPopup, isActive, policyIsAccepted, showLimitExceedMessage } = this.state;\n const { indentation, locationId, notificationWrapperId, tooltipPosition, withLabel } = this.props;\n const tooltipText = isActive ? I18n.t('compare.icon.tooltip_text.remove') : I18n.t('compare.icon.tooltip_text.add');\n const limitExceedMessage = I18n.t('compare.icon.tooltip_text.limit_exceed_message');\n\n\n return (\n
\n { withLabel\n ?\n
\n
\n
\n { isActive &&\n
\n \n
\n }\n
\n
\n { I18n.t('compare.icon.tooltip_text.add') }\n \n
\n :\n
\n
\n
this[`compareIcon${ locationId }`] = el }>\n \n
\n\n { isActive &&\n
\n \n
\n }\n\n {
}\n
\n
\n }\n\n
\n this.notificationWrapper = el}\n className=\"notifications-wrapper\"\n id={notificationWrapperId}\n role=\"button\"\n style={{ display: 'flex', justifyContent: 'center' }}>\n\n \n\n \n
\n \n\n
\n )\n }\n}\n\n\nexport default CompareIcon;\n","import { handleComparableLocationsCounter } from './topBarHelper';\n\n\nexport const updateComparables = (locationId, siteKey, kind, bounceFunction) => {\n const locationsLimit = 4;\n const locationIdStr = `${locationId}`;\n const comparableLocations = (localStorage && JSON.parse(localStorage.getItem(`my.comparable_lease_${siteKey}`))) || {};\n const comparableCount = comparableLocations && Object.keys(comparableLocations).length;\n const locationKindPresent = comparableCount && comparableLocations[kind];\n const locationIsInTheList = locationKindPresent && comparableLocations[kind].indexOf(locationIdStr) >= 0;\n const limitExceededError = comparableCount && locationKindPresent && comparableLocations[kind].length === locationsLimit && !locationIsInTheList;\n\n if (limitExceededError) {\n return { limitExceededError };\n } else {\n if (locationIsInTheList) {\n comparableLocations[kind].splice(comparableLocations[kind].indexOf(locationIdStr), 1);\n comparableLocations[kind].length === 0 && delete comparableLocations[kind];\n } else {\n bounceFunction && bounceFunction(locationId);\n comparableLocations[kind]\n ? comparableLocations[kind].unshift(locationIdStr)\n : comparableLocations[kind] = [locationIdStr];\n }\n\n localStorage.setItem(`my.comparable_lease_${siteKey}`, JSON.stringify(comparableLocations));\n handleComparableLocationsCounter(siteKey, !locationIsInTheList);\n\n return { comparableLocations };\n }\n};\n","import React, { Component } from 'react';\nimport classNames from 'classnames';\n\nimport { SvgIco } from './Icons';\n\nimport'./DropDownContainer.sass';\n\n\nclass DropDownContainer extends Component {\n constructor(props){\n super(props);\n\n this.state = {\n isOpen: false\n }\n }\n\n componentDidMount() {\n document.addEventListener('mousedown', this.handleClickOutside);\n }\n\n componentWillUnmount() {\n document.removeEventListener('mousedown', this.handleClickOutside);\n }\n\n handleClickOutside = (event) =>\n this.wrapperRef && !this.wrapperRef.contains(event.target) && this.setState({ isOpen: false });\n\n setWrapperRef = (node) => this.wrapperRef = node;\n\n handleClick = () => this.setState(prevState => ({isOpen: !prevState.isOpen}));\n\n\n render() {\n const { name, text, children, selectedTooltip, isMobileMenu } = this.props;\n const isOpen = !isMobileMenu || this.state.isOpen;\n const placeholderClasses = classNames('dropdown-selector__placeholder', { 'active': isOpen });\n const actionIconClasses = classNames('dropdown-selector__action-icon', { 'open': isOpen });\n const bodyClasses = classNames('dropdown-selector__body', { 'dropdown-selector__body--open': isOpen });\n const triggerClasses = classNames('dropdown-selector__trigger', { 'dropdown-selector__trigger--active': isOpen });\n\n\n return (\n
\n
\n
\n \n
\n
\n { text }\n
\n
\n { selectedTooltip.length > 0 &&\n
\n { selectedTooltip }\n
\n }\n
\n { !isOpen ? : }\n
\n
\n
\n\n { (isOpen || isMobileMenu) &&\n
\n { children }\n
\n }\n
\n );\n }\n}\n\nexport default DropDownContainer;\n","import React, { Component } from 'react';\nimport Select from 'react-select';\n\nimport { SvgIco } from \"./Icons\";\n\nimport './DropdownWithSearch.sass';\n\n\nclass DropdownSelectWithSearch extends Component {\n\n state = {\n selectedOption: '',\n dropdownIsOpen: false,\n };\n\n componentDidMount() {\n const { options, initialValue, value } = this.props;\n const initialValueId = value || initialValue;\n const defaultValue = options.filter(elem => elem.value === initialValueId);\n\n defaultValue.length && this.setState({ selectedOption: defaultValue[0].label });\n }\n\n handleClickOutside = (e) => {\n const dropdownWithSearch = document.getElementById('dropdownWithSearch');\n\n !dropdownWithSearch.contains(e.target) && this.setState({ dropdownIsOpen: false });\n };\n\n handleSelect = selectedOption => {\n this.setState({ selectedOption: selectedOption.label }, () => this.toggleDropdown());\n this.props.setFieldValue(this.props.field, selectedOption.value);\n };\n\n toggleDropdown = () => {\n const { dropdownIsOpen } = this.state;\n this.setState({ dropdownIsOpen: !dropdownIsOpen }, () => {\n this.state.dropdownIsOpen ? document.addEventListener(\"click\", this.handleClickOutside) : document.removeEventListener(\"click\", this.handleClickOutside);\n });\n };\n\n componentWillUnmount() {\n this.state.dropdownIsOpen && document.removeEventListener(\"click\", this.handleClickOutside);\n }\n\n render() {\n\n const { options, label } = this.props;\n const { selectedOption, dropdownIsOpen } = this.state;\n const inputFieldClass = `dropdown-with-search__input-field ${ selectedOption && 'active' }`;\n\n const customStyles = {\n indicatorsContainer: () => ({\n display: 'none',\n }),\n option: (provided, state) => ({\n ...provided,\n height: '40px',\n padding: '0px 16px',\n display: 'flex',\n alignItems: 'center',\n color: 'black',\n borderRadius: '2px',\n cursor: 'pointer'\n }),\n\n placeholder: () => ({\n display: 'none',\n }),\n control: () => ({\n minHeight: '32px',\n maxHeight: '32px',\n background: 'white',\n border: '1px solid #cccccc',\n borderRadius: '4px',\n margin: '16px 16px 10px'\n }),\n input: () => ({\n height: '30px',\n display: 'flex',\n alignItems: 'center',\n paddingBottom: '5px',\n marginLeft: '-3px',\n }),\n menu: () => ({\n margin: 0,\n maxHeight: '208px',\n overflow: 'hidden',\n background: 'white',\n paddingTop: '0px',\n fontFamily: 'MuseoSans, Helvetica, Arial, sans-serif'\n }),\n menuList: (provided) => ({\n ...provided,\n maxHeight: '208px',\n }),\n };\n\n return (\n
\n
\n
\n { label }*\n { selectedOption && { selectedOption } }\n
\n
\n { dropdownIsOpen\n ? \n : \n }\n
\n
\n { dropdownIsOpen &&\n
\n \n
\n }\n
\n )\n }\n}\n\nexport default DropdownSelectWithSearch;\n","import React, { Component } from 'react';\nimport Yup from 'yup';\nimport { withFormik } from 'formik';\nimport classNames from 'classnames';\n\nimport Client from '../../../utils/Client';\nimport { validationPatterns } from '../../../utils/validationPatterns';\nimport alertErrorIcon from '../../../src/images/icons/alert.svg';\nimport Loader from '../../SharedComponents/Loader';\nimport { SvgIco } from \"../../SharedComponents/Icons\";\n\nimport './index.sass';\n\n\nclass GetInfoFormModalWrapper extends Component {\n\n state = {\n dataProtectionIsOpen: false,\n // jeudanReadMore: false,\n // showJeudanValidationMessage: false,\n locationsListOpen: false,\n };\n\n\n componentDidMount() {\n document.getElementById('top-menu').classList.add('hidden');\n this.infoForm.addEventListener('click', this.handleClickOutside)\n };\n\n\n componentWillUnmount() {\n document.getElementById('top-menu').classList.remove('hidden');\n this.infoForm.removeEventListener('click', this.handleClickOutside)\n };\n\n\n handleClickOutside = (e) => {\n !this.infoFormWrapper.contains(e.target) && this.props.handleClose();\n };\n\n\n toggleDataProtection = () => {\n this.setState({ dataProtectionIsOpen: !this.state.dataProtectionIsOpen }, () => {\n this.state.dataProtectionIsOpen && setTimeout(() => {\n const targetTopCoords = document.getElementById('dataScrollTarget').getBoundingClientRect().top;\n const contentTopCoords = Math.abs(document.getElementById('infoFormContent').getBoundingClientRect().top);\n const targetCoords = Math.floor(targetTopCoords + contentTopCoords);\n this.infoForm.scroll(0, targetCoords);\n }, 300)\n });\n };\n\n\n // openReadMoreJeudan = () =>\n // this.setState({ jeudanReadMore: true });\n\n\n // showJeudanValidationMessage = () =>\n // this.setState({ showJeudanValidationMessage: true });\n\n\n handleSubmit = (e) => {\n e.preventDefault();\n this.props.errors && Object.keys(this.props.errors).length && this.infoForm.scroll(0, 0);\n // this.props.isJeudan && !this.props.values.jeudan_policy && this.showJeudanValidationMessage();\n this.props.handleSubmit();\n };\n\n\n openLocationsList = () => {\n const { locationsListOpen } = this.state;\n\n this.setState({ locationsListOpen: !locationsListOpen }, () => {\n this.state.locationsListOpen\n ? window.addEventListener('click', this.handleLocationsListState)\n : window.removeEventListener('click', this.handleLocationsListState);\n });\n };\n\n\n handleLocationsListState = (e) => {\n const locationsListWrapper = document.getElementById('locationsListWrapper');\n\n !locationsListWrapper.contains(e.target) && this.setState({ locationsListOpen: false });\n };\n\n\n render() {\n const {\n values,\n handleChange,\n touched,\n handleBlur,\n errors,\n parkingCheckbox,\n submitSuccess,\n // isJeudan,\n handleClose,\n address,\n gtmClass,\n showServerErrorMessage,\n isLoading,\n isMultiple,\n locations,\n setFieldValue,\n } = this.props;\n\n const {\n dataProtectionIsOpen,\n // jeudanReadMore,\n // showJeudanValidationMessage,\n locationsListOpen,\n } = this.state;\n\n const privacyPolicyPath = 'https://' + window.location.host + '/' + I18n.t('routes.privacy_url');\n const dataProtectionBodyClasses = classNames('data-protection__body', { 'open': dataProtectionIsOpen });\n const getInfoClasses = classNames(`get-info ${gtmClass}`, {\n 'success': submitSuccess,\n 'flex-start': dataProtectionIsOpen,\n });\n\n // const jeudanValidationMessageClasses = classNames('jeudan-policy-checkbox__validation-message', { 'visible': showJeudanValidationMessage });\n // const checkboxClasses = classNames('jeudan-policy-checkbox__wrapper', {\n // 'checked': values.jeudan_policy,\n // 'error': touched.jeudan_policy && errors.jeudan_policy,\n // });\n\n\n const inputClassBuilder = (fieldName) =>\n classNames({\n 'error': touched[fieldName] && errors[fieldName],\n 'filled': values[fieldName],\n });\n\n const locationsList = isMultiple && locations &&\n
\n
\n
\n
\n { I18n.t('apps.lb_showroom.detailed.order_form.selected_locations_list') } ({ locations.length })\n
\n
\n
\n
\n
;\n\n\n return (\n
this.infoForm = el} className={getInfoClasses}>\n
this.infoFormWrapper = el}>\n { submitSuccess &&\n
\n
\n { !isMultiple &&\n
\n \n { address }\n
\n }\n
\n { I18n.t('signup.teaser.modal.thank_you.thanks') }\n
\n
\n { I18n.t('apps.lb_showroom.detailed.order_form.success_content', { email: values.email }) }\n
\n
\n }\n { !submitSuccess &&\n
\n\n
\n \n
{ I18n.t('apps.lb_showroom.detailed.order_form.modal_main_top_title') }
\n \n \n\n
\n
\n\n
\n\n { isMultiple\n ? locationsList\n :
{ address }\n }\n\n
{ I18n.t('apps.lb_showroom.detailed.order_form.headline') }
\n
{ I18n.t('apps.lb_showroom.detailed.order_form.description') }
\n\n
\n\n
\n
\n
\n
{ I18n.t('apps.lb_showroom.detailed.order_form.data_protection') }
\n
\n
\n
\n
\n
\n
\n }\n
\n
\n );\n }\n}\n\n\nconst { fifth_element, name, phone, email, company, option_parking_lots } = Client.getClientInfo();\nconst { nameI18n, emailI18n, companyI18n, phoneI18n } = Client.getI18nAttrNames();\nconst i18nRequiredKey = 'apps.lb_showroom.detailed.order_form.validation.field_required';\nconst i18nMinNumberKey = 'apps.lb_showroom.detailed.order_form.validation.min_number';\nconst i18nSymbolsLimitErrorMessage = I18n.t('apps.lb_showroom.misc.scoped_form.max_symbols_limit', { symbols_limit: 254 });\nconst i18nSymbolsEmailLimitErrorMessage = I18n.t('apps.lb_showroom.misc.scoped_form.max_symbols_limit', { symbols_limit: 100 });\nconst i18nAtLeast8Digits = 'apps.lb_showroom.detailed.order_form.validation.at_least_8_digits';\n\nconst GetInfoFormModal = withFormik({\n mapPropsToValues: (bag) => ({\n name,\n email,\n company,\n phone: phone ? phone : bag.userCountryPhoneCode,\n option_parking_lots,\n fifth_element,\n // jeudan_policy: false,\n // isJeudan: bag.isJeudan\n }),\n validationSchema: Yup.object().shape({\n name: Yup.string()\n .matches(validationPatterns.symbolsLimit, i18nSymbolsLimitErrorMessage)\n .matches(validationPatterns.name, I18n.t(\"apps.lb_showroom.misc.scoped_form.name.invalid\"))\n .required(I18n.t(i18nRequiredKey, { field: nameI18n })),\n email: Yup.string()\n .matches(validationPatterns.symbolsEmailLimit, i18nSymbolsEmailLimitErrorMessage)\n .email(I18n.t('apps.lb_showroom.detailed.order_form.validation.wrong_email'))\n .required(I18n.t(i18nRequiredKey, { field: emailI18n })),\n company: Yup.string()\n .matches(validationPatterns.symbolsLimit, i18nSymbolsLimitErrorMessage)\n .matches(validationPatterns.company, I18n.t(\"apps.lb_showroom.misc.scoped_form.company.invalid\"))\n .required(I18n.t(i18nRequiredKey, { field: companyI18n })),\n phone: Yup.string()\n .matches(validationPatterns.symbolsLimit, i18nSymbolsLimitErrorMessage)\n .min(8, I18n.t(i18nMinNumberKey, { field: phoneI18n }))\n .matches(validationPatterns.phone, I18n.t('apps.lb_showroom.misc.scoped_form.phone.invalid'))\n .test('minDigitsValidation', I18n.t(i18nAtLeast8Digits), function(value) {\n const { path, createError } = this;\n const phoneIsValid = value && value.replace(/[+\\-\\s()]/g, '').length >= 8;\n return phoneIsValid || !value || createError({ path, message: I18n.t(i18nAtLeast8Digits) });\n })\n .required(I18n.t(i18nRequiredKey, { field: phoneI18n })),\n parking: Yup.boolean(),\n // isJeudan: Yup.boolean(),\n // jeudan_policy: Yup.boolean()\n // .when(\"isJeudan\", {\n // is: true,\n // then: Yup.boolean()\n // .required(I18n.t('activemodel.attributes.provider_service_request.jeudan_privacy_policy_error_message'))\n // .oneOf([true], I18n.t('activemodel.attributes.provider_service_request.jeudan_privacy_policy_error_message')),\n // })\n }),\n\n handleSubmit: (values, bag) => {\n Client.updateClientInfo(values);\n bag.props.submitHandler(values, bag.props.orderUrl);\n },\n\n displayName: 'GetInfoForm',\n})(GetInfoFormModalWrapper);\n\n\nexport default GetInfoFormModal;\n","import React, { useState, useEffect } from 'react';\nimport { useJsApiLoader } from \"@react-google-maps/api\";\n\nimport { SvgIco } from \"../Icons\";\n\nimport './index.sass';\n\n\nconst GoogleReviewsWidget = ({ apiKey, siteKey }) => {\n\n const [currentMap, setCurrentMap] = useState(null);\n const [rating, setRating] = useState(0);\n const [reviewsCount, setReviewsCount] = useState(0);\n const [showWidget, setShowWidget] = useState(null);\n\n const { isLoaded, loadError } = useJsApiLoader({\n googleMapsApiKey: apiKey,\n libraries: ['places']\n });\n\n\n useEffect(() => {\n isLoaded && !loadError && initMap();\n }, [isLoaded, loadError]);\n\n\n useEffect(() => {\n currentMap && getRating();\n }, [currentMap]);\n\n\n const initMap = () =>\n setCurrentMap(new google.maps.Map(document.getElementById('map')));\n\n\n const getRating = () => {\n const request = {\n placeId: siteKey === 'dk' ? 'ChIJb_2a015SUkYRUzw4AsPyuCM' : 'ChIJyWGa015SUkYRtpvXlkhWusk',\n fields: ['rating', 'user_ratings_total'],\n };\n\n let service = new google.maps.places.PlacesService(currentMap);\n service.getDetails(request, callback);\n\n function callback(place, status) {\n if (status == google.maps.places.PlacesServiceStatus.OK) {\n setRating(place.rating);\n setReviewsCount(place.user_ratings_total);\n setShowWidget(true);\n }\n }\n };\n\n\n const renderStarIcons = () => {\n\n const starsList = [];\n\n for (let i = 0; i < 5; i++) {\n const starType = (rating > i && i + 1 > rating) ? 'half' : i >= rating ? 'empty' : 'full';\n\n starsList.push(
);\n }\n\n return starsList.map(star => star);\n };\n\n\n return (\n
\n
\n { showWidget &&\n
\n }\n
\n )\n}\n\nexport default GoogleReviewsWidget;\n","import React from 'react';\n\nimport './index.sass';\n\n\nconst InfoBadges = ({ anonymous,\n closedMonth,\n crawledBottomText,\n hideCrawledBottom,\n isCrawled,\n isRentedOut,\n isNew,\n missingImagesUrl,\n rentedOutLabel,\n sale,\n specialOffer,\n wrapperClass\n }) => {\n return (\n
\n { anonymous &&
}\n { isCrawled &&
}\n { isRentedOut &&
}\n { (isNew || specialOffer) &&\n
\n { isNew && }\n { specialOffer && }\n
\n }\n
\n )\n};\n\nexport default InfoBadges;\n\n\nexport const SpecialOfferBadge = ({ wrapperClass }) =>\n
\n { I18n.t('generic.special_offer') }\n
;\n\n\nexport const NewBadge = ({ wrapperClass }) =>\n
\n { I18n.t(\"apps.lb_showroom.showroom.list.new_item_label\") }\n
;\n\n\nexport const RentedOutBadge = ({ label, month, sale, wrapperClass }) =>\n
\n { label ||\n ( sale\n ? I18n.t('activerecord.attributes.location.states.sold_out')\n : `${ I18n.t('activerecord.attributes.location.states.rented_out', {count: month ? 1 : 0}) } ${ month || '' }`\n )\n }\n
;\n\n\nexport const AnonymousBadge = ({ wrapperClass }) =>\n
\n { I18n.t('generic.anonymous_location.detailed.label') }\n
;\n\n\nexport const CrawledBadge = ({ bottomText, hideBottomLine, missingImagesUrl, wrapperClass }) =>\n
\n
\n { I18n.t('generic.parsed_location') }\n
\n\n { !hideBottomLine &&\n
\n }\n
;\n","import React, { Component } from 'react';\nimport { SvgIco } from './Icons';\n\nimport './InfoNotice.sass';\n\nclass InfoNotice extends Component {\n\n state = {\n isShowingInfo: false,\n content: {\n anonymous: {\n title: I18n.t('generic.anonymous_location.detailed.notice'),\n modalTitle: I18n.t('generic.anonymous_location.detailed.notice'),\n modalContent: I18n.t('generic.anonymous_location.detailed.notice_title'),\n },\n parsed: {\n title: I18n.t('generic.found_automatically'),\n modalTitle: I18n.t('generic.title_info_text'),\n modalContent: I18n.t('generic.parsed_info_text'),\n }\n },\n };\n\n toggleInfoModal = () => {\n const { isShowingInfo } = this.state;\n !isShowingInfo\n ? this.setState({ isShowingInfo: true }, () => {\n window.addEventListener('mousedown', this.handleClickOutsideInfoModal);\n const windowHeight = window.innerHeight;\n const modalBottomPos = this.infoModal.getBoundingClientRect().bottom;\n windowHeight < modalBottomPos && window.scroll(0, window.pageYOffset + (modalBottomPos - windowHeight) + 20);\n })\n : this.setState({ isShowingInfo: false }, () => window.removeEventListener('mousedown', this.handleClickOutsideInfoModal));\n };\n\n handleClickOutsideInfoModal = (e) => {\n const target = e.target;\n const noticeWrapperContainsTarget = this.noticeWrapper.contains(target);\n const infoLinkWrapperContainsTarget = this.infoLinkWrapper.contains(target);\n const closeInfoBtnContainsTarget = this.closeButton.contains(target);\n\n if (!infoLinkWrapperContainsTarget && (!noticeWrapperContainsTarget || closeInfoBtnContainsTarget)) {\n this.toggleInfoModal();\n }\n };\n\n render() {\n const { noticeKind, root, id, missingImagesUrl, showCopyright } = this.props;\n const { isShowingInfo } = this.state;\n const { title, modalTitle, modalContent } = this.state.content[noticeKind];\n const wrapperId = id ? `noticeWrapper-${id}`: null;\n\n return (\n
this.noticeWrapper = wrapper } id={wrapperId}>\n
\n
this.infoLinkWrapper = link} onClick={this.toggleInfoModal} className=\"info-notice__title\">\n
{ title } \n
\n \n
\n
\n { isShowingInfo && (\n
this.infoModal = modal}>\n
this.closeButton = btn } className=\"info-notice__close-modal-btn\">\n \n
\n
{ modalTitle }
\n\n { showCopyright &&\n
\n { I18n.t('generic.parsed_copyright') }\n
\n }\n\n
\n { modalContent } \n { noticeKind === 'parsed' &&\n \n { I18n.t('generic.read_more') }\n \n }\n
\n
\n ) }\n
\n
\n );\n }\n}\n\nexport default InfoNotice;\n","import React from 'react';\n\nimport UnavailableLocationIcon from '../../../src/images/icons/unavaillable-location-icon.svg';\nimport SimilarLocations from '../../SimilarLocations';\n\nimport './index.sass';\n\n\nconst InformationUnavailable = ({ similarLocationsList, similarLocationsHeadline, headline, content, siteKey, section }) =>\n
\n
\n
\n
\n

\n
\n\n
\n
\n { headline }\n
\n
\n { content }\n
\n
\n

\n
\n
\n
\n
\n\n { similarLocationsList && similarLocationsList.length > 0 &&\n
\n \n
\n }\n
;\n\n\nexport default InformationUnavailable;\n","import React from 'react';\n\nimport './AtomLoader.sass';\n\n\nconst AtomLoader = () => {\n return (\n
\n )\n};\n\nexport default AtomLoader;\n","import React from 'react';\n\nimport PulsingLoader from './PulsingLoader';\n\nimport './ModalLoader.sass';\n\n\nconst ModalLoader = () => {\n\n return (\n
\n )\n};\n\nexport default ModalLoader;\n","import React from 'react';\n\nimport './PulsingLoader.sass';\n\n\nconst PulsingLoader = () => {\n\n return (\n
\n )\n};\n\nexport default PulsingLoader;\n\n","import React, { Component } from 'react';\nimport { isMobileOnly } from \"react-device-detect\";\nimport ReactTooltip from \"react-tooltip\";\n\nimport { mappedMonths } from \"../../helpers/danishMonths\";\nimport FavouriteIcon from '../FavouriteIcon';\nimport CompareIcon from \"../CompareIcon\";\nimport { SvgIco } from '../Icons';\nimport { CrawledBadge, RentedOutBadge } from \"../Badges\";\n\nimport './index.sass';\n\n\nclass LocationTemplate extends Component {\n\n state = {\n favouriteNotificationWrapperId: `${Math.random()}`.split('.')[1],\n comparableNotificationWrapperId: `${Math.random()}`.split('.')[1],\n }\n\n handleClick = (e) => {\n if (!e.ctrlKey && !e.metaKey) {\n e.preventDefault();\n\n const target = e.target;\n const favouriteNotificationWrapper = document.getElementById(this.state.favouriteNotificationWrapperId);\n const comparableNotificationWrapper = document.getElementById(this.state.comparableNotificationWrapperId);\n const isFavouriteNotificationWrapper = favouriteNotificationWrapper && (favouriteNotificationWrapper.contains(target) || target === favouriteNotificationWrapper);\n const isComparableNotificationWrapper = comparableNotificationWrapper && (comparableNotificationWrapper.contains(target) || target === comparableNotificationWrapper);\n const isFavouriteIconWrapper = this.favouriteIconWrapper.contains(target);\n const isComparableIconWrapper = this.comparableIconWrapper.contains(target);\n const isTooltip = this.PersonsTooltipRef && (target === this.PersonsTooltipRef || this.PersonsTooltipRef.contains(target));\n\n !isComparableIconWrapper\n && !isFavouriteIconWrapper\n && !isFavouriteNotificationWrapper\n && !isComparableNotificationWrapper\n && !isTooltip\n && window.open(this.props.data.url, \"_blank\");\n }\n };\n\n handlePersonsTooltip = () => {\n const { showPersonsTooltip } = this.state;\n\n this.setState({ showPersonsTooltip: !showPersonsTooltip }, () =>\n showPersonsTooltip ? ReactTooltip.hide(this.PersonsTooltipRef) : ReactTooltip.show(this.PersonsTooltipRef)\n );\n };\n\n afterHide = () =>\n this.setState({ showPersonsTooltip: false });\n\n\n render() {\n\n const {\n comparableLocations,\n component,\n data,\n showDate,\n favoriteLocations,\n hidePrice,\n section,\n siteKey,\n updateComparableLocations,\n updateFavouriteLocations,\n } = this.props;\n\n const {\n address_line_1,\n closed_month,\n context_info,\n id,\n is_internal,\n photo_alt,\n photo_url,\n postal_code_and_name,\n price_and_area_facts,\n raw_kind,\n secondary_kinds,\n shown_as_rented_out,\n temporarily_unavailable,\n url,\n } = data;\n\n const { area, persons, price } = price_and_area_facts;\n const infoWrapperHeight = { height: showDate ? 'calc(100% - 196px)' : 'calc(100% - 172px)' };\n const closedMonth = mappedMonths(closed_month);\n\n\n return (\n
\n\n { showDate && { context_info }
}\n\n \n { is_internal && }\n
\n\n { (shown_as_rented_out || temporarily_unavailable) &&\n \n \n
\n }\n\n\n this.comparableIconWrapper = el}>\n { section === 'lease' && !isMobileOnly &&\n \n }\n
\n\n this.favouriteIconWrapper = el}>\n \n
\n\n \n\n
\n \n { I18n.t(`generic.${raw_kind}`) }\n \n { secondary_kinds.length ? +{ secondary_kinds.length } : null }\n
\n\n
\n
{ address_line_1 }
\n
{ postal_code_and_name }
\n
\n\n { raw_kind !== 'parking' && raw_kind !== 'virtual_office' && area.value &&\n
\n
\n \n { persons\n ? persons.label\n : area.icon === 'desks'\n ? I18n.t('generic.desks')\n : area.label\n }\n
\n
\n { persons ? persons.value : area.value } { area.icon !== 'desks' && !persons && area.unit }\n { persons && persons.tooltip &&\n this.PersonsTooltipRef = ref}>\n \n \n \n }\n
\n\n\n
\n }\n\n { !hidePrice &&\n
\n
\n
\n { price.label }\n
\n
\n { price.value } { price.unit }\n
\n
\n
\n }\n
\n \n )\n }\n}\n\nexport default LocationTemplate;\n","import React from 'react';\nimport Modal from 'react-modal';\n\nimport './index.sass';\n\n\nconst customStyles = {\n overlay: {\n backgroundColor: 'rgba(0,0,0,0.6)',\n top: '0',\n overflow: 'auto',\n zIndex: '9999'\n },\n content: {\n top: '50%',\n left: '50%',\n right: 'auto',\n bottom: 'auto',\n marginRight: '-50%',\n transform: 'translate(-50%, -50%)',\n padding: 0,\n pointerEvents: 'visible',\n background: 'white',\n borderRadius: '4px',\n position: 'absolute',\n width: '400px',\n },\n};\n\n\nconst ModalWindow = ({ children, name, isOpen, onRequestClose }) => {\n\n return (\n
\n { children }\n \n )\n}\n\nexport default ModalWindow;\n\n","import React, { Component } from 'react';\nimport Nouislider from 'nouislider-react';\nimport \"nouislider/distribute/nouislider.css\";\n\nimport './index.sass';\n\n\nclass NoLinearRangeSlider extends Component {\n state = {\n minInput: 0,\n maxInput: 0,\n employeeMin: Math.round(this.props.value.min / 15),\n employeeMax: Math.round(this.props.value.max / 15),\n activeInput: '',\n maxInputIsFocused: false,\n textValue: null,\n percent: null,\n };\n\n componentDidMount() {\n this.setState({\n minInput: this.props.value.min,\n maxInput: this.props.value.max,\n })\n };\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n if (this.props.value.min !== prevProps.value.min || this.props.value.max !== prevProps.value.max) {\n this.setState({\n minInput: this.props.value.min,\n maxInput: this.props.value.max,\n employeeMin: Math.round(this.props.value.min / 15),\n employeeMax: Math.round(this.props.value.max / 15),\n });\n }\n };\n\n handleChange = (e) =>\n this.setState({ [e.target.id]: e.target.value.replace(/\\D/g, '') });\n\n handleKeyPress = (e, valueChangeFunc) => {\n if (e.key === 'Enter') {\n e.target.blur();\n this.handleValueChange(e, valueChangeFunc);\n }\n };\n\n handleBlur = (e, valueType, valueChangeFunc) => {\n const { value, employeeCalculation } = this.props;\n\n this.handleInputClick(e);\n\n this.setState({ maxInputIsFocused: false });\n e.target.value.replace(/\\D/g,'') === ''\n ? (e.target.value = employeeCalculation ? Math.round(value[valueType] / 15) : value[valueType])\n : this.handleValueChange(e, valueChangeFunc);\n };\n\n handleValueChange = (e, valueChangeFunc) => {\n let currentState = Object.assign({}, this.props.value);\n const targetValue = +e.target.value.replace(/\\D/g,'');\n const value = this.props.employeeCalculation ? targetValue * 15 : targetValue;\n const inputRange = e.target.dataset.range;\n\n if(value !== currentState[inputRange]) {\n currentState[inputRange] = valueChangeFunc(value, currentState);\n this.props.handleSelectorChange(currentState, true);\n }\n };\n minChange = (value, currentState) => {\n const { maxValue, minValue } = this.props;\n\n if(!value) {\n this.setState({ ...this.state, minInput: minValue });\n return minValue;\n } else {\n const maxLimit = value > currentState.max || value > maxValue;\n const minLimit = value < minValue ? minValue : value;\n return maxLimit ? currentState.max : minLimit;\n }\n };\n maxChange = (value, currentState) => {\n const { maxValue, minValue, allowBiggerValue } = this.props;\n const currentValue = +value;\n\n if(!currentValue) {\n this.setState({ maxInput: maxValue });\n return maxValue;\n } else {\n const maxLimit = currentValue > maxValue;\n const minLimit = currentValue < +currentState.min || currentValue < minValue ? +currentState.min : currentValue;\n this.setState({ maxInput: maxLimit ? (allowBiggerValue ? minLimit : maxValue) : minLimit });\n return maxLimit ? (allowBiggerValue ? minLimit : maxValue) : minLimit;\n }\n };\n onSlide = (value) => {\n this.setState({\n minInput: value[0].slice(0, -3),\n maxInput: value[1].slice(0, -3)\n });\n\n this.setState({\n employeeMin: Math.round(value[0].slice(0, -3) / 15),\n employeeMax: Math.round(value[1].slice(0, -3) / 15)\n })\n };\n\n handleChangeComplete = (value, handle) => {\n const { filterType, employeeCalculation, handleSelectorChange } = this.props;\n\n const min = Number(value[0].slice(0, -3));\n const max = Number(value[1].slice(0, -3));\n let currentState = Object.assign({}, this.props.value);\n\n if(max > this.props.maxValue) {\n currentState.max = this.props.maxValue;\n } else if(min < this.props.minValue) {\n currentState.min = this.props.minValue;\n } else {\n currentState.min = min;\n currentState.max = max;\n }\n\n const activeInput = handle === 0\n ? (employeeCalculation ? `employeeMin${filterType}` : `minInput${filterType}`)\n : handle === 1\n ? (employeeCalculation ? `employeeMax${filterType}` : `maxInput${filterType}`)\n : null;\n\n activeInput && this.setState({ activeInput });\n handleSelectorChange(currentState, true);\n\n if (activeInput) {\n const activeInputField = this[activeInput];\n activeInputField.classList.add('outline-none');\n activeInputField.focus();\n }\n };\n\n handleInputClick = (e) => e.target.classList.remove('outline-none');\n\n handleFocus = (e) => {\n const value = e.target.value.replace(/\\D/g,'');\n value === 0 || value === '0' ? e.target.value = '' : null;\n };\n\n handleMaxInputFocus = () => this.setState({ maxInputIsFocused: true });\n\n\n render() {\n const { maxInputIsFocused, maxInput, employeeMax, employeeMin, minInput } = this.state;\n const { minValue, maxValue, dimension, employeeCalculation, showMaxMoreIcon, value, filterType } = this.props;\n\n const locale = I18n.locale === 'en' ? 'fr' : I18n.locale;\n const localizedNumberFormatter = (value) => new Intl.NumberFormat(locale).format(value);\n const selectedMaxValue = (!maxInputIsFocused && showMaxMoreIcon && +maxInput === maxValue) ? localizedNumberFormatter(maxInput) + ' +' : localizedNumberFormatter(maxInput);\n const selectedMaxEmployeeValue = (!maxInputIsFocused && showMaxMoreIcon && +employeeMax === Math.round(maxValue / 15)) ? localizedNumberFormatter(employeeMax) + ' +' : localizedNumberFormatter(employeeMax);\n\n return (\n
\n
\n {I18n.t('search_agent.selector.from')}\n {I18n.t('search_agent.selector.to')}\n
\n\n
\n\n
\n
\n );\n }\n}\n\nexport default NoLinearRangeSlider;\n","import React, { Component } from \"react\";\nimport Yup from 'yup';\n\nimport { withFormik } from 'formik';\nimport { validationPatterns } from '../../../utils/validationPatterns';\nimport Client from '../../../utils/Client';\nimport Loader from '../../SharedComponents/Loader';\n\n\nclass RequestFormWrapper extends Component {\n\n\n render() {\n const {\n errors,\n handleBlur,\n handleChange,\n handleSubmit,\n touched,\n values,\n submitError,\n pendingRequest,\n } = this.props;\n\n\n return (\n
\n )\n }\n}\n\nconst { fifth_element, phone } = Client.getClientInfo();\nconst { phoneI18n } = Client.getI18nAttrNames();\nconst i18nRequiredKey = 'apps.lb_showroom.detailed.order_form.validation.field_required';\nconst i18nMinNumberKey = 'apps.lb_showroom.detailed.order_form.validation.min_number';\nconst i18nSymbolsLimitErrorMessage = I18n.t('apps.lb_showroom.misc.scoped_form.max_symbols_limit', { symbols_limit: 254 });\nconst i18nAtLeast8Digits = 'apps.lb_showroom.detailed.order_form.validation.at_least_8_digits';\n\nexport const RequestCallForm = withFormik({\n mapPropsToValues: () => ({ fifth_element, phone }),\n\n validationSchema: Yup.object().shape({\n fifth_element: Yup.string(),\n phone: Yup.string()\n .matches(validationPatterns.symbolsLimit, i18nSymbolsLimitErrorMessage)\n .min(8, I18n.t(i18nMinNumberKey, { field: phoneI18n }))\n .matches(validationPatterns.phone, I18n.t('apps.lb_showroom.misc.scoped_form.phone.invalid'))\n .test('minDigitsValidation', I18n.t(i18nAtLeast8Digits), function(value) {\n const { path, createError } = this;\n const phoneIsValid = value && value.replace(/[+\\-\\s()]/g, '').length >= 8;\n return phoneIsValid || !value || createError({ path, message: I18n.t(i18nAtLeast8Digits) });\n })\n .required(I18n.t(i18nRequiredKey, { field: phoneI18n })),\n }),\n\n handleSubmit: (values, bag) => {\n bag.props.submitHandler(values);\n },\n\n displayName: 'RequestCallForm',\n})(RequestFormWrapper);\n\n\nexport default RequestCallForm;\n","import React, { Fragment } from 'react';\nimport { isMobile, isTablet, isIPad13 } from 'react-device-detect';\nimport Modal from 'react-modal';\n\nimport { apiProvider } from '../../../api/core';\nimport ThankYouIcon from '../../../src/images/list_office/thank_you.svg';\nimport RequestCallForm from './RequestCallForm';\n\nimport './index.sass';\nimport {SvgIco} from \"../../SharedComponents/Icons\";\n\n\nconst customStyles = {\n overlay: {\n backgroundColor: 'rgba(0,0,0,0.6)',\n top: '0',\n overflow: 'auto',\n zIndex: '9999'\n },\n content: {\n top: '50%',\n left: '50%',\n right: 'auto',\n bottom: 'auto',\n marginRight: '-50%',\n transform: 'translate(-50%, -50%)',\n padding: 0,\n pointerEvents: 'visible',\n background: 'white',\n borderRadius: '4px',\n position: 'absolute',\n },\n};\n\n\nclass RequestCallModal extends React.PureComponent {\n state = {\n modalWasShown: true,\n modalIsOpen: false,\n mobileModalIsOpen: false,\n requestSuccess: false,\n submitError: false,\n pendingRequest: false,\n };\n\n hideModal = () =>\n this.setState({\n modalWasShown: true,\n modalIsOpen: false,\n mobileModalIsOpen: false\n }, () => {\n document.removeEventListener('unload', this.showModal);\n document.body.removeEventListener('mouseleave', this.showModal);\n });\n\n showModal = () => {\n const getContactFormOpen = document.getElementById('get-contact-form');\n !this.props.hideModal && !this.state.modalWasShown && !getContactFormOpen && this.setState({ modalIsOpen: true });\n };\n\n showMobileModal = () => {\n const getContactFormOpen = document.getElementById('get-contact-form');\n this.props.hideModal\n ? setTimeout(this.showMobileModal, 30000)\n : !getContactFormOpen && this.setState({ mobileModalIsOpen: true });\n };\n\n componentDidMount() {\n setTimeout(this.showMobileModal, 30000);\n setTimeout(() => this.setState({ modalWasShown: false }), 5000);\n document.addEventListener('unload', this.showModal);\n document.body.addEventListener('mouseleave', this.showModal);\n };\n\n handleSubmit = (data) => {\n\n this.setState({ pendingRequest: true });\n\n const url = '/call_request';\n const params = new FormData();\n\n params.append('call_request[phone_number]', data.phone);\n params.append('call_request[ohtrryvhfhruk]', data.fifth_element);\n params.append('button', '');\n\n apiProvider.post(url, params, true)\n .then(response =>\n response.status === 'success'\n ? this.setState({ requestSuccess: true, pendingRequest: false }, () => setTimeout(this.hideModal, 3000))\n : this.setState({ pendingRequest: false })\n );\n }\n\n render() {\n\n const { modalWasShown, modalIsOpen, mobileModalIsOpen, requestSuccess, submitError, pendingRequest } = this.state;\n const isMobileDevice = isMobile || isTablet || isIPad13;\n const showModal = isMobileDevice\n ? !modalWasShown && mobileModalIsOpen\n : !modalWasShown && modalIsOpen;\n\n return (\n
\n \n
\n \n
\n { requestSuccess\n ?
\n \n
{ I18n.t('signup.teaser.modal_close.thank-header') }
\n
{ I18n.t('signup.teaser.modal_close.thank-text') }
\n
\n
\n \n

\n
\n \n :
\n \n \n
{ I18n.t('signup.teaser.modal_close.header') }
\n
{ I18n.t('signup.teaser.modal_close.text') }
\n
\n \n \n }\n
\n \n )\n }\n}\n\nexport default RequestCallModal;\n","import React, { Fragment, useEffect, useMemo, useState} from 'react';\nimport Modal from \"react-modal\";\nimport DateTimePicker from \"react-datetime-picker\";\n\nimport { placeOrderDetails } from '../../../utils/api';\nimport BasicDropdown from \"../../SharedComponents/Forms/BasicDropdown\";\nimport Input from \"../../SharedComponents/Forms/Input\";\nimport { SvgIco } from \"../../SharedComponents/Icons\";\nimport { loadTawkTo } from \"../../TawkTo/TawkTo\";\nimport { EllipsisLoader } from \"../../Provider/Loaders\";\n\nimport './index.sass';\n\n\nconst customStyles = {\n overlay: {\n backgroundColor: 'rgba(0,0,0,0.6)',\n top: '0',\n overflow: 'auto',\n zIndex: '20000000000',\n backdropFilter: 'blur(5px)',\n },\n content: {\n top: '50%',\n left: '50%',\n right: 'auto',\n bottom: 'auto',\n marginRight: '-50%',\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'visible',\n background: 'white',\n borderRadius: '16px 16px 0px 0px',\n position: 'absolute',\n },\n};\n\nconst kindsOptions = [\n { value: 'open_office', label: I18n.t('order_confirmations.modal.kind.open_office') },\n { value: 'closed_office', label: I18n.t('order_confirmations.modal.kind.closed_office') },\n { value: 'hot_desk', label: I18n.t('order_confirmations.modal.kind.hot_desk') },\n { value: 'assigned_workspace', label: I18n.t('order_confirmations.modal.kind.assigned_workspace') },\n];\n\n\nconst SearchOfferModal = ({ currency, siteKey, locationKind, orderId, apiCreateOrderDetailsPath }) => {\n\n const [modalIsOpen, setModalIsOpen] = useState(false);\n const [values, setValues] = useState({ currency_id: currency.id, order_id: orderId });\n const [timeRangeOptional, setTimeRangeOptional] = useState(null);\n const [calendarIsOpen, setCalendarIsOpen] = useState(false);\n const [loading, setLoading] = useState(false);\n const [success, setSuccess] = useState(false);\n\n\n useEffect(() => {\n const showSearchOptionsModal = (locationKind === 'business_center' || locationKind === 'coworking') && siteKey !== 'dk' && orderId && apiCreateOrderDetailsPath && locationKind;\n\n if (showSearchOptionsModal) {\n // Show modal once a day\n const searchOfferModalShown = localStorage && localStorage.getItem('my.search_offer_modal_shown');\n const newDate = new Date();\n\n newDate.setHours(23,59,59,59);\n\n const timestamp = `${newDate.getUTCDate()}_${newDate.getUTCMonth() + 1}_${newDate.getUTCFullYear()}`;\n\n if (!searchOfferModalShown || searchOfferModalShown !== timestamp) {\n setModalIsOpen(true);\n localStorage && localStorage.setItem('my.search_offer_modal_shown', timestamp);\n }\n }\n }, []);\n\n\n const requiredValuesFilled = useMemo(() => {\n const { employee_amount, workplace_type, monthly_budget_min, monthly_budget_max, occupied_at_type, occupied_at_date } = values;\n\n return !!(employee_amount && workplace_type && (monthly_budget_min || monthly_budget_max) && (occupied_at_type || occupied_at_date));\n },[values]);\n\n\n const handleSubmit = () => {\n\n const path = '/lease/api/frontend/order_details';\n\n setLoading(true);\n\n placeOrderDetails(path, values)\n .then((response) => {\n setLoading(false);\n setSuccess(true);\n setTimeout(() => setModalIsOpen(false), 1000);\n })\n .catch((error) => {\n setLoading(false);\n console.error(error);\n });\n };\n\n\n const handleChange = (newValues) =>\n setValues((prevValues) => ({ ...prevValues, ...newValues }));\n\n\n const setTimeRange = (value, isDateOptional) => {\n setTimeRangeOptional(isDateOptional ? value : null);\n handleChange({\n occupied_at_type: isDateOptional ? 'custom_date' : value,\n occupied_at_date: isDateOptional ? value.toLocaleDateString('en-GB').split('/').join('.') : '',\n });\n };\n\n\n const customFormattedDate = timeRangeOptional && timeRangeOptional.toLocaleDateString('en-GB').split('/').join('.');\n\n\n return (\n
setModalIsOpen(false)}\n style={customStyles}\n >\n \n\n { success &&\n
\n }\n\n { !success &&\n
\n setModalIsOpen(false)}>\n \n
\n\n \n
{ I18n.t('order_confirmations.modal.header') }
\n
{ I18n.t('order_confirmations.modal.header_info') }
\n
\n\n \n\n
\n
\n { I18n.t('order_confirmations.modal.kind_label') }\n
\n
handleChange({ workplace_type: value })}\n name=\"workplace_type\"\n options={kindsOptions}\n placeholder={I18n.t('apps.lb_showroom.main.kinds_placeholder')}\n value={values.workplace_type || null}\n />\n \n\n
(/^\\d+$/.test(e.target.value) || !e.target.value) && handleChange({ employee_amount: e.target.value }) }\n inputMode=\"numeric\"\n label={I18n.t('activemodel.attributes.service_request.employee_count')}\n name=\"employee_amount\"\n pattern=\"[0-9]*\"\n placeholder={I18n.t('generic.enter_amount')}\n type=\"number\"\n value={values.employee_amount || ''}\n />\n\n
\n
{ I18n.t('order_confirmations.modal.price_range_label') }
\n\n
\n
\n\n
\n { I18n.t('generic.minimum') }\n
\n
\n
\n { currency.formatted }\n
\n
values.monthly_budget_max && values.monthly_budget_min && Number(values.monthly_budget_max) < Number(values.monthly_budget_min) && handleChange({ monthly_budget_min: values.monthly_budget_max })}\n handleChange={(e) => (/^\\d+$/.test(e.target.value) || !e.target.value) && handleChange({ monthly_budget_min: e.target.value }) }\n inputMode=\"numeric\"\n name=\"monthly_budget_min\"\n pattern=\"[0-9]*\"\n placeholder=\"0\"\n type=\"number\"\n value={values.monthly_budget_min || ''}\n />\n
\n
\n\n
\n\n
\n
\n { I18n.t('generic.maximum') }\n
\n
\n
\n { currency.formatted }\n
\n
values.monthly_budget_max && values.monthly_budget_min && Number(values.monthly_budget_max) < Number(values.monthly_budget_min) && handleChange({ monthly_budget_max: values.monthly_budget_min })}\n handleChange={(e) => (/^\\d+$/.test(e.target.value) || !e.target.value) && handleChange({ monthly_budget_max: e.target.value })}\n inputMode=\"numeric\"\n name=\"monthly_budget_max\"\n pattern=\"[0-9]*\"\n placeholder=\"0\"\n type=\"number\"\n value={values.monthly_budget_max || ''}\n />\n
\n
\n
\n
\n\n\n
\n\n
{ I18n.t('order_confirmations.modal.occupied_at_label') }
\n\n
\n
setTimeRange('soonest')}>\n { I18n.t('order_confirmations.modal.occupied_at_type.soonest') }\n
\n\n
setTimeRange('next_few_weeks')}>\n { I18n.t('order_confirmations.modal.occupied_at_type.next_few_weeks') }\n
\n
\n\n
\n
setTimeRange('next_2_3_monthes')}>\n { I18n.t('order_confirmations.modal.occupied_at_type.next_2_3_monthes') }\n
\n\n
\n
\n { customFormattedDate || I18n.t('order_confirmations.modal.occupied_at_type.custom_date') }\n
\n
setCalendarIsOpen(false)}\n onCalendarOpen={() => setCalendarIsOpen(true)}\n onChange={(date) => setTimeRange(date, true)}\n value={timeRangeOptional} />\n \n\n
\n
\n
\n\n \n
setModalIsOpen(false)}>\n { I18n.t('generic.skip') }\n
\n\n
\n { loading\n ? \n : I18n.t('generic.submit')\n }\n
\n
\n \n }\n\n
\n \n )\n}\n\nexport default SearchOfferModal;\n","import React, { useState } from 'react';\nimport Modal from \"react-modal\";\nimport ReactTooltip from \"react-tooltip\";\n\nimport RadioButtons from \"../Forms/RadioButtons\";\nimport Checkbox from \"../Forms/CheckBox\";\nimport { SvgIco } from \"../Icons\";\n\nimport './SpaceCalculatorModal.sass';\n\n\nconst SpaceCalculatorModal = ({ isOpen, handleClose }) => {\n\n const [workplaces, setWorkplaces] = useState(1);\n const [workplaceClass, setWorkplaceClass] = useState('workplace_class_comfort');\n const [additionalSpaces, setAdditionalSpaces] = useState({ small_lounge: 0, big_lounge: 0, small_meeting: 0, big_meeting: 0 });\n const [spacesConsiderations, setSpacesConsiderations] = useState([]);\n\n\n const metrics = {\n workplace_class_economy: 9 * workplaces,\n workplace_class_comfort: 14 * workplaces,\n workplace_class_business: 18 * workplaces,\n small_lounge: additionalSpaces.small_lounge ? 15 * additionalSpaces.small_lounge : 15,\n big_lounge: additionalSpaces.big_lounge ? 30 * additionalSpaces.big_lounge : 30,\n small_meeting: additionalSpaces.small_meeting ? 10 * additionalSpaces.small_meeting : 10,\n big_meeting: additionalSpaces.big_meeting ? 30 * additionalSpaces.big_meeting : 30,\n conference: 4 + 2 * workplaces,\n reception: 10,\n break: 7 + 2 * workplaces,\n mail: 10,\n };\n\n\n const workplaceClassOptions = [\n {\n checked: workplaceClass === 'workplace_class_economy',\n label: I18n.t('space_calculator.workplace_class_economy'),\n value: 'workplace_class_economy'\n },\n {\n checked: workplaceClass === 'workplace_class_comfort',\n label: I18n.t('space_calculator.workplace_class_comfort'),\n value: 'workplace_class_comfort'\n },\n {\n checked: workplaceClass === 'workplace_class_business',\n label: I18n.t('space_calculator.workplace_class_business'),\n value: 'workplace_class_business'\n },\n ];\n\n\n const spaceConsiderationsOptions = ['reception', 'break', 'mail'];\n\n\n const chosenCategoriesIds = React.useMemo(\n () => {\n const ids = [workplaceClass, ...spacesConsiderations];\n\n Object.keys(additionalSpaces).map(spaceKind => additionalSpaces[spaceKind] && ids.push(spaceKind));\n\n return ids;\n },\n [additionalSpaces, spacesConsiderations, workplaceClass],\n );\n\n const areaSummary = React.useMemo(\n () => {\n const result = { fullArea: 0 };\n\n chosenCategoriesIds.map(id => metrics[id] && (result.fullArea = result.fullArea + metrics[id]));\n\n if (chosenCategoriesIds.includes('halls')) {\n result.fullArea = Math.round(result.fullArea + (result.fullArea / 5));\n result.halls = Math.round(result.fullArea / 5);\n }\n\n return result;\n },\n [chosenCategoriesIds, workplaces],\n );\n\n\n const handleSpaceConsideration = (e, name) => {\n const newData = [ ...spacesConsiderations ];\n const valueIndex = newData.indexOf(name);\n\n valueIndex >= 0 ? newData.splice(valueIndex, 1) : newData.push(name);\n setSpacesConsiderations(newData);\n };\n\n\n return (\n
\n \n\n
\n { I18n.t('space_calculator.title') }\n
\n\n
\n { I18n.t('space_calculator.subtitle') }\n
\n\n
\n \n
\n\n
\n\n
\n
\n
\n { I18n.t('space_calculator.workplace_count_label') }\n
\n\n
\n\n
\n
workplaces ? setWorkplaces(Number(workplaces) - 1) : null}>\n -\n
\n\n
(/^\\d+$/.test(e.target.value) || !e.target.value) && setWorkplaces(Number(e.target.value))}\n placeholder=\"0\"\n type=\"text\"\n value={workplaces}\n />\n\n
setWorkplaces(Number(workplaces) + 1)}>\n +\n
\n
\n\n
\n
\n\n
\n
\n { I18n.t('space_calculator.workplace_class_label') }\n
\n\n
\n \n
\n
\n\n
\n
\n { I18n.t('space_calculator.additional_spaces_label') }\n
\n\n
\n\n { Object.keys(additionalSpaces).map(spaceName =>\n
\n
additionalSpaces[spaceName] ? setAdditionalSpaces(prevState => ({ ...prevState, [spaceName]: prevState[spaceName] - 1 })) : null}>\n -\n
\n\n
{\n e.persist();\n (/^\\d+$/.test(e.target.value) || !e.target.value) && setAdditionalSpaces(prevState => ({ ...prevState, [spaceName]: Number(e.target.value) || 0 }));\n }}\n placeholder=\"0\"\n type=\"text\"\n value={additionalSpaces[spaceName]}\n />\n\n
setAdditionalSpaces(prevState => ({ ...prevState, [spaceName]: prevState[spaceName] + 1 }))}>\n +\n
\n\n
\n { I18n.t(`space_calculator.additional_spaces_${spaceName}`) }\n
\n\n
\n \n \n
\n
\n )}\n\n
\n
\n\n
\n
\n { I18n.t('space_calculator.space_consideration_label') }\n
\n\n
\n { spaceConsiderationsOptions.map(spaceType =>\n
\n
\n \n\n \n \n \n \n
\n
\n )}\n
\n
\n\n
\n\n
\n
\n\n
\n { I18n.t('space_calculator.summary') }:\n
\n\n { !!areaSummary.fullArea &&\n
\n { workplaces &&\n
\n
\n
\n { workplaces }\n
\n
\n x\n
\n
\n
{ I18n.t('space_calculator.workplaces') }
\n
{ I18n.t(`space_calculator.${workplaceClass}`) }
\n
\n
\n
\n { metrics[workplaceClass] } m²\n
\n
\n }\n\n { Object.keys(additionalSpaces).map(spaceType => {\n if (additionalSpaces[spaceType]) {\n return (\n
\n
\n
\n { additionalSpaces[spaceType] }\n
\n
\n x\n
\n
\n { I18n.t(`space_calculator.additional_spaces_${spaceType}`) }\n
\n
\n\n
\n { metrics[spaceType] } m²\n
\n
\n )\n }\n })}\n\n { spacesConsiderations.map(spaceType =>\n
\n
\n
\n 1\n
\n
\n x\n
\n
\n { I18n.t(`space_calculator.space_consideration_${spaceType}`) }\n
\n
\n\n
\n { spaceType === 'halls' ? areaSummary.halls || 0 : metrics[spaceType] } m²\n
\n
\n )}\n
\n }\n\n
\n
{ I18n.t('space_calculator.space_total_area') }
\n
{ areaSummary.fullArea } m²
\n
\n
\n
\n
\n
\n\n \n )\n}\n\nexport default SpaceCalculatorModal;\n\n\n\n\nconst customStyles = {\n overlay: {\n backgroundColor: 'rgba(0,0,0,0.6)',\n top: '0',\n overflow: 'auto',\n zIndex: '9999',\n },\n content: {\n top: '50%',\n left: '50%',\n right: 'auto',\n bottom: 'auto',\n marginRight: '-50%',\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'visible',\n borderRadius: '8px',\n position: 'absolute',\n },\n};\n","import React, { useEffect, useState, Suspense } from 'react';\n\nimport { SvgIco } from \"../Icons\";\n\nconst SpaceCalculatorModal = React.lazy(() => import('./SpaceCalculatorModal'));\n\nimport './index.sass';\n\n\nconst SpaceCalculator = ({ wrapperClass }) => {\n\n const [isOpen, setIsOpen] = useState(false);\n\n\n useEffect(() => {\n isOpen\n ? document.body.classList.add('modal-active')\n : document.body.classList.remove('modal-active');\n }, [isOpen]);\n\n\n return (\n
\n\n
setIsOpen(true)}>\n
\n
\n { I18n.t('space_calculator.toggle_label') }\n
\n
\n\n { isOpen &&\n
\n setIsOpen(false)}\n />\n \n }\n
\n )\n};\n\nexport default SpaceCalculator;\n","import React from 'react';\n\nimport './TrustLogos.sass';\n\nconst TrustLogos = ({ trustedLogosUrl, trustedLogos }) => {\n\n return (\n
\n
\n
\n
\n { I18n.t('apps.lb_showroom.detailed.order_form.logos-membership') }\n
\n
\n { trustedLogos.map(logo =>\n - \n \n
\n \n \n )}\n
\n
\n
\n
\n )\n};\n\nexport default TrustLogos;\n","import React from 'react';\n\nconst TypeformButton = ({ className, href, title }) => {\n\n\n return (\n
\n
\n { title }\n \n {(function() {\n var qs,\n js,\n q,\n s,\n d=document,\n gi=d.getElementById,\n ce=d.createElement,\n gt=d.getElementsByTagName,\n id=\"typef_orm_share\",\n b=\"https://embed.typeform.com/\";\n\n if(!gi.call(d,id)) {\n js=ce.call(d,\"script\");\n js.id=id;\n js.src=b+\"embed.js\";\n q=gt.call(d,\"script\")[0];\n q.parentNode.insertBefore(js,q)\n }\n })()}\n
\n )\n};\n\nexport default React.memo(TypeformButton);\n","// this parking only on DK, that why I don't create some keys in phraseapp\nimport React, { Fragment } from 'react';\n\nimport { localizedNumberFormatter } from \"../../../utils/helpers\";\nimport { SvgIco } from \"../../SharedComponents/Icons\";\n\n\nconst BasicParkeringContent = ({ price }) => {\n\n return (\n
\n \n
\n { I18n.t('generic.parking') }\n
\n
\n \n
\n
\n \n
\n
\n
{ I18n.t('signup.signup_form.parking_price_table_title') }
\n\n
\n \n\n \n { I18n.t('signup.signup_form.on_deal.infobox.prices') } | \n {I18n.t('signup.signup_form.parking_basic_parkering')} | \n
\n\n \n { I18n.t('signup.signup_form.parking_tabs_block_one') } | \n {localizedNumberFormatter(Number(price))} kr. | \n
\n\n \n { I18n.t('signup.signup_form.meeting_room.infobox.billing_period.period') } | \n { I18n.t('signup.signup_form.coworking.infobox.billing_period.monthly') } | \n
\n\n \n { I18n.t('signup.signup_form.meeting_room.infobox.term.term') } | \n { I18n.t('signup.signup_form.meeting.infobox.term.months_basic') } | \n
\n\n \n { I18n.t('signup.signup_form.on_deal.infobox.you_get') } | \n | \n
\n\n \n { I18n.t('signup.teaser.tabs.tab.block.greater') } | \n | \n
\n\n \n { I18n.t('signup.teaser.tabs.tab.block.general_2') } | \n | \n
\n\n \n { I18n.t('signup.teaser.tabs.tab.block.basic.list_1') } | \n | \n
\n\n \n Har du flere parkeringspladser på samme adresse, betaler du kun for én annonce. | \n | \n
\n\n \n Visning af kontaktoplysninger | \n | \n
\n\n \n { I18n.t('signup.teaser.tabs.tab.block.no_cure_no_pay_plus.list_4') } | \n | \n
\n\n \n { I18n.t('signup.teaser.tabs.tab.block.general_website-link') } | \n | \n
\n\n\n \n { I18n.t('signup.teaser.tabs.tab.block.general_contact-person-photo') } | \n | \n
\n\n \n { I18n.t('signup.teaser.tabs.tab.block.linklist_14') } | \n | \n
\n\n \n
\n
\n
\n \n )\n};\n\nexport default BasicParkeringContent;\n","import React, { Fragment } from 'react';\nimport { SvgIco } from '../../SharedComponents/Icons';\n\nconst pricesTableSignUpModal = [\n {\n key: '',\n category: \"Lejemåls m²\",\n basic: \"Basic\",\n basicPlus: \"Basic Plus\",\n premium: \"Premium\",\n premiumPlus: \"Premium +\",\n },\n {\n key: '0..249',\n category: \"0 - 249 m²\",\n basic: \"756 kr.\",\n basicPlus: \"984 kr.\",\n premium: \"1.984 kr.\",\n premiumPlus: \"5.250 kr.\",\n },\n {\n key: '250..499',\n category: \"250 - 499 m²\",\n basic: \"1.259 kr.\",\n basicPlus: \"1.756 kr.\",\n premium: \"2.756 kr.\",\n premiumPlus: \"6.222 kr.\",\n },\n {\n key: '500..999',\n category: \"500 - 999 m²\",\n basic: \"2.336 kr.\",\n basicPlus: \"3.015 kr.\",\n premium: \"4.015 kr.\",\n premiumPlus: \"7.681 kr.\",\n },\n {\n key: '1000..1999',\n category: \"1.000 - 1.999 m²\",\n basic: \"3.642 kr.\",\n basicPlus: \"4.558 kr.\",\n premium: \"5.558 kr.\",\n premiumPlus: \"9.424 kr.\",\n },\n {\n key: '2000..9999',\n category: \"2.000 - 9.999 m²\",\n basic: \"5.522 kr.\",\n basicPlus: \"6.584 kr.\",\n premium: \"7.584 kr.\",\n premiumPlus: \"11.650 kr.\",\n },\n {\n key: 'default',\n category: \"Over 9.999 m²\",\n basic: \"12.339 kr.\",\n basicPlus: \"13.395 kr.\",\n premium: \"14.395 kr.\",\n premiumPlus: \"18.661 kr.\",\n },\n {\n key: '',\n category: \"Det får du\",\n basic: \"\",\n basicPlus: \"\",\n premium: \"\",\n premiumPlus: \"\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_1'),\n basic: \"
\",\n basicPlus: \"
\",\n premium: \"
\",\n premiumPlus: \"
\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_2'),\n basic: \"
\",\n basicPlus: \"
\",\n premium: \"
\",\n premiumPlus: \"
\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_3'),\n basic: \"
\",\n basicPlus: \"
\",\n premium: \"
\",\n premiumPlus: \"
\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_4_new'),\n basic: \"
\",\n basicPlus: \"
\",\n premium: \"
\",\n premiumPlus: \"
\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_6'),\n basic: \"
\",\n basicPlus: \"
\",\n premium: \"
\",\n premiumPlus: \"
\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_14'),\n basic: \"
\",\n basicPlus: \"
\",\n premium: \"
\",\n premiumPlus: \"
\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_7'),\n basic: \"\",\n basicPlus: \"
\",\n premium: \"
\",\n premiumPlus: \"
\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_8'),\n basic: \"\",\n basicPlus: \"
\",\n premium: \"
\",\n premiumPlus: \"
\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_9'),\n basic: \"\",\n basicPlus: \"
\",\n premium: \"
\",\n premiumPlus: \"
\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_10'),\n basic: \"\",\n basicPlus: \"
\",\n premium: \"
\",\n premiumPlus: \"
\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_11_new'),\n basic: \"\",\n basicPlus: \"\",\n premium: \"
\",\n premiumPlus: \"
\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_12_new'),\n basic: \"\",\n basicPlus: \"\",\n premium: \"
\",\n premiumPlus: \"
\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_13'),\n basic: \"\",\n basicPlus: \"\",\n premium: \"
\",\n premiumPlus: \"
\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_15'),\n basic: \"\",\n basicPlus: \"\",\n premium: \"\",\n premiumPlus: \"
\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_16'),\n basic: \"\",\n basicPlus: \"\",\n premium: \"\",\n premiumPlus: \"
\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_17'),\n basic: \"\",\n basicPlus: \"\",\n premium: \"\",\n premiumPlus: \"
\",\n },\n {\n key: '',\n category: I18n.t('signup.teaser.tabs.tab.block.linklist_18'),\n basic: \"\",\n basicPlus: \"\",\n premium: \"\",\n premiumPlus: \"
\",\n },\n];\n\n\nconst BasicPriceContent = ({ advertisementStrategiesPrices }) => {\n\n function generateTableRows() {\n return fillPrices(advertisementStrategiesPrices).map((item, index) => (\n
\n | \n | \n | \n | \n | \n
\n ));\n }\n\n function fillPrices(prices) {\n let strategy_prices = prices['prices'];\n\n pricesTableSignUpModal.forEach((obj) => {\n if(obj.key != '') {\n obj.basic = strategy_prices['basic'][obj.key] + ' kr.';\n obj.basicPlus = strategy_prices['basicPlus'][obj.key] + ' kr.';\n obj.premium = strategy_prices['premium'][obj.key] + ' kr.';\n obj.premiumPlus = strategy_prices['premiumPlus'][obj.key] + ' kr.';\n }\n });\n\n return pricesTableSignUpModal;\n }\n\n return (\n
\n \n
\n { I18n.t('signup.signup_form.basic.infobox.title') }\n
\n
\n \n
\n
\n\n \n
\n
\n
Afregningsmodel (Betal pr. annonce)
\n\n
\n \n { generateTableRows() }\n \n
\n\n
\n
\n \n )\n};\n\nexport default BasicPriceContent;\n","import React, { Component } from 'react';\nimport { withFormik } from 'formik';\nimport Modal from 'react-modal';\nimport Yup from 'yup';\nimport { isIPad13, isMobile } from \"react-device-detect\";\nimport postalCodes from \"postal-codes-js\";\n\nimport { addressValidation, cityValidation, eanValidation, passwordValidation, vatIdValidation } from '../../SharedComponents/Forms/ValidationSchemaPattern';\nimport { postalCodeError, requiredFieldError } from \"../../SharedComponents/Forms/ErrorMessages\";\nimport { SvgIco } from \"../../SharedComponents/Icons\";\nimport DropdownSelectWithSearch from \"../../SharedComponents/DropdownSelectWithSearch\";\nimport SignUp from '../../../utils/SignUp';\n\nimport './ContinueRegistrationModal.sass';\n\n\nconst customStyles = {\n overlay: {\n backgroundColor: 'rgba(0,0,0,0.6)',\n top: '0',\n overflow: 'auto',\n zIndex: '9999',\n },\n content: {\n top: '50%',\n left: '50%',\n right: 'auto',\n bottom: 'auto',\n marginRight: '-50%',\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'visible',\n background: 'white',\n borderRadius: '4px',\n position: 'absolute',\n },\n};\n\n\nclass ContinueRegistrationModal extends Component {\n\n state = {\n passwordVisibility: false,\n tooltipVatIsOpen: false,\n };\n\n handleTooltipClick = (e) => {\n e.preventDefault();\n this.setState({tooltipVatIsOpen: !this.state.tooltipVatIsOpen}, () =>\n this.state.tooltipVatIsOpen\n ? window.addEventListener('click', this.handleClickOutside)\n : window.removeEventListener('click', this.handleClickOutside)\n );\n };\n\n handleClickOutside = (e) => {\n e.preventDefault();\n (e.target === this.tooltipContent || !this.tooltipWrapper.contains(e.target)) && this.setState({ tooltipVatIsOpen: false });\n };\n\n togglePasswordVisibility = () => {\n this.setState({\n passwordVisibility: !this.state.passwordVisibility,\n });\n };\n\n handleSubmit = (e) => {\n e.preventDefault();\n\n if(Object.keys(this.props.errors).length) {\n this.setState({ errorsOnSubmit: true }, () => {\n const target = document.querySelector('.sign-up-form__form-group-error');\n const targetCoords = Math.floor(target.getBoundingClientRect().top + window.pageYOffset - (document.getElementById('top-menu').offsetHeight + 48));\n\n window.scroll(0, targetCoords);\n });\n } else {\n this.props.handleSubmit();\n }\n };\n\n errorValidator = (field) => {\n const { errors, touched } = this.props;\n const { errorsOnSubmit } = this.state;\n const fieldError = errors[field] && (touched[field] || errorsOnSubmit) && 'sign-up-form__form-group-error';\n\n return field === 'email'\n ? (this.props.emailAlreadyExist && 'sign-up-form__form-group-error') || fieldError\n : fieldError;\n };\n\n\n render() {\n const {\n countriesSelectOptions,\n currentCountryCode,\n errors,\n handleBlur,\n handleChange,\n handleClose,\n internalError,\n isOpen,\n setFieldValue,\n siteKey,\n toggleTermsModal,\n values,\n } = this.props;\n\n const { passwordVisibility, tooltipVatIsOpen } = this.state;\n\n const countriesOptions = siteKey === 'global' && countriesSelectOptions.map(item => {\n return { value: item[1], label: item[0] }\n });\n\n\n return (\n\n
\n \n\n
\n
{ I18n.t('signup.new_form.register.user_info') }
\n \n\n { internalError &&\n
\n { I18n.t('apps.lb_showroom.detailed.order_form.error.message') }\n
\n }\n\n
\n
\n \n );\n }\n};\n\n\nconst { postal_codeI18n } = SignUp.getI18nAttrNames();\n\nconst {\n vat_id,\n ean,\n line_1,\n postal_code,\n country_alpha2,\n city,\n password,\n contract_id,\n fifth_element,\n} = SignUp.getClientInfo();\n\nconst ContinueRegistrationForm = withFormik({\n mapPropsToValues: (bag) => {\n return {\n vat_id,\n ean,\n line_1,\n postal_code,\n city,\n password,\n fifth_element,\n contract_id: contract_id || bag.activeContract.contract.id,\n country_alpha2: country_alpha2 || bag.currentCountryCode,\n }},\n\n validationSchema: Yup.object().shape({\n vat_id: vatIdValidation,\n ean: eanValidation,\n line_1: addressValidation,\n city: cityValidation,\n password: passwordValidation,\n postal_code: Yup.string()\n .test('isPostalCode', postalCodeError, function(value) {\n const { path, createError } = this;\n const codeIsValid = postalCodes.validate(this.parent.country_alpha2, value);\n\n return codeIsValid === true || !value || createError({ path, message: postalCodeError });\n })\n .required(requiredFieldError(postal_codeI18n)),\n }),\n\n handleSubmit: (values, bag) => {\n SignUp.updateClientInfo({ ...values, contract_name: bag.props.contractName, active_contract_section: bag.props.activeContractSection});\n bag.props.submitHandler(values, bag.props.signUpFormUrl);\n },\n\n displayName: 'ContinueRegistrationForm',\n})(ContinueRegistrationModal);\n\nexport default ContinueRegistrationForm;\n","import React, { Fragment } from 'react';\n\nimport { localizedNumberFormatter } from \"../../../utils/helpers\";\nimport { SvgIco } from '../../SharedComponents/Icons';\n\n\nconst MeetingRoomsInfoContent = ({ basicPrice, currentCurrency, premiumPrice, siteKey }) => {\n\n return (\n
\n \n
\n { I18n.t('apps.entry_page.entry_pages.show.lease.meeting_rooms') }\n
\n
\n \n
\n
\n \n
\n
\n
{ I18n.t('signup.signup_form.on_deal.infobox.price_model_meeting_rooms') }
\n\n
\n \n\n \n { I18n.t('signup.signup_form.on_deal.infobox.prices') } | \n { I18n.t('signup.teaser.prices.block.heading.removal_3') } | \n { I18n.t('signup.teaser.prices.block.heading.removal_4') } | \n
\n\n \n { I18n.t('signup.signup_form.meeting_room.infobox.monthly_price') } | \n { I18n.t('signup.teaser.tabs.tab.block.meeteng_room.monthly_fee_new', { price: localizedNumberFormatter(Number(basicPrice)) }) } | \n { I18n.t('signup.teaser.tabs.tab.block.meeteng_room.monthly_fee_premium_new', { price: localizedNumberFormatter(Number(premiumPrice)) }) } | \n
\n\n \n { I18n.t('signup.signup_form.meeting_room.infobox.billing_period.period') } | \n { I18n.t('signup.signup_form.meeting_room.infobox.billing_period.yearly') } | \n { I18n.t('signup.signup_form.meeting_room.infobox.billing_period.yearly') } | \n
\n\n \n { I18n.t('signup.signup_form.meeting_room.infobox.period_amount.period') } | \n { `${localizedNumberFormatter(Number(basicPrice) * 12)} ${siteKey === 'dk' ? 'kr.' : currentCurrency}` } | \n { `${localizedNumberFormatter(Number(premiumPrice) * 12)} ${siteKey === 'dk' ? 'kr.' : currentCurrency}` } | \n
\n\n \n { I18n.t('signup.signup_form.meeting_room.infobox.term.term') } | \n { I18n.t('signup.signup_form.meeting.infobox.term.months_basic') } | \n { I18n.t('signup.signup_form.meeting.infobox.term.months_premium') } | \n
\n\n \n { I18n.t('signup.signup_form.on_deal.infobox.you_get') } | \n | \n | \n
\n\n \n {I18n.t('signup.teaser.tabs.tab.block.greater')} | \n | \n | \n
\n\n \n {I18n.t('signup.teaser.tabs.tab.block.general_2')} | \n | \n | \n
\n\n \n {I18n.t('signup.teaser.tabs.tab.block.basic.list_1')} | \n | \n | \n
\n\n \n {I18n.t('signup.teaser.prices.block.list_1')} | \n | \n | \n
\n\n\n \n { I18n.t('signup.teaser.tabs.tab.block.no_cure_no_pay_plus.list_3') } | \n | \n | \n
\n\n \n { I18n.t('signup.teaser.tabs.tab.block.no_cure_no_pay_plus.list_4') } | \n | \n | \n
\n\n \n {I18n.t('signup.teaser.tabs.tab.block.general_website-link')} | \n | \n | \n
\n\n\n \n {I18n.t('signup.teaser.tabs.tab.block.general_contact-person-photo')} | \n | \n | \n
\n\n { siteKey === 'dk' &&\n \n {I18n.t('signup.teaser.tabs.tab.block.linklist_14')} | \n | \n | \n
\n }\n\n \n { I18n.t('signup.teaser.tabs.tab.block.no_cure_no_pay_premium.list_5') } | \n | \n | \n
\n\n \n { I18n.t('signup.teaser.tabs.tab.block.no_cure_no_pay_premium.list_6') } | \n | \n | \n
\n\n \n {I18n.t('signup.teaser.prices.block.list_2_3_new')} | \n | \n | \n
\n\n \n
\n
\n
\n \n )\n};\n\nexport default MeetingRoomsInfoContent;\n","import React, { Fragment } from 'react';\nimport { SvgIco } from '../../SharedComponents/Icons';\n\nconst NoCureInfoContent = ({ contractDetailsOnDeal, contractDetailsOnDealBasic, contractDetailsOnDealPremium, siteKey }) => {\n return (\n
\n \n
\n { I18n.t('signup.new_form.plans.block1.title_new') }\n
\n
\n \n
\n
\n \n
\n
\n
{ I18n.t('signup.signup_form.on_deal.infobox.price_model_business_center') }
\n\n
\n \n\n \n { I18n.t('signup.signup_form.on_deal.infobox.prices') } | \n Basic | \n
\n\n \n { I18n.t('signup.signup_form.on_deal.infobox.fee_per_rental') } | \n { contractDetailsOnDeal.table.persentage + I18n.t('signup.teaser.tabs.tab.block.fee') } | \n
\n\n\n \n { I18n.t('signup.signup_form.on_deal.infobox.you_get') } | \n | \n
\n\n { siteKey === 'dk' ?\n\n \n\n \n Annonce med kontaktformular | \n | \n
\n\n \n Få henvendelser via e-mail & SMS | \n | \n
\n\n \n Stor synlighed overfor potentielle lejere | \n | \n
\n\n \n Få gratis ”Til leje” skilte | \n | \n
\n\n \n Du betaler kun honorar, hvis du finder en lejer via os | \n | \n
\n\n \n Ingen binding. Du kan altid skifte afregningsmodel | \n | \n
\n\n \n Personlig hjælp og support via telefon, e-mail og chat | \n | \n
\n\n \n\n :\n\n \n \n { I18n.t('signup.teaser.tabs.tab.block.no_cure_no_pay.list_2') } | \n | \n
\n\n \n { I18n.t('signup.teaser.tabs.tab.block.great') } | \n | \n
\n\n \n { I18n.t('signup.teaser.tabs.tab.block.general_2') } | \n | \n
\n\n \n { I18n.t('signup.teaser.tabs.tab.block.no_cure_no_pay.list_1') } | \n | \n
\n\n\n \n }\n \n
\n\n
\n
\n \n )\n};\n\nexport default NoCureInfoContent;\n","import React, { Fragment } from 'react';\n\nimport './TermOfServiceContent.sass';\nimport {SvgIco} from \"../../SharedComponents/Icons\";\n\nconst TermsOfServiceContent = ({ activeContract }) => {\n return (\n
\n \n \n
\n { activeContract.title }\n
\n \n \n \n )\n};\n\nexport default TermsOfServiceContent;\n","import React, { Component } from \"react\";\n\nimport './index.sass';\n\nclass Modal extends Component {\n\n componentDidMount() {\n const modalClassList = document.getElementById(this.props.modalId).classList;\n const initialBodyWidth = document.body.clientWidth;\n\n document.addEventListener('click', this.handleClickOutside);\n document.body.classList.add('modal-active');\n\n if(initialBodyWidth < document.body.clientWidth) {\n document.body.style.marginRight = document.body.clientWidth - initialBodyWidth + 'px';\n }\n\n modalClassList.add('in');\n setTimeout(() => modalClassList.add('active'), 50);\n };\n\n componentWillUnmount() {\n document.removeEventListener('click', this.handleClickOutside);\n document.body.classList.remove('modal-active');\n document.body.style.marginRight = 'unset';\n }\n\n handleClickOutside = (e) => {\n const { modalId } = this.props;\n\n if (!this.modalWrapper.contains(e.target) || e.target.id === 'modalCloseBtn' || e.target.id === 'modalFooterCloseBtn') {\n document.getElementById(modalId).classList.remove('active', 'in');\n setTimeout(() => this.props.toggleModal(modalId), 100);\n }\n };\n\n render() {\n\n const { modalId, content } = this.props;\n const padding = modalId !== 'termOfService' && { paddingTop: `${document.getElementById('top-menu').clientHeight}px` };\n\n return (\n
\n { modalId !== 'termOfService'\n ?
this.modalWrapper = elem }>\n { content }\n
\n :
\n
\n
\n
this.modalWrapper = elem }>\n { content }\n
\n
\n
\n
\n }\n
\n )\n }\n}\n\nexport default Modal;\n","import React, { Component } from \"react\";\nimport queryString from 'query-string';\n\nimport { localizedNumberFormatter } from \"../../utils/helpers\";\nimport { SvgIco } from \"../SharedComponents/Icons\";\n\nimport './PaymentModel.sass'\n\n\nclass PaymentModel extends Component {\n\n state = {\n paymentModel: '',\n activePolicyGroup: '',\n activePolicyPlan: '',\n };\n\n componentDidMount() {\n const { invoicingStrategy, name } = this.props.activeContract.contract;\n const policyGroup = invoicingStrategy.includes('coworking') ? 'coworking-policy-group' : 'invoicing-policy-group';\n const policyPlan = name.replace(/_(\\w)/g, (m => m[1].toUpperCase()));\n const parkeringCheck = queryString.parse(window.location.search).contract_name === 'parking' ? 'parkering-policy-group' : null;\n const activePolicyGroup = parkeringCheck ? parkeringCheck : policyGroup;\n const activePolicyPlan = parkeringCheck ? 'basic' : policyPlan;\n\n this.setState({ activePolicyGroup, activePolicyPlan }, () => {\n const policyGroup = document.getElementById(activePolicyGroup);\n const policyPlan = document.getElementById(activePolicyPlan);\n\n policyGroup && policyGroup.classList.add('active');\n policyPlan && policyPlan.classList.add('active');\n this.props.handleContractSelect(activePolicyPlan, activePolicyGroup);\n });\n }\n\n handleMainGroupRadioSelect = (targetGroup) => {\n const { activePolicyGroup, activePolicyPlan } = this.state;\n const targetGroupRadio = document.getElementById(targetGroup);\n const targetPlan = targetGroupRadio.querySelector('.payment-model__sublist').children[1].id;\n\n document.getElementById(targetGroup) && activePolicyGroup !== targetGroup && this.setState({\n activePolicyGroup: targetGroup,\n activePolicyPlan: targetPlan,\n }, () => {\n document.getElementById(activePolicyPlan).classList.remove('active');\n document.getElementById(activePolicyGroup).classList.remove('active');\n document.getElementById(targetPlan).classList.add('active');\n this.props.handleContractSelect(targetPlan, activePolicyGroup);\n setTimeout(() => targetGroupRadio.classList.add('active'), 10);\n });\n };\n\n handlePlanRadioSelect = (targetPlan) => {\n const { activePolicyGroup, activePolicyPlan } = this.state;\n\n document.getElementById(targetPlan) && activePolicyPlan !== targetPlan && this.setState({\n activePolicyPlan: targetPlan,\n }, () => {\n document.getElementById(activePolicyPlan).classList.remove('active');\n document.getElementById(targetPlan).classList.add('active');\n this.props.handleContractSelect(targetPlan, activePolicyGroup);\n })\n };\n\n renderOptionList = (optionListData) => {\n const { activePolicyPlan } = this.state;\n\n return optionListData.map(elem => {\n const activeClass = activePolicyPlan === elem.dataName ? 'active' : '';\n return (\n
this.handlePlanRadioSelect(elem.dataName)}>\n \n \n { elem.label }\n { elem.promotion && { elem.promotion } }\n
\n \n )\n }\n )\n };\n\n\n render() {\n\n const { contactInfoEmail, contactInfoPhone, currentCurrency, siteKey, toggleModal, advertisementStrategiesPrices } = this.props;\n const margin = { marginBottom: 0 };\n const isDk = siteKey === 'dk';\n const phoneNumber = isDk ? '(+45) 39 45 85 57' : contactInfoPhone;\n const advertisementPrices = advertisementStrategiesPrices['prices'];\n\n const providerDkContractOption =\n isDk\n ? [\n { dataName: 'basic', label: 'Basic - fra ' + advertisementPrices['basic']['0..249'] + ' kr.' },\n { dataName: 'basicPlus', label: 'Basic Plus - fra ' + advertisementPrices['basicPlus']['0..249'] + ' kr.' },\n { dataName: 'premium', label: 'Premium - fra ' + advertisementPrices['premium']['0..249'] + ' kr.' },\n { dataName: 'premiumPlus', label: 'Premium + - fra ' + advertisementPrices['premiumPlus']['0..249'] + ' kr.' }\n ]\n : [];\n\n const providerContractOption = [\n { dataName: 'noCureBasic', label: I18n.t('signup.new_form.plans.block1.nocure_pricer.basic') },\n ];\n\n const providerContractOptionMeetingRoom = [\n { dataName: 'annualRemoval',\n label: I18n.t('signup.new_form.plans.block1.meeting_room_pricer.annual_settlement_new', { price: localizedNumberFormatter(Number(advertisementPrices.meetingRoom.default)) }),\n promotion: I18n.t('signup.meeting_rooms.free_untill')\n },\n { dataName: 'annualRemovalPremium',\n label: I18n.t('signup.new_form.plans.block1.meeting_room_pricer.premium_new', { price: localizedNumberFormatter(Number(advertisementPrices.meetingRoomPremium.default)) }),\n },\n ];\n\n const providerContractOptionParkering =\n isDk\n ? [{ dataName: 'basic', label: `${localizedNumberFormatter(Number(advertisementPrices.parking.default))} kr.` }]\n : [];\n\n\n return (\n
\n
\n\n - \n
this.handleMainGroupRadioSelect('invoicing-policy-group') }>\n
\n
\n { I18n.t('signup.new_form.plans.block1.title_new') }\n
\n
\n\n \n
{ I18n.t('signup.payment_model_top_options_description') }
\n { isDk &&\n
\n \n { I18n.t('signup.new_form.plans.block1.basic_pricer.title') }\n toggleModal('basicPriceInfo')} size={22} />\n
\n { this.renderOptionList(providerDkContractOption) }\n
\n }\n
\n
\n \n\n - \n
this.handleMainGroupRadioSelect('coworking-policy-group') }>\n
\n
\n { I18n.t('apps.entry_page.entry_pages.show.lease.meeting_rooms') }\n
\n
\n\n \n
\n \n { I18n.t('signup.new_form.plans.block1.meeting_pricer.title') }\n toggleModal('coworkingInfo')} size={22} />\n
\n { this.renderOptionList(providerContractOptionMeetingRoom) }\n
\n
\n \n\n { isDk && (\n - \n
this.handleMainGroupRadioSelect('parkering-policy-group') }>\n
\n
\n { I18n.t('generic.parking') }\n
\n
\n\n \n \n )}\n\n
\n
\n { I18n.t('signup.new_form.plans.notes') }\n \n\n { isDk &&\n
\n
\n { I18n.t('signup.teaser.contacts.heading') }\n
\n\n
\n { phoneNumber &&\n
\n }\n
\n
\n\n
\n
\n { I18n.t('simple_form.labels.parking_lot.opening_hours') + ':' }\n
\n
\n { I18n.t('views.sessions.new.opening_hours_weekdays') } { isDk ? '09:00-16:30' : '09:00-17:00' }\n
\n
\n
\n }\n\n
\n )\n }\n}\n\nexport default PaymentModel;\n","import React, { Component } from \"react\";\nimport { withFormik } from 'formik';\nimport Yup from 'yup';\n\nimport { companyValidation, emailValidation, nameValidation, phoneValidation } from '../SharedComponents/Forms/ValidationSchemaPattern';\nimport SignUp from '../../utils/SignUp';\nimport PaymentModel from \"./PaymentModel\";\n\nimport './SignUpForm.sass';\n\n\nclass SignUpFormWrapper extends Component {\n\n state = {\n emailValueOnError: '',\n errorsOnSubmit: false,\n };\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n if (this.props.emailAlreadyExist !== prevProps.emailAlreadyExist && this.props.emailAlreadyExist) {\n this.setState({ emailValueOnError: this.props.emailAlreadyExist });\n const target = document.getElementById('emailErrorTarget');\n const targetCoords = Math.floor(target.getBoundingClientRect().top + window.pageYOffset - (document.getElementById('top-menu').offsetHeight + 48));\n\n window.scroll(0, targetCoords);\n }\n if (this.props.internalError !== prevProps.internalError && this.props.internalError) {\n const target = document.getElementById('internalErrorTarget');\n const targetCoords = Math.floor(target.getBoundingClientRect().top + window.pageYOffset - (document.getElementById('top-menu').offsetHeight + 48));\n\n window.scroll(0, targetCoords);\n }\n }\n\n handleSubmit = (e) => {\n e.preventDefault();\n\n if(Object.keys(this.props.errors).length) {\n this.setState({ errorsOnSubmit: true }, () => {\n const target = document.querySelector('.sign-up-form__form-group-error');\n const targetCoords = Math.floor(target.getBoundingClientRect().top + window.pageYOffset - (document.getElementById('top-menu').offsetHeight + 48));\n\n window.scroll(0, targetCoords);\n });\n } else {\n this.props.handleSubmit();\n }\n };\n\n handleContractSelect = (id, activeSection) => {\n const { hashedContracts, setFieldValue, setActiveContractValues } = this.props;\n\n setActiveContractValues(hashedContracts[id], id, activeSection);\n setFieldValue('contract_id', hashedContracts[id]);\n };\n\n errorValidator = (field) => {\n const { errors, touched } = this.props;\n const { errorsOnSubmit } = this.state;\n const fieldError = errors[field] && (touched[field] || errorsOnSubmit) && 'sign-up-form__form-group-error';\n\n return field === 'email'\n ? (this.props.emailAlreadyExist && 'sign-up-form__form-group-error') || fieldError\n : fieldError;\n };\n\n handleEmailError = (e) => {\n this.setState({ emailValueOnError: e.target.value }, () => {\n this.props.setFieldValue('email', this.state.emailValueOnError);\n this.props.handleEmailAlreadyExistError()\n });\n };\n\n\n render() {\n\n const {\n activeContract,\n contactInfoEmail,\n contactInfoPhone,\n currentCurrency,\n emailAlreadyExist,\n errors,\n handleBlur,\n handleChange,\n hashedContracts,\n internalError,\n setFieldValue,\n siteKey,\n toggleModal,\n values,\n advertisementStrategiesPrices,\n } = this.props;\n\n const { emailValueOnError } = this.state;\n const internalErrorStyle = { display: 'block', marginTop: '-15px' };\n\n return (\n
\n )\n }\n}\n\nconst {\n company_name,\n name,\n email,\n phone_number,\n fifth_element,\n contract_name,\n active_contract_section,\n} = SignUp.getClientInfo();\n\nconst SignUpForm = withFormik({\n mapPropsToValues: (bag) => {\n return {\n company_name,\n name,\n email,\n phone_number: phone_number ? phone_number : bag.userCountryPhoneCode,\n fifth_element,\n }},\n\n validationSchema: Yup.object().shape({\n company_name: companyValidation,\n name: nameValidation,\n email: emailValidation,\n phone_number: phoneValidation,\n }),\n\n handleSubmit: (values, bag) => {\n SignUp.updateClientInfo({ ...values, contract_name: bag.props.contractName, active_contract_section: bag.props.activeContractSection});\n bag.props.preSubmitHandler(values);\n },\n\n displayName: 'SignUpForm',\n})(SignUpFormWrapper);\n\nexport default SignUpForm;\n","import React, { Component } from \"react\";\nimport PropTypes from \"prop-types\";\nimport queryString from 'query-string';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { apiProvider } from '../../api/core';\nimport { loadTawkTo } from '../TawkTo/TawkTo';\nimport RequestCallModal from \"../SharedComponents/RequestCallModal\";\nimport Modal from \"./Modals\";\nimport SignUpForm from \"./SignUpForm\";\nimport ContinueRegistrationForm from \"./Modals/ContinueRegistrationModal\";\nimport MeetingRoomsInfoContent from \"./Modals/MeetingRoomsInfoContent\";\nimport TermsOfServiceContent from \"./Modals/TermsOfServiceContent\";\nimport BasicPriceContent from \"./Modals/BasicPriceContent\";\nimport NoCureInfoContent from \"./Modals/NoCureInfoContent\";\nimport BasicParkeringContent from './Modals/BasicParkeringContent';\n\nimport './index.sass';\n\n\nclass SignUp extends Component {\n\n state = {\n activeContractId: '',\n contractName: '',\n activeContractSection: '',\n emailAlreadyExist: false,\n internalErrorFirstStep: false,\n internalErrorSecondStep: false,\n registrationModalIsOpen: false,\n activeModal: {\n basicPriceInfo: false,\n noCureInfo: false,\n coworkingInfo: false,\n termOfService: false,\n basicParking: false,\n },\n };\n\n componentDidMount() {\n const { activeContract } = this.props;\n this.setState({\n activeContractId: activeContract && activeContract.contract.id,\n uuid: uuidv4(),\n });\n loadTawkTo(this.props.siteKey);\n }\n\n handleEmailAlreadyExistError = () => this.setState({ emailAlreadyExist: '' });\n\n preSubmitHandler = (params) => {\n\n const { company_name, email, name, phone_number } = params;\n\n delete params.fifth_element;\n\n const providerData = {\n provider:{\n company_name,\n name,\n email,\n phone_number,\n token: this.state.uuid,\n }\n };\n\n apiProvider.withOptions({ url: \"/signup_new_first_step\", method: 'post', data: providerData }, true)\n .then(response => {\n if (response && response.status === 'created') {\n this.setState({ registrationModalIsOpen: true, internalErrorFirstStep: false });\n } else if (response.error) {\n response.status >= 500\n ? this.setState({ internalErrorSecondStep: true })\n : this.setState({ emailAlreadyExist: params.email, internalErrorSecondStep: false });\n }\n });\n };\n\n submitHandler = (params, signUpFormUrl) => {\n let activeContractId = this.state.activeContractId;\n const strategy = activeContractId && this.props.contracts.filter(elem => elem.contract.id === activeContractId)[0].contract.invoicing_strategy;\n const { line_1, postal_code, city, country_alpha2, password } = params;\n\n queryString.parse(window.location.search).contract_name === 'parking' ? activeContractId = 9 : null;\n delete params.fifth_element;\n\n const providerData = {\n provider: {\n ...params,\n strategy,\n terms_of_service: '1',\n contract_id: activeContractId,\n password_confirmation: params.password,\n primary_contact_attributes: { password, password_confirmation: params.password },\n invoicing_policy_attributes: { contract_id: activeContractId, strategy },\n address_attributes: { country_alpha2, line_1, postal_code, city },\n token: this.state.uuid,\n },\n };\n\n apiProvider.withOptions({ url: signUpFormUrl, method: 'post', withCredentials: true, data: providerData }, true)\n .then(response => {\n // change path to welcome page\n // if (response.status === 'created') return window.location.href = '/new_providers/welcome';\n if (response.status === 'created') return window.location.href = response.redirect_path;\n\n if (response.error) {\n response.status >= 500\n ? this.setState({ internalErrorSecondStep: true })\n : this.setState({ emailAlreadyExist: params.email, internalErrorSecondStep: false });\n }\n });\n };\n\n toggleModal = (modal) => {\n this.setState({\n activeModal: {\n ...this.state.activeModal,\n [modal]: !this.state.activeModal[modal],\n }\n })\n };\n\n setActiveContractValues = (id, contractName, activeSection) => {\n this.setState({\n activeContractId: id,\n contractName: contractName,\n activeContractSection: activeSection,\n });\n };\n\n closeRegistrationModal = () =>\n this.setState({ registrationModalIsOpen: false });\n\n\n render() {\n\n const {\n activeContract,\n advertisementStrategiesPrices,\n contractDetailsOnDeal,\n contractDetailsOnDealBasic,\n contractDetailsOnDealPremium,\n contactInfoEmail,\n contactInfoPhone,\n contracts,\n countriesSelectOptions,\n currentCurrency,\n geocoderCountryCode,\n hashedContracts,\n siteKey,\n signUpFormUrl,\n userCountryPhoneCode,\n } = this.props;\n\n const { basicPriceInfo, noCureInfo, coworkingInfo, termOfService, basicParking } = this.state.activeModal;\n const activeContractData = this.state.activeContractId && contracts.filter(elem => elem.contract.id === this.state.activeContractId)[0].contract;\n const { activeContractSection, contractName, emailAlreadyExist, internalErrorFirstStep, internalErrorSecondStep, registrationModalIsOpen } = this.state;\n const advertisementStrategiesPricesPresent = advertisementStrategiesPrices && advertisementStrategiesPrices.prices;\n const parkingPrice =\n ( advertisementStrategiesPricesPresent &&\n advertisementStrategiesPrices.prices.parking &&\n advertisementStrategiesPrices.prices.parking.default)\n || 0;\n const meetingRoomPrice =\n ( advertisementStrategiesPricesPresent &&\n advertisementStrategiesPrices.prices.meetingRoom &&\n advertisementStrategiesPrices.prices.meetingRoom.default)\n || 0;\n const meetingRoomPremiumPrice =\n ( advertisementStrategiesPricesPresent &&\n advertisementStrategiesPrices.prices.meetingRoomPremium &&\n advertisementStrategiesPrices.prices.meetingRoomPremium.default)\n || 0;\n\n\n return (\n
\n
\n\n \n
\n\n { registrationModalIsOpen &&\n
this.toggleModal('termOfService')}\n userCountryPhoneCode={this.userCountryPhoneCode}\n />\n }\n\n { basicPriceInfo &&\n }\n />\n }\n\n { noCureInfo &&\n \n }\n />\n }\n\n { coworkingInfo &&\n \n }\n />\n }\n\n { basicParking &&\n \n }\n />\n }\n\n { termOfService &&\n }\n />\n }\n\n \n\n \n )\n }\n}\n\nexport default SignUp;\n\nSignUp.propTypes = {\n activeContract: PropTypes.shape({\n contract: PropTypes.object,\n }),\n siteKey: PropTypes.string,\n contracts: PropTypes.arrayOf(PropTypes.object),\n contractCoworkingYearly: PropTypes.shape({\n table: PropTypes.object,\n }),\n contractCoworkingYearlyPremium: PropTypes.shape({\n table: PropTypes.object,\n }),\n contractDetailsOnDeal: PropTypes.shape({\n table: PropTypes.object,\n }),\n contractDetailsOnDealBasic: PropTypes.shape({\n table: PropTypes.object,\n }),\n contractDetailsOnDealPremium: PropTypes.shape({\n table: PropTypes.object,\n }),\n countriesSelectOptions: PropTypes.array,\n hashedContracts: PropTypes.object,\n geocoderCountryCode: PropTypes.string,\n signUpFormUrl: PropTypes.string,\n};\n\n\nSignUpForm.defaultProps = {\n activeContract: {\n contract: {},\n },\n siteKey: '',\n contracts: [],\n contractCoworkingYearly: {\n table: {},\n },\n contractCoworkingYearlyPremium: {\n table: {},\n },\n contractDetailsOnDeal: {\n table: {},\n },\n contractDetailsOnDealBasic: {\n table: {},\n },\n contractDetailsOnDealPremium: {\n table: {},\n },\n countriesSelectOptions: [],\n hashedContracts: {},\n geocoderCountryCode: '',\n signUpFormUrl: PropTypes.string,\n};\n","class NumberFormatter {\n static floatSeperator = '.';\n\n constructor(delimiter, seperator) {\n this.delimiter = delimiter;\n this.seperator = seperator;\n }\n\n numberWithDelimiter(number) {\n let seperatedNumber = String(number).split(NumberFormatter.floatSeperator);\n seperatedNumber[0] = seperatedNumber[0].replace(\n /(\\d)(?=(\\d\\d\\d)+(?!\\d))/g,\n '$1' + this.delimiter\n );\n return seperatedNumber.join(this.seperator);\n }\n}\n\nexport default NumberFormatter;\n","import React, { Component } from 'react';\nimport { fetchSimilarLocations } from '../../utils/api';\nimport NumberFormatter from '../../utils/NumberFormatter';\nimport BaseSlider from '../SharedComponents/BaseSlider';\nimport LocationTemplate from '../SharedComponents/LocationTemplate';\n\nimport './index.sass';\n\n\nclass SimilarLocations extends Component {\n constructor(props) {\n super(props);\n this.state = {\n error: null,\n isLoaded: false,\n items: []\n };\n }\n\n componentDidMount() {\n const { similarLocationsEndpoint, similarLocationsList } = this.props;\n\n similarLocationsList && similarLocationsList.length > 0\n ? this.setState({ isLoaded: true, items: this.handleResult(similarLocationsList) })\n : similarLocationsEndpoint && this.renderSimilarLocations(similarLocationsEndpoint);\n }\n\n renderSimilarLocations(endPoint) {\n return fetchSimilarLocations(endPoint)\n .then(response => response.data)\n .then(responseJSON => {\n this.setState({\n isLoaded: true,\n items: this.handleResult(responseJSON),\n });\n })\n .catch(error => {\n this.setState({\n isLoaded: true,\n error,\n });\n });\n }\n\n handleResult(items) {\n for (let i = 0; i < items.length; i++) {\n items[i].first_spotlight_value_formatted = this.numberFormatter().numberWithDelimiter(\n items[i].first_spotlight_value\n );\n if (items[i].raw_kind === 'parking') {\n items[i].second_spotlight_value_formatted = items[i].second_spotlight_value\n } else {\n items[i].second_spotlight_value_formatted = this.numberFormatter().numberWithDelimiter(\n items[i].second_spotlight_value\n );\n }\n }\n items.length && this.props.handleInit && this.props.handleInit();\n return items;\n }\n\n numberFormatter() {\n return new NumberFormatter('.', ',');\n }\n\n render() {\n const { isLoaded, items } = this.state;\n\n const {\n comparableLocations,\n favouriteLocationsIds,\n locationAvailable,\n section,\n similarLocationsHeadline,\n similarLocationsParagraph,\n siteKey,\n updateComparableLocations,\n updateFavouriteLocations,\n } = this.props;\n\n const wrapperMargin = { marginBottom: locationAvailable ? '23px' : 0 };\n\n\n if (isLoaded && items.length > 0) {\n return (\n
\n
{ similarLocationsHeadline }
\n { similarLocationsParagraph &&
{ similarLocationsParagraph }
}\n
\n \n { items.map(item => (\n \n )) }\n \n
\n
\n )\n } else {\n return null\n }\n }\n}\n\nexport default SimilarLocations;\n","import React, { Component } from 'react';\nimport { SocialIcons } from '../SharedComponents/Icons';\nimport './index.sass';\n\n\nclass SocialMedia extends Component {\n sharePopUp = (url, w, h) => {\n let left, top;\n left = Math.max(screen.width / 2 - w / 2, 0);\n top = Math.max(screen.height / 2 - h / 2, 0);\n window.open(\n url,\n '_blank',\n 'toolbar=yes, location=yes, directories=no, status=no, menubar=yes, scrollbars=yes, resizable=no, copyhistory=yes, width=' +\n w +\n ', height=' +\n h +\n ', top=' +\n top +\n ', left=' +\n left +\n ''\n );\n return false;\n };\n\n handleClick = e => {\n const shareUrl = e.target.getAttribute('url') + window.location.href;\n const w = e.target.getAttribute('w');\n const h = e.target.getAttribute('h');\n this.sharePopUp(shareUrl, w, h);\n };\n\n render() {\n return (\n
\n {I18n.t('lb_showroom.detailed.social_share')}\n \n {SocialIcons.facebook}\n \n \n {SocialIcons.twitter}\n \n \n {SocialIcons.linkedin}\n \n
\n );\n }\n}\n\nexport default SocialMedia;\n","import React, { Component } from 'react';\nimport Flag from 'react-flags';\n\nimport './LanguageSwitcher.sass'\n\nconst customStyles = {\n overlay: {\n backgroundColor: 'rgba(0,0,0,0.5)',\n zIndex: '999',\n },\n content: {\n top: '50%',\n left: '50%',\n right: 'auto',\n bottom: 'auto',\n marginRight: '-50%',\n transform: 'translate(-50%, -50%)',\n padding: '20px',\n pointerEvents: 'visible',\n height: '80%',\n },\n};\n\n\nclass LanguageSwitcher extends Component {\n\n state = {\n isOpened: false\n };\n\n switchState = (e) => {\n if(this.node) {\n if(this.node.contains(e.target)) {\n this.setState({\n isOpened: !this.state.isOpened\n });\n\n return;\n }\n }\n\n this.setState({ isOpened: false });\n };\n\n componentDidMount() {\n document.addEventListener('click', this.switchState, false)\n }\n\n componentWillUnmount() {\n document.removeEventListener('click', this.switchState, false)\n }\n\n render() {\n const { availableLocalesLinks, currentLocaleCountry } = this.props;\n\n if (availableLocalesLinks && availableLocalesLinks.length > 0) {\n return (\n
\n
this.node = node} className='language-switcher__language-selected'>\n \n { I18n.t('generic.choose_your_language') }\n
\n { this.state.isOpened && (\n
\n )}\n
\n );\n } else {\n return (null);\n }\n }\n}\n\nexport default React.memo(LanguageSwitcher);\n","import React from 'react';\n\nimport './UnsupportedBrowserMessage.sass'\n\nconst UnsupportedBrowserMessage = ({ browserName, handleClose }) => {\n return (\n
\n
\n
\n
\n { `${ I18n.t('apps.lokalebasen_header.browser_message.title') } ${ browserName }`}\n
\n
\n { I18n.t('apps.lokalebasen_header.browser_message.message') }\n
\n
\n
\n
\n
\n )\n};\n\nexport default UnsupportedBrowserMessage;","export const findPos = (obj) => {\n let curtop = 0;\n if (obj.offsetParent) {\n do {\n curtop += obj.offsetTop;\n } while (obj = obj.offsetParent);\n return curtop\n }\n return undefined;\n};","export const numbersLandlords = (siteKey) => {\n let numbersMapped = {\n 'global': 2000,\n 'ch': 100,\n 'de': 350,\n 'dk': 1000,\n 'es': 350,\n 'fi': 100,\n 'no': 100,\n 'nl': 200,\n 'pl': 100,\n 'se': 350,\n 'gb': 500,\n 'ua': 250,\n 'be': 250,\n 'sg': 100,\n 'it': 250,\n 'fr': 250,\n 'lu': 100,\n 'in': 1000,\n 'hk': 150,\n };\n\n return numbersMapped[siteKey] ? numbersMapped[siteKey] : numbersMapped['global']\n}","class SignUp {\n constructor() {\n this.storageKey = 'my.sign_up_client';\n this.clientInfo = {\n fifth_element: '',\n company_name: '',\n ean: '',\n vat_id: '',\n line_1: '', //address\n country_alpha2: '',\n city: '',\n name: '',\n email: '',\n phone_number: '',\n postal_code: '',\n password: '',\n contract_id: '',\n contract_name: '',\n active_contract_section: '',\n };\n }\n\n getClientInfo() {\n if (localStorage && !!localStorage.getItem(this.storageKey)) {\n const storageObj = JSON.parse(localStorage.getItem(this.storageKey));\n this.clientInfo = { ...this.clientInfo, ...storageObj };\n }\n return this.clientInfo;\n }\n\n updateClientInfo(clientUpdatedInfo) {\n if (localStorage) {\n const { company_name, ean, vat_id, line_1, country_alpha2, city, name, email, phone_number, password, postal_code, contract_id, fifth_element, contract_name, active_contract_section } = clientUpdatedInfo;\n const updatedClientObj = {\n ...this.clientInfo,\n ...{ company_name, ean, vat_id, line_1, country_alpha2, city, name, email, phone_number, password, postal_code, contract_id, fifth_element, contract_name, active_contract_section },\n };\n let clientInfoString = JSON.stringify(updatedClientObj);\n localStorage.setItem(this.storageKey, clientInfoString);\n }\n }\n\n getI18nAttrNames() {\n return {\n companyI18n: I18n.t('generic.company'),\n eanI18n: I18n.t('signup.new_form.register.ean.placeholder'),\n vat_idI18n: I18n.t('signup.new_form.register.vat_id.placeholder'),\n line_1I18n: I18n.t('signup.new_form.register.line_1.placeholder'),\n postal_codeI18n: I18n.t('signup.new_form.register.postal_code.placeholder'),\n countryI18n: I18n.t('apps.lease.goto.types.country'),\n cityI18n: I18n.t('signup.new_form.register.city.placeholder'),\n nameI18n: I18n.t('signup.new_form.register.name.placeholder'),\n emailI18n:I18n.t('signup.new_form.register.email.placeholder'),\n phoneI18n: I18n.t('signup.new_form.register.phone_number.placeholder'),\n passwordI18n: I18n.t('signup.new_form.register.password.placeholder'),\n };\n }\n\n setCountryPhone() {}\n}\n\nexport default new SignUp();\n","import { postLocationShown } from './api';\n\nclass Storage {\n constructor() {\n this.locationViewedKey = 'my.viewed_locations';\n this.locationOrderedKey = 'my.ordered_locations';\n this.locationShowcaseKey = 'my.ordered_showcase';\n this.locationContactKey = 'my.contact_locations';\n }\n\n static timestamp() {\n return { timestamp: new Date().toISOString() };\n }\n\n populateStorageItems(key) {\n if (!!localStorage) {\n if (!!localStorage.getItem(key)) {\n this[`${key}Obj`] = JSON.parse(localStorage.getItem(key));\n } else {\n this[`${key}Obj`] = {};\n localStorage.setItem(key, '{}');\n }\n }\n }\n\n isLocationViewed(itemId) {\n // --> TODO: cahnge this to be functional\n this.itemId = itemId;\n this.viewedLocations = localStorage && localStorage.getItem(this.locationViewedKey);\n\n //if (this.viewedLocations != undefined && JSON.parse(this.viewedLocations)[this.itemId] == undefined) {\n postLocationShown(this.itemId)\n //}\n\n this.populateStorageItems(this.locationViewedKey);\n this.updateViewedItem();\n return (\n Object.keys(this[`${this.locationViewedKey}Obj`]).indexOf(this.itemId) !== -1\n );\n }\n\n isLocationOrdered(itemId) {\n // --> TODO: cahnge this to be functional\n let orderLocation;\n let orderedDate;\n let todayDate = new Date();\n let oneWeekAgoDate = new Date(todayDate.getTime() - (60*60*24*7*1000)); // one week ago\n this.itemId = itemId;\n this.populateStorageItems(this.locationOrderedKey);\n orderLocation = localStorage && JSON.parse(localStorage.getItem(\"my.ordered_locations\"))[this.itemId];\n\n if (orderLocation) {\n orderedDate = new Date(orderLocation[0].timestamp);\n\n return oneWeekAgoDate < orderedDate;\n } else {\n return false // location not yet ordered\n }\n }\n\n isShowcaseOrdered(itemId) {\n // --> TODO: cahnge this to be functional\n this.itemId = itemId;\n this.populateStorageItems(this.locationShowcaseKey);\n return (\n Object.keys(this[`${this.locationShowcaseKey}Obj`]).indexOf(\n this.itemId\n ) !== -1\n );\n }\n\n isContactOrdered(itemId) {\n // --> TODO: cahnge this to be functional\n const locationObj = this[`${this.locationContactKey}Obj`] || null;\n\n this.itemId = itemId;\n this.populateStorageItems(this.locationContactKey);\n\n if (locationObj) {\n return (\n Object.keys(this[`${this.locationContactKey}Obj`]).indexOf(\n this.itemId\n ) !== -1\n );\n }\n };\n\n updateViewedItem() {\n this[`${this.locationViewedKey}Obj`][this.itemId] = [\n this.constructor.timestamp(),\n ];\n const viewedLocationStr = JSON.stringify(\n this[`${this.locationViewedKey}Obj`]\n );\n localStorage.setItem(this.locationViewedKey, viewedLocationStr);\n }\n\n updateOrderedItem() {\n // --> TODO: cahnge this to be functional\n this[`${this.locationOrderedKey}Obj`][this.itemId] = [\n this.constructor.timestamp(),\n ];\n const orderedLocationStr = JSON.stringify(\n this[`${this.locationOrderedKey}Obj`]\n );\n localStorage.setItem(this.locationOrderedKey, orderedLocationStr);\n }\n\n updateContactItem() {\n // --> TODO: cahnge this to be functional\n this[`${this.locationContactKey}Obj`][this.itemId] = [\n this.constructor.timestamp(),\n ];\n const orderedLocationStr = JSON.stringify(\n this[`${this.locationContactKey}Obj`]\n );\n localStorage.setItem(this.locationContactKey, orderedLocationStr);\n }\n\n updateShowcaseItem() {\n // --> TODO: cahnge this to be functional\n this[`${this.locationShowcaseKey}Obj`][this.itemId] = [\n this.constructor.timestamp(),\n ];\n const orderedLocationStr = JSON.stringify(\n this[`${this.locationShowcaseKey}Obj`]\n );\n localStorage.setItem(this.locationShowcaseKey, orderedLocationStr);\n }\n}\n\nexport default new Storage();\n"],"names":["map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","describe","props","breadcrumbs","label","path","wrapper","shallow","React","Breadcrumb","it","expect","find","length","toBe","at","href","toEqual","text","wrapper_blank","ModalGetInfoFormMobile","_Component","_inherits","_super","_createSuper","_this","_classCallCheck","_len","arguments","args","Array","_key","call","apply","concat","_defineProperty","_assertThisInitialized","isShowingModal","isSubmitting","validateForm","then","resolved","entries","errors","setState","handleBlur","_createClass","key","value","_this$props","this","values","touched","handleChange","handleSubmit","contactOrdered","state","noErrors","askLandLordButton","mainText","I18n","t","infoSentText","buttonText","buttonIcon","Loader","size","left","top","className","onSubmit","noValidate","type","name","fifth_element","onPaste","onChange","onBlur","handleFieldBlur","error","email","phone","company","resize","comment","onClick","handleSendingData","Component","_Client$getClientInfo","Client","getClientInfo","option_parking_lots","emailI18n","getI18nAttrNames","_Client$getI18nAttrNa2","getI18nAttrNamesMobileModalForm","fullName","phoneNumber","companyName","messageI18n","i18nRequiredStartKey","i18nSymbolsLimitErrorMessage","symbols_limit","i18nSymbolsEmailLimitErrorMessage","i18nAtLeast8Digits","GetInfoFormMobile","withFormik","mapPropsToValues","bag","validationSchema","Yup","shape","matches","validationPatterns","symbolsLimit","required","field","symbolsEmailLimit","min","test","createError","replace","message","updateClientInfo","submitHandler","displayName","customStyles","overlay","backgroundColor","zIndex","padding","content","right","bottom","marginRight","transform","pointerEvents","height","border","borderRadius","_useContext","useContext","Context","contactPath","locationId","locationUuid","modalFormOpen","setContactOrdered","setModalFormOpen","setUpdateAskLandlord","switchSelectedOrderForm","visitorToken","_useState","useState","_useState2","_slicedToArray","modalIsOpen","setModalIsOpen","locationOrdered","Storage","isLocationOrdered","Fragment","InfoModal","handleClose","Modal","ariaHideApp","isOpen","onRequestClose","shouldCloseOnOverlayClick","style","SvgIco","params","user_token","contactProvider","response","updateContactItem","window","location","data","confirmation_page_url","catch","console","prevState","nearbyLocationsLink","similarLocationsLink","width","target","_ref","combinedLocations","isRentIncludeOperationalCost","lease","kind","area","yearlyPricePerM2","addressLine1","contact","siteKey","streetName","isContactsShown","setIsContactsShown","_useState3","_useState4","contactEmail","setContactEmail","address","encodedEmail","iv","CryptoJS","Base64","parse","tag","Utf8","decrypt","ciphertext","mode","CBC","toString","postLocationContactDetailsShown","log","locationClosed","locationContactDetails","partnerBadgeUrl","available","owner","provider","ProviderBadgeSection","partnerBadge","alt","photo","PersonPlaceholder","SmallContactBlock","logo","title","info","postLocationProviderAdvertsShown","dangerouslySetInnerHTML","__html","advertLink","partner","activeTranslatedDescription","setTranslatedDescription","isRequestFromPrerender","_useContext$tabs","tabs","originalDescription","translatedDescriptions","readMore","setReadMore","showOriginalDescription","textLength","description","DescriptionTopMenu","slice","locales","translated","locale","substring","document","addEventListener","hasSomeParentTheClass","switcherClassName","showLocaleSwitcherItems","activeLocale","localesExceptActive","availableLocales","filter","item","setActiveTranslatedDescription","desc","getTranslatedDescription","undefined","translateDescriptionWithGoogle","originalDesc","originalLocale","localeFrom","simplifyLocale","translateDescription","res","push","country","getOriginalLocale","showLocaleSwitcher","isShowingScrapedInfo","clickOutside","_this2","_this$state","toggleLocaleSwitcherItems","index","checked","localesClickHandler","htmlFor","sourceLanguage","googleTranslate","Contacts","DescriptionSection","translatedDescription","showContactsSection","Description","Suspense","fallback","activeKey","columnWrapperClass","handleClick","sectionHeadline","sectionClasses","isMobile","Accordion","defaultActiveKey","Card","Header","Toggle","as","variant","eventKey","Collapse","EconomySection","areaUnit","facts","linkToDisposalPriceInfo","rentedOut","scrollToForm","section","temporarilyUnavailable","economyText","setEconomyText","openAnnualPrice","setOpenAnnualPrice","_useState5","_useState6","openPricePerSquareMeter","setOpenPricePerSquareMeter","_useState7","_useState8","openPricePerHour","setOpenPricePerHour","economy","smartText","disposalPrice","pricePerHour","pricesPerM2","pricesPerYear","price","smartTextEconomy","pricePerM2Present","pricesPerYearPresent","textLines","innerWidth","isDisposalRender","parseInt","showPricePerHour","i18nPricePerHour","i18nAnnualPrices","leftColumnClasses","classNames","leftColumnTitle","askProviderLink","formWrapper","getElementById","classList","remove","setTimeout","add","rightColumnContent","toUnderscore","leftColumnContent","pricePerHourContent","SmartTextTooltip","Truncate","lines","ellipsis","children","SectionRow","ReactTooltip","place","effect","defaultProps","facility","facilities","factAndFacilities","transport","distances","postalDistrict","postalName","icon","unit","DistancesListItem","lazyload","iconPathHandler","iconName","require","backgroundImage","distance","FacilitiesListItem","groupName","items","iconSvg","ParkingListItem","parkingIcon","url","showAllParkings","anonymous","suitableFor","_useContext$tabs$faci","buildRoute","energyRating","energyCertificateLevels","exemptedEnergy","nearbyParkingLots","smartTextFacilities","facilityText","setFacilityText","showAllFacilities","setShowAllFacilities","showAllDistances","setShowAllDistances","showMoreParkings","setShowMoreParkings","collapseDistances","visibleDistancesList","collapsedDistancesList","collapseFacilities","visibleFacilitiesList","collapsedFacilitiesList","collapsedParkings","visibleParkingsList","showMoreLinkText","showMore","showMoreLink","showAll","handleShow","energyCertificateIconHandler","districtUrl","kinds","count","toUpperCase","ExemptedEnergyRatingIcon","certificate","certificateName","src","CollapsibleSection","uncollapse","classes","elem","shortLabel","FixedNavigationBar","_React$PureComponent","activeSection","initialization","isScrollable","navigationListLeftBorder","navigationListRightBorder","showLeftArrow","showRightArrow","topOffset","recalculateNavigationTop","offsetHeight","navigationListFirstChild","navigationLinksList","firstChild","navigationListLastChild","lastChild","Math","round","getBoundingClientRect","handleArrowAppearance","handleNavigationTop","targetName","targetSection","targetRightCoodrs","targetLeftCoords","navigationListRightCoords","navigationListLeftCoords","scrollToRightTarget","scrollToLeftTarget","handleActiveSectionChange","leftBoundary","rightBoundary","scrollToTarget","scrollLeft","offsetWidth","targetLeftScroll","handleHorizontalScroll","removeEventListener","prevProps","snapshot","_this3","showMap","showOrderFormButton","showNavigationMenu","showSimilarLocations","similarLocationsHeadline","showRichSnippets","checkEconomySectionPresent","_this$state2","wrapperTop","ref","el","similarLocations","faq","handleLeftScroll","KeyboardArrowLeftRounded","handleRightScroll","KeyboardArrowRightRounded","VirtualTour","DetailsMapWrapper","activeGallerySection","_useContext$assets","assets","photos","floorPlans","videos","googleApiKey","_useContext$location","latitude","longitude","orientationHorizontalMobile","setOrientationHorizontalMobile","useEffect","isTablet","innerHeight","handleOrientationChange","ImageGalleryWrapper","isDefault","webkitallowfullscreen","mozallowfullscreen","allowFullScreen","frameBorder","isGalleryComponent","Landscape","InteriorDesignBanner","activeSlide","targetTop","targetCoords","floor","scrollY","scroll","Portal","itemType","originalFull","isFullScreen","Label","isActive","_objectWithoutProperties","_excluded","assign","DetailedViewSet","_ref2","counters","switchGallerySection","sorted","virtualTour","forEach","pills","properties","renderPills","InfoBadges","FullscreenGallery","MobileGallery","isScraped","locationRented","missingImagesUrl","setActiveSlide","fullscreenIsOpen","setFullscreenIsOpen","photosCount","useMemo","closedMonth","showNewBanner","specialOffer","closedMonthLiteral","mappedMonths","showBadges","isSaleLocation","enableFullscreen","handleOpenFullscreen","slideIndex","body","infoBadges","crawledBottomText","isCrawled","isRentedOut","isNew","rentedOutLabel","sale","wrapperClass","GalleryImage","withBadges","original","gallery","isMobileOnly","columnsCount","isFullScreenMobile","bannerClasses","handleLandscapeClick","open","landscapeImage","SLIDES","image","EmblaCarousel","carouselName","slides","options","loop","virtualTourOpen","assetsData","setAssetsData","updatedAssets","_objectSpread","showInteriorDesignForm","assetsObj","assetContainerClasses","AssetBlock","GallerySwitcher","InfoNotice","CompareIcon","SpaceCalculator","allKinds","comparableLocations","favouriteLocationsIds","setFavouriteLocationsIds","updateComparableLocations","showAllKinds","setShowAllKinds","persons","showEmployees","visibleKinds","reducedKinds","disposal","sectionTitle","badgesWrapperClasses","bottomBorderClasses","verifiedLabel","pricePerYearM2","pricePerYear","InfoCell","showUnit","isPersons","isArea","tooltip","noticeKind","root","tooltipPosition","withLabel","FavouriteIcon","favoriteLocations","isDetailView","updateFavouriteLocations","ids","pageYOffset","CombinedLeases","SameAddressLocations","BaseSlider","LocationTemplate","SimilarLocations","newSearchAgentPath","richSnippetQuestions","richSnippetQuestionsTitle","sectionType","setComparableLocations","setShowSimilarLocations","similarLocationsEndpoint","viewedLocations","updateViewedLocations","setActiveSection","locationsWithSameAddress","setLocationsWithSameAddress","showNavigationMenuState","setShowNavigationMenuState","scrollTargetsRefs","descriptionRef","useRef","factsRef","economyRef","mapRef","similarLocationsRef","faqRef","postalDistrictId","retrievedFavouriteLocations","localStorage","getItem","retrievedComparableLocations","JSON","apiProvider","getAll","showNavigation","current","debounce","handleActiveAreaSection","sectionsList","querySelectorAll","viewPortBottomBorder","node","nodeName","dataset","nodeTop","nodeBottom","endOfScroll","richSnippetsAvailable","filteredViewedLocations","viewed","showViewedLocations","viewedLocationsWrapperClasses","FactsAndFacilities","MapSection","handleInit","infinite","withDots","component","uuid","SearchAgentBanner","page","searchAgentHeadline","searchAgentText","FAQSection","locationAddress","UnavailableLocationIcon","host","ParkingMarkerMap","staticMapUrl","smartTextLocation","geography","isMapHovering","setIsMapHovering","locationText","setLocationText","staticImageAvailable","setStaticImageAvailable","img","Image","handleMapMouseHover","background","onMouseEnter","onTouchStart","position","objectFit","coordinates","countryAlpha2","orderedLocations","setOrderedLocations","windowWidth","setWindowWidth","handleWindowWidth","checkOrderedLocation","setItem","stringify","ListViewItems","hideMap","locationData","GridViewItem","borderColor","VirtualTourForm","preventDefault","isSubmittingOrder","setFieldValue","infoForm","trimStart","disabled","_Client$getI18nAttrNa","nameI18n","companyI18n","phoneI18n","i18nRequiredKey","Form","isJeudan","jeudan_policy","when","is","oneOf","orderPath","setUpdateOrderForm","showcaseOrdered","updateVirtualTourForm","isOrdered","setIsOrdered","setIsSubmittingOrder","formHasBeenSent","setFormHasBeenSent","submitFormHandler","placeOrder","updateOrderedItem","AskProviderModalForm","ClosedLocationBanner","LocationUnavailable","OrderForm","createContext","DetailedViewHeader","apiCreateOrderPath","apiShowcasePath","locationAvailable","locationIsClosed","setActiveGallerySection","isContactOrdered","_useState9","_useState10","setLocationOrdered","_useState11","_useState12","mapSectionOpen","setMapSectionOpen","_useState13","_useState14","_useState15","_useState16","selectedFormOption","setSelectedFormOption","_useState17","isShowcaseOrdered","_useState18","setShowcaseOrdered","_useState19","_useState20","setViewedLocations","_useState21","_useState22","setVirtualTourOpen","_useState23","_useState24","updateOrderForm","_useState25","_useState26","setUpdateVirtualTourForm","_useState27","_useState28","updateAskLandlord","_useState29","_useState30","loadTawkTo","preventResizeObserverError","targetElem","getViewedLocations","viewedLocationsIds","httpService","getLocationsByIds","contextProps","showCasePath","option","locationIdStr","retrievedViewed","indexOf","pop","unshift","Provider","ErrorBoundary","GallerySection","InfoSections","ToTheTopBtn","DataProtectionModal","NewsletterWidget","specialCharacktersNotMoreThan","atLeastOneLetter","newsletterSubmitHandler","hideSubmitError","resubscribeLink","submitError","submitSuccess","setIsShowingModal","autoComplete","ModalLoader","ErrorModalDialog","errorName","errorInfo","didCatchError","onAfterOpen","afterOpenModal","contentLabel","subtitle","componentStack","AdditionalOption","headline","linkContent","buttonColor","gridClasses","FavoritesItem","isActiveInfoForm","showServerErrorMessage","isLoading","orderId","orderUrl","orderInfoListViewForm","order_uuid","constructor","timestamp","updateOrderedLocation","sendTrovitLead","ctrlKey","metaKey","parentNode","getAttribute","sessionStorage","history","scrollRestoration","_this$props2","currency","handleSelect","hidePrice","isInternal","isSelected","nearbyParkingLot","photoAlt","photoUrl","postalCodeAndName","rawKind","providerName","secondaryKinds","shownAsRentedOut","showNewBadge","imgStyle","rentedOutMonth","showSearchOfferModal","handleItemClick","role","includes","handleOpenInfoForm","GetInfoFormModal","gtmClass","handleCloseInfoForm","parkingCheckbox","infoHandlerSubmit","SearchOfferModal","apiCreateOrderDetailsPath","locationKind","Date","toISOString","favoritesList","handleActiveSection","removeFromFavorite","showSwitchers","leasesTabClasses","salesTabClasses","spinner","address_line_1","closed_month","price_and_area_facts","is_internal","nearby_parking_lot","order_path","photo_alt","photo_url","postal_code_and_name","provider_name","raw_kind","secondary_kinds","show_new_badge","shown_as_rented_out","special_offer","temporarily_unavailable","StickyBar","previousScrollY","showStickyBar","currentScrollY","clientHeight","handleStickyBarRender","Sticky","bottomBoundary","innerZ","enabled","FavoritesPage","selectButtonsOpen","deleteButtonsOpen","isFormLoading","leaseLocationsIds","saleLocationsIds","leaseLocations","saleLocations","leaseSelected","saleSelected","currentLocationsIds","newFavouriteIds","handleFavoriteLocationsCounter","availableSection","requestData","_this$setState3","retrievedFaves","favouriteLocations","selectedGroup","updatedList","updatedStorageList","_this$setState4","updatedSelectedLocation","_toConsumableArray","selectedIndex","splice","buttonsGroup","handleClickOutside","buttonsWrapper","contains","uuids","locationsAvailableForOrder","selectedLocationsIds","favouriteLocationsList","selectedLocationsList","selectedLocationsCount","locationsCount","showLocationsList","locations_count","handleOpenButtonsDropdown","selectAll","deselectAll","cleanAllFavoriteLocations","FavoritesList","isMultiple","locations","multipleOrderSubmit","EmptyPage","contacts","footerBottom","addressLine","postalCodeCity","showCvr","cvr","copyrightUrl","logoUrl","siteLinks","socialLinks","sslLink","supportUrl","link","footer_site_link","SslSecureLogo","getFullYear","footerBoxes","box","footer_box","Markdown","Footer","trustedLogos","trustedLogosUrl","TrustLogos","FooterLinks","FooterBottom","trustedLogosL","backgroundSize","backgroundPosition","crawledFallbackImage","defaultGalleryOptions","lazyLoad","showPlayButton","showBullets","showThumbnails","Gallery","images","thumbnailAlt","thumbnail","thumbnailClass","originalAlt","originalClass","addClass","isFullscreen","fullscreenBtn","querySelector","hidePhotoesIndex","fullScreenOpened","isIOS","Boolean","showInteriorDesignBanner","isLastImage","getCurrentIndex","fullScreen","imagesLength","assetsContainer","handleShowIndex","wrapperId","imageWrapper","activeImage","getElementsByTagName","noFullScreen","hideIndex","setImages","notAvailableFullScreen","onLoad","handleImageOrientation","CrawledLocationImg","other","_classNames","actionIcons","abTestFixedCta","showFullScreenBtn","galleryWrapperClasses","galleryClasses","ImageGallery","renderFullscreenButton","renderItem","_renderItem","bind","renderCustomControls","_renderCustomControls","getOptions","additionalClass","renderRightNav","renderLeftNav","showIndex","handleShowFullScreen","onScreenChange","handleFullScreen","onBeforeSlide","handleOnSlide","disableKeyDown","disableArrow","BenefitsMobile","activeTab","wrapperName","toggle","benefits","virtualTourUrl","from","benefit","toggleDropdownTrigger","BenefitsSection","elm","openPopupWidget","ContactsSection","contactInfoEmail","contactInfoPhone","advertisementStrategiesPrices","contractDetails","contractLink","signupFormPath","settings","adaptiveHeight","arrows","dots","nextArrow","prevArrow","slidesToShow","slidesToScroll","annualRemoval","Slider","TableContent","annual","meetingRoomContracts","prices","meetingRoom","default","rate","tabInfo","tabDataBot","basic","annualRemovalPremium","meetingRoomPremium","premium","contractName","parking","parkering","Phone","Email","overflow","openThankModal","closeTimeoutMS","ThankYouIcon","customStylesMobile","GetContactModalForm","openContactModal","privacyPolicyPath","mobileOrTablet","inputClassBuilder","fieldName","alertErrorIcon","openCollapseMenu","formSent","updateSliderHeight","bodyFormData","FormData","append","post","contactUsFormPath","danishInfoFullPriceList","dropDownPrices","payPerShow","priceSection","checkRate","greenTopLine","enterprise","headerImage","headerText","headerTextLease","linksLease","linksLeaseDk","linksPayPerShow","selectLinks","headertext","shift","textTopGreenLine","closeModalForm","subhead","head","subhead_text_dk_annouce","subhead_text","ContactBlock","heading","onDealBasicPrice","in","openEnterpriceModal","FormSentModalThankyou","ContractsTop","changeState","isDesktop","slider","forceUpdate","strategy","priceTemplate","strategy_prices","obj","contractDetailsBot","formAuthToken","priceDetails","payPerAdvertisementContracts","priceDetailsPremiumPlus","premiumPlus","isDk","basicPayPerShowTable","fillPrices","tabData","basicNoCure","basicPlusPayPerShowTable","basicPlus","basicNoCurePlus","premiumPayPerShowTable","noCurePremium","enterprisePayPerShowTable","basicLeaseTable","noCureNoPayContracts","noCureBasic","enterpriceLeaseTable","noCureEnterprice","changeActiveTab","PaymentTeasers","ProvidersSection","quantity_of_leases","i18nInvalidAddressInput","i18nTooManySimilarSymbols","i18nAtLeastOneLetterIsRequired","ContactForm","isAdviceForm","currentValues","TeaserBlocks","adviceFormIsOpen","realEstateAgentFormIsOpen","thankYouModalIsOpen","modalFormIsOpen","_this$setState","getHelpFormPath","findAgentFormPath","TeaserImgLeft","SeePricesIcon","LogoDk","TeaserImgCenter","openModalForm","GetOfferIcon","TeaserImgRight","ContactUsIcon","RealEstateProvidersLogos","testimonial","authorImg","authorInfo","authorName","companyLogo","testimonials","SlickArrowLeft","currentSlide","slideCount","SlickArrowRight","_excluded2","responsive","breakpoint","TestimonialBlock","TopBanner","AdvBannerDk","CalendlyBlock","ContractsBottom","ListOffice","trustpilotWidget","trustPilotLocale","checkTurkish","Testimonials","TrustBoxContainer","topContracts","bottomContracts","bottomContractForLink","RequestCallModal","dkFullLinksList","bottomText","basic_plus","DropdownSelector","isOpened","event","tagName","wrapperRef","arrayIncludesObject","selectedData","placeholder","selectedCounterPhrase","showCount","showOnlyCountPlaceholder","charAt","itemsArray","selectAction","itemIsSelected","textTransform","dynamicData","isMobileMenu","dropdownBody","generateDropdownBody","triggerClasses","setWrapperRef","renderPlaceholder","join","energyRatings","handleEnergyRatingSelect","requestParams","selectedEnergyRatings","setRequestParams","setSelectedEnergyRatings","energy_rating","energyRatingsOptions","updatedRatings","optionSelectedIndex","prevParams","FacilitiesFilter","clearFacilities","toggleClearFacilitiesFilter","applyFacilitiesFilters","facilitiesList","selectedFacilities","setSelectedFacilities","facilitiesFilterOpen","setFacilitiesFilterOpen","currentSelectedFacilities","setCurrentSelectedFacilities","showMoreIsOpen","setShowMoreIsOpen","filterWrapper","handleApplyFilters","toggleFacilitiesFilter","currentState","handleFacilitiesOpenClick","applyAllFiltersButtonMobile","handleSelectAllFacilities","newList","filterIsOpen","selectedFacilitiesCount","selectedFacilitiesNames","listItem","dynamicList","currentFacilities","showShowMoreLink","valueIndex","handleFacilitiesCheckboxClick","scrollIntoView","_ref$advertismentData","advertismentData","image_text","image_text_bottom","text_on_button","mapIsOpen","rootPath","signupTeaserPath","siteLogoPath","handleListItemClick","DescriptionLine","showMorePhotos","showEnergyRatingTooltip","showPersonsTooltip","abTestParam","stopPropagation","tooltipRef","tooltipShowState","hide","show","hoveredLocationId","setHoveredLocationId","infoSent","userCountryPhoneCode","address_line1","address_title","exempted_energy","is_increased_in_listview","postal_code","postal_name","presenter","price_decrease_percentage","provider_logo","show_full_address","show_price_decrease_label","street_name","suitable_for_kinds","monthly_rent_price","all_photos","first_3_photos","premiumOnlyDK","locationKinds","suitableForItem","locationKindsLength","energyRatingMark","toLowerCase","energyRatingLabel","persons_label","persons_tooltip","formatted_monthly_rent_price","monthly_rent_label","showInfoBadges","getInfoFormGrid","sliderClasses","crawled","styles","itemStyle","iconsBlockStyle","justifyContent","carouselStyle","disableScroll","onMouseLeave","handleMouseLeave","hideCrawledBottom","handleSlideChange","handleTooltip","EnergyRatingRef","afterHide","color","marginTop","area_label","PersonsTooltipRef","display","promotedLInk","provider_url","GridViewSearchAgent","GridViewAdvertisment","keywords","locationsByPostalDistricts","mapOptions","advertisement","NearbyLocationsBanner","grid","search_agent","checkDk","searchAgentBanner","text_above_button","advertismentClass","mainWrap","additionalFormPadding","offset","dataProtectionIsOpen","dataLayer","eventCategory","eventAction","indexing_prohibited","provider_partner","descriptionLines","suitableForList","kindsCountToShow","addressOrStreet","getInfoForm","descriptionClasses","locationClasses","descriptionWrapperClasses","metricsWrapperClasses","rel","r","descriptionStyle","showCopyright","promotedLink","ListViewSearchAgent","ListViewAdvertisment","ListViewItemsList","dynRemarketingId","trackDynamicRemarketing","locationsIds","dynRemData","send_to","listing_id","listing_pagetype","gtag","InfoWrapper","forwardRef","activePlaceId","setActivePlaceId","markerFullInfo","setMarkerFullInfo","windowPosition","setWindowPosition","markersInfo","setMarkersInfo","pos","locationsParamsIds","idsList","sameMarker","every","marker","close","onInfoToggle","useImperativeHandle","InfoWindow","onUnmount","MarkersList","markers","MarkerContent","markerData","clusterer","handleActiveMarker","noClustererRedraw","hovered","setHovered","markerRef","lat","lng","Marker","onMouseOver","onMouseOut","metadata","pinHover","pin","scaledSize","anchor","x","y","boundsTrigger","closeInfoWindow","markersArray","activeCluster","setActiveCluster","infoWindow","clusterWrapper","highlightCluster","clusterIcon","div","currentCluster","clusters","markerClusterer","getClusters","cluster","getMarkers","markersData","lon","MarkerClusterer","averageCenter","enableRetinaIcons","maxZoom","gridSize","clusterClass","MapMarker","showFullAddress","showToolTip","setShowToolTip","imageUrl","primary_photo_2x","area_icon","priceLabel","closedMonthName","updatedTranslation","parsedLocImageStyle","imageStyle","CrawledBadge","RentedOutBadge","month","AnonymousBadge","Tooltip","tooltipContent","tooltipSuitableForOnly","_markers$","boundsTimer","containerStyle","getLocationsByCoords","mapLoaded","loaded","setBoundsTrigger","currentMarkersArray","setCurrentMarkersArray","googleMap","setGoogleMap","mapDragged","setMapDragged","mapZoomed","setMapZoomed","mapBounds","setMapBounds","mapMarkersUrl","updateTrigger","boundsMap","useCallback","requestBuilder","currentMarkers","currentMap","clearTimeout","google","bounds","maps","LatLngBounds","extend","LatLng","getNorthEast","equals","getSouthWest","extendPoint1","extendPoint2","fitBounds","newMarkers","_marker$location","LoadScript","googleMapsApiKey","GoogleMap","mapContainerStyle","mapContainerClassName","zoom","onDragStart","onIdle","changeCoords","googleMapBounds","getBounds","ne","sw","viewport_string","searchData","postal_districts","onDragEnd","onZoomChanged","gestureHandling","mapStyles","scrollwheel","mapTypeControl","fullscreenControl","panControl","streetViewControl","MapWrapper","ProviderLogo","providerLogo","ProviderPartner","MapIcon","_ref3","toggleMap","parent","noticeWrapper","parentElement","_ref4","nearbyLocationsBanner","LokalebasenLogo","MatchofficeLogo","SuitableForFilter","clearSuitableFor","toggleClearSuitableForFilter","applySuitableForFilters","selectedSuitableFor","setSelectedSuitableFor","suitableForStructuredTypes","setFilterIsOpen","currentSelectedSuitableFor","setCurrentSelectedSuitableFor","showSuitableFor","setShowSuitableFor","currentSuitableForList","setCurrentSuitableForList","showSuitableForFunctionality","handleSuitableForList","newSuitableForList","sortedSuitableForByKinds","suitableForKind","sort","a","b","localeCompare","toggleFilter","handleFilterOpenClick","newData","suitable_for","showFilter","selectedSuitableForLabels","handleFilterCheckboxClick","MainInfoColumns","LogoMO","accessor","Cell","cell","_cell$row$original","row","EconomyColumns","monthly_price","price_per_hour","prices_per_m2","price_per_year","electricity_per_m2_per_year","heating_per_m2_per_year","operational_per_m2_per_year","water_per_m2_per_year","prices_per_year","annual_electricity_cost","annual_heating_cost","annual_operational_cost","annual_rent","annual_total_cost","annual_water_cost","FacilitiesColumns","sortedFacilities","facilitiesLength","economyIsOpen","setEconomyIsOpen","facilitiesIsOpen","setFacilitiesIsOpen","location_id","showFacilities","some","mainInfoColumns","economyColumns","facilitiesColumns","Table","columns","marginBottom","alignColumns","extraClass","_useTable","useTable","getTableProps","getTableBodyProps","headerGroups","prepareRow","rows","locationsLength","MaUTable","TableBody","headerGroup","headers","column","headerIndex","emptyCount","render","cells","cellIsEmpty","toggleHidden","getCellProps","interval","createComparisonPdfPath","locationsKind","queryString","search","setLocations","setSelectedLocationsIds","loading","setLoading","setDeleteButtonsOpen","infoFormIsActive","setInfoFormIsActive","setShowServerErrorMessage","setSubmitSuccess","setIsFormLoading","pdfModalIsOpen","setPdfModalIsOpen","pdfUrl","setPdfUrl","pdfReady","setPdfReady","comparisonLeases","newComparableLocations","handleComparableLocationsCounter","_location$data","getStatus","status","clearInterval","newLocations","comparableIds","pdf_url","status_url","setInterval","ComparisonTable","ModalWindow","FileLoader","download","ForgotPassword","submitSuccessMessage","emailServerError","forgotPasswordUrl","success","statusText","ForgotPasswordForm","handleFormSubmit","handleError","ForgotPasswordFormWrapper","fieldError","errorValidator","_SignUp$getClientInfo","SignUp","LoginFormWrapper","passwordVisibility","errorsOnSubmit","forgotPasswordLink","createAccountLink","loginError","password","togglePasswordVisibility","remember_me","_SignUp$getI18nAttrNa","passwordI18n","LoginForm","LoginPage","loginPath","authenticity_token","login","redirect_url","siteName","aboutUsLink","contactPhone","site_name","create_account_link","handleLoginSubmit","mapApi","MainMap","compose","withProps","googleMapURL","loadingElement","containerElement","mapElement","withScriptjs","withGoogleMap","MainMapWrapper","onMarkerClustererClick","showLoader","viewportString","turnOnDrag","isMapReady","addListener","get","getCenter","set","trigger","onlyAnonymusocation","showSearchButton","defaultOptions","defaultCenter","changeDragAndDropFunction","coords","markerInfoLocation","openByClick","MarkerWrapper","onMarkerInfoToggle","areaLabel","postalCode","features","features_presence","areaIcon","minimumClusterSize","showTooltip","hideTooltip","projection","getProjection","topRight","fromLatLngToPoint","bottomLeft","scale","pow","getZoom","point","windowHeight","infoWindowHeight","infoWindowWidth","centerPoint","getPixelCoords","markerPoint","offsetCoords","offsetTop","offsetRight","offsetBottom","offsetLeft","fitTop","fitBottom","fitLeft","fitRight","fitsLeftRight","fitsTopBottom","fitCenterTop","fitCenterBottom","fitCenterLeft","fitCenterRight","recalculateOffset","quadrant","topDistance","bottomDistance","Size","setInfoWindowOffset","pixelOffset","setMarkerOffset","noRedraw","hoverPin","disableAutoPan","colsY","rowX","ParkingMarker","element","markerOpenedId","updateMarkerOpenedId","priceFrom","priceTo","_this$props$marker","monthly_rent_per_space_amount_from","monthly_rent_per_space_amount_to","primary_photo_url","parkingPin","onCloseClick","renderPrice","marker_id","parkingLots","_this$props$coordinat","clickHandler","getParkingLotsNear","parking_lots","_this$props2$coordina","coordinatesObj","BaseMap","containerClass","isFullscreenMobile","isGalleryMobileComponent","handleFullscreenMobile","_useJsApiLoader","useJsApiLoader","isLoaded","loadError","center","mapPin","DetailMap","_this$props$coordinat2","VirtualTourModal","toggleModal","OrderConfirmationContainer","virtualTourIsOpen","downloadPdfUrl","statusPdfFile","loadingProspectus","serverError","generateButton","createLocationPatternedPropsectus","checkPdf","locationProspectus","axios","method","statusUrl","pdfTimer","pageTitle","pageTextHint","pageText","prospectusTitle","userEmail","ourEmail","locationImage","districtName","locationType","linkToListView","linkFromEmail","pageNotFound","pageTitleFromEmail","generateProspectusTitle","checkSiteKey","placeHolderImage","generateProspectus","toggleVirtualTour","GoogleReviewsWidget","apiKey","nextProps","LOCATION_INFO_FIELDS","gql","_templateObject","_taggedTemplateLiteral","InteriorDesignForm","js","q","d","gi","ce","gt","createElement","insertBefore","errorMessage","recoveryPasswordUrl","token","URLSearchParams","loginUrl","RecoveryPasswordForm","RecoveryPasswordFormWrapper","enableReinitialize","passwordValidation","resetForm","InformationUnavailablePage","similarLocationsList","InformationUnavailable","SpecialOffer","NewBadge","_ref5","readMoreLink","DisposalBadge","_ref6","disposalBadge","percents","viewBox","filledPercents","RADIAN","PI","PieChart","Pie","dataKey","cx","cy","startAngle","endAngle","outerRadius","fill","paddingAngle","midAngle","innerRadius","payload","radius","cos","sin","textAnchor","dominantBaseline","fontWeight","fontSize","stroke","entry","uncollapsed","collapsibleSection","delimiter","defaultDelimiter","allIds","prop","hasOwnProperty","showLimitExceedMessage","hideLimitExceedMessage","comparableLimitExceededError","showInfoPopup","newComparablesList","bounceFunction","comparableCount","locationKindPresent","locationIsInTheList","limitExceededError","updateComparables","bounce","descriptionPopup","typingTimer","kindPresent","iconWrapper","policyIsAccepted","cookie","handleIsActive","_this$state3","_this$props3","indentation","notificationWrapperId","tooltipText","limitExceedMessage","notificationWrapper","Notification","visible","customClass","closeDescriptionPopup","DropDownContainer","selectedTooltip","placeholderClasses","actionIconClasses","bodyClasses","DropdownSelectWithSearch","selectedOption","dropdownIsOpen","toggleDropdown","initialValue","initialValueId","defaultValue","inputFieldClass","indicatorsContainer","provided","alignItems","cursor","control","minHeight","maxHeight","margin","input","paddingBottom","marginLeft","menu","paddingTop","fontFamily","menuList","Select","menuIsOpen","closeMenuOnSelect","theme","colors","primary25","primary","isClearable","isSearchable","GetInfoFormModalWrapper","locationsListOpen","infoFormWrapper","targetTopCoords","contentTopCoords","abs","handleLocationsListState","_React$createElement","dataProtectionBodyClasses","getInfoClasses","locationsList","openLocationsList","openInfoModal","toggleDataProtection","setCurrentMap","rating","setRating","reviewsCount","setReviewsCount","showWidget","setShowWidget","libraries","initMap","getRating","Map","request","placeId","fields","places","PlacesService","getDetails","PlacesServiceStatus","OK","user_ratings_total","starsList","i","starType","star","renderStarIcons","hideBottomLine","SpecialOfferBadge","isShowingInfo","modalTitle","modalContent","parsed","handleClickOutsideInfoModal","modalBottomPos","infoModal","noticeWrapperContainsTarget","infoLinkWrapperContainsTarget","infoLinkWrapper","closeInfoBtnContainsTarget","closeButton","toggleInfoModal","_this$state$content$n","modal","btn","PulsingLoader","favouriteNotificationWrapperId","random","split","comparableNotificationWrapperId","favouriteNotificationWrapper","comparableNotificationWrapper","isFavouriteNotificationWrapper","isComparableNotificationWrapper","isFavouriteIconWrapper","favouriteIconWrapper","isComparableIconWrapper","comparableIconWrapper","isTooltip","showDate","context_info","infoWrapperHeight","handlePersonsTooltip","NoLinearRangeSlider","minInput","maxInput","employeeMin","employeeMax","max","activeInput","maxInputIsFocused","textValue","percent","valueChangeFunc","blur","handleValueChange","valueType","employeeCalculation","handleInputClick","targetValue","inputRange","range","handleSelectorChange","maxValue","minValue","minLimit","allowBiggerValue","currentValue","maxLimit","handle","_this$props4","filterType","Number","activeInputField","focus","_this$props5","dimension","showMaxMoreIcon","localizedNumberFormatter","Intl","NumberFormat","format","selectedMaxValue","selectedMaxEmployeeValue","Nouislider","connect","start","onSlide","handleChangeComplete","minChange","onKeyPress","handleKeyPress","onFocus","handleFocus","inputMode","maxChange","handleMaxInputFocus","RequestFormWrapper","pendingRequest","RequestCallForm","modalWasShown","mobileModalIsOpen","requestSuccess","showModal","getContactFormOpen","hideModal","showMobileModal","isIPad13","backdropFilter","kindsOptions","currency_id","order_id","setValues","timeRangeOptional","setTimeRangeOptional","calendarIsOpen","setCalendarIsOpen","setSuccess","searchOfferModalShown","newDate","setHours","getUTCDate","getUTCMonth","getUTCFullYear","requiredValuesFilled","employee_amount","workplace_type","monthly_budget_min","monthly_budget_max","occupied_at_type","occupied_at_date","newValues","prevValues","setTimeRange","isDateOptional","toLocaleDateString","customFormattedDate","BasicDropdown","Input","pattern","formatted","DateTimePicker","disableClock","minDate","onCalendarClose","onCalendarOpen","date","placeOrderDetails","EllipsisLoader","workplaces","setWorkplaces","workplaceClass","setWorkplaceClass","small_lounge","big_lounge","small_meeting","big_meeting","additionalSpaces","setAdditionalSpaces","spacesConsiderations","setSpacesConsiderations","metrics","workplace_class_economy","workplace_class_comfort","workplace_class_business","conference","reception","break","mail","workplaceClassOptions","chosenCategoriesIds","spaceKind","areaSummary","result","fullArea","halls","handleSpaceConsideration","RadioButtons","spaceName","persist","spaceType","Checkbox","SpaceCalculatorModal","setIsOpen","TypeformButton","pricesTableSignUpModal","category","ContinueRegistrationModal","tooltipVatIsOpen","tooltipWrapper","emailAlreadyExist","countriesSelectOptions","currentCountryCode","internalError","toggleTermsModal","countriesOptions","vat_id","handleTooltipClick","ean","line_1","city","country_alpha2","terms_of_service","postal_codeI18n","contract_id","ContinueRegistrationForm","activeContract","contract","vatIdValidation","eanValidation","addressValidation","cityValidation","postalCodeError","postalCodes","requiredFieldError","contract_name","active_contract_section","activeContractSection","signUpFormUrl","basicPrice","currentCurrency","premiumPrice","contractDetailsOnDeal","contractDetailsOnDealBasic","contractDetailsOnDealPremium","table","persentage","modalId","modalWrapper","modalClassList","initialBodyWidth","clientWidth","PaymentModel","paymentModel","activePolicyGroup","activePolicyPlan","targetGroup","targetGroupRadio","targetPlan","handleContractSelect","optionListData","activeClass","dataName","handlePlanRadioSelect","promotion","_this$props$activeCon","invoicingStrategy","policyGroup","policyPlan","m","parkeringCheck","advertisementPrices","providerDkContractOption","providerContractOption","providerContractOptionMeetingRoom","providerContractOptionParkering","handleMainGroupRadioSelect","renderOptionList","SignUpFormWrapper","emailValueOnError","hashedContracts","setActiveContractValues","handleEmailAlreadyExistError","cookiesActiveGroup","cookiesContract","company_name","handleEmailError","phone_number","SignUpForm","companyValidation","nameValidation","emailValidation","phoneValidation","preSubmitHandler","activeContractId","internalErrorFirstStep","internalErrorSecondStep","registrationModalIsOpen","activeModal","basicPriceInfo","noCureInfo","coworkingInfo","termOfService","basicParking","providerData","withOptions","contracts","invoicing_strategy","password_confirmation","primary_contact_attributes","invoicing_policy_attributes","address_attributes","withCredentials","redirect_path","uuidv4","geocoderCountryCode","_this$state$activeMod","activeContractData","advertisementStrategiesPricesPresent","parkingPrice","meetingRoomPrice","meetingRoomPremiumPrice","closeRegistrationModal","BasicPriceContent","NoCureInfoContent","MeetingRoomsInfoContent","BasicParkeringContent","TermsOfServiceContent","contractCoworkingYearly","contractCoworkingYearlyPremium","PropTypes","NumberFormatter","seperator","number","seperatedNumber","String","floatSeperator","handleResult","renderSimilarLocations","endPoint","fetchSimilarLocations","responseJSON","first_spotlight_value_formatted","numberFormatter","numberWithDelimiter","first_spotlight_value","second_spotlight_value_formatted","second_spotlight_value","similarLocationsParagraph","wrapperMargin","SocialMedia","w","h","screen","shareUrl","sharePopUp","SocialIcons","facebook","twitter","linkedin","LanguageSwitcher","switchState","availableLocalesLinks","currentLocaleCountry","Flag","basePath","pngSize","countryCode","localeName","browserName","findPos","curtop","offsetParent","numbersLandlords","numbersMapped","storageKey","clientInfo","storageObj","clientUpdatedInfo","updatedClientObj","clientInfoString","eanI18n","vat_idI18n","line_1I18n","countryI18n","cityI18n","locationViewedKey","locationOrderedKey","locationShowcaseKey","locationContactKey","itemId","postLocationShown","populateStorageItems","updateViewedItem","orderLocation","todayDate","oneWeekAgoDate","getTime","locationObj","viewedLocationStr","orderedLocationStr"],"sourceRoot":""}