{"version":3,"sources":["hooks/use-click-outside.tsx","components/Form/ContactFormBasic/styles.js","components/Form/ContactFormBasic/index.tsx","components/RancidBanner/styles.js","utils/city-conjugation.tsx","components/RancidBanner/index.tsx","components/AreaNavigation/styles.js","components/AreaNavigation/index.tsx","components/ContentBlocks/ApartmentLifts/styles.js","components/HousetypeDropdown/styles.js","components/HousetypeDropdown/index.tsx","components/Form/HomevisitSmallForm/styles.js","components/Form/HomevisitSmallForm/index.tsx","utils/apartment-pricing/selections.tsx","components/Search/PriceAddressSearch/suggestion-categories.tsx","components/Search/PriceAddressSearch/styles.js","components/Search/PriceAddressSearch/index.tsx","components/ApartmentPriceGraph/defaultOptions.tsx","components/ApartmentPriceGraph/styles.js","components/ApartmentPriceGraph/index.tsx","pages/ApartmentPricingPage/styles.js","components/Accordion/index.tsx","pages/ApartmentPricingPage/index.tsx"],"names":["useOnClickOutside","ref","handler","useEffect","listener","event","target","current","contains","document","addEventListener","removeEventListener","FormWrapper","styled","div","attrs","props","className","id","withConfig","componentId","color","media","md","_templateObject","_taggedTemplateLiteral","textStyles","H3Condensed","Formik","lazy","then","module","default","ErrorMessage","ContactFormBasic","_ref","agent","agency","buttonText","children","subjectIndex","titleText","withTitle","withPostcode","isSubmitted","setSubmitted","useState","fields","initialValues","email","message","name","phone","postCode","validationSchema","getSchema","FormPlaceholder","React","createElement","Placeholder","PlaceholderInput","PlaceholderTextarea","PlaceholderGdpr","PlaceholderButton","width","contactSubmitTimeout","clearTimeout","hasWindow","Suspense","fallback","onSubmit","doSubmit","values","_ref2","setSubmitting","resetForm","__awaiter","submitUrl","location","href","formData","Object","assign","res","contactService","doBasicContact","console","log","window","setTimeout","e","_ref3","handleChange","handleBlur","handleSubmit","isSubmitting","clxs","InputGroup","aria-label","disabled","data-white","onBlur","onChange","placeholder","type","value","FaIcon","icon","component","msg","FormError","Textarea","ThankYouMessage","Fragment","GdprLink","Link","to","CtaButton","text","submitting","RancidBannerContainer","bannerColor","clsx","lg","RancidBannerContent","boxShadow","wide","smd","_templateObject2","emSpacing","lineHeight","_templateObject3","DismissButton","button","_templateObject4","cities","own","in","conjugateCity","city","RancidBanner","enterDelay","onExit","textOverride","isInQuarantine","historyTracker","isVisible","setVisible","getHistory","inCity","setInCity","enterTimeout","exitTimeout","bannerRef","useRef","classList","add","requestAnimationFrame","onHistoryTrackUpdate","detail","newCity","concat","onClick","removeBanner","setQuarantine","AreaNavContainer","position","AreaNav","nav","lgx","isBlue","darken","connect","state","doc","blue","data","rest","__rest","areaNavi","isEmpty","page","getAreaNavi","body","remove","map","index","link","active","key","ApartmentsContainer","grid","gutterSmall","gutter","Select","SelectButton","fontFamily","base","isOpen","css","Selections","basic","Selection","HousetypeDropdown","_a","noSelectionsText","selections","selectables","onSelection","defaultValue","length","mounted","setMounted","setSelections","selected","setSelected","setOpen","i","isActive","selection","label","sels","s","select","FormContainer","hugeLight","ribbon","PSmallCondensed","HomevisitSmallForm","Editor","BasicContactForm","selectableHouseTypes","order","selectableRooms","suggestionCategories","priceType","SearchInput","PriceAddressSearch","PureComponent","constructor","super","categories","createRef","inputRef","isRendering","initialPlaceholder","this","results","resultsOpen","selectedAddress","reset","bind","parseAddressSuggestions","getAddressSuggestionsCount","setSearchTerm","search","checkForClickOutside","setAddress","createPlaceholder","onFocus","setState","suggestions","l","suggestionCategory","addressType","addressTypeName","j","suggestion","t","push","count","forEach","category","getAddressByAssignedIndex","isSearching","timestamp","Date","getMilliseconds","query","response","axios","get","querySelector","onSelect","componentDidMount","componentWillUnmount","render","grey","TextInput","autoComplete","spin","AddressSearchResults","onSelectedAddress","time","white","grey1","grey2","grey5","grey7","greenDark2","defaultOptions","chart","backgroundColor","renderTo","spacingLeft","spacingRight","spacingTop","zoomType","credits","enabled","exporting","legend","align","floating","itemDistance","itemStyle","fontWeight","marginBottom","layout","margin","symbolPadding","symbolRadius","symbolWidth","verticalAlign","x","plotOptions","arearange","states","hover","series","borderWidth","legendIndex","maxPointWidth","tooltip","valueSuffix","yAxis","animation","lineWidth","linecap","marker","fillColor","lineColor","radius","subtitle","title","style","fontSize","shared","xAxis","crosshair","tickColor","tickLength","gridLineColor","labels","format","offset","rotation","y","opposite","ApartmentPriceGraphDiv","ApartmentPriceNoData","Disclaimer","createNewOptions","oldOptions","ashiMinYear","ashiMaxYear","priceGraphTitle","params","roomName","roomNameTypes","typeName","postalCode","postalName","generateTitle","priceData","salesData","hasData","generateChartData","ashidata","graphData","undefined","ashiCounty","ashi","ashiCurrentYear","ashiCountyCurrentYear","firstYear","lastYear","hasOwnProperty","priceperm2","sales","year","newOptions","ApartmentPriceGraph","chartOptions","setChartOptions","chartHasData","setChartHasData","HighchartsReact","highcharts","Highcharts","options","memo","prevProps","nextProps","isEqual","ApartmentPricesHero","HeroColumns","HeroColumn","PMedium","buttons","textLinkPrimary","HeroImage","_templateObject5","_templateObject6","SelectionsWrapper","_templateObject7","_templateObject8","_templateObject9","fetching","keyframes","ResultsArea","_templateObject10","_templateObject11","ChartArea","_templateObject12","Summary","_templateObject13","_templateObject14","SummaryItems","_templateObject15","SummaryItem","_templateObject16","SummaryItemTitle","condensed","SummaryItemValue","small","H2","green","ShareBar","Icon","span","last","AshiColumns","_templateObject17","_templateObject18","AshiColumn","_templateObject19","_templateObject20","InfoTexts","_templateObject21","_templateObject22","_templateObject23","_templateObject24","AshiAgents","_templateObject25","_templateObject26","AshiProperties","_templateObject27","AshiPropertiesHeader","_templateObject28","_templateObject29","WhatAffectsIntro","WhatAffectsWrapper","_templateObject30","_templateObject31","WhatAffects","_templateObject32","_templateObject33","WhatAffectsColumn","_templateObject34","_templateObject35","MicroTextCaps","PSmall","AshiSummaryText","AshiExtra","AInline","AshiArticles","H1","Accordion","buttonTextClosed","textClosed","buttonTextOpen","textOpen","toggleOpen","defaultOpen","display","defaultProps","ApartmentPricingPageContainer","ashiTimespan","agents","properties","articlesMain","apartmentPricesMoreSummary","ashiData","setAshiData","ashiAgents","setAshiAgents","ashiProperties","setAshiProperties","isFetching","setFetching","share","setShare","url","ashiRef","county","defaultCounty","postcode","figureData","ashiLatest","ashiCountyLatest","figureCurrentYear","defaultQuery","m2","room","defaultValues","idPlain","setQuery","defaults","setDefaults","updateQuery","field","fetchData","forcedParams","arguments","fetchAgentData","fetchAgentSalesData","fetchPropertyData","updateChartData","newFigureData","currentPropertyQuery","limit","roomAmount","salesPriceUnencumbered","sortArea","apartmentSearchField","updatePropertyData","currentAgentQuery","random","currentAgentSalesQuery","apartmentAmount","apartmentType","updateAgentData","history","pushState","salesParams","onPopState","stateQuery","Number","getLastYearText","getFullYear","trackHistory","titleH1","ashiname","whatAffectsTexts","infoTexts","num","postalcode","comparison","percent","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","price","averageSales","ashiAverages","ashiCountyAverages","shouldShowNumbers","paavo","flat_size","useParallax","speed","formRef","wake","loading","AreaNavigation","Container","scrollToContactForm","top","getBoundingClientRect","scroll","scrollTo","Image","srcSet","getAssetUrl","src","alt","thumb","imageWithSize","Wrapper","background","address","updateAddress","MultiButtonSelect","single","labelAfter","decimalScale","decimalSeparator","displayType","suffix","thousandSeparator","fixedDecimalScale","prefix","first","FacebookShareButton","additionalProps","TwitterShareButton","EmailShareButton","print","AgentList","agencyLink","urlCounty","apt","ApartmentBlock","isAdmin","dangerouslySetInnerHTML","__html","filterXSS","Articles","ArticleCards","articles"],"mappings":"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","file":"assets/js/pages-ApartmentPricingPage.chunk.js?cb=72455e0ea8954a2e9737","sourcesContent":["import React, { useEffect, RefObject } from 'react';\n\nconst useOnClickOutside = (ref: RefObject, handler: (e?: MouseEvent | TouchEvent) => void) => {\n\tuseEffect(() => {\n\t\tconst listener = (event: MouseEvent | TouchEvent) => {\n\t\t\tconst target = (event.target as HTMLElement);\n\t\t\t// Do nothing if clicking ref's element or descendent elements\n\t\t\tif (!ref.current || ref.current.contains(target)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thandler(event);\n\t\t};\n\n\t\tdocument.addEventListener('mousedown', listener);\n\t\tdocument.addEventListener('touchstart', listener);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('mousedown', listener);\n\t\t\tdocument.removeEventListener('touchstart', listener);\n\t\t};\n\t}, []);\n};\n\nexport default useOnClickOutside;","import styled from \"styled-components\";\nimport { color, media, textStyles } from \"@utils/style-utils\";\n\nexport const FormWrapper = styled.div.attrs(props => ({\n\tclassName: \"basic-form\",\n\tid: props.id || \"basic-form\",\n}))`\n\tbackground: ${color(\"grey\", 7)};\n\tborder: 1px solid ${color(\"grey\", 6)};\n\tborder-radius: 4px;\n\toverflow: hidden;\n\tpadding: 30px 15px;\n\n\t${media.md`\n\t\tpadding: 40px 32px;\n\t`}\n\n\th4 {\n\t\t${textStyles.H3Condensed}\n\t\tmargin: 0 auto 24px;\n\t\ttext-align: center;\n\t}\n\n\t.placeholder-textarea {\n\t\tmargin-top: 16px;\n\t}\n`;\n","import React, { lazy, Suspense, Fragment, useState, useEffect } from \"react\";\nimport {\n\tInputGroup,\n\tFormError,\n\tGdprLink,\n\tTextarea,\n\tThankYouMessage,\n\tPlaceholder,\n\tPlaceholderButton,\n\tPlaceholderGdpr,\n\tPlaceholderInput,\n\tPlaceholderTextarea,\n} from \"@components/Form/form-styles\";\nimport contactService from \"@services/contact.service\";\nimport { hasWindow } from \"@utils\";\nimport { getSchema } from \"@utils/validators\";\nimport CtaButton from \"@components/Buttons/CtaButton\";\nimport { Link } from \"react-router-dom\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport { FormWrapper } from \"./styles\";\nimport clxs from \"clsx\";\n\nconst Formik = lazy(() => import(/* webpackPrefetch:true */ \"formik\").then(module => ({ default: module.Formik })));\nconst ErrorMessage = lazy(() =>\n\timport(/* webpackPrefetch:true */ \"formik\").then(module => ({ default: module.ErrorMessage }))\n);\n\ninterface IProps {\n\tagent?: string;\n\tagency?: string;\n\tbuttonText?: string;\n\tchildren?: React.ReactNode;\n\tsubjectIndex?: number;\n\ttitleText?: string;\n\twithTitle?: boolean;\n\twithPostcode?: boolean;\n}\n\nconst ContactFormBasic = ({\n\tagent = null,\n\tagency = null,\n\tbuttonText = \"Lähetä\",\n\tchildren = null,\n\tsubjectIndex = 1,\n\ttitleText = \"Ota yhteyttä\",\n\twithTitle = true,\n\twithPostcode = false,\n}: IProps) => {\n\tconst [isSubmitted, setSubmitted] = useState(false);\n\n\tlet fields = [\"name\", \"email\", \"phone\", \"message\"];\n\tlet initialValues: any = {\n\t\temail: \"\",\n\t\tmessage: \"\",\n\t\tname: \"\",\n\t\tphone: \"\",\n\t};\n\n\tif (withPostcode) {\n\t\tfields = [\"name\", \"email\", \"postCode\", \"phone\", \"message\"];\n\n\t\tinitialValues = {\n\t\t\temail: \"\",\n\t\t\tmessage: \"\",\n\t\t\tname: \"\",\n\t\t\tphone: \"\",\n\t\t\tpostCode: \"\",\n\t\t};\n\t}\n\n\tconst validationSchema = getSchema(fields);\n\n\tconst FormPlaceholder = () => {\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t{withPostcode && }\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t);\n\t};\n\n\tlet contactSubmitTimeout: number;\n\n\tconst doSubmit = async (values, { setSubmitting, resetForm }) => {\n\t\tsetSubmitting(true);\n\n\t\tconst submitUrl = location.href;\n\n\t\tconst formData = {\n\t\t\tagency: agency ? agency : null,\n\t\t\tagent: agent ? agent : null,\n\t\t\tsubjectIndex,\n\t\t\tsubmitUrl,\n\t\t\t...values,\n\t\t};\n\n\t\ttry {\n\t\t\tconst res = await contactService.doBasicContact(formData);\n\t\t\tconsole.log(\"successful form submit\", res);\n\t\t\tsetSubmitting(false);\n\t\t\tsetSubmitted(true);\n\n\t\t\tif (hasWindow) {\n\t\t\t\tcontactSubmitTimeout = window.setTimeout(() => {\n\t\t\t\t\tsetSubmitted(false);\n\t\t\t\t\tresetForm(initialValues);\n\t\t\t\t}, 6000);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(\"error while sending form..\", e);\n\t\t\tsetSubmitting(false);\n\t\t\tsetSubmitted(false);\n\t\t\tthrow e;\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\t/* clear the reset timeout before component unmounts */\n\t\t\tif (contactSubmitTimeout) {\n\t\t\t\tclearTimeout(contactSubmitTimeout);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\treturn (\n\t\t\n\t\t\t{withTitle &&

{titleText}

}\n\t\t\t{children}\n\t\t\t{!hasWindow && }\n\t\t\t{hasWindow && (\n\t\t\t\t}>\n\t\t\t\t\t\n\t\t\t\t\t\t{({ values, handleChange, handleBlur, handleSubmit, isSubmitting }) => (\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{msg => {msg}}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{msg => {msg}}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{msg => {msg}}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t{withPostcode && (\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t{msg => {msg}}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{msg => {msg}}\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t{isSubmitted && (\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tKiitos yhteydenotosta!\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{!isSubmitted && (\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tTietosuojaseloste\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t)}\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t)}\n\t\t
\n\t);\n};\n\nexport default ContactFormBasic;\n","import styled, { keyframes } from \"styled-components\";\nimport clsx from \"clsx\";\nimport { color, boxShadow, emSpacing, lineHeight, media } from \"@utils/style-utils\";\n\nexport const RancidBannerContainer = styled.div.attrs(({ bannerColor }) => ({\n\tclassName: clsx(\"rancid-banner\", bannerColor),\n}))`\n\tmargin: 80px auto;\n\tmax-width: 1160px;\n\topacity: 0;\n\tpadding: 30px 15px;\n\tperspective: 1000px;\n\tposition: relative;\n\tz-index: 80;\n\tdisplay: none;\n\n\t${media.lg`\n\t\tmax-width: 1170px;\n\t\tpadding: 30px 20px;\n\t`}\n\n\t&.visible {\n\t\tdisplay: block;\n\t}\n\t&.enter {\n\t\topacity: 1;\n\t}\n`;\n\nexport const RancidBannerContent = styled.div`\n\tborder-radius: 4px;\n\tbox-shadow: ${boxShadow.wide};\n\tleft: 0;\n\topacity: 0;\n\tpadding: 16px 24px;\n\tposition: absolute;\n\ttext-align: center;\n\ttop: 50%;\n\ttransform: translateY(10%);\n\ttransition: opacity 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55),\n\t\ttransform 0.6s cubic-bezier(0.68, -0.55, 0.265, 2.55);\n\twidth: 100%;\n\n\t${media.smd`\n\t\tpadding: 16px 68px;\n\t`}\n\n\ta {\n\t\tcolor: ${color(\"white\")};\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tfont-size: 16px;\n\t\tfont-weight: 500;\n\t\tjustify-content: center;\n\t\tletter-spacing: ${emSpacing(0.02)};\n\t\tline-height: ${lineHeight(18, 29)};\n\t\ttext-align: center;\n\t\ttext-decoration: none;\n\n\t\t${media.smd`\n\t\t\tfont-size: 18px;\n\t\t`}\n\t}\n\n\tspan {\n\t\tdisplay: inline-block;\n\n\t\t&.underlined {\n\t\t\ttext-decoration: underline;\n\t\t}\n\t}\n\n\t.red & {\n\t\tbackground-color: ${color(\"coral\", 1)};\n\t}\n\n\t.green & {\n\t\tbackground-color: ${color(\"greenDark\", 2)};\n\t}\n\n\t.blue & {\n\t\tbackground-color: ${color(\"blue\", 1)};\n\t}\n\n\t.enter & {\n\t\topacity: 1;\n\t\ttransform: translateY(-50%);\n\t\ttransform-origin: center;\n\t}\n\n\t.exit & {\n\t\ttransition: transform 0.3s ease-in-out;\n\t\ttransform: translateY(-50%) rotateX(90deg);\n\t}\n`;\n\nexport const DismissButton = styled.button`\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tbackground: rgba(255, 255, 255, 0);\n\tborder: 0;\n\tborder: 8px solid rgba(255, 255, 255, 0);\n\tborder-radius: 50%;\n\tcolor: rgba(255, 255, 255, 0.5);\n\tcursor: pointer;\n\tfont-size: 14px;\n\theight: 38px;\n\tmargin: 0;\n\tpadding: 0;\n\tposition: absolute;\n\tright: -11px;\n\ttext-align: center;\n\ttop: -11px;\n\ttransition: background-color 150ms;\n\twidth: 38px;\n\n\t&.red {\n\t\tbackground-color: ${color(\"coral\", 2)};\n\t}\n\t&.green {\n\t\tbackground-color: ${color(\"greenDark\", 3)};\n\t}\n\t&.blue {\n\t\tbackground-color: ${color(\"blue\", 2)};\n\t}\n\n\t${media.smd`\n\t\tbackground: rgba(255, 255, 255, 0);\n\t\tborder: 0;\n\t\theight: 44px;\n\t\tright: 12px;\n\t\ttop: 50%;\n\t\ttransform: translateY(-50%);\n\t\twidth: 44px;\n\n\t\t&.red,\n\t\t&.green,\n\t\t&.blue {\n\t\t\tbackground: rgba(255, 255, 255, 0);\n\n\t\t\t.is-pointer & {\n\t\t\t\t&:hover {\n\t\t\t\t\tbackground-color: rgba(255, 255, 255, 0.1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t`}\n\n\tsvg {\n\t\tmax-width: 17px;\n\t}\n`;\n","// prettier-ignore\nconst cities = {\n\t\"Akaa\": { own: \"Akaan\", in: \"Akaalla\" },\n\t\"Alajärvi\": { own: \"Alajärven\", in: \"Alajärvellä\" },\n\t\"Alavieska\": { own: \"Alavieskan\", in: \"Alavieskassa\" },\n\t\"Alavus\": { own: \"Alavuden\", in: \"Alavudella\" },\n\t\"Asikkala\": { own: \"Asikkalan\", in: \"Asikkalassa\" },\n\t\"Askola\": { own: \"Askolan\", in: \"Askolassa\" },\n\t\"Aura\": { own: \"Auran\", in: \"Aurassa\" },\n\t\"Brändö\": { own: \"Brändön\", in: \"Brändössa\" },\n\t\"Eckerö\": { own: \"Eckerön\", in: \"Eckerössä\" },\n\t\"Enonkoski\": { own: \"Enonkosken\", in: \"Enonkoskella\" },\n\t\"Enontekiö\": { own: \"Enontekiön\", in: \"Enontekiöllä\" },\n\t\"Espoo\": { own: \"Espoon\", in: \"Espoossa\" },\n\t\"Eura\": { own: \"Euran\", in: \"Eurassa\" },\n\t\"Eurajoki\": { own: \"Eurajoen\", in: \"Eurajoella\" },\n\t\"Evijärvi\": { own: \"Evijärven\", in: \"Evijärvellä\" },\n\t\"Finström\": { own: \"Finströmin\", in: \"Finströmissä\" },\n\t\"Forssa\": { own: \"Forssan\", in: \"Forssassa\" },\n\t\"Föglö\": { own: \"Föglön\", in: \"Föglössa\" },\n\t\"Geta\": { own: \"Getan\", in: \"Getassa\" },\n\t\"Haapajärvi\": { own: \"Haapajärven\", in: \"Haapajärvellä\" },\n\t\"Haapavesi\": { own: \"Haapaveden\", in: \"Haapavedellä\" },\n\t\"Hailuoto\": { own: \"Hailuodon\", in: \"Hailuodossa\" },\n\t\"Halsua\": { own: \"Halsuan\", in: \"Halsualla\" },\n\t\"Hamina\": { own: \"Haminan\", in: \"Haminassa\" },\n\t\"Hammarland\": { own: \"Hammarlandin\", in: \"Hammarlandissa\" },\n\t\"Hankasalmi\": { own: \"Hankasalmen\", in: \"Hankasalmella\" },\n\t\"Hanko\": { own: \"Hangon\", in: \"Hangossa\" },\n\t\"Harjavalta\": { own: \"Harjavallan\", in: \"Harjavallassa\" },\n\t\"Hartola\": { own: \"Hartolan\", in: \"Hartolassa\" },\n\t\"Hattula\": { own: \"Hattulan\", in: \"Hattulassa\" },\n\t\"Hausjärvi\": { own: \"Hausjärven\", in: \"Hausjärvellä\" },\n\t\"Heinola\": { own: \"Heinolan\", in: \"Heinolassa\" },\n\t\"Heinävesi\": { own: \"Heinäveden\", in: \"Heinävedellä\" },\n\t\"Helsinki\": { own: \"Helsingin\", in: \"Helsingissä\" },\n\t\"Hirvensalmi\": { own: \"Hirvensalmen\", in: \"Hirvensalmella\" },\n\t\"Hollola\": { own: \"Hollolan\", in: \"Hollolassa\" },\n\t\"Honkajoki\": { own: \"Honkajoen\", in: \"Honkajoella\" },\n\t\"Huittinen\": { own: \"Huittisten\", in: \"Huittisilla\" },\n\t\"Humppila\": { own: \"Humppilan\", in: \"Humppilassa\" },\n\t\"Hyrynsalmi\": { own: \"Hyrynsalmen\", in: \"Hyrynsalmella\" },\n\t\"Hyvinkää\": { own: \"Hyvinkään\", in: \"Hyvinkäällä\" },\n\t\"Hämeenkyrö\": { own: \"Hämeenkyrön\", in: \"Hämeenkyrössä\" },\n\t\"Hämeenlinna\": { own: \"Hämeenlinnan\", in: \"Hämeenlinnassa\" },\n\t\"Ii\": { own: \"Iin\", in: \"Iissä\" },\n\t\"Iisalmi\": { own: \"Iisalmen\", in: \"Iisalmella\" },\n\t\"Iitti\": { own: \"Iitin\", in: \"Iitissä\" },\n\t\"Ikaalinen\": { own: \"Ikaalisten\", in: \"Ikaalisissa\" },\n\t\"Ilmajoki\": { own: \"Ilmajoen\", in: \"Ilmajoella\" },\n\t\"Ilomantsi\": { own: \"Ilomantsin\", in: \"Ilomantsissa\" },\n\t\"Imatra\": { own: \"Imatran\", in: \"Imatralla\" },\n\t\"Inari\": { own: \"Inarin\", in: \"Inarissa\" },\n\t\"Inkoo\": { own: \"Inkoon\", in: \"Inkoossa\" },\n\t\"Isojoki\": { own: \"Isojoen\", in: \"Isojoella\" },\n\t\"Isokyrö\": { own: \"Isokyrön\", in: \"Isokyrössä\" },\n\t\"Janakkala\": { own: \"Janakkalan\", in: \"Janakkalassa\" },\n\t\"Joensuu\": { own: \"Joensuun\", in: \"Joensuussa\" },\n\t\"Jokioinen\": { own: \"Jokioisten\", in: \"Jokioisilla\" },\n\t\"Jomala\": { own: \"Jomalan\", in: \"Jomalassa\" },\n\t\"Joroinen\": { own: \"Joroisten\", in: \"Joroisilla\" },\n\t\"Joutsa\": { own: \"Joutsan\", in: \"Joutsassa\" },\n\t\"Juuka\": { own: \"Juukan\", in: \"Juukassa\" },\n\t\"Juupajoki\": { own: \"Juupajoen\", in: \"Juupajoella\" },\n\t\"Juva\": { own: \"Juvan\", in: \"Juvalla\" },\n\t\"Jyväskylä\": { own: \"Jyväskylän\", in: \"Jyväskylässä\" },\n\t\"Jämijärvi\": { own: \"Jämijärven\", in: \"Jämijärvellä\" },\n\t\"Jämsä\": { own: \"Jämsän\", in: \"Jämsässä\" },\n\t\"Järvenpää\": { own: \"Järvenpään\", in: \"Järvenpäässä\" },\n\t\"Kaarina\": { own: \"Kaarinan\", in: \"Kaarinassa\" },\n\t\"Kaavi\": { own: \"Kaavin\", in: \"Kaavissa\" },\n\t\"Kajaani\": { own: \"Kajaanin\", in: \"Kajaanissa\" },\n\t\"Kalajoki\": { own: \"Kalajoen\", in: \"Kalajoella\" },\n\t\"Kangasala\": { own: \"Kangasalan\", in: \"Kangasalla\" },\n\t\"Kangasniemi\": { own: \"Kangasniemen\", in: \"Kangasniemillä\" },\n\t\"Kankaanpää\": { own: \"Kankaanpään\", in: \"Kankaanpäässä\" },\n\t\"Kannonkoski\": { own: \"Kannonkosken\", in: \"Kannonkoskella\" },\n\t\"Kannus\": { own: \"Kannuksen\", in: \"Kannuksella\" },\n\t\"Karijoki\": { own: \"Karijoen\", in: \"Karijoella\" },\n\t\"Karkkila\": { own: \"Karkkilan\", in: \"Karkkilassa\" },\n\t\"Karstula\": { own: \"Karstulan\", in: \"Karstulassa\" },\n\t\"Karvia\": { own: \"Karvian\", in: \"Karvialla\" },\n\t\"Kauhajoki\": { own: \"Kauhajoen\", in: \"Kauhajoella\" },\n\t\"Kauhava\": { own: \"Kauhavan\", in: \"Kauhavalla\" },\n\t\"Kauniainen\": { own: \"Kauniaisten\", in: \"Kauniaisissa\" },\n\t\"Kaustinen\": { own: \"Kaustisen\", in: \"Kaustisilla\" },\n\t\"Keitele\": { own: \"Keiteleen\", in: \"Keiteleessä\" },\n\t\"Kemi\": { own: \"Kemin\", in: \"Kemissä\" },\n\t\"Kemijärvi\": { own: \"Kemijärven\", in: \"Kemijärvellä\" },\n\t\"Keminmaa\": { own: \"Keminmaan\", in: \"Keminmaalla\" },\n\t\"Kemiönsaari\": { own: \"Kemiönsaaren\", in: \"Kemiönsaaressa\" },\n\t\"Kempele\": { own: \"Kempeleen\", in: \"Kempeleellä\" },\n\t\"Kerava\": { own: \"Keravan\", in: \"Keravalla\" },\n\t\"Keuruu\": { own: \"Keuruun\", in: \"Keuruulla\" },\n\t\"Kihniö\": { own: \"Kihniön\", in: \"Kihniössä\" },\n\t\"Kinnula\": { own: \"Kinnulan\", in: \"Kinnulassa\" },\n\t\"Kirkkonummi\": { own: \"Kirkkonummen\", in: \"Kirkkonummella\" },\n\t\"Kitee\": { own: \"Kiteen\", in: \"Kiteellä\" },\n\t\"Kittilä\": { own: \"Kittilän\", in: \"Kittilässä\" },\n\t\"Kiuruvesi\": { own: \"Kiuruveden\", in: \"Kiuruvedellä\" },\n\t\"Kivijärvi\": { own: \"Kivijärven\", in: \"Kivijärvellä\" },\n\t\"Kokemäki\": { own: \"Kokemäen\", in: \"Kokemäellä\" },\n\t\"Kokkola\": { own: \"Kokkolan\", in: \"Kokkolassa\" },\n\t\"Kolari\": { own: \"Kolarin\", in: \"Kolarissa\" },\n\t\"Konnevesi\": { own: \"Konneveden\", in: \"Konnevedellä\" },\n\t\"Kontiolahti\": { own: \"Kontiolahden\", in: \"Kontiolahdella\" },\n\t\"Korsnäs\": { own: \"Korsnäsin\", in: \"Korsnäsissä\" },\n\t\"Koski TL\": { own: \"Koski TL:n\", in: \"Koski TL:ssä\" },\n\t\"Kotka\": { own: \"Kotkan\", in: \"Kotkassa\" },\n\t\"Kouvola\": { own: \"Kouvolan\", in: \"Kouvolassa\" },\n\t\"Kristiinankaupunki\": { own: \"Kristiinankaupungin\", in: \"Kristiinankaupungissa\" },\n\t\"Kruunupyy\": { own: \"Kruunupyyn\", in: \"Kruunupyyssä\" },\n\t\"Kuhmo\": { own: \"Kuhmon\", in: \"Kuhmossa\" },\n\t\"Kuhmoinen\": { own: \"Kuhmoisten\", in: \"Kuhmoisissa\" },\n\t\"Kumlinge\": { own: \"Kumlingen\", in: \"Kumlingessa\" },\n\t\"Kuopio\": { own: \"Kuopion\", in: \"Kuopiossa\" },\n\t\"Kuortane\": { own: \"Kuortaneen\", in: \"Kuortaneella\" },\n\t\"Kurikka\": { own: \"Kurikan\", in: \"Kurikassa\" },\n\t\"Kustavi\": { own: \"Kustavin\", in: \"Kustavissa\" },\n\t\"Kuusamo\": { own: \"Kuusamon\", in: \"Kuusamossa\" },\n\t\"Kyyjärvi\": { own: \"Kyyjärven\", in: \"Kyyjärvellä\" },\n\t\"Kärkölä\": { own: \"Kärkölän\", in: \"Kärkölässä\" },\n\t\"Kärsämäki\": { own: \"Kärsämäen\", in: \"Kärsämäellä\" },\n\t\"Kökar\": { own: \"Kökarin\", in: \"Kökarissa\" },\n\t\"Lahti\": { own: \"Lahden\", in: \"Lahdessa\" },\n\t\"Laihia\": { own: \"Laihian\", in: \"Laihialla\" },\n\t\"Laitila\": { own: \"Laitilan\", in: \"Laitilassa\" },\n\t\"Lapinjärvi\": { own: \"Lapinjärven\", in: \"Lapinjärvellä\" },\n\t\"Lapinlahti\": { own: \"Lapinlahden\", in: \"Lapinlahdella\" },\n\t\"Lappajärvi\": { own: \"Lappajärven\", in: \"Lappajärvellä\" },\n\t\"Lappeenranta\": { own: \"Lappeenrannan\", in: \"Lappeenrannassa\" },\n\t\"Lapua\": { own: \"Lapuan\", in: \"Laupualla\" },\n\t\"Laukaa\": { own: \"Laukaan\", in: \"Laukaalla\" },\n\t\"Lemi\": { own: \"Lemin\", in: \"Lemillä\" },\n\t\"Lemland\": { own: \"Lemlandin\", in: \"Lemlandissa\" },\n\t\"Lempäälä\": { own: \"Lempäälän\", in: \"Lempäälässä\" },\n\t\"Leppävirta\": { own: \"Leppävirran\", in: \"Leppävirralla\" },\n\t\"Lestijärvi\": { own: \"Lestijärven\", in: \"Lestijärvellä\" },\n\t\"Levi\": { own: \"Levin\", in: \"Levillä\" },\n\t\"Lieksa\": { own: \"Lieksan\", in: \"Lieksassa\" },\n\t\"Lieto\": { own: \"Liedon\", in: \"Liedossa\" },\n\t\"Liminka\": { own: \"Limingan\", in: \"Limingalla\" },\n\t\"Liperi\": { own: \"Liperin\", in: \"Liperissä\" },\n\t\"Lohja\": { own: \"Lohjan\", in: \"Lohjassa\" },\n\t\"Loimaa\": { own: \"Loimaan\", in: \"Loimaalla\" },\n\t\"Loppi\": { own: \"Lopen\", in: \"Lopella\" },\n\t\"Loviisa\": { own: \"Loviisan\", in: \"Loviisassa\" },\n\t\"Luhanka\": { own: \"Luhangan\", in: \"Luhangalla\" },\n\t\"Lumijoki\": { own: \"Lumijoen\", in: \"Lumijoella\" },\n\t\"Lumparland\": { own: \"Lumparlandin\", in: \"Lumparlandissa\" },\n\t\"Luoto\": { own: \"Luodon\", in: \"Luodossa\" },\n\t\"Luumäki\": { own: \"Luumäen\", in: \"Luumäellä\" },\n\t\"Maalahti\": { own: \"Maalahden\", in: \"Maalahdessa\" },\n\t\"Maarianhamina\": { own: \"Maarianhaminan\", in: \"Maarianhaminassa\" },\n\t\"Marttila\": { own: \"Marttilan\", in: \"Marttilassa\" },\n\t\"Masku\": { own: \"Maskun\", in: \"Maskussa\" },\n\t\"Merijärvi\": { own: \"Merijärven\", in: \"Merijärvellä\" },\n\t\"Merikarvia\": { own: \"Merikarvian\", in: \"Merikarvialla\" },\n\t\"Miehikkälä\": { own: \"Miehikkälän\", in: \"Miehikkälässä\" },\n\t\"Mikkeli\": { own: \"Mikkelin\", in: \"Mikkelissä\" },\n\t\"Muhos\": { own: \"Muhoksen\", in: \"Muhoksella\" },\n\t\"Multia\": { own: \"Multian\", in: \"Multiassa\" },\n\t\"Muonio\": { own: \"Muonion\", in: \"Muoniossa\" },\n\t\"Mustasaari\": { own: \"Mustasaaren\", in: \"Mustasaaressa\" },\n\t\"Muurame\": { own: \"Muuramen\", in: \"Muuramella\" },\n\t\"Mynämäki\": { own: \"Mynämäen\", in: \"Mynämäellä\" },\n\t\"Myrskylä\": { own: \"Myrskylän\", in: \"Myrskylässä\" },\n\t\"Mäntsälä\": { own: \"Mäntsälän\", in: \"Mäntsälässä\" },\n\t\"Mänttä\": { own: \"Mäntän\", in: \"Mäntässä\" },\n\t\"Mäntyharju\": { own: \"Mäntyharjun\", in: \"Mäntyharjussa\" },\n\t\"Naantali\": { own: \"Naantalin\", in: \"Naantalissa\" },\n\t\"Nakkila\": { own: \"Nakkilan\", in: \"Nakkilassa\" },\n\t\"Nivala\": { own: \"Nivalan\", in: \"Nivalassa\" },\n\t\"Nokia\": { own: \"Nokian\", in: \"Nokialla\" },\n\t\"Nousiainen\": { own: \"Nousiaisten\", in: \"Nousiaisilla\" },\n\t\"Nummela\": { own: \"Nummelan\", in: \"Nummelassa\" },\n\t\"Nurmes\": { own: \"Nurmeksen\", in: \"Nurmeksella\" },\n\t\"Nurmijärvi\": { own: \"Nurmijärven\", in: \"Nurmijärvellä\" },\n\t\"Närpiö\": { own: \"Närpiön\", in: \"Närpiössä\" },\n\t\"Orimattila\": { own: \"Orimattilan\", in: \"Orimattilassa\" },\n\t\"Oripää\": { own: \"Oripään\", in: \"Oripäässä\" },\n\t\"Orivesi\": { own: \"Oriveden\", in: \"Orivedellä\" },\n\t\"Oulainen\": { own: \"Oulaisten\", in: \"Oulaisilla\" },\n\t\"Oulu\": { own: \"Oulun\", in: \"Oulussa\" },\n\t\"Outokumpu\": { own: \"Outokummun\", in: \"Outokummussa\" },\n\t\"Padasjoki\": { own: \"Padasjoen\", in: \"Padasjoella\" },\n\t\"Paimio\": { own: \"Paimion\", in: \"Paimiossa\" },\n\t\"Paltamo\": { own: \"Paltamon\", in: \"Paltamossa\" },\n\t\"Parainen\": { own: \"Paraisten\", in: \"Paraisilla\" },\n\t\"Parikkala\": { own: \"Parikkalan\", in: \"Parikkalassa\" },\n\t\"Parkano\": { own: \"Parkanon\", in: \"Parkanossa\" },\n\t\"Pedersören kunta\": { own: \"Pedersören kunnan\", in: \"Pedersören kunnassa\" },\n\t\"Pelkosenniemi\": { own: \"Pelkosenniemen\", in: \"Pelkosenniemellä\" },\n\t\"Pello\": { own: \"Pellon\", in: \"Pellossa\" },\n\t\"Perho\": { own: \"Perhon\", in: \"Perhossa\" },\n\t\"Pertunmaa\": { own: \"Pertunmaan\", in: \"Pertunmaalla\" },\n\t\"Petäjävesi\": { own: \"Petäjäveden\", in: \"Petäjävedellä\" },\n\t\"Pieksämäki\": { own: \"Pieksämäen\", in: \"Pieksämäellä\" },\n\t\"Pielavesi\": { own: \"Pielaveden\", in: \"Pielavedellä\" },\n\t\"Pietarsaari\": { own: \"Pietarsaaren\", in: \"Pietarsaaressa\" },\n\t\"Pihtipudas\": { own: \"Pihtiputaan\", in: \"Pihtiputaalla\" },\n\t\"Pirkkala\": { own: \"Pirkkalan\", in: \"Pirkkalassa\" },\n\t\"Polvijärvi\": { own: \"Polvijärven\", in: \"Polvijärvellä\" },\n\t\"Pomarkku\": { own: \"Pomarkun\", in: \"Pomarkkussa\" },\n\t\"Pori\": { own: \"Porin\", in: \"Porissa\" },\n\t\"Pornainen\": { own: \"Pornaisten\", in: \"Pornaisissa\" },\n\t\"Porvoo\": { own: \"Porvoon\", in: \"Porvoossa\" },\n\t\"Posio\": { own: \"Posion\", in: \"Posiossa\" },\n\t\"Pudasjärvi\": { own: \"Pudasjärven\", in: \"Pudasjärvellä\" },\n\t\"Pukkila\": { own: \"Pukkilan\", in: \"Pukkilassa\" },\n\t\"Punkalaidun\": { own: \"Punkalaitumen\", in: \"Punkalaitumella\" },\n\t\"Puolanka\": { own: \"Puolangan\", in: \"Puolangassa\" },\n\t\"Puumala\": { own: \"Puumalan\", in: \"Puumalassa\" },\n\t\"Pyhtää\": { own: \"Pyhtään\", in: \"Pyhtäällä\" },\n\t\"Pyhäjoki\": { own: \"Pyhäjoen\", in: \"Pyhäjoella\" },\n\t\"Pyhäjärvi\": { own: \"Pyhäjärven\", in: \"Pyhäjärvellä\" },\n\t\"Pyhäntä\": { own: \"Pyhännän\", in: \"Pyhännällä\" },\n\t\"Pyhäranta\": { own: \"Pyhärannan\", in: \"Pyhärannalla\" },\n\t\"Pälkäne\": { own: \"Pälkäneen\", in: \"Pälkäneellä\" },\n\t\"Pöytyä\": { own: \"Pöytyän\", in: \"Pöytyällä\" },\n\t\"Raahe\": { own: \"Raahen\", in: \"Raahessa\" },\n\t\"Raasepori\": { own: \"Raaseporin\", in: \"Raaseporissa\" },\n\t\"Raisio\": { own: \"Raision\", in: \"Raisiossa\" },\n\t\"Rantasalmi\": { own: \"Rantasalmen\", in: \"Rantasalmella\" },\n\t\"Ranua\": { own: \"Ranuan\", in: \"Ranualla\" },\n\t\"Rauma\": { own: \"Rauman\", in: \"Raumalla\" },\n\t\"Rautalampi\": { own: \"Rautalammin\", in: \"Rautalammella\" },\n\t\"Rautavaara\": { own: \"Rautavaaran\", in: \"Rautavaarassa\" },\n\t\"Rautjärvi\": { own: \"Rautjärven\", in: \"Rautjärvellä\" },\n\t\"Reisjärvi\": { own: \"Reisjärven\", in: \"Reisjärvellä\" },\n\t\"Riihimäki\": { own: \"Riihimäen\", in: \"Riihimäellä\" },\n\t\"Ristijärvi\": { own: \"Ristijärven\", in: \"Ristijärvellä\" },\n\t\"Rovaniemi\": { own: \"Rovaniemen\", in: \"Rovaniemellä\" },\n\t\"Ruokolahti\": { own: \"Ruokolahden\", in: \"Ruokolahdella\" },\n\t\"Ruovesi\": { own: \"Ruoveden\", in: \"Ruovedellä\" },\n\t\"Rusko\": { own: \"Ruskon\", in: \"Ruskossa\" },\n\t\"Rääkkylä\": { own: \"Rääkkylän\", in: \"Rääkkylässä\" },\n\t\"Saarijärvi\": { own: \"Saarijärven\", in: \"Saarijärvellä\" },\n\t\"Salla\": { own: \"Sallan\", in: \"Sallassa\" },\n\t\"Salo\": { own: \"Salon\", in: \"Salossa\" },\n\t\"Saltvik\": { own: \"Saltvikin\", in: \"Saltvikissa\" },\n\t\"Sastamala\": { own: \"Sastamalan\", in: \"Sastamalassa\" },\n\t\"Sauvo\": { own: \"Sauvon\", in: \"Sauvossa\" },\n\t\"Savitaipale\": { own: \"Savitaipaleen\", in: \"Savitaipaleella\" },\n\t\"Savonlinna\": { own: \"Savonlinnan\", in: \"Savonlinnassa\" },\n\t\"Savukoski\": { own: \"Savukosken\", in: \"Savukoskella\" },\n\t\"Seinäjoki\": { own: \"Seinäjoen\", in: \"Seinäjoella\" },\n\t\"Sievi\": { own: \"Sievin\", in: \"Sievissä\" },\n\t\"Siikainen\": { own: \"Siikaisten\", in: \"Siikaisilla\" },\n\t\"Siikajoki\": { own: \"Siikajoen\", in: \"Siikajoella\" },\n\t\"Siikalatva\": { own: \"Siikalatvan\", in: \"Siikalatvassa\" },\n\t\"Siilinjärvi\": { own: \"Siilinjärven\", in: \"Siilinjärvellä\" },\n\t\"Simo\": { own: \"Simon\", in: \"Simossa\" },\n\t\"Sipoo\": { own: \"Sipoon\", in: \"Sipoossa\" },\n\t\"Siuntio\": { own: \"Siuntion\", in: \"Siuntiossa\" },\n\t\"Sodankylä\": { own: \"Sodankylän\", in: \"Sodankylässä\" },\n\t\"Soini\": { own: \"Soinin\", in: \"Soinissa\" },\n\t\"Somero\": { own: \"Someron\", in: \"Somerossa\" },\n\t\"Sonkajärvi\": { own: \"Sonkajärven\", in: \"Sonkajärvellä\" },\n\t\"Sotkamo\": { own: \"Sotkamon\", in: \"Sotkamossa\" },\n\t\"Sottunga\": { own: \"Sottungan\", in: \"Sottungassa\" },\n\t\"Sulkava\": { own: \"Sulkavan\", in: \"Sulkavalla\" },\n\t\"Sund\": { own: \"Sundin\", in: \"Sundissa\" },\n\t\"Suomussalmi\": { own: \"Suomussalmen\", in: \"Suomussalmella\" },\n\t\"Suonenjoki\": { own: \"Suonenjoen\", in: \"Suonenjoella\" },\n\t\"Sysmä\": { own: \"Sysmän\", in: \"Sysmässä\" },\n\t\"Säkylä\": { own: \"Säkylän\", in: \"Säkylässä\" },\n\t\"Taipalsaari\": { own: \"Taipalsaaren\", in: \"Taipalsaaressa\" },\n\t\"Taivalkoski\": { own: \"Taivalkosken\", in: \"Taivalkoskella\" },\n\t\"Taivassalo\": { own: \"Taivassalon\", in: \"Taivassalossa\" },\n\t\"Tammela\": { own: \"Tammelan\", in: \"Tammelassa\" },\n\t\"Tampere\": { own: \"Tampereen\", in: \"Tampereella\" },\n\t\"Tervo\": { own: \"Tervon\", in: \"Tervossa\" },\n\t\"Tervola\": { own: \"Tervolan\", in: \"Tervolassa\" },\n\t\"Teuva\": { own: \"Teuvan\", in: \"Teuvalla\" },\n\t\"Tohmajärvi\": { own: \"Tohmajärven\", in: \"Tohmajärvellä\" },\n\t\"Toholampi\": { own: \"Toholammen\", in: \"Toholammella\" },\n\t\"Toivakka\": { own: \"Toivakan\", in: \"Toivakassa\" },\n\t\"Tornio\": { own: \"Tornion\", in: \"Torniossa\" },\n\t\"Turku\": { own: \"Turun\", in: \"Turussa\" },\n\t\"Tuusniemi\": { own: \"Tuusniemen\", in: \"Tuusniemessä\" },\n\t\"Tuusula\": { own: \"Tuusulan\", in: \"Tuusulassa\" },\n\t\"Tyrnävä\": { own: \"Tyrnävän\", in: \"Tyrnävällä\" },\n\t\"Ulvila\": { own: \"Ulvilan\", in: \"Ulvilassa\" },\n\t\"Urjala\": { own: \"Urjalan\", in: \"Urjalassa\" },\n\t\"Utajärvi\": { own: \"Utajärven\", in: \"Utajärvellä\" },\n\t\"Utsjoki\": { own: \"Utsjoen\", in: \"Utsjoella\" },\n\t\"Uurainen\": { own: \"Uuraisten\", in: \"Uuraisilla\" },\n\t\"Uusikaarlepyy\": { own: \"Uudenkaarlepyyn\", in: \"Uudessakaarlepyyssä\" },\n\t\"Uusikaupunki\": { own: \"Uudenkaupungin\", in: \"Uudessakaupungissa\" },\n\t\"Vaala\": { own: \"Vaalan\", in: \"Vaalassa\" },\n\t\"Vaasa\": { own: \"Vaasan\", in: \"Vaasassa\" },\n\t\"Valkeakoski\": { own: \"Valkeakosken\", in: \"Valkeakoskella\" },\n\t\"Valtimo\": { own: \"Valtimon\", in: \"Valtimossa\" },\n\t\"Vantaa\": { own: \"Vantaan\", in: \"Vantaalla\" },\n\t\"Varkaus\": { own: \"Varkauden\", in: \"Varkaudessa\" },\n\t\"Vehmaa\": { own: \"Vehmaan\", in: \"Vehmaalla\" },\n\t\"Vesanto\": { own: \"Vesannon\", in: \"Vesannolla\" },\n\t\"Vesilahti\": { own: \"Vesilahden\", in: \"Vesilahdella\" },\n\t\"Veteli\": { own: \"Vetelin\", in: \"Vetelissä\" },\n\t\"Vieremä\": { own: \"Vieremän\", in: \"Vieremällä\" },\n\t\"Vihti\": { own: \"Vihdin\", in: \"Vihdissä\" },\n\t\"Viitasaari\": { own: \"Viitasaaren\", in: \"Viitasaaressa\" },\n\t\"Vimpeli\": { own: \"Vimpelin\", in: \"Vimpelissä\" },\n\t\"Virolahti\": { own: \"Virolahden\", in: \"Vironlahdella\" },\n\t\"Virrat\": { own: \"Virtojen\", in: \"Virroilla\" },\n\t\"Vårdö\": { own: \"Vårdön\", in: \"Vårdössa\" },\n\t\"Vöyri\": { own: \"Vöyrin\", in: \"Vöyrissä\" },\n\t\"Ylitornio\": { own: \"Ylitornion\", in: \"Ylitorniossa\" },\n\t\"Ylivieska\": { own: \"Ylivieskan\", in: \"Ylivieskassa\" },\n\t\"Ylöjärvi\": { own: \"Ylöjärven\", in: \"Ylöjärvellä\" },\n\t\"Ypäjä\": { own: \"Ypäjän\", in: \"Ypäjällä\" },\n\t\"Ähtäri\": { own: \"Ähtärin\", in: \"Ähtärissä\" },\n\t\"Äänekoski\": { own: \"Äänekosken\", in: \"Äänekoskella\" },\n};\n// prettier-ignore-end\n\nconst conjugateCity = (city: string, type: string): string => {\n\tif (!city) {\n\t\treturn \"\";\n\t}\n\n\tif ((!type && city) || !cities[city]) {\n\t\treturn city;\n\t}\n\n\tif (city && (type === \"own\" || type === \"in\") && cities[city]) {\n\t\treturn cities[city][type];\n\t}\n};\n\nexport default conjugateCity;\n","import React, { useEffect, useState, useRef } from \"react\";\nimport { RancidBannerContainer, DismissButton, RancidBannerContent } from \"./styles\";\nimport { Link } from \"react-router-dom\";\nimport conjugateCity from \"@utils/city-conjugation\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport { hasWindow } from \"@utils\";\nimport historyTracker, { HistoryField } from \"@services/history-tracker\";\n\ninterface IProps {\n\tbannerColor?: \"red\" | \"green\" | \"blue\";\n\tenterDelay?: number;\n\tonExit?: (e: any) => void;\n\ttextOverride?: string;\n\ttype: HistoryField;\n}\n\nconst RancidBanner = (props: IProps) => {\n\tconst { bannerColor = \"green\", enterDelay = 1000, onExit, textOverride, type } = props;\n\n\tif (!textOverride && !type) {\n\t\treturn null;\n\t}\n\n\tconst isInQuarantine = historyTracker.isInQuarantine();\n\tconst [isVisible, setVisible] = useState(true);\n\tconst city = historyTracker.getHistory(type) || null;\n\tconst [inCity, setInCity] = useState(conjugateCity(city, \"in\") || \"\");\n\tlet enterTimeout: number = null;\n\tlet exitTimeout: number = null;\n\tconst bannerRef = useRef(null);\n\n\tuseEffect(() => {\n\t\tif (hasWindow && bannerRef.current && isVisible && inCity && !isInQuarantine) {\n\t\t\tbannerRef.current.classList.add(\"visible\");\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tenterTimeout = window.setTimeout(() => {\n\t\t\t\t\tbannerRef.current.classList.add(\"enter\");\n\t\t\t\t}, enterDelay);\n\t\t\t});\n\t\t}\n\n\t\treturn () => {\n\t\t\tclearTimeout(enterTimeout);\n\t\t\tclearTimeout(exitTimeout);\n\t\t};\n\t}, [bannerRef.current]);\n\n\tuseEffect(() => {\n\t\tif (hasWindow) {\n\t\t\twindow.addEventListener(\"historyTrackUpdate\", onHistoryTrackUpdate);\n\t\t}\n\t\treturn () => {\n\t\t\tclearTimeout(enterTimeout);\n\t\t\tclearTimeout(exitTimeout);\n\t\t\tif (hasWindow) {\n\t\t\t\twindow.removeEventListener(\"historyTrackUpdate\", onHistoryTrackUpdate);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tconst onHistoryTrackUpdate = event => {\n\t\tif (event.detail && event.detail[type]) {\n\t\t\tconst newCity = conjugateCity(event.detail[type], \"in\");\n\t\t\tsetInCity(newCity);\n\t\t}\n\t};\n\n\tconst removeBanner = () => {\n\t\tbannerRef.current.classList.add(\"exit\");\n\n\t\tif (hasWindow) {\n\t\t\texitTimeout = window.setTimeout(() => {\n\t\t\t\tsetVisible(false);\n\t\t\t\thistoryTracker.setQuarantine(city);\n\n\t\t\t\tif (typeof onExit === \"function\") {\n\t\t\t\t\tonExit(city);\n\t\t\t\t}\n\t\t\t}, 450);\n\t\t}\n\t};\n\n\t// This needs to be always, SSR + Hydrate doens't like it magically appearing.\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t{!textOverride ? `Oletko myymässä asuntoasi ${inCity}?` : textOverride} \n\t\t\t\t\tHanki osuva hinta-arvio ›\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport default RancidBanner;\n","import styled from \"styled-components\";\nimport { media, color } from \"@utils/style-utils\";\nimport { darken } from \"polished\";\n\nexport const AreaNavContainer = styled.div.attrs(() => ({\n\tclassName: \"area-nav-container\",\n\tid: \"area-nav-container\",\n}))`\n\tborder-top: 1px solid #d7e9e4;\n\tleft: 0;\n\tposition: ${props => props.position || \"absolute\"};\n\ttop: 56px;\n\twidth: 100%;\n\n\t@media (min-width: 530px) {\n\t\ttop: 65px;\n\t}\n\n\t&.area-nav--property {\n\t\tborder-top: 0;\n\t\tposition: relative;\n\t}\n`;\n\nexport const AreaNav = styled.nav.attrs(() => ({\n\tclassName: \"area-nav\",\n\tid: \"area-nav\",\n}))`\n\tdisplay: none;\n\tflex-wrap: wrap;\n\tjustify-content: center;\n\tmargin: 0 auto;\n\tmax-width: 1050px;\n\tpadding-left: 15px;\n\tpadding-right: 15px;\n\twidth: 100%;\n\n\t${media.lgx`\n\t\tdisplay: flex;\n\t`}\n\n\ta {\n\t\tcolor: ${props => (props.isBlue ? darken(0.1, color(\"blue\", 2)) : color(\"greenDark\", 2))};\n\t\tdisplay: inline-block;\n\t\tfont-size: 14px;\n\t\tfont-weight: 500;\n\t\tmargin: 10px 13px;\n\t\tpadding: 14px 10px;\n\t\ttext-decoration: none;\n\t\ttransition: color 150ms;\n\n\t\t&:hover {\n\t\t\tcolor: ${props => (props.isBlue ? darken(0.2, color(\"blue\", 1)) : color(\"greenDark\", 1))};\n\t\t}\n\n\t\t&.is-active {\n\t\t\tcolor: ${props => (props.isBlue ? darken(0.2, color(\"blue\", 1)) : color(\"greenDark\", 1))};\n\t\t}\n\t}\n`;\n","import React, { useEffect } from \"react\";\nimport { connect } from \"react-redux\";\nimport isEmpty from \"lodash-es/isEmpty\";\nimport { IApplicationState } from \"@redux\";\nimport { AreaNavContainer, AreaNav } from \"./styles\";\nimport { IDocument } from \"@redux/document\";\nimport { Link } from \"react-router-dom\";\nimport { hasWindow } from \"@utils\";\n\ninterface IAreaNavLink {\n\tactive: boolean;\n\tname: string;\n\tlink: string;\n}\n\nconst getAreaNavi = (doc: IDocument): IAreaNavLink[] => {\n\tif (!isEmpty(doc) && !isEmpty(doc.areaNavi)) {\n\t\treturn doc.areaNavi;\n\t} else if (!isEmpty(doc) && !isEmpty(doc.page) && !isEmpty(doc.page.areaNavi)) {\n\t\treturn doc.page.areaNavi;\n\t} else {\n\t\treturn [];\n\t}\n};\n\ninterface IProps {\n\tdoc: IDocument;\n\tdata?: object;\n\tposition?: string;\n\tblue?: boolean;\n\t[key: string]: any;\n}\n\nconst AreaNavigation = (props: IProps) => {\n\tconst { blue, doc, data, ...rest } = props;\n\tconst areaNavi: IAreaNavLink[] = getAreaNavi(data || doc);\n\n\tuseEffect(() => {\n\t\tif (hasWindow) {\n\t\t\tdocument.body.classList.add(\"has-area-nav\");\n\n\t\t\treturn () => {\n\t\t\t\tdocument.body.classList.remove(\"has-area-nav\");\n\t\t\t};\n\t\t}\n\t}, []);\n\n\tif (isEmpty(areaNavi)) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{areaNavi.map(({ name, link, active }: IAreaNavLink, index: number) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{name}\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t\n\t\t\n\t);\n};\n\nconst mapStateToProps = (state: IApplicationState) => ({\n\tdoc: state.document,\n});\n\nexport default connect(mapStateToProps)(AreaNavigation);\n","import styled from \"styled-components\";\nimport { grid } from \"@utils/style-utils\";\n\nexport const ApartmentsContainer = styled.div`\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: space-between;\n\tmargin: 40px auto 90px;\n\tmax-width: 1635px;\n\n\t> div {\n\t\tflex-basis: 100%;\n\t\tmargin-bottom: ${grid.gutterSmall}px;\n\n\t\t@media (min-width: 610px) {\n\t\t\tflex-basis: calc((100% - ${grid.gutterSmall / 2}px) / 2);\n\t\t\tmargin-bottom: ${grid.gutterSmall / 2}px;\n\t\t}\n\n\t\t@media (min-width: 1215px) {\n\t\t\tflex-basis: calc((100% - ${(grid.gutter / 2) * 3}px) / 4);\n\t\t\tmargin-bottom: ${grid.gutter / 2}px;\n\t\t}\n\t}\n\n\t@media (max-width: 991px) and (hover: none) and (pointer: coarse) {\n\t\tflex-wrap: nowrap;\n\t\tmargin-left: -${grid.gutterSmall / 2}px;\n\t\tmargin-right: -${grid.gutterSmall / 2}px;\n\t\toverflow-x: scroll;\n\t\t-webkit-overflow-scrolling: touch;\n\t\twhite-space: nowrap;\n\t\twidth: auto;\n\n\t\t> div {\n\t\t\tflex: 1 0 86%;\n\t\t\tmargin-right: ${grid.gutterSmall / 2}px;\n\n\t\t\t&:first-of-type {\n\t\t\t\tmargin-left: ${grid.gutterSmall / 2}px;\n\t\t\t}\n\n\t\t\t&:nth-last-of-type(2) {\n\t\t\t\tflex: 0 0 ${grid.gutterSmall / 2}px;\n\t\t\t\tmargin: 0 !important;\n\t\t\t\twidth: ${grid.gutterSmall / 2}px;\n\t\t\t}\n\n\t\t\t&:nth-last-of-type(2),\n\t\t\t&:last-of-type {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n`;\n","import styled, { css } from \"styled-components\";\nimport { color, boxShadow, fontFamily } from \"@utils/style-utils\";\n\nexport const Select = styled.div`\n\tdisplay: inline-block;\n\tposition: relative;\n\tz-index: 9;\n`;\n\nexport const SelectButton = styled.button`\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tbackground: ${color(\"white\")};\n\tborder: 1px solid ${color(\"grey\", 5)};\n\tborder-radius: 4px;\n\tcursor: pointer;\n\tfont-family: ${fontFamily.base};\n\tfont-size: 16px;\n\tmin-width: 205px;\n\tpadding: 11px 50px 11px 16px;\n\tposition: relative;\n\ttext-align: left;\n\n\tspan.icon {\n\t\tcolor: ${color(\"greenBright\", 1)};\n\t\tfont-size: 16px;\n\t\tdisplay: block;\n\t\tright: 16px;\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\ttransform: translateY(-50%) rotate(0deg);\n\n\t\tsvg {\n\t\t\tmax-width: 16px;\n\t\t}\n\t}\n\n\t${props =>\n\t\tprops.isOpen &&\n\t\tcss`\n\t\t\tspan {\n\t\t\t\ttransform: translateY(-50%) rotate(180deg);\n\t\t\t}\n\t\t`}\n`;\n\nexport const Selections = styled.div`\n\tborder: 1px solid ${color(\"grey\", 5)};\n\tbox-shadow: ${boxShadow.basic};\n\tleft: 0;\n\tmin-width: 205px;\n\tposition: absolute;\n\ttop: 100%;\n`;\n\nexport const Selection = styled.div`\n\tbackground: ${color(\"white\")};\n\tborder-bottom: 1px solid ${color(\"grey\", 6)};\n\tcursor: pointer;\n\tfont-size: 16px;\n\tpadding: 11px 16px;\n\ttransition: background-color 150ms;\n\n\t&:hover {\n\t\tbackground: ${color(\"grey\", 7)};\n\t}\n\n\t${props =>\n\t\tprops.active &&\n\t\tcss`\n\t\t\tbackground: ${color(\"greenBright\", 4)};\n\t\t\tpointer-events: none;\n\t\t`}\n`;\n","import React, { useState, useEffect, useRef } from \"react\";\nimport useOnClickOutside from \"@hooks/use-click-outside\";\nimport { ISelection } from \"@utils/apartment-search/selections\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport { SelectButton, Select, Selections, Selection } from \"./styles\";\n\ninterface IProps {\n\tnoSelectionsText?: string;\n\tselections: ISelection[];\n\tonSelection?: (e) => void;\n\tdefaultValue?: any;\n\t[key: string]: any;\n}\n\nconst HousetypeDropdown = ({\n\tnoSelectionsText = \"Valitse\",\n\tselections: selectables,\n\tonSelection = e => void 0,\n\tdefaultValue = null,\n\t...rest\n}: IProps) => {\n\tif (!selectables || selectables.length <= 0) {\n\t\treturn null;\n\t}\n\tconst [mounted, setMounted] = useState(false);\n\tconst [selections, setSelections] = useState([...selectables]);\n\tconst [selected, setSelected] = useState([]);\n\tconst [isOpen, setOpen] = useState(false);\n\tconst ref = useRef(null);\n\n\tuseOnClickOutside(ref, () => setOpen(false));\n\n\tuseEffect(() => {\n\t\tif (defaultValue) {\n\t\t\tfor (const i in selections) {\n\t\t\t\tif (selections[i].value === defaultValue) {\n\t\t\t\t\tselections[i].selected = true;\n\n\t\t\t\t\tsetSelected([selections[i]]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tsetMounted(true);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (typeof onSelection === \"function\" && mounted) {\n\t\t\tonSelection(selected);\n\t\t}\n\t}, [selected]);\n\n\tconst select = (selection: ISelection) => {\n\t\tif (selected[0] && selection.value === selected[0].value) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst sels = selections.map(s => {\n\t\t\treturn {\n\t\t\t\t...s,\n\t\t\t\tselected: s.value === selection.value,\n\t\t\t};\n\t\t});\n\n\t\tsetSelections([...sels]);\n\t\tsetSelected([{ ...selection, selected: true }]);\n\t\tsetOpen(false);\n\t};\n\n\tconst isActive = (selection: ISelection): boolean =>\n\t\tselected && selected[0] && selection.value === selected[0].value;\n\n\treturn (\n\t\t\n\t);\n};\n\nexport default HousetypeDropdown;\n","import styled from \"styled-components\";\nimport { ribbon, media, boxShadow, color, textStyles } from \"@utils/style-utils\";\n\nexport const FormContainer = styled.div.attrs(() => ({\n\tclassName: \"homevisit-form\",\n}))`\n\tbackground: ${color(\"white\")};\n\tbox-shadow: ${boxShadow.hugeLight};\n\tposition: relative;\n\tpadding: 50px 30px 20px;\n\n\t@media print {\n\t\tdisplay: none !important;\n\t}\n\n\t${media.md`\n\t\tpadding-top: 66px;\n\n\t\t> * {\n\t\t\tmargin-left: auto;\n\t\t\tmargin-right: auto;\n\t\t\tmax-width: 312px;\n\t\t}\n\t`}\n\n\t&::before {\n\t\t${ribbon}\n\t\tcontent: '';\n\t\theight: 6px;\n\t\tleft: 0;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\twidth: 100%;\n\t}\n\n\ttextarea {\n\t\tmargin-top: 16px;\n\t}\n\n\tinput,\n\ttextarea {\n\t\tbackground: ${color(\"grey\", 7)} !important;\n\t}\n\n\t.basic-form {\n\t\tbackground: ${color(\"white\")};\n\t\tborder: 0;\n\t\tpadding-left: 0;\n\t\tpadding-right: 0;\n\t\tpadding-top: 5px;\n\n\t\tbutton {\n\t\t\twidth: 100%;\n\t\t}\n\t}\n\n\th3 {\n\t\t${textStyles.H3Condensed}\n\t\tmargin-bottom: 24px;\n\t\tmargin-top: 0;\n\t\ttext-align: center;\n\t}\n\n\tp {\n\t\t${textStyles.PSmallCondensed}\n\t\tcolor: ${color(\"grey\", 2)};\n\t\ttext-align: center;\n\n\t\tstrong {\n\t\t\tcolor: ${color(\"grey\", 1)};\n\t\t\tfont-weight: 500;\n\t\t}\n\t}\n`;\n","import React from \"react\";\nimport Editor from \"wake-react-components/editor\";\nimport BasicContactForm from \"@components/Form/ContactFormBasic\";\nimport { FormContainer } from \"./styles\";\n\nconst defaultText = `

Kutsu välittäjämme Kotikäynnille, kun haluat keskustella tarkemmin asunnon myynnistä ja arvosta. Välittäjiemme antamat hinta-arviot ovat toteutuneet tilastojemme mukaan keskimäärin 98 prosenttisesti.

Kotikäynti ei sido sinua mihinkään eikä aiheuta sinulle mitään kuluja.

`;\n\nconst HomevisitSmallForm = props => {\n\treturn (\n\t\t\n\t\t\t

Pyydä perusteltu hinta-arvio asunnostasi!

\n\t\t\t\n\t\t\t\n\t\t
\n\t);\n};\n\nexport default HomevisitSmallForm;\n","export interface ISelection {\n\tlabel: string;\n\t/** Order can be used to \"manually\" sort selections instead of alphabetical sort by label in sagas */\n\torder?: number;\n\tselected?: boolean;\n\tvalue: any;\n\t[key: string]: any;\n}\n\nexport const selectableHouseTypes: ISelection[] = [\n\t{ label: \"Kaikki asuntotyypit\", order: 0, value: \"all\" },\n\t{ label: \"Kerrostalo\", order: 1, value: \"kt\" },\n\t{ label: \"Rivitalo\", order: 2, value: \"rt\" },\n\t{ label: \"Omakotitalo\", order: 3, value: \"okt\" },\n];\n\nexport const selectableRooms: ISelection[] = [\n\t{ label: \"1h\", value: \"1h\" },\n\t{ label: \"2h\", value: \"2h\" },\n\t{ label: \"3h\", value: \"3h\" },\n\t{ label: \"4h\", value: \"4h\" },\n\t{ label: \"5h\", value: \"5h\" },\n\t{ label: \"6h+\", value: \"5hplus\" },\n];\n","export interface ISuggestionCategory {\n\tindex?: number;\n\tname: string;\n\ttype: string;\n\tpriceType: string;\n\tvalues: any[];\n}\n\nconst suggestionCategories: ISuggestionCategory[] = [\n\t{\n\t\tname: \"Kaupunki\",\n\t\ttype: \"city\",\n\t\tpriceType: \"c\",\n\t\tvalues: [],\n\t},\n\t{\n\t\tname: \"Postinumero\",\n\t\ttype: \"postcode\",\n\t\tpriceType: \"p\",\n\t\tvalues: [],\n\t},\n];\n\nexport default suggestionCategories;","import styled from \"styled-components\";\nimport { color } from \"@utils/style-utils\";\n\nexport const SearchInput = styled.div`\n\tposition: relative;\n\n\tinput {\n\t\tpadding: 10px 30px 10px 16px;\n\t\twidth: 306px;\n\n\t\t&.has-selected-area {\n\t\t\t&::placeholder {\n\t\t\t\tcolor: ${color(\"grey\", 1)};\n\t\t\t}\n\t\t}\n\t}\n\n\t.icon {\n\t\tcolor: ${color(\"grey\", 4)};\n\t\tdisplay: inline-block;\n\t\tfont-size: 14px;\n\t\tright: 14px;\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\ttransform: translateY(-50%);\n\n\t\t&.searching {\n\t\t\tcolor: ${color(\"greenBright\", 1)};\n\t\t}\n\n\t\tsvg {\n\t\t\tanimation-duration: 500ms;\n\t\t\tmax-width: 14px;\n\t\t}\n\t}\n`;\n","import React, { PureComponent, RefObject } from \"react\";\nimport TextInput from \"@components/Form/TextInput\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\n\nimport axios from \"axios\";\nimport categories, { ISuggestionCategory } from \"./suggestion-categories\";\n\nimport AddressSearchResults from \"@components/Search/AddressSearchResults\";\n\nimport { SearchInput } from \"./styles\";\nimport clsx from \"clsx\";\n\ninterface IProps {\n\tonSelect?: (selections?: any) => void;\n\tdefaultValue?: string;\n\tgrey?: boolean;\n}\n\ninterface IState {\n\tisOpen: boolean;\n\tresults: any;\n\tresultsOpen: boolean;\n\tselectedAddress: any;\n\ttimestamp?: number;\n\tplaceholder?: string;\n\t[key: string]: any;\n}\n\nclass PriceAddressSearch extends PureComponent {\n\tprotected suggestionCategories: ISuggestionCategory[] = [...categories];\n\tprotected ref: RefObject = React.createRef();\n\tprotected inputRef: RefObject = React.createRef();\n\tprotected isRendering: boolean = true;\n\tprotected initialPlaceholder: string = \"Kirjoita kaupunki tai postinumero\";\n\n\tconstructor(props: IProps) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\tisOpen: false,\n\t\t\tresults: [],\n\t\t\tresultsOpen: false,\n\t\t\tselectedAddress: {},\n\t\t\tplaceholder: props.defaultValue || \"Kirjoita kaupunki tai postinumero\",\n\t\t};\n\n\t\tthis.reset = this.reset.bind(this);\n\t\tthis.parseAddressSuggestions = this.parseAddressSuggestions.bind(this);\n\t\tthis.getAddressSuggestionsCount = this.getAddressSuggestionsCount.bind(this);\n\t\tthis.setSearchTerm = this.setSearchTerm.bind(this);\n\t\tthis.search = this.search.bind(this);\n\t\tthis.checkForClickOutside = this.checkForClickOutside.bind(this);\n\t\tthis.setAddress = this.setAddress.bind(this);\n\t\tthis.setOpen = this.setOpen.bind(this);\n\t\tthis.createPlaceholder = this.createPlaceholder.bind(this);\n\t\tthis.onFocus = this.onFocus.bind(this);\n\t}\n\n\tpublic reset() {\n\t\tconsole.log(\"reset address search\");\n\t\tthis.setState({\n\t\t\tisOpen: false,\n\t\t\tresults: [],\n\t\t\tresultsOpen: false,\n\t\t\tselectedAddress: {},\n\t\t});\n\t}\n\n\tparseAddressSuggestions(suggestions): ISuggestionCategory[] {\n\t\tfor (let i = 0, l = this.suggestionCategories.length; i < l; i++) {\n\t\t\tconst suggestionCategory = this.suggestionCategories[i];\n\t\t\tconst addressType = suggestionCategory.priceType;\n\t\t\tconst addressTypeName = suggestionCategory.name;\n\t\t\tsuggestionCategory.values.length = 0;\n\n\t\t\tfor (let j = 0; j < suggestions.length; j++) {\n\t\t\t\tconst suggestion = suggestions[j];\n\t\t\t\tif (suggestion.t === addressType) {\n\t\t\t\t\tsuggestion.index = j;\n\t\t\t\t\tsuggestion.value = suggestion.name;\n\t\t\t\t\tsuggestion.addressTypeName = addressTypeName;\n\t\t\t\t\tsuggestionCategory.values.push(suggestion);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.suggestionCategories;\n\t}\n\n\tgetAddressSuggestionsCount() {\n\t\tlet count = 0;\n\t\tthis.suggestionCategories.forEach(category => {\n\t\t\tcount += category.values.length;\n\t\t});\n\t\treturn count;\n\t}\n\n\tgetAddressByAssignedIndex(index: number) {\n\t\tfor (const category of this.suggestionCategories) {\n\t\t\tconst values = category.values;\n\n\t\t\tfor (const value of values) {\n\t\t\t\tif (value.index === index) {\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tsetOpen(state?: boolean) {\n\t\tthis.setState({\n\t\t\t...this.state,\n\t\t\tisOpen: true,\n\t\t});\n\t}\n\n\tasync setSearchTerm(value: string) {\n\t\tif (!value) {\n\t\t\tthis.setState({\n\t\t\t\t...this.state,\n\t\t\t\tresults: [],\n\t\t\t\tresultsOpen: false,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState({\n\t\t\t...this.state,\n\t\t\tisSearching: true,\n\t\t});\n\n\t\tconst results = await this.search(value);\n\n\t\tif (!this.isRendering) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState({\n\t\t\tcount: this.getAddressSuggestionsCount(),\n\t\t\tisOpen: true,\n\t\t\tisSearching: false,\n\t\t\tresults,\n\t\t\tresultsOpen: true,\n\t\t\ttimestamp: new Date().getMilliseconds() /* this will make component re-render without need for very deep check */,\n\t\t});\n\t}\n\n\tasync search(query: string) {\n\t\ttry {\n\t\t\tconst response = await axios.get(`/api/km/KMSite/priceAreas?key=${query}&limit=50`);\n\n\t\t\treturn this.parseAddressSuggestions(response.data.data);\n\t\t} catch (e) {\n\t\t\tconsole.log(\"Failed to search\", e);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tcheckForClickOutside(event: MouseEvent | TouchEvent) {\n\t\tif (!this.state.isOpen) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst target = event.target as HTMLElement;\n\t\tif (!this.ref.current || this.ref.current.contains(target)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState({\n\t\t\t...this.state,\n\t\t\tisOpen: false,\n\t\t\tresultsOpen: false,\n\t\t});\n\t}\n\n\tsetAddress(index: number) {\n\t\tconst selection = this.getAddressByAssignedIndex(index);\n\t\tconst input = this.ref.current.querySelector(\"input\");\n\t\tinput.value = \"\";\n\n\t\tthis.setState(\n\t\t\t{\n\t\t\t\t...this.state,\n\t\t\t\tisOpen: false,\n\t\t\t\tresultsOpen: false,\n\t\t\t\tselectedAddress: selection,\n\t\t\t\tplaceholder: selection.value,\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tif (this.props.onSelect) {\n\t\t\t\t\tthis.props.onSelect(this.state.selectedAddress);\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\tcreatePlaceholder() {\n\t\tconst { placeholder, isOpen } = this.state;\n\n\t\tif (isOpen) {\n\t\t\treturn this.initialPlaceholder;\n\t\t}\n\n\t\treturn placeholder;\n\t}\n\n\tonFocus() {\n\t\tthis.setOpen(true);\n\t}\n\n\tcomponentDidMount() {\n\t\tdocument.addEventListener(\"mousedown\", this.checkForClickOutside);\n\t\tdocument.addEventListener(\"touchstart\", this.checkForClickOutside);\n\t}\n\n\tcomponentWillUnmount() {\n\t\tthis.isRendering = false;\n\t\tdocument.removeEventListener(\"mousedown\", this.checkForClickOutside);\n\t\tdocument.removeEventListener(\"touchstart\", this.checkForClickOutside);\n\t}\n\n\trender() {\n\t\tconst { grey } = this.props;\n\t\tconst { count, isOpen, placeholder, isSearching, results, resultsOpen, timestamp } = this.state;\n\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t this.setSearchTerm(e.target.value)}\n\t\t\t\t\t\tonFocus={this.onFocus}\n\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t/>\n\t\t\t\t\t\n\t\t\t\t\t\t{isSearching && }\n\t\t\t\t\t\t{!isSearching && }\n\t\t\t\t\t\n\t\t\t\t\t{resultsOpen && results && (\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t\n\t\t);\n\t}\n}\n\nexport default PriceAddressSearch;\n","import { color } from \"@utils/style-utils\";\nconst white: string = color(\"white\");\nconst grey1: string = color(\"grey\", 1);\nconst grey2: string = color(\"grey\", 2);\nconst grey5: string = color(\"grey\", 5);\nconst grey7: string = color(\"grey\", 7);\nconst greenDark2: string = color(\"greenDark\", 2);\nconst greenDark4: string = color(\"greenDark\", 4);\n\nconst defaultOptions: Highcharts.Options = {\n\tchart: {\n\t\tbackgroundColor: grey7,\n\t\trenderTo: \"pricegraph\",\n\t\tspacingLeft: 30,\n\t\tspacingRight: 30,\n\t\tspacingTop: 30,\n\t\tzoomType: \"xy\",\n\t},\n\tcredits: {\n\t\tenabled: false,\n\t},\n\texporting: {\n\t\tenabled: false,\n\t},\n\tlegend: {\n\t\talign: \"left\",\n\t\tbackgroundColor: grey7,\n\t\tenabled: true,\n\t\tfloating: false,\n\t\titemDistance: 50,\n\t\titemStyle: {\n\t\t\tcolor: grey2,\n\t\t\tfontWeight: \"normal\",\n\t\t\tmarginBottom: \"5px\",\n\t\t},\n\t\tlayout: \"horizontal\",\n\t\tmargin: 30,\n\t\tsymbolPadding: 10,\n\t\tsymbolRadius: 0,\n\t\tsymbolWidth: 20,\n\t\tverticalAlign: \"bottom\",\n\t\tx: 40,\n\t},\n\tplotOptions: {\n\t\tarearange: {\n\t\t\tstates: {\n\t\t\t\thover: {\n\t\t\t\t\tenabled: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tseries: {\n\t\t\tstates: {\n\t\t\t\thover: {\n\t\t\t\t\tenabled: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\tseries: [\n\t\t{\n\t\t\tborderWidth: 0,\n\t\t\tcolor: greenDark4,\n\t\t\tdata: [],\n\t\t\tlegendIndex: 1,\n\t\t\tmaxPointWidth: 20,\n\t\t\tname: \"Kauppoja\",\n\t\t\ttooltip: {\n\t\t\t\tvalueSuffix: \" kpl\",\n\t\t\t},\n\t\t\ttype: \"column\",\n\t\t\tyAxis: 1,\n\t\t},\n\t\t{\n\t\t\tanimation: true,\n\t\t\tcolor: greenDark2,\n\t\t\tdata: [],\n\t\t\tlegendIndex: 0,\n\t\t\tlineWidth: 3,\n\t\t\tlinecap: \"square\",\n\t\t\tmarker: {\n\t\t\t\tfillColor: white,\n\t\t\t\tlineColor: greenDark2,\n\t\t\t\tlineWidth: 3,\n\t\t\t\tradius: 5,\n\t\t\t},\n\t\t\tname: \"Keskineliöhinta\",\n\t\t\ttooltip: {\n\t\t\t\tvalueSuffix: \" €/m²\",\n\t\t\t},\n\t\t\ttype: \"line\",\n\t\t},\n\t],\n\tsubtitle: {\n\t\ttext: \"\",\n\t},\n\ttitle: {\n\t\tmargin: 60,\n\t\tstyle: {\n\t\t\tcolor: grey1,\n\t\t\tfontFamily: \"'GT Walsheim', Helvetica, Arial, sans-serif\",\n\t\t\tfontSize: \"16px\",\n\t\t\tfontWeight: \"500\",\n\t\t},\n\t\ttext: \"\",\n\t},\n\ttooltip: {\n\t\tshared: true,\n\t},\n\txAxis: [\n\t\t{\n\t\t\tcategories: [],\n\t\t\tcrosshair: false,\n\t\t\tlineColor: grey5,\n\t\t\ttickColor: grey5,\n\t\t\ttickLength: 0,\n\t\t},\n\t],\n\tyAxis: [\n\t\t{\n\t\t\t// Primary yAxis\n\t\t\tgridLineColor: grey5,\n\t\t\tlabels: {\n\t\t\t\tformat: \"{value:,.0f}\",\n\t\t\t\tstyle: {\n\t\t\t\t\tcolor: grey2,\n\t\t\t\t\tfontSize: \"12px\",\n\t\t\t\t},\n\t\t\t},\n\t\t\ttitle: {\n\t\t\t\talign: \"high\",\n\t\t\t\toffset: 0,\n\t\t\t\trotation: 0,\n\t\t\t\tstyle: {\n\t\t\t\t\tcolor: grey2,\n\t\t\t\t},\n\t\t\t\ttext: \"€/m²\",\n\t\t\t\tx: -10,\n\t\t\t\ty: -50,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// Secondary yAxis,\n\t\t\tgridLineColor: grey5,\n\t\t\tlabels: {\n\t\t\t\tformat: \"{value:,.0f}\",\n\t\t\t\tstyle: {\n\t\t\t\t\tcolor: grey2,\n\t\t\t\t\tfontSize: \"12px\",\n\t\t\t\t},\n\t\t\t},\n\t\t\topposite: true,\n\t\t\ttitle: {\n\t\t\t\talign: \"high\",\n\t\t\t\toffset: 0,\n\t\t\t\trotation: 0,\n\t\t\t\tstyle: {\n\t\t\t\t\tcolor: grey2,\n\t\t\t\t},\n\t\t\t\ttext: \"kpl\",\n\t\t\t\tx: 15,\n\t\t\t\ty: -50,\n\t\t\t},\n\t\t},\n\t],\n};\n\nexport default defaultOptions;\n","import styled from \"styled-components\";\nimport { color, media } from \"@utils/style-utils\";\n\nexport const ApartmentPriceGraphDiv = styled.div`\n\tbackground: ${color(\"grey\", 7)};\n\tcolor: ${color(\"grey\", 2)};\n\tdisplay: flex;\n\tflex-direction: column;\n\theight: 600px;\n\tpadding: 20px 0;\n\n\t${media.lg`\n\t\tpadding: 40px 20px 20px;\n\t`}\n\n\t> div:first-of-type {\n\t\tflex-grow: 10;\n\t}\n`;\n\nexport const ApartmentPriceNoData = styled.div`\n\tposition: relative;\n\ttop: -260px;\n\ttext-align: center;\n`;\n\nexport const Disclaimer = styled.div`\n\tcolor: ${color(\"grey\", 3)};\n\tfont-size: 12px;\n\tpadding: 20px 25px;\n`;\n","import React, { memo, useEffect, useState } from \"react\";\nimport HighchartsReact from \"highcharts-react-official\";\nimport Highcharts from \"highcharts\";\nimport isEqual from \"react-fast-compare\";\n\nimport defaultOptions from \"./defaultOptions\";\n\nimport { ApartmentPriceGraphDiv, ApartmentPriceNoData, Disclaimer } from \"./styles\";\n\nconst generateTitle = (data): string => {\n\tlet priceGraphTitle = \"\";\n\tif (!data) {\n\t\treturn priceGraphTitle;\n\t}\n\tconst {\n\t\tname,\n\t\tparams: { roomName, roomNameTypes, typeName },\n\t\tpostalCode,\n\t\tpostalName,\n\t} = data;\n\n\tif (typeName) {\n\t\tpriceGraphTitle =\n\t\t\ttypeName +\n\t\t\t(roomNameTypes ? \" \" + roomNameTypes : \"\") +\n\t\t\t\" alueella \" +\n\t\t\t(postalCode ? postalCode + \", \" : \"\") +\n\t\t\t(postalName ? postalName : name);\n\t} else if (roomName) {\n\t\tpriceGraphTitle =\n\t\t\troomName + \" alueella \" + (postalCode ? postalCode + \", \" : \"\") + (postalName ? postalName : name);\n\t}\n\n\treturn priceGraphTitle;\n};\n\nconst generateChartData = (ashidata, ashiMinYear, ashiMaxYear) => {\n\tlet hasData = false;\n\tlet graphData = [];\n\tconst priceData = [];\n\tconst salesData = [];\n\tconst categories = [];\n\n\t// County data\n\tif (ashidata.ashiCounty !== undefined && ashidata.ashiCounty.length >= 1) {\n\t\tgraphData = ashidata.ashiCounty;\n\t}\n\t// Area data, preferred if available\n\tif (ashidata.ashi !== undefined && ashidata.ashi.length >= 1) {\n\t\tgraphData = ashidata.ashi;\n\t}\n\t// If we have current year, always show corresponding graph\n\tif (ashidata.ashiCurrentYear) {\n\t\tgraphData = ashidata.ashi || [];\n\t} else if (ashidata.ashiCountyCurrentYear) {\n\t\tgraphData = ashidata.ashiCounty || [];\n\t}\n\n\tlet firstYear = null;\n\tlet lastYear = null;\n\tfor (const i in graphData) {\n\t\tif (!graphData.hasOwnProperty(i)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (graphData[i] && graphData[i].priceperm2 && graphData[i].sales && graphData[i].year) {\n\t\t\t// Add missing data before sample years\n\t\t\tif (firstYear === null) {\n\t\t\t\tfirstYear = graphData[i].year;\n\t\t\t\tfor (let y = ashiMinYear; y < firstYear; y++) {\n\t\t\t\t\tpriceData.push(null);\n\t\t\t\t\tsalesData.push(null);\n\t\t\t\t\tcategories.push(y);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Add missing data between two years\n\t\t\tif (lastYear) {\n\t\t\t\tfor (let y = lastYear + 1; y < graphData[i].year; y++) {\n\t\t\t\t\tpriceData.push(null);\n\t\t\t\t\tsalesData.push(null);\n\t\t\t\t\tcategories.push(y);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Don't show data if sales are less than 5, but don't handle it as \"missing\"\n\t\t\tif (graphData[i].sales < 5) {\n\t\t\t\tpriceData.push(null);\n\t\t\t\tsalesData.push(null);\n\t\t\t\tcategories.push(graphData[i].year);\n\t\t\t\thasData = true;\n\t\t\t\tlastYear = graphData[i].year;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Add normal data.\n\t\t\tpriceData.push(graphData[i].priceperm2);\n\t\t\tsalesData.push(graphData[i].sales);\n\t\t\tcategories.push(graphData[i].year);\n\t\t\t// Has data\n\t\t\thasData = true;\n\t\t\t// Last year\n\t\t\tlastYear = graphData[i].year;\n\t\t}\n\t}\n\n\t// Missing last years?\n\tif (hasData) {\n\t\tfor (let y = lastYear+1; y <= ashiMaxYear; y++) {\n\t\t\tpriceData.push(null);\n\t\t\tsalesData.push(null);\n\t\t\tcategories.push(y);\n\t\t}\n\t}\n\n\t// No data, make year bar and data still.\n\tif (!hasData) {\n\t\tfor (let y = ashiMinYear;y <= ashiMaxYear;y++) {\n\t\t\tpriceData.push(null);\n\t\t\tsalesData.push(null);\n\t\t\tcategories.push(y);\n\t\t}\n\t}\n\n\treturn {\n\t\tcategories,\n\t\thasData,\n\t\tpriceData,\n\t\tsalesData,\n\t};\n};\n\nconst createNewOptions = (oldOptions, data, ashiMinYear, ashiMaxYear) => {\n\tconst title = generateTitle(data);\n\tconst { categories, priceData, salesData, hasData } = generateChartData(data, ashiMinYear, ashiMaxYear);\n\n\tconst newOptions = { ...oldOptions };\n\tnewOptions.series[0].data = salesData;\n\tnewOptions.series[1].data = priceData;\n\tnewOptions.title.text = title;\n\tnewOptions.xAxis[0].categories = categories;\n\n\treturn {\n\t\thasData,\n\t\tnewOptions,\n\t};\n};\n\nconst ApartmentPriceGraph = props => {\n\tconst { data, ashiMinYear, ashiMaxYear } = props;\n\tconst [chartOptions, setChartOptions] = useState(defaultOptions);\n\tconst [chartHasData, setChartHasData] = useState(true);\n\n\tuseEffect(() => {\n\t\t/* This will run on mount */\n\t\tconst { newOptions, hasData } = createNewOptions(chartOptions, data, ashiMinYear, ashiMaxYear);\n\n\t\tsetChartOptions(newOptions);\n\t\tsetChartHasData(hasData);\n\t}, []);\n\n\tuseEffect(() => {\n\t\t/* This will run when data changes */\n\t\tconst { newOptions, hasData } = createNewOptions(chartOptions, data, ashiMinYear, ashiMaxYear);\n\n\t\tsetChartOptions(newOptions);\n\t\tsetChartHasData(hasData);\n\t}, [data]);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t{!chartHasData && Valituilla hakukriteereillä ei löydy dataa.}\n\t\t\t\n\t\t\t\tLähteet: Hintaseurantapalvelu - Kiinteistönvälitysalan keskusliitto / Tilastokeskus, Paavo -\n\t\t\t\tPostinumeroalueittainen avain tieto, 2015 / Suomen virallinen tilasto (SVT): Kuluttajaindeksi\n\t\t\t\t[verkkojulkaisu]. ISSN=1796-3524. Helsinki: Tilastokeskus. Tietoja ei esitetä, mikäli kauppoja\n\t\t\t\tvalituilla hakuehdoilla on alle viisi.\n\t\t\t\n\t\t\n\t);\n};\n\nexport default memo(ApartmentPriceGraph, (prevProps, nextProps) => {\n\tif (!prevProps.data || !nextProps.data) {\n\t\treturn true;\n\t}\n\n\treturn isEqual(prevProps.data, nextProps.data);\n});\n","import styled, { css, keyframes } from \"styled-components\";\nimport { color, media, textStyles, buttons, fontFamily, emSpacing } from \"@utils/style-utils\";\n\nexport const ApartmentPricesHero = styled.div`\n\tbackground: ${color(\"greenBright\", 6)};\n\tpadding: 80px 0 56px;\n\tposition: relative;\n\tmargin-bottom: 85px;\n\n\t.rancid-banner {\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\tmargin-bottom: 0;\n\t\tmargin-top: 0;\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttransform: translateY(50%);\n\t\twidth: calc(100% - 30px);\n\t}\n\n\t${media.md`\n\t\tpadding: 100px 0 90px;\n\t`}\n\n\t${media.lg`\n\t\tpadding: 150px 0 100px;\n\t`}\n\n\t.area-nav-container {\n\t\tmargin-bottom: 55px;\n\t\tmargin-top: -86px;\n\t\tposition: relative;\n\t\ttop: 0 !important;\n\t}\n`;\n\nexport const HeroColumns = styled.div`\n\tmargin: auto;\n\tmax-width: 768px;\n\n\t${media.lg`\n\t\talign-items: center;\n\t\tdisplay: flex;\n\t\tmax-width: 100%;\n\t\twidth: 100%;\n\t`}\n`;\n\nexport const HeroColumn = styled.div`\n\tmargin-bottom: 30px;\n\n\t${media.lg`\n\t\tdisplay: flex;\n\t\tflex-basis: 50%;\n\t\tflex-direction: column;\n\n\t\t&:first-of-type {\n\t\t\tpadding-right: 40px;\n\t\t}\n\t`}\n\n\tp {\n\t\t${textStyles.PMedium}\n\n\t\tbutton {\n\t\t\t${buttons.textLinkPrimary}\n\t\t}\n\t}\n`;\n\nexport const HeroImage = styled.div`\n\theight: 0;\n\toverflow: hidden;\n\tpadding-bottom: 66.76%;\n\tposition: relative;\n\twidth: 100%;\n\n\t${media.lg`\n\t\tpadding-bottom: 48%;\n\t`}\n\n\timg {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\n\t\t&:first-of-type {\n\t\t\tleft: 0;\n\t\t\twidth: 84.8%;\n\t\t\tz-index: 1;\n\t\t}\n\n\t\t&:last-of-type {\n\t\t\tright: 0;\n\t\t\ttop: 18.34%;\n\t\t\twidth: 35.56%;\n\t\t\tz-index: 2;\n\t\t}\n\n\t\t${media.lg`\n\t\t\ttop: 0;\n\n\t\t\t&:first-of-type {\n\t\t\t\twidth: 71.69%;\n\t\t\t}\n\n\t\t\t&:last-of-type {\n\t\t\t\ttop: 0;\n\t\t\t\twidth: calc(28.31% - 20px);\n\t\t\t}\n\t\t`}\n\t}\n`;\n\nexport const SelectionsWrapper = styled.div`\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tmargin-bottom: 50px;\n\n\t${media.lg`\n\t\tmargin-bottom: 80px;\n\t`}\n\n\t> * {\n\t\tflex-basis: 100%;\n\t\tmargin-bottom: 12px;\n\n\t\t@media (min-width: 1386px) {\n\t\t\tmargin-right: 24px;\n\t\t}\n\t\t:last-child {\n\t\t\tmargin-right: 0;\n\t\t}\n\t}\n\n\t.form-group {\n\t\talign-items: center;\n\t\tdisplay: flex;\n\t\tflex-basis: calc((100% - 12px) / 2);\n\n\t\t&--year {\n\t\t\tmargin-right: 12px;\n\t\t}\n\t}\n\n\t.multi-button-select {\n\t\tdisplay: flex;\n\t}\n\n\t.selection-button {\n\t\tflex-basis: 0;\n\t\tflex-grow: 1;\n\t\tfont-size: 15px;\n\t\theight: 40px;\n\t\tmargin-left: -1px;\n\t\tpadding-left: 15px;\n\t\tpadding-right: 15px;\n\n\t\t&:first-of-type {\n\t\t\tmargin-left: 0;\n\t\t}\n\n\t\t@media (min-width: 374px) {\n\t\t\tfont-size: 16px;\n\t\t\tpadding-left: 17px;\n\t\t\tpadding-right: 17px;\n\t\t}\n\t}\n\n\t.calculate-button {\n\t\talign-self: center;\n\t\tmargin-left: auto;\n\t\tmargin-right: auto;\n\t\tmargin-top: 12px;\n\t\tmax-width: 312px;\n\n\t\t&.is-fetching {\n\t\t\theight: 47px;\n\t\t\tpadding: 0;\n\t\t\tfont-size: 24px;\n\n\t\t\t@media (min-width: 1386px) {\n\t\t\t\theight: 40px;\n\t\t\t}\n\t\t}\n\t}\n\n\t.housetype-dropdown button {\n\t\tfont-size: 15px;\n\t\tpadding: 10px 50px 10px 16px;\n\t\twidth: 100%;\n\n\t\t@media (min-width: 374px) {\n\t\t\tfont-size: 16px;\n\t\t}\n\t}\n\n\tinput#search {\n\t\tfont-size: 15px;\n\t\twidth: 100%;\n\n\t\t@media (min-width: 374px) {\n\t\t\tfont-size: 16px;\n\t\t}\n\t}\n\n\tinput[name=\"year\"],\n\tinput[name=\"m2\"] {\n\t\tfont-family: ${fontFamily.base};\n\t\tfont-size: 15px;\n\t\tflex-grow: 1;\n\t\twidth: 100%;\n\n\t\t@media (min-width: 374px) {\n\t\t\tfont-size: 16px;\n\t\t}\n\t}\n\n\tinput[name=\"m2\"] {\n\t\tmargin-right: 10px;\n\t}\n\n\t${media.md`\n\t\t> * {\n\t\t\tmargin-bottom: 18px;\n\t\t}\n\n\t\t.search-input,\n\t\t.housetype-dropdown {\n\t\t\tflex-basis: calc((100% - 12px) / 2);\n\t\t}\n\n\t\t.search-input {\n\t\t\tmargin-right: 12px;\n\t\t}\n\t`}\n\n\t${media.lg`\n\t\t.multi-button-select {\n\t\t\tflex-basis: calc((100% - 12px) / 2);\n\t\t}\n\n\t\t.form-group--year,\n\t\t.form-group--m2 {\n\t\t\tflex-basis: calc((50% - 24px) / 2);\n\t\t}\n\n\t\t.multi-button-select,\n\t\t.form-group--year {\n\t\t\tmargin-right: 12px;\n\t\t}\n\t`}\n\n\t@media (min-width: 1386px) {\n\t\t.search-input {\n\t\t\tflex-basis: 269px;\n\t\t\tmargin-bottom: 0;\n\t\t\tmargin-right: 24px;\n\n\t\t\tinput {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t}\n\n\t\t.housetype-dropdown {\n\t\t\tflex-basis: 209px;\n\t\t\tmargin-bottom: 0;\n\t\t\tmargin-right: 24px;\n\t\t}\n\n\t\t.multi-button-select {\n\t\t\tflex-basis: 331px;\n\t\t\tmargin-bottom: 0;\n\t\t\tmargin-right: 24px;\n\t\t}\n\n\t\t.form-group--year {\n\t\t\tflex-basis: 135px;\n\t\t\tmargin-bottom: 0;\n\t\t\tmargin-right: 24px;\n\t\t}\n\n\t\t.form-group--m2 {\n\t\t\tflex-basis: 115px;\n\t\t\tmargin-bottom: 0;\n\t\t\tmargin-right: 24px;\n\t\t}\n\n\t\tinput[name=\"year\"] {\n\t\t\tmax-width: 136px;\n\t\t}\n\n\t\tinput[name=\"m2\"] {\n\t\t\tmax-width: 100px;\n\t\t}\n\n\t\t.calculate-button {\n\t\t\tflex-basis: 159px;\n\t\t\tmargin: 0;\n\t\t\tmargin-left: auto;\n\t\t\tpadding: 12px 20px 11px;\n\t\t\twidth: auto;\n\t\t}\n\t}\n`;\n\nconst fetching = keyframes`\n\t0%, 100% {\n\t\topacity: 1;\n\t}\n\n\t50% {\n\t\topacity: 0.5;\n\t}\n`;\n\nexport const ResultsArea = styled.div`\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tmargin-bottom: 80px;\n\n\t${media.md`\n\t\tmargin-bottom: 110px;\n\t`}\n\n\t${media.lg`\n\t\tjustify-content: space-between;\n\t\tmargin-bottom: 130px;\n\t`}\n\n\t&.is-fetching {\n\t\tanimation: ${fetching} 800ms linear infinite;\n\t}\n`;\n\nexport const ChartArea = styled.div`\n\twidth: 100%;\n\n\t${media.lg`\n\t\twidth: calc(896 / 1364 * 100%);\n\t`}\n`;\n\nexport const Summary = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding-top: 30px;\n\tposition: relative;\n\twidth: 100%;\n\n\t${media.lg`\n\t\tpadding-left: 40px;\n\t\twidth: calc(468 / 1364 * 100%);\n\t`}\n\n\t&::before {\n\t\tborder-top: 1px solid ${color(\"grey\", 5)};\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttop: 0;\n\t\twidth: 100%;\n\n\t\t${media.lg`\n\t\t\twidth: calc(100% - 40px);\n\t\t`}\n\t}\n`;\n\nexport const SummaryItems = styled.div`\n\t${media.lg`\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tflex-grow: 10;\n\t\tjustify-content: center;\n\t`}\n`;\n\nexport const SummaryItem = styled.div`\n\tmargin-bottom: 30px;\n\n\t${media.lg`\n\t\tmargin-bottom: 48px;\n\t`}\n`;\n\nexport const SummaryItemTitle = styled.div`\n\tcolor: ${color(\"grey\", 2)};\n\tfont-family: ${fontFamily.condensed};\n\tfont-size: 16px;\n\tletter-spacing: ${emSpacing(0.02)};\n`;\n\nexport const SummaryItemValue = styled.div`\n\t${props =>\n\t\tprops.small\n\t\t\t? css`\n\t\t\t\t\t${textStyles.H3Condensed}\n\t\t\t `\n\t\t\t: css`\n\t\t\t\t\t${textStyles.H2}\n\t\t\t `}\n\n\talign-items: center;\n\tcolor: ${props => (props.green ? color(\"greenBright\", 1) : color(\"grey\", 2))};\n\tdisplay: flex;\n\tmargin-bottom: 10px;\n\n\tspan.small {\n\t\t${textStyles.H3Condensed}\n\t\tcolor: ${color(\"greenBasic\", 1)};\n\t\tmargin-bottom: 0;\n\t\tmargin-top: 0;\n\t}\n`;\n\nexport const ShareBar = styled.div`\n\talign-items: center;\n\tborder-bottom: 1px solid ${color(\"grey\", 5)};\n\tborder-top: 1px solid ${color(\"grey\", 5)};\n\tdisplay: flex;\n\tpadding: 9px 0;\n\twidth: 100%;\n\n\tspan.spacer {\n\t\tflex-grow: 10;\n\t}\n`;\n\nexport const Icon = styled.span`\n\tcolor: ${color(\"greenDark\", 2)};\n\tcursor: pointer;\n\tdisplay: inline-block;\n\tfont-size: 16px;\n\tmargin: ${props => (!props.last ? `0 12px 0 -5px` : `0 -5px 0 0`)};\n\toutline: 0;\n\tpadding: 5px;\n\ttransition: color 150ms;\n\n\t&:hover {\n\t\tcolor: ${color(\"greenDark\", 1)};\n\t\tsvg {\n\t\t\ttransform: scale(1.2);\n\t\t}\n\t}\n\n\tdiv {\n\t\toutline: 0;\n\t}\n\n\tsvg {\n\t\tmax-width: 16px;\n\t\ttransition: transform 150ms;\n\t}\n`;\n\nexport const AshiColumns = styled.div`\n\tmargin-bottom: 80px;\n\n\t${media.md`\n\t\tmargin-bottom: 120px;\n\t`}\n\n\t${media.lg`\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\tmargin-bottom: 160px;\n\t`}\n`;\n\n/* prettier-ignore */\nexport const AshiColumn = styled.div`\n\t.homevisit-form {\n\t\t@media (min-width: 992px) and (min-height: 900px) {\n\t\t\tposition: sticky;\n\t\t\ttop: 30px;\n\t\t}\n\t}\n\n\t${props =>\n\t\tprops.wide\n\t\t\t? css`\n\t\t\t\t${media.lg`\n\t\t\t\t\twidth: calc(896 / 1364 * 100%);\n\t\t\t\t`}\n\t\t\t`\n\t\t\t: css`\n\t\t\t\tpadding-top: 6px;\n\n\t\t\t\t${media.lg`\n\t\t\t\t\tpadding-left: 40px;\n\t\t\t\t\twidth: calc(468 / 1364 * 100%);\n\t\t\t\t`}\n\t\t\t`\n\t}\n`;\n/* prettier-ignore-end */\n\nexport const InfoTexts = styled.div`\n\th2 {\n\t\tmargin-top: 0;\n\n\t\t${media.md`\n\t\t\tmargin-bottom: 35px;\n\t\t`}\n\n\t\t${media.lg`\n\t\t\tmargin-bottom: 48px;\n\t\t`}\n\t}\n\n\tp {\n\t\t${textStyles.PMedium}\n\n\t\tmargin-bottom: 40px;\n\n\t\t${media.md`\n\t\t\tmargin-bottom: 60px;\n\t\t`}\n\n\t\t${media.lg`\n\t\t\tmargin-bottom: 80px;\n\t\t`}\n\t}\n`;\n\nexport const AshiAgents = styled.div`\n\th3 {\n\t\t${textStyles.H2}\n\t\tmargin-bottom: 30px;\n\n\t\t${media.lg`\n\t\t\tmargin-bottom: 48px;\n\t\t`}\n\t}\n\n\t> a {\n\t\t${buttons.textLinkPrimary}\n\t\tdisplay: inline-block;\n\t\tmargin-bottom: 40px;\n\t\tmargin-top: 20px;\n\n\t\t${media.lg`\n\t\t\tmargin-bottom: 0;\n\t\t`}\n\t}\n`;\n\nexport const AshiProperties = styled.div`\n\ta.mobile-link {\n\t\t${buttons.textLinkPrimary}\n\t\tdisplay: inline-block;\n\t\tposition: relative;\n\t\ttop: -30px;\n\n\t\t${media.lg`\n\t\t\tdisplay: none;\n\t\t`}\n\t}\n`;\n\nexport const AshiPropertiesHeader = styled.div`\n\talign-items: baseline;\n\tdisplay: flex;\n\n\t.spacer {\n\t\t${media.lg`\n\t\t\tborder-bottom: 1px solid ${color(\"grey\", 5)};\n\t\t\tflex-grow: 10;\n\t\t\tmargin: 0 25px;\n\t\t`}\n\t}\n\n\ta {\n\t\t${buttons.textLinkPrimary}\n\t\tdisplay: none;\n\n\t\t${media.lg`\n\t\t\tdisplay: inline-block;\n\t\t`}\n\t}\n`;\n\nexport const WhatAffectsIntro = styled.div`\n\tmargin: 0 auto 80px;\n\tmax-width: 926px;\n\tpadding: 0 15px;\n\ttext-align: center;\n\n\tp {\n\t\t${textStyles.PMedium}\n\t}\n`;\n\nexport const WhatAffectsWrapper = styled.div`\n\tbackground: ${color(\"grey\", 7)};\n\tmargin-bottom: 60px;\n\n\t${media.md`\n\t\tmargin-bottom: 80px;\n\t`}\n\n\t${media.lg`\n\t\tmargin-bottom: 100px;\n\t`}\n`;\n\nexport const WhatAffects = styled.div`\n\tpadding: 40px 0;\n\tposition: relative;\n\n\t${media.md`\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\tpadding: 80px 0;\n\t`}\n\n\timg {\n\t\tdisplay: none;\n\t\tleft: 50%;\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\ttransform: translate(-50%, -50%);\n\t\twidth: calc(426 / 1364 * 100%);\n\t\tz-index: 0;\n\n\t\t${media.lg`\n\t\t\tdisplay: block;\n\t\t`}\n\t}\n`;\n\nexport const WhatAffectsColumn = styled.div`\n\tposition: relative;\n\twidth: 100%;\n\tz-index: 5;\n\n\t${media.md`\n\t\twidth: calc((100% - 40px) / 2);\n\t`}\n\n\t${media.lg`\n\t\twidth: calc(428 / 1364 * 100%);\n\t`}\n\n\th4 {\n\t\t${textStyles.MicroTextCaps}\n\t\tmargin: 0;\n\t}\n\n\tp {\n\t\t${textStyles.PSmall}\n\t\tmargin-top: 0.5em;\n\t}\n`;\n\nexport const AshiSummaryText = styled.div`\n\tmargin: 0 auto 50px;\n\tmax-width: 926px;\n\tpadding: 0 15px;\n\ttext-align: center;\n\n\tp {\n\t\t${textStyles.PMedium}\n\t}\n`;\n\nexport const AshiExtra = styled.div`\n\tmargin: 0 auto 80px;\n\tmax-width: 926px;\n\tpadding: 0 15px;\n\ttext-align: center;\n\n\tbutton {\n\t\t${buttons.textLinkPrimary}\n\t\tmargin-top: 30px;\n\t}\n\n\th1 {\n\t\t${textStyles.H2}\n\t}\n\n\tp {\n\t\t${textStyles.PMedium}\n\n\t\ta {\n\t\t\t${textStyles.AInline}\n\t\t}\n\t}\n`;\n\nexport const AshiArticles = styled.div`\n\tbackground: ${color(\"grey\", 7)};\n\tpadding-bottom: 40px;\n\tpadding-top: 40px;\n\n\th2 {\n\t\t${textStyles.H1}\n\t}\n`;\n","import React, { useState } from \"react\";\n\ninterface IProps {\n\tbuttonTextClosed?: string;\n\tbuttonTextOpen?: string;\n\tchildren: any;\n\tdefaultOpen?: boolean;\n\t[key: string]: any;\n}\n\nconst Accordion = (props: IProps) => {\n\tconst { children, buttonTextClosed: textClosed, buttonTextOpen: textOpen } = props;\n\tconst [isOpen, toggleOpen] = useState(props.defaultOpen || false);\n\n\tfunction toggle() {\n\t\ttoggleOpen(!isOpen);\n\t}\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t{children}\n\t\t\t
\n\t\t\t\n\t\t
\n\t);\n};\n\nAccordion.defaultProps = {\n\tbuttonTextClosed: \"Avaa\",\n\tbuttonTextOpen: \"Sulje\",\n};\n\nexport default Accordion;\n","import React, {useState, useEffect, useRef, Fragment} from \"react\";\n\nimport {IDocument} from \"@redux/document\";\nimport {IApplicationState} from \"@redux\";\nimport {connect} from \"react-redux\";\n\nimport {Wrapper, Container} from \"@components/Grid\";\nimport MultiButtonSelect from \"@components/Form/MultiButtonSelect\";\nimport TextInput from \"@components/Form/TextInput\";\nimport {selectableRooms, selectableHouseTypes} from \"@utils/apartment-pricing/selections\";\nimport HousetypeDropdown from \"@components/HousetypeDropdown\";\nimport PriceAddressSearch from \"@components/Search/PriceAddressSearch\";\n\nimport ApartmentPriceGraph from \"@components/ApartmentPriceGraph\";\nimport CtaButton from \"@components/Buttons/CtaButton\";\n\nimport axios from \"axios\";\nimport {hasWindow, imageWithSize, getAssetUrl, wake} from \"@utils\";\n\nimport {\n\tApartmentPricesHero,\n\tChartArea,\n\tHeroColumn,\n\tHeroColumns,\n\tHeroImage,\n\tSelectionsWrapper,\n\tSummaryItem,\n\tSummaryItemTitle,\n\tSummaryItemValue,\n\tResultsArea,\n\tSummaryItems,\n\tShareBar,\n\tIcon,\n\tSummary,\n\tAshiColumns,\n\tAshiColumn,\n\tInfoTexts,\n\tAshiAgents,\n\tAshiProperties,\n\tAshiPropertiesHeader,\n\tWhatAffectsIntro,\n\tWhatAffects,\n\tWhatAffectsWrapper,\n\tWhatAffectsColumn,\n\tAshiSummaryText,\n\tAshiExtra,\n\tAshiArticles,\n} from \"./styles\";\nimport Image from \"@components/Image\";\n\nimport AgentList from \"@components/AgentList\";\nimport {ApartmentsContainer} from \"@components/ContentBlocks/ApartmentLifts/styles\";\nimport ApartmentBlock from \"@components/ApartmentBlock\";\nimport {Articles} from \"@pages/FrontPage/styles\";\nimport ArticleCards from \"@components/ArticleCards\";\nimport NumberFormat from \"react-number-format\";\nimport AreaNavigation from \"@components/AreaNavigation\";\nimport isEmpty from \"lodash-es/isEmpty\";\nimport {Link} from \"react-router-dom\";\nimport useParallax from \"@hooks/use-parallax\";\nimport {FacebookShareButton, TwitterShareButton, EmailShareButton} from \"react-share\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport HomevisitSmallForm from \"@components/Form/HomevisitSmallForm\";\nimport Editor from \"wake-react-components/editor\";\nimport {isAdmin} from \"wake-react-components/utils\";\nimport Accordion from \"@components/Accordion\";\nimport {filterXSS} from \"xss\";\nimport RancidBanner from \"@components/RancidBanner\";\nimport historyTracker from \"@services/history-tracker\";\nimport {animateScroll as scroll} from \"react-scroll\";\n\ninterface IProps {\n\tdocument: IDocument;\n}\n\ninterface IFigureData {\n\tpriceperm2?: number;\n\tsales?: number;\n\tyear?: number;\n\tprice?: number;\n\ttime?: number | string;\n}\n\nconst isPossiblyAreaInsteadOfYear = (value: string | number): boolean => Number(value) >= 1900;\n\nconst ApartmentPricingPage = (props: IProps) => {\n\tlet isRendering = true;\n\n\tconst {\n\t\tdocument: {\n\t\t\tashidata = {},\n\t\t\tashiTimespan = \"\",\n\t\t\tashiMinYear = \"\",\n\t\t\tashiMaxYear = \"\",\n\t\t\tagents = {},\n\t\t\tproperties = {},\n\t\t\tarticlesMain = {},\n\t\t\tapartmentPricesMoreSummary,\n\t\t},\n\t} = props;\n\n\tconst [ashiData, setAshiData] = useState(ashidata);\n\tconst [ashiAgents, setAshiAgents] = useState(agents);\n\tconst [ashiProperties, setAshiProperties] = useState(properties);\n\tconst [isFetching, setFetching] = useState(false);\n\tconst [share, setShare] = useState({\n\t\ttitle: hasWindow ? document.title : \"\",\n\t\turl: hasWindow ? location.href : \"/\",\n\t});\n\tconst ashiRef = useRef(null);\n\n\t/* Renaming some of these to avoid shadowed names */\n\tconst {name = null, params = {}, county: defaultCounty, postalCode: postcode} = ashiData;\n\n\t// figureData\n\tlet figureData: IFigureData = {};\n\tif (ashiData.ashiLatest) {\n\t\tfigureData = ashiData.ashiLatest;\n\t} else if (ashiData.ashiCountyLatest) {\n\t\tfigureData = ashiData.ashiCountyLatest;\n\t}\n\n\t// figureCurrentYear\n\tlet figureCurrentYear: IFigureData = {};\n\tif (ashiData.ashiCurrentYear) {\n\t\tfigureCurrentYear = ashiData.ashiCurrentYear;\n\t\tfigureData = ashiData.ashiLatest || [];\n\t} else if (ashiData.ashiCountyCurrentYear) {\n\t\tfigureCurrentYear = ashiData.ashiCountyCurrentYear;\n\t\tfigureData = ashiData.ashiCountyLatest || [];\n\t}\n\n\tconst defaultQuery = {\n\t\tcounty: defaultCounty || \"Helsinki\",\n\t\tid: params.id || \"Helsinki\",\n\t\tm2: params.m2 || \"\",\n\t\tpostalCode: postcode || 0,\n\t\troom: params.room || \"all\",\n\t\ttype: params.type || \"all\",\n\t\tyear: params.year || \"\",\n\t};\n\n\tconst defaultValues = {\n\t\t...defaultQuery,\n\t\tidPlain: name || \"Kirjoita kaupunki tai postinumero\",\n\t};\n\n\tconst [query, setQuery] = useState(defaultQuery);\n\tconst [defaults, setDefaults] = useState(defaultValues);\n\n\tconst updateQuery = field => {\n\t\tsetQuery({\n\t\t\t...query,\n\t\t\t...field,\n\t\t});\n\t};\n\n\tconst updateAddress = address => {\n\t\tif (address && address.t === \"p\") {\n\t\t\tupdateQuery({\n\t\t\t\tcounty: address ? address.county : \"Helsinki\",\n\t\t\t\tid: address ? address.id : \"Helsinki\",\n\t\t\t\tpostalCode: address ? address.id : 0,\n\t\t\t});\n\t\t} else if (address && address.t === \"c\") {\n\t\t\tupdateQuery({\n\t\t\t\tcounty: address ? address.id : \"Helsinki\",\n\t\t\t\tid: address ? address.id : \"Helsinki\",\n\t\t\t\tpostalCode: 0,\n\t\t\t});\n\t\t}\n\t};\n\n\tconst fetchData = async (forcedParams = null) => {\n\t\t// console.log(\"fetch\", { query: forcedParams ? forcedParams : query });\n\t\tconst api = \"/api/km/KMSite/priceCalculator\";\n\n\t\ttry {\n\t\t\tconst response = await axios.get(api, {params: forcedParams ? forcedParams : query});\n\t\t\treturn response.data;\n\t\t} catch (e) {\n\t\t\tconsole.log(\"error while fetching apartment prices\", e);\n\t\t\tsetFetching(false);\n\t\t}\n\t};\n\n\tconst fetchAgentData = async (params = null) => {\n\t\tconst api = \"/api/km/KMSite/agentSearch\";\n\n\t\ttry {\n\t\t\tconst response = await axios.get(api, {params});\n\t\t\treturn response.data;\n\t\t} catch (e) {\n\t\t\tconsole.log(\"error while fetching agent data\", e);\n\t\t}\n\t};\n\n\tconst fetchAgentSalesData = async (params = null) => {\n\t\tconst api = \"/api/km/KMSite/agentSearchBySales\";\n\n\t\ttry {\n\t\t\tconst response = await axios.get(api, {params});\n\t\t\treturn response.data;\n\t\t} catch (e) {\n\t\t\tconsole.log(\"error while fetching agent sales data\", e);\n\t\t}\n\t};\n\n\tconst fetchPropertyData = async (params = null) => {\n\t\tconst api = \"/api/km/KMSite/propertiesSimilar\";\n\n\t\ttry {\n\t\t\tconst response = await axios.get(api, {params});\n\t\t\treturn response.data;\n\t\t} catch (e) {\n\t\t\tconsole.log(\"error while fetching property data\", e);\n\t\t}\n\t};\n\n\tconst updateChartData = async (push: boolean = true, forcedParams = null) => {\n\t\tsetFetching(true);\n\t\tconst {data} = await fetchData(forcedParams);\n\t\tif (data && isRendering) {\n\t\t\tconst {url} = data.params;\n\n\t\t\tsetAshiData(data);\n\t\t\tashiRef.current = data;\n\n\t\t\t// Update title\n\t\t\tdocument.title = \"Asuntojen hinnat \" + (data.name || \"\") + \" | Kiinteistömaailma\";\n\n\t\t\t// newFigureData, needed for property query\n\t\t\tlet newFigureData: IFigureData = {};\n\t\t\tif (data.ashiLatest) {\n\t\t\t\tnewFigureData = data.ashiLatest;\n\t\t\t} else if (data.ashiCountyLatest) {\n\t\t\t\tnewFigureData = data.ashiCountyLatest;\n\t\t\t}\n\t\t\tif (data.ashiCurrentYear) {\n\t\t\t\tnewFigureData = data.ashiLatest || [];\n\t\t\t} else if (data.ashiCountyCurrentYear) {\n\t\t\t\tnewFigureData = ashiData.ashiCountyLatest || [];\n\t\t\t}\n\t\t\tconst currentPropertyQuery = {\n\t\t\t\tlimit: 4,\n\t\t\t\troomAmount: data.params.room || \"all\",\n\t\t\t\tsalesPriceUnencumbered: (newFigureData.priceperm2 || 0) * (data.params.m2 || 0),\n\t\t\t\tsortArea: data.params.m2 || \"\",\n\t\t\t\ttype: data.params.type || \"\",\n\t\t\t\t[data.params.apartmentSearchField]: data.params.id || \"Helsinki\",\n\t\t\t};\n\t\t\tupdatePropertyData(currentPropertyQuery);\n\n\t\t\tconst currentAgentQuery = {\n\t\t\t\tcity: data.county || '',\n\t\t\t\tlimit: 4,\n\t\t\t\tpostCode: data.postalCode || data.postcode || '',\n\t\t\t\trandom: true,\n\t\t\t};\n\t\t\tconst currentAgentSalesQuery = {\n\t\t\t\tapartmentAmount: data.params.room || \"all\",\n\t\t\t\tapartmentType: data.params.type || \"all\",\n\t\t\t\tkey: data.params.id || \"Helsinki\",\n\t\t\t\tlimit: 4,\n\t\t\t};\n\t\t\tupdateAgentData(currentAgentQuery, currentAgentSalesQuery);\n\n\t\t\tif (forcedParams) {\n\t\t\t\tsetDefaults({\n\t\t\t\t\t...defaults,\n\t\t\t\t\t...forcedParams,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tsetFetching(false);\n\n\t\t\tif (hasWindow && window.history.pushState && push) {\n\t\t\t\twindow.history.pushState({query}, null, url);\n\t\t\t}\n\n\t\t\tsetShare({\n\t\t\t\ttitle: document.title,\n\t\t\t\turl: location.href,\n\t\t\t});\n\t\t}\n\t};\n\n\tconst updateAgentData = async (params = null, salesParams = null) => {\n\t\tconst {data} = await fetchAgentData(params);\n\t\tif (isEmpty(data.agents)) {\n\t\t\tconst {data: salesData} = await fetchAgentSalesData(salesParams);\n\t\t\tif (salesData && isRendering) {\n\t\t\t\tsetAshiAgents(salesData);\n\t\t\t}\n\t\t} else {\n\t\t\tif (data && isRendering) {\n\t\t\t\tsetAshiAgents(data);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst updatePropertyData = async (params = null) => {\n\t\tconst {data} = await fetchPropertyData(params);\n\t\tif (data && isRendering) {\n\t\t\tsetAshiProperties(data);\n\t\t}\n\t};\n\n\tconst onPopState = e => {\n\t\tif (e.state && e.state.query) {\n\t\t\tlet {query: stateQuery} = e.state;\n\t\t\tlet {year, m2} = stateQuery;\n\n\t\t\tif (isPossiblyAreaInsteadOfYear(year)) {\n\t\t\t\tm2 = year;\n\t\t\t\tyear = \"\";\n\n\t\t\t\tstateQuery = {\n\t\t\t\t\t...stateQuery,\n\t\t\t\t\tm2,\n\t\t\t\t\tyear,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tupdateQuery(stateQuery);\n\t\t\tupdateChartData(false, stateQuery);\n\t\t}\n\t};\n\n\tconst formatNumber = (num: number) => {\n\t\treturn new Intl.NumberFormat(\"fi-FI\", {minimumFractionDigits: 2, maximumFractionDigits: 2}).format(num);\n\t};\n\n\tconst getLastYearText = (data) => {\n\t\tconst lastYear = new Date().getFullYear() - 1;\n\t\tif (data && data.year && lastYear === data.year) {\n\t\t\treturn \" viime vuonna\";\n\t\t}\n\t\tif (data && data.year) {\n\t\t\treturn \" vuonna \" + data.year;\n\t\t}\n\t\treturn \"\";\n\t};\n\n\tuseEffect(() => {\n\t\tif (hasWindow) {\n\t\t\twindow.addEventListener(\"popstate\", onPopState);\n\t\t}\n\n\t\treturn () => {\n\t\t\tif (hasWindow) {\n\t\t\t\twindow.removeEventListener(\"popstate\", onPopState);\n\t\t\t}\n\t\t\t/* this should prevent setState after async fetch if component unmounts */\n\t\t\tisRendering = false;\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (hasWindow && ashiRef.current) {\n\t\t\thistoryTracker.trackHistory(\"seller-county\", ashiRef.current.county);\n\t\t}\n\t}, [ashiRef.current]);\n\n\tlet titleH1 = \"Asuntojen hinnat\";\n\tlet ashiname = \"\";\n\tlet whatAffectsTexts = \"\";\n\n\tif (ashiData) {\n\t\ttitleH1 += `${ashiData.county ? \" \" + ashiData.county : \"\"}`;\n\t\ttitleH1 += `${ashiData.postalName ? \", \" + ashiData.postalName : \"\"}`;\n\n\t\tashiname += `${ashiData.name ? \" \" + ashiData.name : \"\"}`;\n\t}\n\n\t// Texts\n\tlet infoTexts = \"\";\n\tif (figureData.priceperm2) {\n\t\tinfoTexts +=\n\t\t\t\"Toteutuneiden asuntokauppatilastojen perusteella asuntosi keskineliöhinta\" + getLastYearText(figureData) + \" olisi ollut \" +\n\t\t\tfigureData.priceperm2 +\n\t\t\t\" €/m².\";\n\t\twhatAffectsTexts +=\n\t\t\t\"Toteutuneiden asuntokauppatilastojen perusteella asuntosi keskineliöhinta\" + getLastYearText(figureData) + \" olisi ollut \" +\n\t\t\tfigureData.priceperm2 +\n\t\t\t\" €/m².\";\n\t}\n\tif (ashiData.params.postalcode) {\n\t\tif (\n\t\t\tashiData.ashiLatest &&\n\t\t\tashiData.ashiCountyLatest &&\n\t\t\tashiData.ashiLatest.priceperm2 &&\n\t\t\tashiData.ashiCountyLatest.priceperm2\n\t\t) {\n\t\t\tif (ashiData.ashiLatest.priceperm2 > ashiData.ashiCountyLatest.priceperm2) {\n\t\t\t\tinfoTexts += \" \" + ashiData.postalName + \" on neliöhinnoiltaan kunnan keskiarvoa kalliimpi.\";\n\t\t\t} else {\n\t\t\t\tinfoTexts += \" \" + ashiData.postalName + \" on neliöhinnoiltaan kunnan keskiarvoa edullisempi.\";\n\t\t\t}\n\t\t}\n\t}\n\tif (ashiData.params.year && ashiData.comparison && ashiData.comparison.m2) {\n\t\tinfoTexts +=\n\t\t\t\" Asuntosi arvo on muuttunut vuodesta \" +\n\t\t\tashiData.params.year +\n\t\t\t\" laskennallisesti \" +\n\t\t\tformatNumber(ashiData.comparison.m2.percent) +\n\t\t\t\"%.\";\n\t}\n\tif (\n\t\tashiData.comparison.price &&\n\t\tashiData.comparison.m2 &&\n\t\tashiData.comparison.price.percent &&\n\t\tashiData.comparison.m2.percent\n\t) {\n\t\tif (ashiData.comparison.m2.percent > ashiData.comparison.price.percent) {\n\t\t\tinfoTexts += \" Samaan aikaan kuluttajahintojen nousu - eli inflaatio - on ollut tätä pienempi.\";\n\t\t} else {\n\t\t\tinfoTexts += \" Samaan aikaan kuluttajahintojen nousu - eli inflaatio - on ollut tätä suurempi.\";\n\t\t}\n\t}\n\tlet averageSales = 0;\n\tif (ashiData.ashiAverages && ashiData.ashiAverages.sales) {\n\t\taverageSales = ashiData.ashiAverages.sales;\n\t} else if (ashiData.ashiCountyAverages && ashiData.ashiCountyAverages.sales) {\n\t\taverageSales = ashiData.ashiCountyAverages.sales;\n\t}\n\tlet shouldShowNumbers = true;\n\tif (figureData && figureData.sales) {\n\t\tif (figureData.sales < 5) {\n\t\t\tshouldShowNumbers = false;\n\t\t}\n\t\tif (figureData.sales > averageSales) {\n\t\t\tinfoTexts +=\n\t\t\t\t\" Neliöhinnan arvioinnissa on hyvä huomioida, että alueella on tehty\" + getLastYearText(figureData) + \" keskimääräistä enemmän kauppaa.\";\n\t\t\twhatAffectsTexts +=\n\t\t\t\t\" Neliöhinnan arvioinnissa on hyvä huomioida, että alueella on tehty\" + getLastYearText(figureData) + \" keskimääräistä enemmän kauppaa.\";\n\t\t} else {\n\t\t\tinfoTexts +=\n\t\t\t\t\" Neliöhinnan arvioinnissa on hyvä huomioida, että alueella on tehty\" + getLastYearText(figureData) + \" keskimääräistä vähemmän kauppaa.\";\n\t\t\twhatAffectsTexts +=\n\t\t\t\t\" Neliöhinnan arvioinnissa on hyvä huomioida, että alueella on tehty\" + getLastYearText(figureData) + \" keskimääräistä vähemmän kauppaa.\";\n\t\t}\n\t}\n\tif (ashiData.params.m2) {\n\t\tif (ashiData.paavo && ashiData.paavo.flat_size) {\n\t\t\tif (ashiData.params.m2 > ashiData.paavo.flat_size) {\n\t\t\t\tinfoTexts +=\n\t\t\t\t\t\" Asuntosi neliömäärä on alueen keskiarvoa suurempi, mikä myös vaikuttaa asunnon todelliseen arvoon.\";\n\t\t\t} else {\n\t\t\t\tinfoTexts +=\n\t\t\t\t\t\" Asuntosi neliömäärä on alueen keskiarvoa pienempi, mikä myös vaikuttaa asunnon todelliseen arvoon.\";\n\t\t\t}\n\t\t}\n\t}\n\tif (infoTexts) {\n\t\tinfoTexts = '\"' + infoTexts + '\"';\n\t}\n\n\tuseParallax(\".parallax\", {speed: -0.6});\n\tuseParallax(\".parallax-1\", {speed: 0.6});\n\n\tconst formRef = useRef(null);\n\n\tconst scrollToContactForm = () => {\n\t\tif (formRef.current) {\n\t\t\ttry {\n\t\t\t\tconst {top} = formRef.current.getBoundingClientRect();\n\t\t\t\tscroll.scrollTo(top - 25);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log(e);\n\t\t\t}\n\t\t}\n\t};\n\n\t// If we have ashiData and are not loading.\n\tif (ashiData && !wake.loading) {\n\t\tif (ashiData.postalCode) {\n\t\t\thistoryTracker.trackHistory(\"seller-postcode\", ashiData.postalCode);\n\t\t}\n\t\tif (ashiData.county) {\n\t\t\thistoryTracker.trackHistory(\"seller-county\", ashiData.county);\n\t\t}\n\t}\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t

{titleH1}

\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\tHintalaskurista näet toteutuneet asuntojen hinnat{ashiname}. Saat\n\t\t\t\t\t\t\t\ttilastoihin pohjautuvan arvion asuntosi neliöhinnasta ja näet miten asuntojen hinnat\n\t\t\t\t\t\t\t\tovat muuttuneet hankintavuodesta. Laskurin pohjana ovat kaikkien kiinteistönvälittäjien\n\t\t\t\t\t\t\t\tvälityksellä toteutuneet asuntokaupat{ashiname}.\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t{ashiData && ashiData.county && }\n\t\t\t
\n\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t

Aloita syöttämällä asunnon tiedot

\n\t\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t updateAddress(address)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t updateQuery({type: type[0] ? type[0].value : \"all\"})}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t updateQuery({room: room[0] ? room[0].value : \"all\"})}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t updateQuery({year: target.value})}\n\t\t\t\t\t\t\tplaceholder=\"Hankintavuosi\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t updateQuery({m2: target.value})}\n\t\t\t\t\t\t\tplaceholder=\"Koko\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tLaske arvio\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t

{titleH1} ja kauppojen määrät

\n\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{ashiData.postalCode ? ashiData.postalCode + \", \" : \"\"}\n\t\t\t\t\t\t\t\t\t\t{ashiData.postalName\n\t\t\t\t\t\t\t\t\t\t\t? ashiData.postalName +\n\t\t\t\t\t\t\t\t\t\t\t(ashiData.county && ashiData.county !== ashiData.postalName\n\t\t\t\t\t\t\t\t\t\t\t\t? \", \" + ashiData.county\n\t\t\t\t\t\t\t\t\t\t\t\t: \"\")\n\t\t\t\t\t\t\t\t\t\t\t: ashiData.name}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tToteutuneet asuntokaupat\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{shouldShowNumbers ? <>\n\t\t\t\t\t\t\t\t\t\t\t{!!figureData.priceperm2 ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\"-\"\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t{ashiData.comparison &&\n\t\t\t\t\t\t\t\t\t\t\t\tashiData.comparison.m2 &&\n\t\t\t\t\t\t\t\t\t\t\t\tashiData.comparison.m2.percent && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t  (\n\t\t\t\t\t\t\t\t\t\t\t\t\t 0 ? \"+\" : \"\"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsuffix=\" %\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tthousandSeparator=\" \"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={ashiData.comparison.m2.percent}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t : \"-\"}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tKeskineliöhinta vuonna {figureData.year}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{(shouldShowNumbers && figureData.time) ? (\n\t\t\t\t\t\t\t\t\t\t\t{figureData.time}  vuorokautta\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\"-\"\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tKeskimääräinen myyntiaika\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{(shouldShowNumbers && !!figureData.sales) ? (\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\"-\"\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tKauppoja vuonna {figureData.year}\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t{figureCurrentYear && figureCurrentYear.priceperm2 > 0 && figureCurrentYear.sales > 0 && (\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t{figureCurrentYear.priceperm2} €/m² \n\t\t\t\t\t\t\t\t\t\t\t{figureCurrentYear.sales}\n\t\t\t\t\t\t\t\t\t\t\t kauppaa\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tTänä vuonna toteutuneet {ashiTimespan}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t window.print()}>\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{infoTexts && (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t

Asunnon arvo muodostuu monesta yksityiskohdasta

\n\t\t\t\t\t\t\t\t\t

{infoTexts}

\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{!isEmpty(ashiAgents) && (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tKatso kaikki kiinteistönvälittäjämme\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\n\t\t\t\t\t{!isEmpty(ashiProperties) && (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t

Vastaavia asuntoja myynnissä

\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tKatso kaikki myytävät asunnot {ashiData.county}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{ashiProperties.map(apt => (\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tKatso kaikki myytävät asunnot {ashiData.county}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\n\t\t\t\t\t\n\t\t\t\t\t\t

Mikä vaikuttaa asuntosi hintaan?

\n\t\t\t\t\t\t

{whatAffectsTexts}

\n\t\t\t\t\t
\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t

Tarkka sijainti

\n\t\t\t\t\t\t\t\t

Kävelyetäisyys palveluista ja hyvät kulkuyhteydet nostavat asunnon arvoa.

\n\n\t\t\t\t\t\t\t\t

Vastaavat myynnissä olevat asunnot

\n\t\t\t\t\t\t\t\t

Hintaa katsotaan tarkemmin, kun tarjolla on useampi samankaltainen vaihtoehto.

\n\n\t\t\t\t\t\t\t\t

Asunnon kunto

\n\t\t\t\t\t\t\t\t

Remontointi syö rahaa ja siksi kunnostusta vaativat asunnot ovat edullisempia.

\n\n\t\t\t\t\t\t\t\t

Asunnon ominaisuudet

\n\t\t\t\t\t\t\t\t

Joku haaveilee valoisasta kodista, toinen saunasta ja kolmas parvekkeesta.

\n\t\t\t\t\t\t\t
\n\n\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t

Kerros ja näkymät

\n\t\t\t\t\t\t\t\t

Kattohuoneisto merinäköalalla on haluttu, vaikka maatasossa saisi oman etupihan.

\n\n\t\t\t\t\t\t\t\t

Pohjaratkaisu ja tilankäyttö

\n\t\t\t\t\t\t\t\t

Samaan neliömäärään mahtuu sata eri pohjaratkaisua, joilla on oma vetovoimansa.

\n\n\t\t\t\t\t\t\t\t

Taloyhtiön saneeraustarpeet

\n\t\t\t\t\t\t\t\t

Remontit kuuluvat rakennusten elinkaareen, mutta kustannuksiin on hyvä varautua.

\n\n\t\t\t\t\t\t\t\t

Taloyhtiön taloudellinen tila

\n\t\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t\tVakavaraisessa yhtiössä kulurakenne on kestävällä pohjalla ja vastike kohtuullinen.\n\t\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\t\t\n\t\t\t\t\t

Asunnon hinta on monen tekijän summa.

\n\t\t\t\t\t

\n\t\t\t\t\t\tKiinteistömaailman hintalaskuri antaa alueen hintatietoihin perustuvan arvion asuntosi hinnasta\n\t\t\t\t\t\tja luo hyvän lähtökohdan hintapohdinnoille. Jokainen asunto on kuitenkin yksilöllinen. Ostajan\n\t\t\t\t\t\tnäkökulmasta vaakakupissa painavat asunnon koko ja sen tarjoamat mukavuudet suhteessa asumisen\n\t\t\t\t\t\tkokonaiskustannuksiin. Ammattitaitoinen välittäjä on kaivattu apu osuvan pyyntihinnan\n\t\t\t\t\t\tmäärittelemisessä.\n\t\t\t\t\t

\n\n\t\t\t\t\t{isAdmin && (\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t

Lisätiedot

\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t)}\n\t\t\t\t
\n\n\t\t\t\t{!isAdmin && !isEmpty(apartmentPricesMoreSummary) && (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t)}\n\n\t\t\t\t{!isEmpty(articlesMain) && (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t

Tietoa asuntojen hinnoista

\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t)}\n\t\t\t\n\t\t\n\t);\n};\n\nconst mapStateToProps = (state: IApplicationState) => ({\n\tdocument: state.document,\n});\n\nconst ApartmentPricingPageContainer = connect(mapStateToProps)(ApartmentPricingPage);\n\nexport default ApartmentPricingPageContainer;\n"],"sourceRoot":""}