{"version":3,"sources":["static/bathTemp.svg","static/defaultImages/friluftsomraade.png","static/typeIcons/badeplass.svg","static/typeIcons/fottur.svg","static/frontpage/checkcircle.svg","static/frontpage/kayak_img.jpg","static/frontpage/padlehuk_skarvoy.png","lib/lazyload.js","static/defaultImages/fottur.jpg","static/defaultImages/fisketur.jpg","static/defaultImages/padletur.jpg","static/defaultImages/sykkeltur.jpg","static/defaultImages/baatutsetting.jpg","static/defaultImages/badeplass.jpg","static/defaultImages/gapahuk.jpg","static/defaultImages/rasteplass.jpg","static/defaultImages/flytebrygge.png","static/defaultImages/defaultImage.jpeg","static/defaultImages/dykking.png","static/defaultImages/ankring.png","static/defaultImages/baal.png","static/defaultImages/lek.png","static/defaultImages/parkering.png","static/defaultImages/drikkevann.png","static/defaultImages/fortoyningsbolter.png","static/defaultImages/klatre.png","static/defaultImages/boye.png","static/defaultImages/toalett.png","static/defaultImages/teltplass.png","static/defaultImages/kai.png","static/logo_telltur.png","static/handicap_sign.svg","static/typeIcons/flytebrygge.svg","static/typeIcons/kai.svg","static/typeIcons/fortoyningsbolter.svg","static/typeIcons/batutsettingsrampe.svg","static/typeIcons/fortoyningsboye.svg","static/typeIcons/ankring.svg","static/typeIcons/padling.svg","static/typeIcons/fiske.svg","static/typeIcons/baalOgGrill.svg","static/typeIcons/lek.svg","static/typeIcons/lekeplass.svg","static/typeIcons/klatrefelt.svg","static/typeIcons/ferskvann.svg","static/typeIcons/basseng.svg","static/typeIcons/toalett.svg","static/typeIcons/gapahuk.svg","static/typeIcons/parkeringsplass.svg","static/typeIcons/friluftsomrade.svg","static/typeIcons/rasteplass.svg","static/typeIcons/utedo.svg","static/typeIcons/stupebrett.svg","static/typeIcons/utsettingKanoKajakk.svg","static/typeIcons/grill.svg","static/typeIcons/aktivitetsanlegg.svg","static/typeIcons/ballokke.svg","static/typeIcons/hyttemer.svg","static/typeIcons/hytte.svg","static/typeIcons/teltplass.svg","static/typeIcons/sykling.svg","static/typeIcons/badeflaate.png","static/badetassen.svg","static/logo_vestlandskysten.png","static/footer/Kystledlogo.png","static/footer/Logo-Skjaergaardstjenesten.png","static/bathTempSmall.svg","utils/flickr.js","translations/translations.js","translations/en.js","translations/no.js","components/ContactComponent.js","utils/Path.js","config/index.js","components/Title.js","components/LoadingIndicator.js","components/Icon.js","components/FrontPage/BannerContent.js","components/FrontPage/AboutPreview.js","components/FrontPage/OutportInfo.js","components/FrontPage/BuoyInfo.js","views/PageView.js","components/Article/GodTurArticleListComponent.js","components/SourceSelector.js","redux/filterReducer.js","components/Switch.js","hocs/provideViewSize.js","containers/SlideMenu.js","utils/scopedReducer.js","redux/digiThemeReducer.js","utils/featureStyle.js","views/ArticleLayers.js","views/ArticleView.js","redux/mediaReducer.js","components/SingleCarousel.js","containers/TripGeometryContainer.js","components/Article/GodTurArticle.js","hocs/useBadeTemp.js","components/BadeTemp.js","components/BadeTempBkk.js","components/ImageCarousel.js","components/VimeoVideo.js","components/Article/FriluftselementArticle.js","views/ArticleDetailView.js","components/Link.js","components/SearchResultComponent.js","components/Nav.js","containers/NavBar.js","components/Footer/Footer.js","layouts/PageLayout.js","layouts/IndexLayout.js","components/InitExtentButton.js","components/Checkbox.js","components/PopupBox.js","hocs/usePortal.js","components/MapOverlay.js","components/FeaturePopup.js","layouts/MapLayout.js","router/index.js","components/MapWrapper.js","redux/location.js","redux/user.js","redux/mapHistory.js","redux/activities.js","redux/reducers.js","App.js","hocs/withReducer.js","registerServiceWorker.js","index.js","redux/createStore.js"],"names":["module","exports","define","_defaultSettings","elements_selector","container","window","threshold","throttle","data_src","data_srcset","class_loading","class_loaded","skip_invisible","show_while_loading","callback_load","callback_set","callback_processed","placeholder","_supportsAddEventListener","addEventListener","_supportsAttachEvent","attachEvent","_supportsClassList","document","body","classList","_addEventListener","element","eventName","callback","el","call","event","_removeEventListener","removeEventListener","detachEvent","_isInsideViewport","ownerDocument","documentTop","documentLeft","_getDocumentWidth","innerWidth","documentElement","clientWidth","_getTopOffset","getBoundingClientRect","top","clientTop","_getLeftOffset","left","clientLeft","pageYOffset","scrollTop","pageXOffset","scrollLeft","innerHeight","clientHeight","offsetHeight","offsetWidth","_now","Date","getTime","_addClass","className","add","_removeClass","remove","replace","RegExp","_setSrcAndSrcset","target","source","srcsetDataAttribute","srcDataAttribute","srcSet","getAttribute","src","setAttribute","_bind","fn","obj","apply","arguments","LazyLoad","instanceSettings","this","_settings","obj1","obj2","propertyName","obj3","hasOwnProperty","_merge_objects","_queryOriginNode","_previousLoopTime","_loopTimeout","_handleScrollFn","handleScroll","update","prototype","_showOnLoad","fakeImg","settings","createElement","loadCallback","_showOnAppear","_loopThroughElements","i","elements","_elements","elementsLength","length","processedIndexes","offsetParent","push","wasProcessed","splice","pop","_stopScrollHandler","_purgeElements","elementsToPurge","_startScrollHandler","_isHandlingScroll","remainingTime","now","clearTimeout","setTimeout","nodeSet","Array","slice","e","array","l","_convertToArray","querySelectorAll","destroy","flickr","userId","translations","en","locale","MapLayout","zoomInTip","zoomOutTip","trackTip","kartlagsVelger","fullscrenTip","basemapGroup","maplayerGroup","seeMore","time","season","App","Trips","selectTourType","turType","lettFottur","langFottur","klatretur","sykleLangsVei","sykleITerreng","havpadling","skiturIFjell","skiturPaFlatmark","klarForAlt","findTourOnMap","host","var","sommer","vinter","barmark","snofore","bade_barmark_og_snofore","alle","Skitur","AnnenTur","Jakttur","Padletur","Fisketur","Dykkertur","Sykkeltur","Klatretur","Aktivitet","Fottur","Trugetur","ArticleView","searchForTrip","LoadMore","filter","ArticleDetailView","title","GodTurArticle","copyLinkBtn","copyLink","linkCopied","copyLinkCloseBtn","elevation","points","startDate","endDate","RentalCabinsNearby","ShareTrip","gpxFile","vkpKategori","0","1","2","3","4","5","6","7","9","10","11","12","13","14","15","17","21","22","23","24","SlideMenu","turfilter","vanskelihetsgrad","distanse","FilterIntroText","ShowSuggestions","ShowOutdoorElements","ShowVkpElements","chooseOutdoorElementType","chooseTripType","showFilter","hideFilter","menuButtonText","RangeInfo","max","min","range","UserRegistrationPage","UserRegistration","PasswordsDoNotMatch","PasswordIsTooShort","FirstnameNotValid","SurnameNotValid","MobileNotValid","EmailAddressNotValid","organizationNotValid","CancelAndReturnToFrontPage","ToLogin","UserRegistrationIntro","MandatoryFields","CreatedUser","UserRegistrationForm","Register","Password","PasswordRepeat","Firstname","Surname","Mobile","Email","Organization","EmailPlaceholder","PasswordPlaceholder","PasswordRepeatPlaceholder","FirstnamePlaceholder","SurnamePlaceholder","MobilePlaceholder","OrganizationPlaceholder","AcceptPrivacyPolicy","PrivacyPolicy","LoginPage","LogIn","Username","LogInIntroText","ForgotPassword","RegisterHere","Error","ResetPasswordPage","SendNewPassword","Cancel","CouldNotResetPassword","PasswordResetInfoText","GoBack","TranslatedServerError","UserExists","InvalidUser","InvalidOwner","EmailInUse","SessionExpired","NavBar","MyProfile","LogOut","AllTrips","RegisterUser","SearchPlaceholder","SearchResultComponent","noResults","MyTripsList","Title","Added","Tools","MyTrips","NoTripsRegistered","MyProfileContainer","MyPage","OrganizationNotValid","MyProfileForm","Save","Fullname","ShowAndEditProfileDetails","HideProfileDetails","ConfirmDelete","DeleteAccountHeader","DeleteGodTurAccount","DeleteTellTurAccount","DeleteAccount","ChangePassword","LastPublished","lastPublished","seeAll","Activities","AllActivities","News","lesMer","news","noNews","ChangePasswordPage","CurrentPassword","NewPassword","RepeatNewPassword","SaveNewPassword","PasswordChanged","CouldNotChangePassword","GeomForm","saveFailed","infoText","cancel","save","continue","GodTurArticleCommentForm","GiveRating","DisplayName","Comment","Submit","EmailIsMandatory","DisplayNameIsMandatory","RatingIsMandatory","RatingIsNotValid","GodTurArticleCommentSection","RatingsIntro","RatingsLink","EditTripForm","publish_disclaimer","publish","unpublish","mustDoBeforePublish","distance","timeSpent","type","description","municipality","selectMunicipality","backToMyProfile","editTrip","line","media","MediaField","caption","dragAndDrop","PrivacyPage","PrivacyStatement","Accept","ConsentError","no","infoBox","results","showFriluftsrad","showTipBox","tipboxContent","closeTipBox","dontshowTipBox","sourceselectorText1","sourceselectorText2","BannerContent","map","AboutPreview","nature","biology","natureGiven","esthetics","health","uu","about","BuoyInfo","OutportInfo","Nav","seeAlso","addTourToMap","Host","Var","Sommer","Vinter","Barmark","Snofore","Bade_barmark_og_snofore","Alle","AnnetFriluft","Attraksjon","Badeplass","Bru","Batutsettplass","Gapahuk","Havn","Infotavle","JubileumsomradetFL","Rasteplass","Teltplass","TilrettelagtFriluftsomrade","Utleiehytte","ApentHusvaere","Friluftselementer","ChooseYourRecreationType","findRecreationOnMap","bilder","allYear","8","16","GodTurArticleListComponent","descriptionMissing","18","20","25","29","33","37","40","42","47","48","55","56","66","68","70","71","277","282","444","26","111","555","symbol","67","ShowuthavnerElements","ShowaktiviteterElements","ShowovernattingElements","ShowfasiliteterElements","lodging","ShowButtons","summer","winter","allyear","availability","NoRecordFound","SaveFailed","DeleteFailed","DeleteTrip","Delete","setAsMain","Footer","contact","developedBy","privacy","avinet","avinetAddress","MiniFooter","ContactComponent","width","alt","gtag","phone_conversion_number","href","onClick","React","Component","getPath","location","pathname","flickrConfig","flickrApiKey","tripPointsStyle","fillColor","fillOpacity","strokeColor","strokeWidth","strokeOpacity","pointRadius","labelProperty","labelBackgroundFill","labelTextAlign","labelPadding","labelOffsetX","labelOffsetY","font","tripLinesStyle","lineDash","lineDashOffset","adaptiveUrl","guiUrl","appName","gm_lang_code","privacyVersion","articleModuleUuid","vestkystparkElementerPublic","uuid","columns","dataIndex","mapProjCode","mapProjection","minZoom","maxZoom","initExtent","dtNews","dtMunicipality","dtTrips","listColumns","recaptchaSiteKey","dtLine","fkColumn","geomType","dtPoint","dtFriluft","articleModuleFilters","turmal","published","name","value","comparisonOperator","logicalOperator","netType","avstandTil","avstandFra","vestkystparkelementer","sesong","tilgjengelig","aktiviteter","fasiliteter","overnatting","is_kystledhus","is_utleiehytte","is_aapen_hytte","typeFilter","uri","icon","vkpTypeFilter","sesongFilter","vkpCategoryFilter","category","uthavner","friluftselementerFilter","seasonFilter","cms_site_id","oldTitle","props","config","LoadingIndicator","state","timer","displayLoadingIndicator","setState","icons","Flytebrygge","viewBox","fill","transform","d","Kai","Fortoyningsbolter","Batutsettingsrampe","Fortoyningsboye","Ankring","Fiske","Padling","Dykking","Grillogbaal","Lek","Klatring","xmlns","Sykling","Ferskvann","Toalett","Parkeringsplass","search","pencil","unlock","checkmark","userplus","userminus","cross","profile","share","facebook","envelope","twitter","load","chevronRight","chevronLeft","info","expand","compress","godTurLogo","xlinkHref","equalizer","id","bin","cloud","bookmark","pin","triangle_up","triangle_down","point","fiskeTur","fotTur","padleTur","sykkelTur","skiTur","annenTur","badeplass","gapahuk","tilrettelagt","utleiehytte","apentHusvaere","infotavle","bru","attraksjon","rasteplass","batutsettplass","havn","teltplass","heartOutline","heart","close","eye","eyeBlocked","fullscreen","fullscreenShrink","earth","radioUnchecked","radioChecked","lockedCabin","addTour","Icon","t","to","translate","listValues","content","key","checkcircle","KayakImg","Img","PageView","currentPath","loadPage","path","nextProps","history","pageContent","getElementsByClassName","links","getElementsByTagName","forEach","link","test","onclick","nl","preventDefault","indexOf","fixLinks","page","pageLoading","dangerouslySetInnerHTML","__html","Fragment","connect","dispatch","bindActionCreators","Object","assign","pageActions","withRouter","loadPrimaryPhotoUrlFromSet","photosetUrl","a","endsWith","photoSetId","lastIndexOf","isNaN","photosets","getPhotos","photoset_id","user_id","res","JSON","parse","text","primary","photoset","photos","photo","find","p","loadFlickrImage","article","properties","flickr_url","flickrObject","onArticleOpen","thumbnailClassName","thumbnail","statskogUrl","statskog_url","loadImage","flickrImage","getFlickrImageUrl","thumbnailProp","startsWith","onMouseOver","olFeature","set","onMouseOut","id_telltur","open","kat_telltur","type_friluftselement","data-original","defaultImage","tellturLogo","farm","server","secret","buildStaticFlickrUrl","kategori_array","datakilde","friluftsomraade","flytebrygge","kai","fortoyningsbolter","baatutsetting","boye","drikkevann","toalett","padletur","fisketur","dykking","baal","lek","klatre","sykkeltur","fottur","parkering","ankring","SourceSelector","didJustSetSource","toggleSource","bind","sources","stayOpen","disabled","includes","defaultProps","updateFilterState","payload","updateFilter","updateActiveSources","setSources","resetFilterState","initialState","turmal__type","turmal__season","turmal__avstandFra","turmal__avstandTil","activeSources","friluftselementer__type","vestkystparkelementer__type","uthavnelementer__type","aktivitetelementer__type","overnattingelementer__type","fasilitetelementer__type","vkp__sesong","vkp__tilgjengelig","overnatting__type","filterReducer","action","ttIdx","newFilter","isArray","Set","some","val","f","Switch","onChange","checked","provideViewSize","WrappedComponent","handleViewSizeChange","viewWidth","viewHeight","toggleAllSources","elementerType","handleTilgjengeligClick","boolean","handleChange","slideMenuHandler","slideMenuOpen","showButtons","showDetailsTurforslag","showDetailsFriluftselementer","showDetailsVkpelementer","showDetailsuthavnerelementer","showDetailaktiviteterelementer","showDetailsovernattingelementer","showDetailsfasiliteterelementer","showTilgjengeligelementer","toggleTypeSource","extractLayerNameFromId","checkIfTypeIsActive","updateQuery","updateFilterFromUrl","prevProps","queries","split","q","tmp","toLowerCase","k","vestkystparkelementerType","vkpSesong","vkpTilgjengelig","baseUrl","join","showDetailsaktiviteterelementer","uthavnerelementerIsActive","aktiviteterelementerIsActive","overnattingelementerIsActive","fasiliteterelementerIsActive","tilgjengeligIsActive","uthavnerElementerType","aktiviteterElementerType","overnattingElementerType","fasiliteterElementerType","displayName","Handicap","PureComponent","reducers","turmalType","activeLayers","friluftselementerType","wrapDispatch","reducerKey","wrappedDispatch","wrappedAction","globalDispatch","getState","extraArgument","wrapAction","actionCreators","originalBindActionCreator","loading","createAction","error","data","readSuccess","records","total","readObjectSuccess","record","readFailed","resetDigiTheme","readChildren","fkColumnId","srid","start","limit","extraParams","getReducerState","readAny","theme_uuid","themeUuid","fk_column","fk_column_id","readObject","request","post","send","getSessionToken","then","sessionExpired","authReducerActions","success","code","message","exception","catch","readFiltered","saving","deleting","undefined","handleActions","featureStyle","resolution","get","opacity","Style","image","friluftsomrade","anchor","zIndex","badeflaate","scale","ballokke","basseng","baalOgGrill","batutsettingsrampe","utsettingKanoKajakk","ferskvann","fiske","fortoyningsboye","grill","aktivitetsanlegg","klatring","lekeplass","parkeringsplass","stupebrett","utedo","padling","hytte","hyttemer","Circle","radius","Fill","color","stroke","Stroke","clusterStyle","clusterStackStyle","clusterLabelText","clusterText","clusterLabelOffsetX","clusterLabelOffsetY","typeField","ArticleLayers","polygonStyle","vkpElementFeatures","vkpElementFeaturesPolygon","vkpElementFeaturesPolygonPoint","readVkpElements","filterColumns","stringify","readAllVkpElements","vkpElementGeomsLoading","me","shouldUpdateVkpElementFeatures","console","s","mapZoom","vestkystparkElementSource","getDatasource","layerName","features","style","clusterThreshold","vestkystparkelementerIsActive","as","vkpElementGeoms","geom","olUtils","createFeatureFromWkt","geom_wkt","symbol_id","geom_omraade","vkpElementGeomReducer","scopedBindActionCreator","provideMapState","ensureArticleModuleConfig","getFilterColumn","menuHandler","articleLimit","onSourceSelect","updateActiveSourcesFilter","lazyLoad","checkActiveSourcesFilter","scrollTo","pushActiveSources","url","activeSourcesFromReducer","substring","enable","filteredSources","query","scroll","aria-label","padding","calcMapPadding","hideSelector","hideLayers","onContentChange","articleComponent","thumbnailSize","queryString","allFilters","kvp","filterProperty","categoryKey","generateFilterColumns","match","params","readMedia","recordUuid","defaultFilter","secondFilter","SingleCarousel","mainImage","images","externalUrl","isFlickr","sliderImages","concat","unshift","dots","infinite","speed","slidesToShow","slidesToScroll","sliderContents","rel","comment","TripGeometryContainer","getFeatureStyleTrip","Text","offsetX","offsetY","backgroundFill","textAlign","getFeatureStylePoint","readPoints","readLines","tripId","prevId","resetLineChildrenDt","resetPointChildrenDt","parseInt","pointsReadChildren","linesReadChildren","tripPoints","tripLines","zoomToExtent","r","bindScopedActionCreators","getArticleId","arr","municipalityName","initialized","updateMunicipalityName","checkArticle","prevState","fitViewAndZoom","extent","bufferExtent","getExtentFromFeatures","municipalities","m","komm","toString","navn","mediaFiles","mediaLoading","author","lengde","tid","bilde_multimedia","contentType","formatContent","toFixed","godtur_id","motherGeom","municipalitiesLoading","mediaTrips","sessionToken","auth","useBadeTemp","useState","setLoading","setData","useEffect","BadeTemp","date","useMemo","updatedAt","dateString","toLocaleDateString","day","month","year","at","bathTemp","measValue","badetassen","months","BadeTempBkk","temperature","setDate","getDate","getMonth","getHours","getMinutes","ImageCarousel","small","ref","useRef","scrollPos","setScrollPos","imageUuids","setImageUuids","featuredImage","resImages","resImageUuids","img","handleClick","useCallback","scrollValue","currentTarget","current","newValue","ms","_","debounce","refScrollPos","Math","round","elementScrollState","carousel","indicatorsRef","cache","VimeoVideo","vimeo","setVimeo","useVimeo","paddingBottom","height","video_id","frameBorder","allowFullScreen","averageRating","getLinks","vimeoUrl","vimeo_url","styleFn","getFeatureStylePolygon","getFeatureStyle","badetemp_id","badetemp_bkk","item","tittel1","tittel2","tittel3","tittel4","tittel5","lenke1","lenke2","lenke3","lenke4","lenke5","mediaFriluft","filterColumn","onClose","sourceId","articleId","articles","aid","godTurId","hideOpenExternalBtn","disableZoom","FriluftselementArticle","Link","isExternal","rest","prepareUri","result","onResultSelected","provider","nav","navbarOpen","onNavClick","children","clearButtonIcon","searchResult","n","menu_uri","KystledLogo","SkaergaardsLogo","onSeachDone","navOpen","onHamburgerClick","loadNav","cmsLinks","renderCmsLinks","brochureLinks","renderBrochuresLinks","mapLinks","renderMapLinks","Logo","navActions","PageLayout","IndexLayout","InitExtentButton","Checkbox","onCheckChange","PopupBox","checkBoxChecked","closeBtnText","checkBoxText","newChecked","usePortal","rootElemRef","rootElem","existingParent","querySelector","parentElem","rootContainer","createRootElement","insertBefore","lastElementChild","nextElementSibling","appendChild","childNodes","MapOverlay","ensureMap","coords","autoPan","selectedFeature","changePopupClass","overlayRef","portal","overlay","Overlay","stopEvent","positioning","addOverlay","removeOverlay","setPosition","x","y","thresholdTop","thresholdBottom","thresholdLeft","thresholdRight","getGeometry","getType","getExtent","setPositioning","createPortal","TripInfo","FeaturePopup","onArticleClose","popupClass","setProperties","imageurl","setImageurl","closeRef","shortentView","values_","handleClose","contains","imageid","convertToClick","evt","MouseEvent","bubbles","stopPropagation","dispatchEvent","onMouseUp","bathTempSmall","searchOpen","tmpHideTipBox","onFullScreenBtnClick","onTipBoxVisibilityChange","tipBoxDeactivated","localStorage","getItem","tipboxTimestamp","diff","abs","floor","forceUpdateMap","neverShowAgain","setItem","removeItem","mobileLayout","getCenterFromGeom","isOpen","zoomInTipLabel","zoomOutTipLabel","tooltip","enabledLayers","activeIcon","inactiveIcon","singleSelect","version","useBaat","singleTile","AppRouter","splashScreen","getElementById","cfg","basename","Route","render","component","exact","MapWrapper","center","zoom","track","baatUrl","trackTipLabel","hitTolerance","locationReducer","user","registeredUserEmail","userReducer","email","lastZoomLevel","lastMapCenter","mapHistoryReducer","activities","activityReducer","makeRootReducer","asyncReducers","combineReducers","articleReducer","pageReducer","mapHistory","newsReducer","digiThemeReducer","trips","navReducer","mediaReducer","authReducer","lang","reactArticleModuleTranslations","store","getTranslations","ArticleModuleComponent","WithReducer","injectReducer","reducer","replaceReducer","defaultInjectReducer","context","contextTypes","PropTypes","object","withReducer","onSearchInit","Boolean","hostname","apiKey","flickrUserId","initalState","middleware","thunk","enhancers","__REDUX_DEVTOOLS_EXTENSION__","composeEnhancers","compose","createStore","applyMiddleware","__INITIAL_STATE__","CmsConfig","init","Flickr","ReactDOM","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.65f39af8.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/bathTemp.3ba1d0bd.svg\";","module.exports = __webpack_public_path__ + \"static/media/friluftsomraade.7d5755c8.png\";","module.exports = __webpack_public_path__ + \"static/media/badeplass.a4e4be55.svg\";","module.exports = __webpack_public_path__ + \"static/media/fottur.8ca02b6a.svg\";","module.exports = __webpack_public_path__ + \"static/media/checkcircle.0df00891.svg\";","module.exports = __webpack_public_path__ + \"static/media/kayak_img.d7aa86a7.jpg\";","module.exports = __webpack_public_path__ + \"static/media/padlehuk_skarvoy.4b708340.png\";","(function (root, factory) {\r\n /* eslint-disable no-undef */\r\n if (typeof define === \"function\" && define.amd) {\r\n define([], factory);\r\n /* eslint-disable no-undef */\r\n } else if (typeof exports === \"object\") {\r\n module.exports = factory();\r\n } else {\r\n root.LazyLoad = factory();\r\n }\r\n})(this, function () {\r\n var _defaultSettings = {\r\n elements_selector: \"img\",\r\n container: window,\r\n threshold: 300,\r\n throttle: 50,\r\n data_src: \"original\",\r\n data_srcset: \"original-set\",\r\n class_loading: \"loading\",\r\n class_loaded: \"loaded\",\r\n skip_invisible: true,\r\n show_while_loading: false,\r\n callback_load: null,\r\n callback_set: null,\r\n callback_processed: null,\r\n placeholder:\r\n \"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\",\r\n },\r\n _supportsAddEventListener = !!window.addEventListener,\r\n _supportsAttachEvent = !!window.attachEvent,\r\n _supportsClassList = !!document.body.classList;\r\n\r\n /*\r\n * PRIVATE FUNCTIONS *NOT RELATED* TO A SPECIFIC INSTANCE OF LAZY LOAD\r\n * -------------------------------------------------------------------\r\n */\r\n\r\n function _addEventListener(element, eventName, callback) {\r\n // Use addEventListener if available\r\n if (_supportsAddEventListener) {\r\n element.addEventListener(eventName, callback);\r\n return;\r\n }\r\n // Otherwise use attachEvent, set this and event\r\n if (_supportsAttachEvent) {\r\n element.attachEvent(\r\n \"on\" + eventName,\r\n (function (el) {\r\n return function () {\r\n callback.call(el, window.event);\r\n };\r\n })(element)\r\n );\r\n // Break closure and primary circular reference to element\r\n element = null;\r\n }\r\n }\r\n\r\n function _removeEventListener(element, eventName, callback) {\r\n // Use removeEventListener if available\r\n if (_supportsAddEventListener) {\r\n element.removeEventListener(eventName, callback);\r\n return;\r\n }\r\n // Otherwise use detachEvent\r\n if (_supportsAttachEvent) {\r\n element.detachEvent(\"on\" + eventName, callback);\r\n }\r\n }\r\n\r\n function _isInsideViewport(element, container, threshold) {\r\n var ownerDocument, documentTop, documentLeft;\r\n\r\n function _getDocumentWidth() {\r\n return (\r\n window.innerWidth ||\r\n ownerDocument.documentElement.clientWidth ||\r\n document.body.clientWidth\r\n );\r\n }\r\n\r\n function _getDocumentHeight() {\r\n return (\r\n window.innerHeight ||\r\n ownerDocument.documentElement.clientHeight ||\r\n document.body.clientHeight\r\n );\r\n }\r\n\r\n function _getTopOffset(element) {\r\n return (\r\n element.getBoundingClientRect().top +\r\n documentTop -\r\n ownerDocument.documentElement.clientTop\r\n );\r\n }\r\n\r\n function _getLeftOffset(element) {\r\n return (\r\n element.getBoundingClientRect().left +\r\n documentLeft -\r\n ownerDocument.documentElement.clientLeft\r\n );\r\n }\r\n\r\n function _isBelowViewport() {\r\n var fold;\r\n if (container === window) {\r\n fold = _getDocumentHeight() + documentTop;\r\n } else {\r\n fold = _getTopOffset(container) + container.offsetHeight;\r\n }\r\n return fold <= _getTopOffset(element) - threshold;\r\n }\r\n\r\n function _isAtRightOfViewport() {\r\n var fold;\r\n if (container === window) {\r\n fold = _getDocumentWidth() + window.pageXOffset;\r\n } else {\r\n fold = _getLeftOffset(container) + _getDocumentWidth();\r\n }\r\n return fold <= _getLeftOffset(element) - threshold;\r\n }\r\n\r\n function _isAboveViewport() {\r\n var fold;\r\n if (container === window) {\r\n fold = documentTop;\r\n } else {\r\n fold = _getTopOffset(container);\r\n }\r\n return fold >= _getTopOffset(element) + threshold + element.offsetHeight;\r\n }\r\n\r\n function _isAtLeftOfViewport() {\r\n var fold;\r\n if (container === window) {\r\n fold = documentLeft;\r\n } else {\r\n fold = _getLeftOffset(container);\r\n }\r\n return fold >= _getLeftOffset(element) + threshold + element.offsetWidth;\r\n }\r\n\r\n ownerDocument = element.ownerDocument;\r\n documentTop = window.pageYOffset || ownerDocument.body.scrollTop;\r\n documentLeft = window.pageXOffset || ownerDocument.body.scrollLeft;\r\n\r\n return (\r\n !_isBelowViewport() &&\r\n !_isAboveViewport() &&\r\n !_isAtRightOfViewport() &&\r\n !_isAtLeftOfViewport()\r\n );\r\n }\r\n\r\n function _now() {\r\n var d = new Date();\r\n return d.getTime();\r\n }\r\n\r\n function _merge_objects(obj1, obj2) {\r\n var obj3 = {},\r\n propertyName;\r\n for (propertyName in obj1) {\r\n if (obj1.hasOwnProperty(propertyName)) {\r\n obj3[propertyName] = obj1[propertyName];\r\n }\r\n }\r\n for (propertyName in obj2) {\r\n if (obj2.hasOwnProperty(propertyName)) {\r\n obj3[propertyName] = obj2[propertyName];\r\n }\r\n }\r\n return obj3;\r\n }\r\n\r\n function _convertToArray(nodeSet) {\r\n try {\r\n return Array.prototype.slice.call(nodeSet);\r\n } catch (e) {\r\n var array = [],\r\n i,\r\n l = nodeSet.length;\r\n\r\n for (i = 0; i < l; i++) {\r\n array.push(nodeSet[i]);\r\n }\r\n return array;\r\n }\r\n }\r\n\r\n function _addClass(element, className) {\r\n /* HTML 5 compliant browsers. */\r\n if (_supportsClassList) {\r\n element.classList.add(className);\r\n return;\r\n }\r\n /* Legacy browsers (IE<10) support. */\r\n element.className += (element.className ? \" \" : \"\") + className;\r\n }\r\n\r\n function _removeClass(element, className) {\r\n /* HTML 5 compliant browsers. */\r\n if (_supportsClassList) {\r\n element.classList.remove(className);\r\n return;\r\n }\r\n /* Legacy browsers (IE<10) support. */\r\n element.className = element.className\r\n .replace(new RegExp(\"(^|\\\\s+)\" + className + \"(\\\\s+|$)\"), \" \")\r\n .replace(/^\\s+/, \"\")\r\n .replace(/\\s+$/, \"\");\r\n }\r\n\r\n function _setSrcAndSrcset(\r\n target,\r\n source,\r\n srcsetDataAttribute,\r\n srcDataAttribute\r\n ) {\r\n var srcSet = source.getAttribute(\"data-\" + srcsetDataAttribute),\r\n src = source.getAttribute(\"data-\" + srcDataAttribute);\r\n if (srcSet) {\r\n target.setAttribute(\"srcset\", srcSet);\r\n }\r\n if (src) {\r\n target.setAttribute(\"src\", src);\r\n }\r\n }\r\n\r\n function _bind(fn, obj) {\r\n return function () {\r\n return fn.apply(obj, arguments);\r\n };\r\n }\r\n\r\n /*\r\n * INITIALIZER\r\n * -----------\r\n */\r\n\r\n function LazyLoad(instanceSettings) {\r\n this._settings = _merge_objects(_defaultSettings, instanceSettings);\r\n this._queryOriginNode =\r\n this._settings.container === window ? document : this._settings.container;\r\n\r\n this._previousLoopTime = 0;\r\n this._loopTimeout = null;\r\n\r\n this._handleScrollFn = _bind(this.handleScroll, this);\r\n\r\n _addEventListener(window, \"resize\", this._handleScrollFn);\r\n this.update();\r\n }\r\n\r\n /*\r\n * PRIVATE FUNCTIONS *RELATED* TO A SPECIFIC INSTANCE OF LAZY LOAD\r\n * ---------------------------------------------------------------\r\n */\r\n\r\n LazyLoad.prototype._showOnLoad = function (element) {\r\n var fakeImg,\r\n settings = this._settings;\r\n\r\n /* If no src attribute given use data:uri. */\r\n if (!element.getAttribute(\"src\")) {\r\n element.setAttribute(\"src\", settings.placeholder);\r\n }\r\n /* Creating a new `img` in a DOM fragment. */\r\n fakeImg = document.createElement(\"img\");\r\n /* Listening to the load event */\r\n function loadCallback() {\r\n /* As this method is asynchronous, it must be protected against external destroy() calls */\r\n if (settings === null) {\r\n return;\r\n }\r\n /* Calling LOAD callback */\r\n if (settings.callback_load) {\r\n settings.callback_load(element);\r\n }\r\n _setSrcAndSrcset(\r\n element,\r\n element,\r\n settings.data_srcset,\r\n settings.data_src\r\n );\r\n /* Calling SET callback */\r\n if (settings.callback_set) {\r\n settings.callback_set(element);\r\n }\r\n _removeClass(element, settings.class_loading);\r\n _addClass(element, settings.class_loaded);\r\n _removeEventListener(fakeImg, \"load\", loadCallback);\r\n }\r\n\r\n _addEventListener(fakeImg, \"load\", loadCallback);\r\n _addClass(element, settings.class_loading);\r\n _setSrcAndSrcset(fakeImg, element, settings.data_srcset, settings.data_src);\r\n };\r\n\r\n LazyLoad.prototype._showOnAppear = function (element) {\r\n var settings = this._settings;\r\n\r\n function loadCallback() {\r\n /* As this method is asynchronous, it must be protected against external destroy() calls */\r\n if (settings === null) {\r\n return;\r\n }\r\n /* Calling LOAD callback */\r\n if (settings.callback_load) {\r\n settings.callback_load(element);\r\n }\r\n _removeClass(element, settings.class_loading);\r\n _addClass(element, settings.class_loaded);\r\n _removeEventListener(element, \"load\", loadCallback);\r\n }\r\n\r\n _addEventListener(element, \"load\", loadCallback);\r\n _addClass(element, settings.class_loading);\r\n _setSrcAndSrcset(element, element, settings.data_srcset, settings.data_src);\r\n /* Calling SET callback */\r\n if (settings.callback_set) {\r\n settings.callback_set(element);\r\n }\r\n };\r\n\r\n LazyLoad.prototype._loopThroughElements = function () {\r\n var i,\r\n element,\r\n settings = this._settings,\r\n elements = this._elements,\r\n elementsLength = !elements ? 0 : elements.length,\r\n processedIndexes = [];\r\n\r\n for (i = 0; i < elementsLength; i++) {\r\n element = elements[i];\r\n /* If must skip_invisible and element is invisible, skip it */\r\n if (settings.skip_invisible && element.offsetParent === null) {\r\n continue;\r\n }\r\n if (_isInsideViewport(element, settings.container, settings.threshold)) {\r\n /* Forking behaviour depending on show_while_loading (true value is ideal for progressive jpeg). */\r\n if (settings.show_while_loading) {\r\n this._showOnAppear(element);\r\n } else {\r\n this._showOnLoad(element);\r\n }\r\n /* Marking the element as processed. */\r\n processedIndexes.push(i);\r\n element.wasProcessed = true;\r\n }\r\n }\r\n /* Removing processed elements from this._elements. */\r\n while (processedIndexes.length > 0) {\r\n elements.splice(processedIndexes.pop(), 1);\r\n /* Calling the end loop callback */\r\n if (settings.callback_processed) {\r\n settings.callback_processed(elements.length);\r\n }\r\n }\r\n /* Stop listening to scroll event when 0 elements remains */\r\n if (elementsLength === 0) {\r\n this._stopScrollHandler();\r\n }\r\n };\r\n\r\n LazyLoad.prototype._purgeElements = function () {\r\n var i,\r\n element,\r\n elements = this._elements,\r\n elementsLength = elements.length,\r\n elementsToPurge = [];\r\n\r\n for (i = 0; i < elementsLength; i++) {\r\n element = elements[i];\r\n /* If the element has already been processed, skip it */\r\n if (element.wasProcessed) {\r\n elementsToPurge.push(i);\r\n }\r\n }\r\n /* Removing elements to purge from this._elements. */\r\n while (elementsToPurge.length > 0) {\r\n elements.splice(elementsToPurge.pop(), 1);\r\n }\r\n };\r\n\r\n LazyLoad.prototype._startScrollHandler = function () {\r\n if (!this._isHandlingScroll) {\r\n this._isHandlingScroll = true;\r\n _addEventListener(\r\n this._settings.container,\r\n \"scroll\",\r\n this._handleScrollFn\r\n );\r\n }\r\n };\r\n\r\n LazyLoad.prototype._stopScrollHandler = function () {\r\n if (this._isHandlingScroll) {\r\n this._isHandlingScroll = false;\r\n _removeEventListener(\r\n this._settings.container,\r\n \"scroll\",\r\n this._handleScrollFn\r\n );\r\n }\r\n };\r\n\r\n /*\r\n * PUBLIC FUNCTIONS\r\n * ----------------\r\n */\r\n\r\n LazyLoad.prototype.handleScroll = function () {\r\n var remainingTime, now, throttle;\r\n\r\n // IE8 fix for destroy() malfunctioning\r\n if (!this._settings) {\r\n return;\r\n }\r\n\r\n now = _now();\r\n throttle = this._settings.throttle;\r\n\r\n if (throttle !== 0) {\r\n remainingTime = throttle - (now - this._previousLoopTime);\r\n if (remainingTime <= 0 || remainingTime > throttle) {\r\n if (this._loopTimeout) {\r\n clearTimeout(this._loopTimeout);\r\n this._loopTimeout = null;\r\n }\r\n this._previousLoopTime = now;\r\n this._loopThroughElements();\r\n } else if (!this._loopTimeout) {\r\n this._loopTimeout = setTimeout(\r\n _bind(function () {\r\n this._previousLoopTime = _now();\r\n this._loopTimeout = null;\r\n this._loopThroughElements();\r\n }, this),\r\n remainingTime\r\n );\r\n }\r\n } else {\r\n this._loopThroughElements();\r\n }\r\n };\r\n\r\n LazyLoad.prototype.update = function () {\r\n this._elements = _convertToArray(\r\n this._queryOriginNode.querySelectorAll(this._settings.elements_selector)\r\n );\r\n this._purgeElements();\r\n this._loopThroughElements();\r\n this._startScrollHandler();\r\n };\r\n\r\n LazyLoad.prototype.destroy = function () {\r\n _removeEventListener(window, \"resize\", this._handleScrollFn);\r\n if (this._loopTimeout) {\r\n clearTimeout(this._loopTimeout);\r\n this._loopTimeout = null;\r\n }\r\n this._stopScrollHandler();\r\n this._elements = null;\r\n this._queryOriginNode = null;\r\n this._settings = null;\r\n };\r\n\r\n return LazyLoad;\r\n});\r\n","module.exports = __webpack_public_path__ + \"static/media/fottur.d0f65a72.jpg\";","module.exports = __webpack_public_path__ + \"static/media/fisketur.64fe9446.jpg\";","module.exports = __webpack_public_path__ + \"static/media/padletur.a61e33f7.jpg\";","module.exports = __webpack_public_path__ + \"static/media/sykkeltur.0f54c0ea.jpg\";","module.exports = __webpack_public_path__ + \"static/media/baatutsetting.bdb6a599.jpg\";","module.exports = __webpack_public_path__ + \"static/media/badeplass.9f108d72.jpg\";","module.exports = __webpack_public_path__ + \"static/media/gapahuk.d7ce9d7d.jpg\";","module.exports = __webpack_public_path__ + \"static/media/rasteplass.c1ec0aca.jpg\";","module.exports = __webpack_public_path__ + \"static/media/flytebrygge.e88571ad.png\";","module.exports = __webpack_public_path__ + \"static/media/defaultImage.931ffdbb.jpeg\";","module.exports = __webpack_public_path__ + \"static/media/dykking.074037b9.png\";","module.exports = __webpack_public_path__ + \"static/media/ankring.a8e7c24f.png\";","module.exports = __webpack_public_path__ + \"static/media/baal.74179dd1.png\";","module.exports = __webpack_public_path__ + \"static/media/lek.9f18a125.png\";","module.exports = __webpack_public_path__ + \"static/media/parkering.2bc76e8e.png\";","module.exports = __webpack_public_path__ + \"static/media/drikkevann.16160ad8.png\";","module.exports = __webpack_public_path__ + \"static/media/fortoyningsbolter.736f2aa9.png\";","module.exports = __webpack_public_path__ + \"static/media/klatre.3f0ff2b2.png\";","module.exports = __webpack_public_path__ + \"static/media/boye.29bb7306.png\";","module.exports = __webpack_public_path__ + \"static/media/toalett.60e55c0f.png\";","module.exports = __webpack_public_path__ + \"static/media/teltplass.aa9c12fc.png\";","module.exports = __webpack_public_path__ + \"static/media/kai.dd3c02e0.png\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARQAAABMCAYAAACs2khXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDVBMzg2N0RCQTZGMTFFMzhEQzNFMkFEN0VEMkYzMUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDVBMzg2N0VCQTZGMTFFMzhEQzNFMkFEN0VEMkYzMUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0NUEzODY3QkJBNkYxMUUzOERDM0UyQUQ3RUQyRjMxQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0NUEzODY3Q0JBNkYxMUUzOERDM0UyQUQ3RUQyRjMxQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjUWYDkAAAw7SURBVHja7F1rjFtH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\"","module.exports = __webpack_public_path__ + \"static/media/handicap_sign.9056e828.svg\";","module.exports = __webpack_public_path__ + \"static/media/flytebrygge.2b5115ce.svg\";","module.exports = __webpack_public_path__ + \"static/media/kai.f8baff3b.svg\";","module.exports = __webpack_public_path__ + \"static/media/fortoyningsbolter.c1c935c9.svg\";","module.exports = __webpack_public_path__ + \"static/media/batutsettingsrampe.3e2c2118.svg\";","module.exports = __webpack_public_path__ + \"static/media/fortoyningsboye.85ec02b4.svg\";","module.exports = __webpack_public_path__ + \"static/media/ankring.628ef344.svg\";","module.exports = __webpack_public_path__ + \"static/media/padling.cc9f0e47.svg\";","module.exports = __webpack_public_path__ + \"static/media/fiske.9c18957e.svg\";","module.exports = __webpack_public_path__ + \"static/media/baalOgGrill.d8142e1b.svg\";","module.exports = __webpack_public_path__ + \"static/media/lek.db9a72e9.svg\";","module.exports = __webpack_public_path__ + \"static/media/lekeplass.401209b0.svg\";","module.exports = __webpack_public_path__ + \"static/media/klatrefelt.82bebd37.svg\";","module.exports = __webpack_public_path__ + \"static/media/ferskvann.743d04ac.svg\";","module.exports = __webpack_public_path__ + \"static/media/basseng.dd74282a.svg\";","module.exports = __webpack_public_path__ + \"static/media/toalett.2d724c6e.svg\";","module.exports = __webpack_public_path__ + \"static/media/gapahuk.856b7dc3.svg\";","module.exports = __webpack_public_path__ + \"static/media/parkeringsplass.ac214116.svg\";","module.exports = __webpack_public_path__ + \"static/media/friluftsomrade.511f39fd.svg\";","module.exports = __webpack_public_path__ + \"static/media/rasteplass.1deda94e.svg\";","module.exports = __webpack_public_path__ + \"static/media/utedo.c17f8542.svg\";","module.exports = __webpack_public_path__ + \"static/media/stupebrett.eb899939.svg\";","module.exports = __webpack_public_path__ + \"static/media/utsettingKanoKajakk.5f159056.svg\";","module.exports = __webpack_public_path__ + \"static/media/grill.8b01a2a8.svg\";","module.exports = __webpack_public_path__ + \"static/media/aktivitetsanlegg.01081d80.svg\";","module.exports = __webpack_public_path__ + \"static/media/ballokke.f2733376.svg\";","module.exports = __webpack_public_path__ + \"static/media/hyttemer.833de67a.svg\";","module.exports = __webpack_public_path__ + \"static/media/hytte.02258724.svg\";","module.exports = __webpack_public_path__ + \"static/media/teltplass.b94913f0.svg\";","module.exports = __webpack_public_path__ + \"static/media/sykling.92348043.svg\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/badetassen.3b4dec82.svg\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/Kystledlogo.6faa7d27.png\";","module.exports = __webpack_public_path__ + \"static/media/Logo-Skjaergaardstjenesten.50b60f24.png\";","module.exports = __webpack_public_path__ + \"static/media/bathTempSmall.47557980.svg\";","import Flickr from \"flickr-sdk\";\r\n\r\nvar flickr;\r\nvar userId;\r\nconst baseUrl =\r\n \"https://farm{farm-id}.staticflickr.com/{server-id}/{id}_{secret}.jpg\";\r\n\r\nexport const loadPrimaryPhotoUrlFromSet = async (photosetUrl) => {\r\n if (photosetUrl.endsWith(\"/\")) {\r\n photosetUrl = photosetUrl.slice(0, -1);\r\n }\r\n const photoSetId = photosetUrl.slice(\r\n photosetUrl.lastIndexOf(\"/\") + 1,\r\n photosetUrl.length\r\n );\r\n\r\n if (isNaN(photoSetId)) {\r\n return false;\r\n }\r\n\r\n try {\r\n var res = await flickr.photosets.getPhotos({\r\n photoset_id: photoSetId,\r\n user_id: userId,\r\n });\r\n res = JSON.parse(res.text);\r\n const primary = res.photoset.primary;\r\n const photos = res.photoset.photo;\r\n return photos.find((p) => p.id === primary);\r\n } catch (ex) {\r\n return false;\r\n }\r\n};\r\n\r\nexport const buildStaticFlickrUrl = (flickrObject) => {\r\n const { farm, server, id, secret } = flickrObject;\r\n var url = baseUrl\r\n .replace(\"{farm-id}\", farm)\r\n .replace(\"{server-id}\", server)\r\n .replace(\"{id}\", id)\r\n .replace(\"{secret}\", secret);\r\n return url;\r\n};\r\n\r\nexport default function init(apiKey, flickrUserId) {\r\n flickr = new Flickr(apiKey);\r\n userId = flickrUserId;\r\n}\r\n","import en from \"./en\";\r\nimport no from \"./no\";\r\n\r\nconst translations = { en, no };\r\n\r\nexport default translations;\r\n","export default {\r\n locale: \"en\",\r\n\r\n MapLayout: {\r\n locale: \"en\",\r\n zoomInTip: \"Zoom in\",\r\n zoomOutTip: \"Zoom out\",\r\n trackTip: \"My location\",\r\n kartlagsVelger: \"Select map layers\",\r\n fullscrenTip: \"Show map in fullscreen\",\r\n basemapGroup: \"Basemap layers\",\r\n maplayerGroup: \"Thematic layers\",\r\n seeMore: \"See more\",\r\n length: \"Length\",\r\n time: \"Time\",\r\n season: \"Season\",\r\n },\r\n\r\n App: {\r\n locale: \"en\",\r\n zoomInTip: \"Zoom in\",\r\n zoomOutTip: \"Zoom out\",\r\n trackTip: \"My location\",\r\n basemapGroup: \"Basemap layers\",\r\n },\r\n\r\n Trips: {\r\n locale: \"en\",\r\n selectTourType: \"Select trip type:\",\r\n turType: \"Trip type\",\r\n lettFottur: \"Short walk\",\r\n langFottur: \"Long walk\",\r\n klatretur: \"Hiking\",\r\n sykleLangsVei: \"Cycling\",\r\n sykleITerreng: \"Downhill cycling\",\r\n havpadling: \"Kayaking\",\r\n skiturIFjell: \"Alpine skiing\",\r\n skiturPaFlatmark: \"Cross-country skiing\",\r\n klarForAlt: \"Ready for all!\",\r\n findTourOnMap: \"... or find trip on map\",\r\n host: \"Autumn\",\r\n var: \"Spring\",\r\n sommer: \"Summer\",\r\n vinter: \"Winter\",\r\n barmark: \"Dryland\",\r\n snofore: \"Snowy roads\",\r\n bade_barmark_og_snofore: \"Both drylands and snowy roads\",\r\n alle: \"All\",\r\n Skitur: \"Ski trips\",\r\n AnnenTur: \"Other trips\",\r\n Jakttur: \"Hunting trips\",\r\n Padletur: \"Kayak/canoe trips\",\r\n Fisketur: \"Fishing trips\",\r\n Dykkertur: \"Diving trips\",\r\n Sykkeltur: \"Biking trips\",\r\n Klatretur: \"Climbing trips\",\r\n Aktivitet: \"Activity\",\r\n Fottur: \"Walking trips\",\r\n Trugetur: \"Snowshoes\",\r\n },\r\n\r\n ArticleView: {\r\n searchForTrip: \"Search For trip\",\r\n LoadMore: \"Load more\",\r\n filter: \"Filters\",\r\n },\r\n\r\n ArticleDetailView: {\r\n title: \"Vestkystparken\",\r\n },\r\n\r\n GodTurArticle: {\r\n copyLinkBtn: \"Copy link\",\r\n copyLink:\r\n \"Copy the link below to share this trip with your friends on chat or email.\",\r\n linkCopied: \"Link copied\",\r\n copyLinkCloseBtn: \"Close\",\r\n elevation: \"Elevation\",\r\n length: \"Length\",\r\n points: \"Points\",\r\n startDate: \"Start date\",\r\n endDate: \"End date\",\r\n RentalCabinsNearby: \"Rental cabins nearby\",\r\n time: \"Time\",\r\n season: \"Season\",\r\n ShareTrip: \"Share this trip:\",\r\n gpxFile: \"GPX-file\",\r\n },\r\n\r\n vkpKategori: {\r\n 0: \"Jubileumsomr�de\",\r\n 1: \"Flytebrygge\",\r\n 2: \"Kai\",\r\n 3: \"Badeplass\",\r\n 4: \"Fort�yningsbolter\",\r\n 5: \"B�tutsettingsrampe\",\r\n 6: \"Fort�yningsb�ye\",\r\n 7: \"Ferskvann-drikkevann\",\r\n 9: \"Toalett\",\r\n 10: \"Padletur\",\r\n 11: \"Fisketur\",\r\n 12: \"Dykking\",\r\n 13: \"B�l-grillplass\",\r\n 14: \"Lekeapparater\",\r\n 15: \"Klatring\",\r\n 17: \"Fottur\",\r\n 21: \"Gapahuk\",\r\n 22: \"Parkeringsplass\",\r\n 23: \"Rasteplass-benker-bord\",\r\n 24: \"Ankring\",\r\n },\r\n\r\n SlideMenu: {\r\n turfilter: \"Trip filter:\",\r\n vanskelihetsgrad: \"Difficulty:\",\r\n distanse: \"Distance:\",\r\n FilterIntroText:\r\n \"You can turn the display of trips and outdoor elements on and off using the toggle buttons in the main area. When zooming and panning in the map, the selection will change.\",\r\n ShowSuggestions: \"Show suggestions\",\r\n ShowOutdoorElements: \"Show outdoor elements\",\r\n // ShowOutportElements: 'Show outports',\r\n ShowVkpElements: \"Vis VKP\",\r\n // ShowHytteElements: 'Show cabins and kystledhus',\r\n chooseOutdoorElementType: \"Choose type\",\r\n chooseTripType: \"Choose type\",\r\n showFilter: \"Show filter\",\r\n hideFilter: \"Hide filter\",\r\n menuButtonText: \"Filter\", //\"Klikk for � velge hva som skal vises i kartet\",\r\n },\r\n\r\n RangeInfo: {\r\n max: \"Trips shorter than {max} km.\",\r\n min: \"Trips longer than {min} km.\",\r\n range: \"Trips longer than {min} km and shorter than {max} km.\",\r\n },\r\n\r\n UserRegistrationPage: {\r\n UserRegistration: \"User registration\",\r\n PasswordsDoNotMatch: \"Passwords do not match\",\r\n PasswordIsTooShort: \"Password is too short\",\r\n FirstnameNotValid: \"First name not valid\",\r\n SurnameNotValid: \"Surname not valid\",\r\n MobileNotValid: \"Mobile number not valid\",\r\n EmailAddressNotValid: \"Email address not valid\",\r\n organizationNotValid: \"Organization not valid\",\r\n CancelAndReturnToFrontPage: \"Cancel and return to front page\",\r\n ToLogin: \"Go to login\",\r\n UserRegistrationIntro:\r\n \"Opening an account at GodTur allows you to share trips with others, using images, text and map tools. Your created trips can be managed from your profile page. By submitting this form, you will also get an account at the website TellTur.no, where you can enter competitions, compete with other users, and win prizes from your local friluftsråd. The username and password for these two sites will be the same.\",\r\n MandatoryFields: \"Form fields marked with * are mandatory.\",\r\n CreatedUser:\r\n \"We have created a new user for you. Click the link to log in.\",\r\n },\r\n\r\n UserRegistrationForm: {\r\n Register: \"Register account\",\r\n Password: \"Password*\",\r\n PasswordRepeat: \"Repeat the password*\",\r\n Firstname: \"First name*\",\r\n Surname: \"Surname*\",\r\n Mobile: \"Mobile phone number\",\r\n Email: \"Email address* (this will be you username when logging in)\",\r\n Organization: \"Organization\",\r\n EmailPlaceholder: \"Enter your email adress\",\r\n PasswordPlaceholder: \"Enter a password\",\r\n PasswordRepeatPlaceholder: \"Repeat the password\",\r\n FirstnamePlaceholder: \"Enter your first name\",\r\n SurnamePlaceholder: \"Enter your surname\",\r\n MobilePlaceholder: \"Enter your phone number\",\r\n OrganizationPlaceholder:\r\n \"If you are a member of a GodTur-organization, provide its name here.\",\r\n AcceptPrivacyPolicy:\r\n \"I have read and accept that data will be shared with collaborating trip pages and that my personal data is kept according to the \",\r\n PrivacyPolicy: \"privacy statement\",\r\n },\r\n\r\n LoginPage: {\r\n LogIn: \"Log in\",\r\n Username: \"Email\",\r\n LogInIntroText:\r\n \"To share your trips with others you need to be logged in. You can \",\r\n Password: \"Password\",\r\n ForgotPassword: \"Forgot your password?\",\r\n RegisterHere: \"create a new account here\",\r\n Error:\r\n \"Login failed. Please ensure that your email and password are correct\",\r\n },\r\n\r\n ResetPasswordPage: {\r\n Email: \"Email\",\r\n SendNewPassword: \"Send new password\",\r\n Cancel: \"Cancel\",\r\n CouldNotResetPassword:\r\n \"Could not reset password. Please make sure that the email address is correct.\",\r\n PasswordResetInfoText:\r\n \"A new password has been sent to your email address. If you can't find it please check your spam-filter\",\r\n GoBack: \"Back to login\",\r\n },\r\n\r\n TranslatedServerError: {\r\n UserExists:\r\n \"A user with this email address already exists. If you have registered a user on godtur.no or telltur.no you can use these credentials to log in\",\r\n InvalidUser: \"Invalid user data\",\r\n InvalidOwner:\r\n \"You do not own the object you are trying to change. Contact your administrator.\",\r\n EmailInUse: \"This email address is already in use\",\r\n SessionExpired: \"Your session has expired. Please log in again.\",\r\n },\r\n\r\n NavBar: {\r\n MyProfile: \"My profile\",\r\n LogOut: \"Log out\",\r\n LogIn: \"Log in\",\r\n AllTrips: \"Show all trips\",\r\n RegisterUser: \"Register user\",\r\n SearchPlaceholder: \"Hva leter du etter?\",\r\n },\r\n\r\n SearchResultComponent: {\r\n noResults: \"No matches found. Please check the spelling and try again\",\r\n },\r\n\r\n MyTripsList: {\r\n Title: \"Title\",\r\n Added: \"Added\",\r\n Tools: \"Tools\",\r\n MyTrips: \"My trips\",\r\n NoTripsRegistered: \"No trips registered\",\r\n },\r\n\r\n MyProfileContainer: {\r\n MyPage: \"My page\",\r\n FirstnameNotValid: \"First name not valid\",\r\n SurnameNotValid: \"Surname not valid\",\r\n MobileNotValid: \"Mobile number not valid\",\r\n EmailAddressNotValid: \"Email address not valid\",\r\n OrganizationNotValid: \"Organization not valid\",\r\n },\r\n\r\n MyProfileForm: {\r\n Save: \"Save\",\r\n Firstname: \"First name\",\r\n Fullname: \"Full name\",\r\n Mobile: \"Mobile phone number\",\r\n Email: \"Email address\",\r\n Organization: \"Organization\",\r\n ShowAndEditProfileDetails: \"Show and edit profile\",\r\n HideProfileDetails: \"Hide profile\",\r\n ConfirmDelete: \"I understand, delete my account\",\r\n DeleteAccountHeader: \"Delete my GodTur (and TellTur) account\",\r\n DeleteGodTurAccount:\r\n \"You are about to delete your GodTur account. You will no longer be able to log in or edit trips. This action is non-reversible.\",\r\n DeleteTellTurAccount: `Attention: You are also about to delete your TellTur.no user account.\r\n You need this account if you want to participate in TellTur contests.\r\n If you delete your account, all information about your user will be permanently deleted,\r\n including the trips you have registered.`,\r\n DeleteAccount: \"Delete account\",\r\n ChangePassword: \"Change password\",\r\n },\r\n\r\n LastPublished: {\r\n lastPublished: \"Newest trips\",\r\n seeAll: \"See all\",\r\n },\r\n\r\n Activities: {\r\n locale: \"en-GB\",\r\n AllActivities: \"All activities\",\r\n },\r\n\r\n News: {\r\n locale: \"en-GB\",\r\n lesMer: \"read more\",\r\n news: \"News archive\",\r\n noNews: \"No news found\",\r\n },\r\n\r\n ChangePasswordPage: {\r\n ChangePassword: \"Change password\",\r\n CurrentPassword: \"Current password\",\r\n NewPassword: \"New password\",\r\n RepeatNewPassword: \"Repeat new password\",\r\n Cancel: \"Cancel\",\r\n SaveNewPassword: \"Save new password\",\r\n PasswordChanged: \"Your password was successfully changed\",\r\n GoBack: \"Back to your profile\",\r\n CouldNotChangePassword: \"Could not change your password\",\r\n },\r\n GeomForm: {\r\n locale: \"en-GB\",\r\n saveFailed: \"Save failed, please try again\",\r\n infoText:\r\n \"Add name and description if you like. The name will be show in map for each point and line you have drawn. Both the name and description will also be added to the GPX-file that may be downloaded for the trip.\",\r\n cancel: \"Cancel\",\r\n save: \"Save\",\r\n continue: \"Continue\",\r\n },\r\n\r\n GodTurArticleCommentForm: {\r\n GiveRating: \"Rate this trip or article:\",\r\n Email: \"Email address (will not be displayed)\",\r\n DisplayName: \"Name\",\r\n Comment: \"Comment\",\r\n Cancel: \"Cancel\",\r\n Submit: \"Submit\",\r\n EmailIsMandatory: \"An email address is mandatory\",\r\n DisplayNameIsMandatory: \"A name is mandatory\",\r\n EmailAddressNotValid: \"The email address is not valid\",\r\n RatingIsMandatory: \"Rating is mandatory\",\r\n RatingIsNotValid: \"The rating is not valid\",\r\n },\r\n\r\n GodTurArticleCommentSection: {\r\n RatingsIntro: \"Read what others have to say - and \",\r\n RatingsLink: \"leave your comment!\",\r\n },\r\n\r\n EditTripForm: {\r\n locale: \"en-GB\",\r\n publish_disclaimer:\r\n \"By publishing this trip you accept that the trip will be visible on GodTur and collaborating trip pages. You may withdraw your consent any time by either depublish or delete the trip.\",\r\n publish: \"Publish\",\r\n unpublish: \"Unpublish\",\r\n mustDoBeforePublish:\r\n \"To publish this trip you are required as a minimum to give the trip a title and a description, upload minimum one picture, specify type and season and draw a line of the trip by using the map.\",\r\n distance: \"Distance\",\r\n timeSpent: \"Time spent\",\r\n season: \"Season\",\r\n type: \"Type\",\r\n description: \"Description\",\r\n municipality: \"Municipality\",\r\n selectMunicipality: \"Select municipality...\",\r\n title: \"Title\",\r\n backToMyProfile: \"Back to my profile\",\r\n editTrip: \"Edit trip\",\r\n line: \"Line\",\r\n media: \"Media\",\r\n },\r\n\r\n MediaField: {\r\n caption: \"Caption\",\r\n dragAndDrop: \"Drag and drop or click here for uploading images\",\r\n },\r\n\r\n PrivacyPage: {\r\n PrivacyStatement: \"Privacy statement\",\r\n AcceptPrivacyPolicy:\r\n \"I have read and accept that data will be shared with collaborating trip pages and that my personal data is kept according to the \",\r\n PrivacyPolicy: \"privacy statement\",\r\n Accept: \"Accept\",\r\n ConsentError:\r\n \"Something went wrong when registering your accept. Please try again or contact the administrator.\",\r\n },\r\n};\r\n","export default {\r\n locale: \"no\",\r\n\r\n MapLayout: {\r\n locale: \"no\",\r\n zoomInTip: \"Zoom inn\",\r\n zoomOutTip: \"Zoom ut\",\r\n trackTip: \"Min posisjon\",\r\n kartlagsVelger: \"Velg kartlag\",\r\n fullscrenTip: \"Vis kart i fullskjerm\",\r\n basemapGroup: \"Bakgrunnskart\",\r\n maplayerGroup: \"Temakart\",\r\n SearchPlaceholder: \"Søk tur, anlegg og friluftsområder\",\r\n\r\n infoBox:\r\n \"I listen vises treff i kartet basert på valgene du har gjort i søkefilteret ovenfor. Utvalget endrer seg med kartutstnittet, med senter av kartet som fokuspunkt. Du kan zoome inn og bevege kartet for å spesifisere treffene ytterligere.\",\r\n results: \"Dine treff\",\r\n showFriluftsrad: \"Vis friluftsråd\",\r\n showTipBox: \"Vis tipsboks\",\r\n tipboxContent:\r\n \"

Slik bruker du kartløsningen

\" +\r\n \"

OBS: Sjøkart på denne nettsiden må ikke benyttes til navigasjon.

\" +\r\n \"

Klikk på den blå knappen med kompasset på for å zoome inn til stedet der du befinner deg akkurat nå. Dersom dette ikke virker må du tillate bruk av stedstjenester i nettleseren. På mobil finnes dette gjerne under Innstillinger.

\" +\r\n \"

Ved klikk i kart (på områdeavgrensing eller punkt) får du forslag til turer, fasiliteter og friluftsområder.

\" +\r\n \"

Når du går inn i kartet for første gang kommer alle punkter, områder og turer til å være aktive og vises som symboler i kartet.

\" +\r\n \"

For å filtrere klikker du på filterknappen oppe til høyre.

\" +\r\n \"

Bruk gjerne søkefeltet helt øverst til venstre for å finne informasjon om kjente turmål, områder eller fasiliteter.

\" +\r\n \"

Disse tipsene kan hentes frem igjen når du ønsker ved å klikke på den blå «Vis tipsboks»-knappen med informasjonstegnet til venstre i kartet.

\",\r\n closeTipBox: \"Ok, lukk tipsboks\",\r\n dontshowTipBox: \"Ikke vis igjen\",\r\n sourceselectorText1: \"1 valgt turtype\",\r\n sourceselectorText2: \"{0} valgte turtyper\",\r\n seeMore: \"Se mer\",\r\n length: \"Lengde\",\r\n time: \"Tid\",\r\n season: \"Sesong\",\r\n },\r\n\r\n App: {\r\n locale: \"no\",\r\n zoomInTip: \"Zoom inn\",\r\n zoomOutTip: \"Zoom ut\",\r\n trackTip: \"Min posisjon\",\r\n basemapGroup: \"Bakgrunnskart\",\r\n },\r\n\r\n BannerContent: {\r\n title: \"Vestlandets skjærgårdspark:\",\r\n description:\r\n \"Fra Åna-Sira i sør til Stadlandet i nord tilbys mer enn 300 friluftslivsområder, uthavner, fortøyningsplasser, teltplasser og badeplasser. Her er noe for enhver smak, enten du kommer med egen båt, kajakk eller bil!\",\r\n map: \"GÅ TIL KARTET\",\r\n },\r\n\r\n AboutPreview: {\r\n title: \"Vestkystparken ivaretar:\",\r\n nature: \"friluftsliv, natur- og kulturverdier\",\r\n biology: \"biologisk mangfold\",\r\n natureGiven: \"naturgitte næringsgrunnlag\",\r\n esthetics: \"estetiske verdier\",\r\n health: \"folkehelse\",\r\n uu: \"universell utforming\",\r\n about: \"OM VESTKYSTPARKEN\",\r\n },\r\n\r\n BuoyInfo: {\r\n title: \"Overnatting i kystleden:\",\r\n description:\r\n \"Friluftsrådene på Vestlandet tilbyr overnatting i kystleden. Bestill et kystledhus, hytte, en kabin – eller finn din egen teltplass, gapahuk eller padlehuk i kartet.\",\r\n map: \"TIL KYSTLEDEN\",\r\n },\r\n\r\n OutportInfo: {\r\n title: \"Stort utvalg uthavner:\",\r\n description:\r\n \"Vestkystparken kan lokke med godt tilrettelagte uthavner – med kaier, toalett, teltplasser og kyststier – såvel som mer urørte med kun fortøyningsbolter. Her er det mye å velge i, fra beskyttede bukter ut mot storhavet til poller og holmer!\",\r\n map: \"UTFORSK KARTET\",\r\n },\r\n\r\n Nav: {\r\n seeAlso: \"Se også\",\r\n SearchPlaceholder: \"Hva leter du etter?\",\r\n },\r\n\r\n SearchResultComponent: {\r\n noResults: \"Fant ingen treff. Kontroller stavemåte og prøv igjen\",\r\n },\r\n\r\n Trips: {\r\n locale: \"no\",\r\n selectTourType: \"Turforslag\",\r\n turType: \"Tur type\",\r\n lettFottur: \"Lett fottur\",\r\n langFottur: \"Lang fottur\",\r\n klatretur: \"Klatretur\",\r\n sykleLangsVei: \"Sykle langs vei\",\r\n sykleITerreng: \"Sykle i terreng\",\r\n havpadling: \"Havpadling\",\r\n skiturIFjell: \"Skitur i fjell\",\r\n skiturPaFlatmark: \"Skitur på flatmark\",\r\n klarForAlt: \"Klar for alt!\",\r\n findTourOnMap: \"Vis alle i kartet\",\r\n addTourToMap: \"Legg til din tur\",\r\n Host: \"Høst\",\r\n Var: \"Vår\",\r\n Sommer: \"Sommer\",\r\n Vinter: \"Vinter\",\r\n Barmark: \"Barmark\",\r\n Snofore: \"Snøføre\",\r\n Bade_barmark_og_snofore: \"Både barmark og snøføre\",\r\n Alle: \"Alle\",\r\n Skitur: \"Skitur\",\r\n AnnenTur: \"Andre turer\",\r\n Jakttur: \"Jakttur\",\r\n Padletur: \"Padletur/rotur\",\r\n Fisketur: \"Fisketur\",\r\n Dykkertur: \"Dykkertur\",\r\n Sykkeltur: \"Sykkeltur\",\r\n Klatretur: \"Klatretur\",\r\n Aktivitet: \"Aktivitet\",\r\n Fottur: \"Fottur\",\r\n Trugetur: \"Trugetur\",\r\n AnnetFriluft: \"Annet friluft\",\r\n Attraksjon: \"Attraksjoner\",\r\n Badeplass: \"Badeplass\",\r\n Bru: \"Bru\",\r\n Batutsettplass: \"Båtutsettingsplass\",\r\n Gapahuk: \"Gapahuk\",\r\n Havn: \"Havn/fortøyning\",\r\n Infotavle: \"Infotavle\",\r\n JubileumsomradetFL: \"Jubileumsområder FL\",\r\n Rasteplass: \"Rasteplass\",\r\n Teltplass: \"Teltplass\",\r\n TilrettelagtFriluftsomrade: \"Godt tilgjengelig friluftsområde\",\r\n Utleiehytte: \"Hytte\",\r\n ApentHusvaere: \"Åpen hytte\",\r\n },\r\n\r\n Friluftselementer: {\r\n ChooseYourRecreationType: \"Friluftsområder og anlegg\",\r\n findRecreationOnMap: \"Vis alle på kartet\",\r\n \"Annet friluft\": \"Annet friluft\",\r\n Attraksjon: \"Attraksjoner\",\r\n Badeplass: \"Badeplass\",\r\n Bru: \"Bru\",\r\n Batutsettplass: \"Båtutsettingsplass\",\r\n Gapahuk: \"Gapahuk\",\r\n Havn: \"Havn/fortøyning\",\r\n Infotavle: \"Infotavle\",\r\n JubileumsomradetFL: \"Jubileumsområder FL\",\r\n Rasteplass: \"Rasteplass\",\r\n Teltplass: \"Teltplass\",\r\n TilrettelagtFriluftsomrade: \"Godt tilgjengelig friluftsområde\",\r\n Utleiehytte: \"Hytte\",\r\n ApentHusvaere: \"Åpen hytte\",\r\n },\r\n\r\n ArticleView: {\r\n searchForTrip: \"Søk i turbeskrivelse\",\r\n LoadMore: \"Last flere\",\r\n infoBox:\r\n \"I listen vises treff i kartet basert på valgene du har gjort i søkefilteret ovenfor. Utvalget endrer seg med kartutstnittet, med senter av kartet som fokuspunkt. Du kan zoome inn og bevege kartet for å spesifisere treffene ytterligere.\",\r\n results: \"Dine treff\",\r\n showFriluftsrad: \"Vis friluftsråd\",\r\n showTipBox: \"Vis tipsboks\",\r\n tipboxContent:\r\n \"

Slik bruker du kartløsningen

\" +\r\n \"

Klikk på den blå knappen med kompasset på for å zoome inn til stedet der du befinner deg akkurat nå. Dersom dette ikke virker må du tillate bruk av stedstjenester i nettleseren. På mobil finnes dette gjerne under Innstillinger.

\" +\r\n \"

Ved klikk i kart (på områdeavgrensing eller punkt) får du forslag til turer, fasiliteter og friluftsområder.

\" +\r\n \"

Når du går inn i kartet for første gang kommer alle punkter, områder og turer til å være aktive og vises som symboler i kartet.

\" +\r\n \"

For å filtrere benytter du checkboksene til høyre (for desktop) eller under (for telefon)

\" +\r\n \"

Bruk gjerne søkefeltet helt øverst til venstre for å finne informasjon om kjente turmål, områder eller fasiliteter.

\" +\r\n \"

Søkefeltet er boksen med forstørrelesglass. Hvis du trykker på boksen, vil søkefeltet ekspandere.

\" +\r\n '

Disse tipsene kan hentes frem igjen når du ønsker ved å klikke på den blå «Vis tipsboks»-knappen på kartet.\"

',\r\n closeTipBox: \"Ok, lukk tipsboks\",\r\n dontshowTipBox: \"Ikke vis igjen\",\r\n sourceselectorText1: \"1 valgt turtype\",\r\n sourceselectorText2: \"{0} valgte turtyper\",\r\n Title: \"Alle turmål\",\r\n filter: \"Filter\",\r\n },\r\n\r\n ArticleDetailView: {\r\n title: \"Vestkystparken\",\r\n },\r\n\r\n GodTurArticle: {\r\n bilder: \"Bilder:\",\r\n copyLinkBtn: \"Kopier lenke\",\r\n copyLink:\r\n \"Kopier nettadressen nedenfor for å dele turmålet med dine venner via chat eller e-post.\",\r\n linkCopied: \"Lenke kopiert\",\r\n copyLinkCloseBtn: \"Lukk\",\r\n elevation: \"Høydemeter\",\r\n length: \"Lengde\",\r\n points: \"Poeng\",\r\n startDate: \"Startdato\",\r\n endDate: \"Sluttdato\",\r\n RentalCabinsNearby: \"Utleiehytter i området\",\r\n time: \"Tid\",\r\n allYear: \"Helårs\",\r\n season: \"Sesong\",\r\n ShareTrip: \"Del på:\",\r\n gpxFile: \"GPX-fil\",\r\n \"Annen tur\": \"Annen tur\",\r\n Fisketur: \"Fisketur\",\r\n Fottur: \"Fottur\",\r\n Skitur: \"Skitur\",\r\n Padletur: \"Padletur/rotur\",\r\n Sykkeltur: \"Sykkeltur\",\r\n Badeplass: \"Badeplass\",\r\n Batutsettplass: \"Båtutsettingsplass\",\r\n Gapahuk: \"Gapahuk\",\r\n Havn: \"Havn/fortøyning\",\r\n Rasteplass: \"Rasteplass\",\r\n TilrettelagtFriluftsomrade: \"Godt tilgjengelig friluftsområde\",\r\n Utleiehytte: \"Hytte\",\r\n ApentHusvaere: \"Åpen hytte\",\r\n 0: \"Jubileumsområde\",\r\n 1: \"Flytebrygge\",\r\n 2: \"Kai\",\r\n 3: \"Badeplass\",\r\n 4: \"Fortøyningsbolter\",\r\n 5: \"Båtutsettingsrampe\",\r\n 6: \"Fortøyningsbøye\",\r\n 7: \"Ferskvann\",\r\n 8: \"Offentlig transport\",\r\n 9: \"Toalett\",\r\n 10: \"Padling\",\r\n 11: \"Fiske\",\r\n 12: \"Dykking\",\r\n 13: \"Grill & bål\",\r\n 14: \"Lek\",\r\n 15: \"klatring\",\r\n 16: \"Sykling\",\r\n 17: \"Fottur\",\r\n 21: \"Gapahuk\",\r\n 22: \"Parkeringsplass\",\r\n 23: \"Rasteplass\",\r\n 24: \"Ankring\",\r\n },\r\n\r\n GodTurArticleListComponent: {\r\n \"Annen tur\": \"Andre turer\",\r\n Fisketur: \"Fisketur\",\r\n Fottur: \"Fottur\",\r\n Skitur: \"Skitur\",\r\n Padletur: \"Padletur/rotur\",\r\n Sykkeltur: \"Sykkeltur\",\r\n Badeplass: \"Badeplass\",\r\n Batutsettplass: \"Båtutsettingsplass\",\r\n Gapahuk: \"Gapahuk\",\r\n Havn: \"Havn/fortøyning\",\r\n Rasteplass: \"Rasteplass\",\r\n TilrettelagtFriluftsomrade: \"Godt tilgjengelig friluftsområde\",\r\n Utleiehytte: \"Hytte\",\r\n ApentHusvaere: \"Åpen hytte\",\r\n Bru: \"Bru\",\r\n descriptionMissing: \"Beskrivelse mangler\",\r\n\r\n 0: \"Friluftsområde\",\r\n 5: \"Badeplass\",\r\n 6: \"Baderampe\",\r\n 8: \"Balløkke\",\r\n 13: \"Bål-/grillplass\",\r\n 14: \"Båtutsettingsrampe\",\r\n 18: \"Utsettingsplass kano-kajakk\",\r\n 20: \"Ferskvann/drikkevann\",\r\n 21: \"Fiskeplass fra land\",\r\n 22: \"Flytebrygge\",\r\n 24: \"Fortøyningsbolter\",\r\n 25: \"Fortøyningsbøye\",\r\n 29: \"Gapahuk\",\r\n 33: \"Grillhytte\",\r\n 37: \"Hinderløype-aktivitetsanlegg\",\r\n 40: \"Kai\",\r\n 42: \"klatring\",\r\n 47: \"Lekeapparater\",\r\n 48: \"Lekeplass\",\r\n 55: \"Parkeringsplass uten ladestasjon\",\r\n 56: \"Rasteplass-benker-bord\",\r\n 66: \"Stupebrett\",\r\n 68: \"Toalett\",\r\n 70: \"Utedo\",\r\n 71: \"Ankring\",\r\n 277: \"Padletur\",\r\n 282: \"Fottur\",\r\n 444: \"Hytte\",\r\n /**\r\n 0: 'Friluftsområde',\r\n 1: 'Flytebrygge',\r\n 2: 'Kai',\r\n 3: 'Badeplass',\r\n 4: 'Fortøyningsbolter',\r\n 5: 'Båtutsettingsrampe',\r\n 6: 'Fortøyningsbøye',\r\n 7: 'Ferskvann',\r\n 9: 'Toalett',\r\n 10: 'Padling',\r\n 11: 'Fiske',\r\n 12: 'Dykketur',\r\n 13: 'Grill & bål',\r\n 14: 'Lekeapparater',\r\n 15: 'Klatrefelt',\r\n 17: 'Fottur',\r\n 21: 'Gapahuk',\r\n 22: 'Parkeringsplass',\r\n 23: 'Rasteplass-benker-bord',\r\n 24: 'Ankring',\r\n\r\n 111: 'Åpen hytte',\r\n 444: 'Utleiehytte',\r\n 555: 'Kystledhus' */\r\n },\r\n\r\n // Maa oppdateres\r\n\r\n vkpKategori: {\r\n 0: \"JUBILEUMSOMRÅDE\",\r\n 1: \"FLYTEBRYGGE\",\r\n 2: \"KAI\",\r\n 3: \"BADEPLASS\",\r\n 4: \"FORTØYNINGSBOLTER\",\r\n 5: \"BÅTUTSETTINGSRAMPE\",\r\n 6: \"FORTØYNINGSBØYE\",\r\n 7: \"FERSKVANN\",\r\n 8: \"OFFENTLIG TRANSPORT\",\r\n 9: \"TOALETT\",\r\n 10: \"PADLING\",\r\n 11: \"FISKE\",\r\n 12: \"DYKKING\",\r\n 13: \"GRILL & BÅL\",\r\n 14: \"LEK\",\r\n 15: \"KLATRING\",\r\n 16: \"SYKLING\",\r\n 17: \"FOTTUR\",\r\n 21: \"GAPAHUK\",\r\n 22: \"PARKERINGSPLASS\",\r\n 23: \"RASTEPLASS\",\r\n 24: \"ANKRING\",\r\n 26: \"TELTPLASS\",\r\n 111: \"ÅPEN HYTTE\",\r\n 444: \"UTLEIEHYTTE\",\r\n 555: \"KYSTLEDHUS\",\r\n },\r\n\r\n // symboler\r\n\r\n symbol: {\r\n 0: \"Friluftsområde\",\r\n 5: \"Badeplass\",\r\n 6: \"Baderampe\",\r\n 8: \"Balløkke\",\r\n 13: \"Bål-/grillplass\",\r\n 14: \"Båtutsettingsrampe\",\r\n\r\n 18: \"Utsettingsplass kano-kajakk\",\r\n 20: \"Ferskvann/drikkevann\",\r\n 21: \"Fiskeplass fra land\",\r\n 22: \"Flytebrygge\",\r\n 24: \"Fortøyningsbolter\",\r\n 25: \"Fortøyningsbøye\",\r\n 29: \"Gapahuk\",\r\n 33: \"Grillhytte\",\r\n 37: \"Hinderløype-aktivitetsanlegg\",\r\n 40: \"Kai\",\r\n 42: \"klatring\",\r\n 47: \"Lekeapparater\",\r\n 48: \"Lekeplass\",\r\n 55: \"Parkeringsplass uten ladestasjon\",\r\n 56: \"Rasteplass-benker-bord\",\r\n 66: \"Stupebrett\",\r\n 67: \"teltplass\",\r\n 68: \"Toalett\",\r\n 70: \"Utedo\",\r\n 71: \"Ankring\",\r\n 277: \"Padletur\",\r\n 282: \"Fottur\",\r\n 444: \"Hytte\", // Tre kategorier\r\n },\r\n\r\n SlideMenu: {\r\n turfilter: \"Visningfilter\",\r\n vanskelihetsgrad: \"Vanskelighetsgrad:\",\r\n distanse: \"Turlengde (km)\",\r\n FilterIntroText:\r\n \"Utvalget til høyre styres av kartutsnittet. Når du zoomer i kartet vil utvalget endres.\",\r\n ShowSuggestions: \"Vis turforslag\",\r\n ShowOutdoorElements: \"Vis friluftsområder og anlegg\",\r\n ShowVkpElements: \"Vis VKP\",\r\n ShowuthavnerElements: \"UTHAVNER\",\r\n ShowaktiviteterElements: \"AKTIVITETER\",\r\n ShowovernattingElements: \"OVERNATTING\",\r\n ShowfasiliteterElements: \"FASILITETER\",\r\n lodging: \"OVERNATTING\",\r\n chooseOutdoorElementType: \"Velg type\",\r\n chooseTripType: \"Velg type\",\r\n showFilter: \"Vis filter\",\r\n hideFilter: \"Skjul filter\",\r\n menuButtonText: \"Filter\", //\"Klikk for å velge hva som skal vises i kartet\",\r\n ShowButtons: \"DETALJER\",\r\n summer: \"SOMMER\",\r\n winter: \"VINTER\",\r\n allyear: \"HELÅRS\",\r\n availability: \"VIS TILGJENGELIG\",\r\n },\r\n\r\n RangeInfo: {\r\n max: \"Turer kortere enn {max} km.\",\r\n min: \"Turer lengre enn {min} km.\",\r\n range: \"Turer lengre enn {min} km og kortere enn {max} km.\",\r\n },\r\n\r\n UserRegistrationPage: {\r\n UserRegistration: \"Registrer ny brukerkonto\",\r\n PasswordsDoNotMatch: \"Passordene er ikke like\",\r\n PasswordIsTooShort: \"Passordet må være minimum 6 tegn\",\r\n FirstnameNotValid: \"Fornavn er ikke gyldig\",\r\n SurnameNotValid: \"Etternavn er ikke gyldig\",\r\n MobileNotValid: \"Mobilnummer er ikke gyldig\",\r\n EmailAddressNotValid: \"E-postadresse er ikke gyldig\",\r\n organizationNotValid: \"Organisasjon er ikke gyldig\",\r\n CancelAndReturnToFrontPage: \"Avbryt og gå tilbake til forsiden\",\r\n ToLogin: \"Til innlogging\",\r\n UserRegistrationIntro:\r\n \"Ved å registrere en brukerkonto på GodTur \" +\r\n \"kan du dele turtips med andre via bilder, tekst og en kartrute. \" +\r\n \"Det vil samtidig opprettes en brukerkonto for deg ved nettstedet \" +\r\n \"telltur.no. Her kan du plotte inn spesielle turkoder \" +\r\n \"fra utvalgte turer og slik konkurrere med andre turgåere om årspremier fra \" +\r\n \"friluftsrådet i din region. Brukernavn og passord for disse to nettstedene vil være det samme.\",\r\n MandatoryFields: \"Feltene i skjemaet merket med * er obligatoriske.\",\r\n CreatedUser:\r\n \"Vi har opprettet ny bruker til deg. Klikk på lenken under for å logge inn.\",\r\n },\r\n\r\n UserRegistrationForm: {\r\n Register: \"Opprett brukerkonto\",\r\n Email: \"E-postadresse* (dette blir ditt brukernavn for innlogging)\",\r\n Password: \"Passord*\",\r\n PasswordRepeat: \"Gjenta passordet*\",\r\n Firstname: \"Fornavn*\",\r\n Surname: \"Etternavn*\",\r\n Mobile: \"Mobiltelefonnummer\",\r\n Organization: \"Organisasjon\",\r\n EmailPlaceholder: \"Tast inn din e-postadresse\",\r\n PasswordPlaceholder: \"Tast inn et passord\",\r\n PasswordRepeatPlaceholder: \"Tast inn ditt valgte passord på nytt\",\r\n FirstnamePlaceholder: \"Tast inn fornavnet ditt\",\r\n SurnamePlaceholder: \"Tast inn etternavnet ditt\",\r\n MobilePlaceholder: \"Tast inn mobiltelefonnummeret ditt\",\r\n OrganizationPlaceholder:\r\n \"Dersom du er tilknyttet en GodTur-organisasjon oppgir du dette her\",\r\n AcceptPrivacyPolicy:\r\n \"Jeg har lest og godtar at data deles med samarbeidende tursider og at mine personlige data behandles i samsvar med \",\r\n PrivacyPolicy: \"personvernerklæringen\",\r\n },\r\n\r\n LoginPage: {\r\n LogIn: \"Logg inn\",\r\n LogInIntroText:\r\n \"For å dele ditt turforslag med andre, må du ha opprettet en brukerkonto og være logget inn på GodTur. Har du ikke allerede laget deg en bruker på GodTur, kan du \",\r\n Username: \"E-postadresse\",\r\n Password: \"Passord\",\r\n ForgotPassword: \"Glemt passord?\",\r\n RegisterHere: \"opprette en brukerkonto her.\",\r\n Error:\r\n \"Innloggingen feilet. Vennligst sjekk at e-post og passord er korrekt\",\r\n },\r\n\r\n ResetPasswordPage: {\r\n Email: \"E-postadresse\",\r\n SendNewPassword: \"Send nytt passord\",\r\n Cancel: \"Avbryt\",\r\n CouldNotResetPassword:\r\n \"Kunne ikke nullstille passord. Vennligst sjekk at e-postadressen er riktig\",\r\n PasswordResetInfoText:\r\n \"Nytt passord er sendt via e-post. Dersom du ikke mottar denne, sjekk om den kan ligge i søppelpostfilteret.\",\r\n GoBack: \"Gå tilbake til innlogging\",\r\n },\r\n\r\n TranslatedServerError: {\r\n UserExists:\r\n \"En bruker med denne e-postadressen finnes allerede. Hvis du tidligere har registrert en bruker på telltur.no eller godtur.no kan du benytte denne til å logge inn\",\r\n InvalidUser:\r\n \"Ugyldige brukerdata sendt inn. Forsøk å logge inn igjen på nytt.\",\r\n InvalidOwner:\r\n \"Du må være eier av objektet som skal endres. Ta kontakt med administrator.\",\r\n EmailInUse: \"Det er registrert en annen bruker med denne e-postadressen\",\r\n SessionExpired: \"Din sesjon har utløpt. Vennligst logg inn på nytt.\",\r\n NoRecordFound: \"Ingen data funnet\",\r\n SaveFailed: \"Lagring feilet\",\r\n DeleteFailed: \"Sletting mislyktes\",\r\n },\r\n\r\n NavBar: {\r\n MyProfile: \"Min side\",\r\n LogOut: \"Logg ut\",\r\n LogIn: \"Logg inn\",\r\n AllTrips: \"Vis alle turer\",\r\n RegisterUser: \"Registrer bruker\",\r\n SearchPlaceholder: \"Søk turforslag, anlegg og friluftsområder\",\r\n },\r\n\r\n MyTripsList: {\r\n locale: \"nb-NO\",\r\n Title: \"Tittel\",\r\n Added: \"Lagt til\",\r\n Tools: \"Verktøy\",\r\n MyTrips: \"Mine turer\",\r\n NoTripsRegistered: \"Ingen turer registrert\",\r\n DeleteTrip: \"Er du sikker på at du vil slette\",\r\n Cancel: \"Avbryt\",\r\n Delete: \"Slett\",\r\n },\r\n\r\n MyProfileContainer: {\r\n MyPage: \"Min side\",\r\n FirstnameNotValid: \"Fornavn er ikke gyldig\",\r\n SurnameNotValid: \"Etternavn er ikke gyldig\",\r\n MobileNotValid: \"Mobilnummer er ikke gyldig\",\r\n EmailAddressNotValid: \"E-postadresse er ikke gyldig\",\r\n OrganizationNotValid: \"Organisasjon er ikke gyldig\",\r\n },\r\n\r\n MyProfileForm: {\r\n Save: \"Lagre\",\r\n Firstname: \"Fornavn\",\r\n Surname: \"Etternavn\",\r\n Mobile: \"Mobiltelefonnummer\",\r\n Email: \"E-postadresse\",\r\n Organization: \"Organisasjon\",\r\n ShowAndEditProfileDetails: \"Vis og endre profildetaljer\",\r\n HideProfileDetails: \"Skjul profildetaljer\",\r\n ConfirmDelete: \"Jeg forstår, slett brukerkontoen min\",\r\n DeleteAccountHeader: \"Slett min GodTur (og TellTur) konto\",\r\n DeleteGodTurAccount: `Du er nå i ferd med å slette din GodTur-brukerkonto.\r\n Du vil ikke lenger kunne logge inn eller redigere turer.\r\n Denne handlingen er ikke reversibel.`,\r\n DeleteTellTurAccount: `NB: Du er også i ferd med å slette din TellTur.no-brukerkonto.\r\n For å kunne delta i TellTur-konkurranser må du ha en brukerkonto.\r\n Opplysningene sikrer at turregistreringer knyttes til brukeren din,\r\n og gir friluftsrådene et verktøy for å hente ut ulike statistikker.\r\n Dersom du sletter brukerkontoen din vil alle opplysninger bli borte for godt,\r\n inkludert de turmål du har registrert.`,\r\n DeleteAccount: \"Slett konto\",\r\n ChangePassword: \"Endre passord\",\r\n },\r\n\r\n LastPublished: {\r\n lastPublished: \"Siste turer\",\r\n seeAll: \"Se alle\",\r\n },\r\n\r\n Activities: {\r\n locale: \"nb-NO\",\r\n AllActivities: \"Alle aktiviteter\",\r\n },\r\n\r\n GeomForm: {\r\n locale: \"nb-NO\",\r\n saveFailed: \"Lagring feilet, prøv igjen\",\r\n infoText:\r\n \"Angi navn og beskrivelse om du vil. Navnet du oppgir vil vises i kartet sammen med hvert punkt og linje du har tegnet. I tillegg vil både navn og beskrivelse være med i GPX-filen som kan lastes ned for turen.\",\r\n cancel: \"Avbryt\",\r\n save: \"Lagre\",\r\n continue: \"Neste\",\r\n },\r\n\r\n GodTurArticleCommentForm: {\r\n GiveRating: \"Gi din vurdering:\",\r\n Email: \"E-post (vil ikke publiseres)\",\r\n DisplayName: \"Navn\",\r\n Comment: \"Kommentar\",\r\n Cancel: \"Avbryt\",\r\n Submit: \"Lagre\",\r\n EmailIsMandatory: \"E-postadresse er obligatorisk\",\r\n DisplayNameIsMandatory: \"Navn er obligatorisk\",\r\n EmailAddressNotValid: \"E-postadresse er ikke gyldig\",\r\n RatingIsMandatory: \"Vurdering er obligatorisk\",\r\n RatingIsNotValid: \"Vurdering er ikke gyldig\",\r\n },\r\n\r\n GodTurArticleCommentSection: {\r\n RatingsIntro: \"Les hva andre turgåere har å si - og \",\r\n RatingsLink: \"legg igjen din kommentar!\",\r\n },\r\n\r\n EditTripForm: {\r\n locale: \"nb-NO\",\r\n publish_disclaimer:\r\n \"Ved å publisere turen aksepterer du at turen blir synlig på GodTur og samarbeidende tursider. Du kan når som helst trekke tilbake ditt samtykke ved å avpublisere eller slette turen.\",\r\n publish: \"Publiser\",\r\n unpublish: \"Avpubliser\",\r\n mustDoBeforePublish:\r\n \"For at du skal kunne publisere turen må du som minimum gi turen en tittel, laste opp minst ett bilde, legge inn en beskrivelse, angi type og sesong og plassering i kart (linje).\",\r\n distance: \"Avstand\",\r\n timeSpent: \"Tidsbruk\",\r\n season: \"Sesong\",\r\n type: \"Type\",\r\n description: \"Beskrivelse\",\r\n municipality: \"Kommune\",\r\n selectMunicipality: \"Velg kommune...\",\r\n title: \"Tittel\",\r\n backToMyProfile: \"Tilbake til Min side\",\r\n editTrip: \"Redigering tur\",\r\n line: \"Linje\",\r\n media: \"Media\",\r\n Host: \"Høst\",\r\n Var: \"Vår\",\r\n Sommer: \"Sommer\",\r\n Vinter: \"Vinter\",\r\n Alle: \"Alle\",\r\n Barmark: \"Barmark\",\r\n Snofore: \"Snøføre\",\r\n Bade_barmark_og_snofore: \"Både barmark og snøføre\",\r\n Fisketur: \"Fisketur\",\r\n Fottur: \"Fottur\",\r\n Padletur: \"Padletur/rotur\",\r\n Skitur: \"Skitur\",\r\n Sykkeltur: \"Sykkeltur\",\r\n AnnenTur: \"Annen tur\",\r\n },\r\n\r\n MediaField: {\r\n caption: \"Bildetekst\",\r\n dragAndDrop: \"Dra og slipp her eller klikk for å laste opp bilder\",\r\n setAsMain: \"Sett som hovedbilde\",\r\n },\r\n\r\n PrivacyPage: {\r\n PrivacyStatement: \"Personvernerklæring\",\r\n AcceptPrivacyPolicy:\r\n \"Jeg har lest og godtar at data deles med samarbeidende tursider og at mine personlige data behandles i samsvar med \",\r\n PrivacyPolicy: \"personvernerklæringen\",\r\n Accept: \"Godkjenn\",\r\n ConsentError:\r\n \"Noe gikk galt ved registrering av din godkjennelse. Vennligst prøv igjen. Kontakt administrator dersom problemet vedvarer.\",\r\n },\r\n\r\n Footer: {\r\n title: \"KONTAKT OSS\",\r\n contact: \"Kontakt oss \",\r\n description: \"Personvern\",\r\n developedBy: \"Utviklet av\",\r\n privacy: \"Personvern\",\r\n avinet: \"Asplan Viak Internet AS\",\r\n avinetAddress: \"https://avinet.no/\",\r\n },\r\n\r\n MiniFooter: {\r\n contact: \"Kontakt oss\",\r\n privacy: \"Personvern\",\r\n avinet: \"Asplan Viak Internet AS\",\r\n },\r\n};\r\n","import React from \"react\";\r\nimport \"./FrontPage/ContactUs.scss\";\r\n\r\nclass ContactComponent extends React.Component {\r\n componentDidUpdate() {}\r\n render() {\r\n return (\r\n
\r\n
\r\n \r\n

Kontakt oss

\r\n
\r\n
\r\n \r\n

Telefon

\r\n

\r\n {window.gtag(\"config\", \"AW-650761050/oRpnCJHsw80BENqmp7YC\", {\r\n phone_conversion_number: \"55392950\",\r\n })}\r\n \r\n 55 39 29 50\r\n \r\n

\r\n
\r\n\r\n
\r\n \r\n

E-post

\r\n vestkystparken@bof.no\r\n
\r\n
\r\n
\r\n
\r\n \r\n );\r\n }\r\n}\r\nexport default ContactComponent;\r\n","const getPath = (location) => {\r\n return location.pathname.length > 1 ? location.pathname.slice(1) : \"index\";\r\n};\r\n\r\nconst fixLinks = (history) => {\r\n let pageContent = document.getElementsByClassName(\"tell-tur-cms\")[0];\r\n if (pageContent) {\r\n let links = pageContent.getElementsByTagName(\"a\");\r\n [].forEach.call(links, (link) => {\r\n if (\r\n link.host !== window.location.host ||\r\n /\\..{3,4}$/.test(link.href) ||\r\n link.target\r\n ) {\r\n return;\r\n }\r\n\r\n link.onclick = (e) => {\r\n let nl = link.pathname;\r\n e.preventDefault();\r\n if (link.pathname.indexOf(\"/\") !== 0) {\r\n nl += \"/\" + nl;\r\n }\r\n history.push(nl);\r\n };\r\n });\r\n }\r\n};\r\n\r\nexport { getPath, fixLinks };\r\n","export default {\r\n flickrConfig: {\r\n userId: \"49428017@N05\",\r\n flickrApiKey: \"c8b844d04f3c50ae271ae8451d89d3d1\",\r\n },\r\n tripPointsStyle: {\r\n fillColor: \"#f0a055\",\r\n fillOpacity: 100,\r\n strokeColor: \"#a93900\",\r\n strokeWidth: 2,\r\n strokeOpacity: 100,\r\n pointRadius: 8,\r\n labelProperty: \"name\",\r\n labelBackgroundFill: \"#f0a055\",\r\n labelTextAlign: \"left\",\r\n labelPadding: [5, 5, 5, 5],\r\n labelOffsetX: 20,\r\n labelOffsetY: 0,\r\n font: \"14px sans-serif\",\r\n },\r\n tripLinesStyle: {\r\n strokeColor: \"#a93900\",\r\n strokeWidth: 5,\r\n strokeOpacity: 100,\r\n lineDash: [4, 8],\r\n lineDashOffset: 6,\r\n labelProperty: \"name\",\r\n labelBackgroundFill: \"#a93900\",\r\n labelTextAlign: \"left\",\r\n labelPadding: [5, 5, 5, 5],\r\n labelOffsetX: 20,\r\n labelOffsetY: 0,\r\n font: \"14px sans-serif\",\r\n },\r\n adaptiveUrl: \"https://friluftsforvaltning.avinet.no/\",\r\n guiUrl: \"https://godtur.no\",\r\n appName: \"Vestkystparken\",\r\n gm_lang_code: \"nb\",\r\n privacyVersion: 1,\r\n\r\n // DEV:\r\n\r\n // articleModuleUuid: \"e171b934-d940-4f61-9e61-2e162b76d462\",\r\n\r\n // PROD:\r\n\r\n articleModuleUuid: \"672bce43-a978-4e0c-84a5-2cfba33bb412\",\r\n\r\n // Alle vestkystparkelementer\r\n\r\n vestkystparkElementerPublic: {\r\n // DEV:\r\n\r\n // uuid: \"16344356-18a2-4b45-a8a7-481ca6d28649\",\r\n\r\n // PROD\r\n uuid: \"c59ac705-b54d-44be-9763-bc57a45f60df\",\r\n\r\n columns: [\r\n \"id\",\r\n \"geom_wkt\",\r\n \"type_friluftselement\",\r\n \"symbol_id\",\r\n \"datakilde\",\r\n \"geom_omraade\",\r\n \"godtur_id\",\r\n ],\r\n dataIndex: \"vestkystparkelementer\",\r\n },\r\n\r\n mapProjCode: \"3857\",\r\n mapProjection: \"EPSG:3857\",\r\n minZoom: 3,\r\n maxZoom: 20,\r\n initExtent: [\r\n 131675.39390401903,\r\n 7742295.306785431,\r\n 1978393.9972738773,\r\n 9074134.087626342,\r\n ],\r\n\r\n dtNews: {\r\n uuid: \"2a55de7c-f391-4ae0-b31c-6e17b5732b99\",\r\n columns: [\"id\", \"title\", \"content\", \"summary\", \"media\"],\r\n },\r\n\r\n dtMunicipality: {\r\n uuid: \"494df784-7a9a-4dfe-a278-a777771747ce\",\r\n columns: [\"gid\", \"komm\", \"navn\"],\r\n },\r\n\r\n dtTrips: {\r\n uuid: \"a654e177-68f1-4fba-82a7-24e14e314dfd\",\r\n listColumns: [\"id\", \"title\", \"date_created\", \"published\", \"name\"],\r\n columns: [\r\n \"id\",\r\n \"sesong\",\r\n \"tilrettelagt\",\r\n \"datakilde\",\r\n \"geom_omraade\",\r\n \"date_created\",\r\n \"date_modified\",\r\n \"created_by\",\r\n \"modified_by\",\r\n \"uuid\",\r\n \"media\",\r\n \"title\",\r\n \"summary\",\r\n \"description\",\r\n \"type_friluftsliv\",\r\n \"season\",\r\n \"time\",\r\n \"distance\",\r\n \"county\",\r\n \"municipality\",\r\n \"published\",\r\n \"published_date\",\r\n ],\r\n },\r\n recaptchaSiteKey: \"6LdR8mgUAAAAACc4LpOBwL2Xt62QO4FjAlQxUgow\",\r\n dtLine: {\r\n uuid: \"4010f11d-0645-41ee-a600-614dab0fef0f\",\r\n fkColumn: \"fk_trips\",\r\n columns: [\"id\", \"name\", \"description\", \"fk_trips\", \"media\"],\r\n geomType: \"LineString\",\r\n },\r\n dtPoint: {\r\n uuid: \"0de9a481-3083-414f-8a40-e3d5cd4ad48b\",\r\n fkColumn: \"fk_trips\",\r\n columns: [\"id\", \"title\", \"name\", \"description\", \"fk_trips\", \"media\"],\r\n geomType: \"Point\",\r\n },\r\n\r\n dtFriluft: {\r\n uuid: \"e41169a6-8265-414d-a931-e71eac48517c\",\r\n },\r\n articleModuleFilters: {\r\n turmal: {\r\n published: {\r\n name: \"published\",\r\n value: true,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"AND\",\r\n },\r\n season: {\r\n name: \"season\",\r\n value: null,\r\n comparisonOperator: \"ANY\",\r\n netType: \"string[]\",\r\n logicalOperator: \"AND\",\r\n },\r\n avstandTil: {\r\n name: \"distance\",\r\n value: null,\r\n comparisonOperator: \"<=\",\r\n logicalOperator: \"AND\",\r\n },\r\n avstandFra: {\r\n name: \"distance\",\r\n value: null,\r\n comparisonOperator: \">=\",\r\n logicalOperator: \"AND\",\r\n },\r\n type: {\r\n name: \"type_friluftselement\",\r\n value: null,\r\n comparisonOperator: \"ANY\",\r\n netType: \"string[]\",\r\n logicalOperator: \"AND\",\r\n },\r\n },\r\n\r\n vestkystparkelementer: {\r\n type: {\r\n name: \"kategori_array\",\r\n netType: \"int[]\",\r\n value: null,\r\n comparisonOperator: \"&&\",\r\n logicalOperator: \"OR\",\r\n },\r\n\r\n sesong: {\r\n name: \"sesong\",\r\n netType: \"String\",\r\n value: null,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"AND\",\r\n },\r\n\r\n tilgjengelig: {\r\n name: \"tilrettelagt\",\r\n netType: \"boolean\",\r\n value: true,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"AND\",\r\n },\r\n\r\n name: \"uthavner\",\r\n netType: \"boolean\",\r\n value: true,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"OR\",\r\n },\r\n aktiviteter: {\r\n name: \"aktiviteter\",\r\n netType: \"boolean\",\r\n value: true,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"OR\",\r\n },\r\n fasiliteter: {\r\n name: \"fasiliteter\",\r\n netType: \"boolean\",\r\n value: true,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"OR\",\r\n },\r\n overnatting: {\r\n name: \"overnatting\",\r\n netType: \"boolean\",\r\n value: true,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"OR\",\r\n\r\n is_kystledhus: {\r\n name: \"is_kystledhus\",\r\n netType: \"boolean\",\r\n value: true,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"OR\",\r\n },\r\n\r\n is_utleiehytte: {\r\n name: \"is_utleiehytte\",\r\n netType: \"boolean\",\r\n value: true,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"OR\",\r\n },\r\n\r\n is_aapen_hytte: {\r\n name: \"is_aapen_hytte\",\r\n netType: \"boolean\",\r\n value: true,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"OR\",\r\n },\r\n },\r\n },\r\n\r\n typeFilter: [\r\n {\r\n title: \"Fisketur\",\r\n uri: \"Fisketur\",\r\n icon: \"fiskeTur\",\r\n },\r\n {\r\n title: \"Fottur\",\r\n uri: \"Fottur\",\r\n icon: \"fotTur\",\r\n },\r\n {\r\n title: \"Padletur\",\r\n uri: \"Padletur\",\r\n icon: \"padleTur\",\r\n },\r\n {\r\n title: \"Skitur\",\r\n uri: \"Skitur\",\r\n icon: \"skiTur\",\r\n },\r\n {\r\n title: \"Sykkeltur\",\r\n uri: \"Sykkeltur\",\r\n icon: \"sykkelTur\",\r\n },\r\n {\r\n title: \"AnnenTur\",\r\n uri: \"Annen_tur\",\r\n icon: \"annenTur\",\r\n },\r\n ],\r\n\r\n vkpTypeFilter: [\r\n {\r\n sesongFilter: [\r\n {\r\n title: \"helaars\",\r\n uri: \"helaars\",\r\n },\r\n {\r\n title: \"vinter\",\r\n uri: \"vinter\",\r\n },\r\n\r\n {\r\n title: \"sommer\",\r\n uri: \"sommer\",\r\n },\r\n ],\r\n },\r\n ],\r\n\r\n vkpCategoryFilter: [\r\n {\r\n category: 1,\r\n title: \"Flytebrygge\",\r\n icon: \"flytebrygge\",\r\n },\r\n {\r\n category: 2,\r\n title: \"Kai\",\r\n icon: \"kai\",\r\n },\r\n {\r\n category: 4,\r\n title: \"Fortoyningsbolter\",\r\n icon: \"fortoyningsbolter\",\r\n },\r\n {\r\n category: 5,\r\n title: \"Batutsettingsrampe\",\r\n icon: \"batutsettingsrampe\",\r\n },\r\n {\r\n category: 6,\r\n title: \"Fortoyningsboye\",\r\n icon: \"fortoyningsboye\",\r\n },\r\n\r\n { category: 24, title: \"Ankring\", icon: \"ankring\" },\r\n {\r\n category: 3,\r\n title: \"Badeplass\",\r\n icon: \"badeplass\",\r\n },\r\n {\r\n category: 10,\r\n title: \"Padling\",\r\n icon: \"padling\",\r\n },\r\n {\r\n // Fisketur og fiskeplass fra land\r\n category: 11,\r\n title: \"Fiske\",\r\n icon: \"fiske\",\r\n },\r\n {\r\n category: 12,\r\n title: \"Dykking\",\r\n icon: \"dykking\",\r\n },\r\n\r\n {\r\n category: 13,\r\n title: \"Grill & b�l\",\r\n icon: \"grillogbaal\",\r\n },\r\n\r\n {\r\n category: 14,\r\n title: \"Lek\",\r\n icon: \"lek\",\r\n },\r\n { category: 15, title: \"Klatring\", icon: \"klatring\" },\r\n { category: 16, title: \"Sykling\", icon: \"sykling\" },\r\n { category: 17, title: \"Fottur\", icon: \"fottur\" },\r\n {\r\n category: 0,\r\n title: \"Jubileumsomraade\",\r\n icon: \"jubileumsomraade\",\r\n },\r\n {\r\n category: 7,\r\n title: \"Ferskvann\",\r\n icon: \"ferskvann\",\r\n },\r\n /** {\r\n category: 8,\r\n title: 'Offentlig transport',\r\n icon: 'offentligtransport'\r\n }, */\r\n {\r\n category: 9,\r\n title: \"Toalett\",\r\n icon: \"toalett\",\r\n },\r\n {\r\n category: 21,\r\n title: \"Gapahuk\",\r\n icon: \"gapahuk\",\r\n },\r\n {\r\n category: 22,\r\n title: \"Parkeringsplass\",\r\n icon: \"parkeringsplass\",\r\n },\r\n {\r\n category: 23,\r\n title: \"Rasteplass\",\r\n icon: \"rasteplass\",\r\n },\r\n {\r\n category: 111,\r\n title: \"�pen hytte\",\r\n icon: \"�pen hytte\",\r\n },\r\n {\r\n category: 222,\r\n title: \"Utleiehytte\",\r\n icon: \"utleiehytte\",\r\n },\r\n {\r\n category: 555,\r\n title: \"Kystledhus\",\r\n icon: \"kystledhus\",\r\n },\r\n ],\r\n\r\n // uthavn\r\n\r\n uthavner: [\r\n {\r\n category: 1,\r\n title: \"Flytebrygge\",\r\n uri: \"Flytebrygge\",\r\n icon: \"Flytebrygge\",\r\n },\r\n {\r\n category: 2,\r\n title: \"Kai\",\r\n uri: \"Kai\",\r\n icon: \"Kai\",\r\n },\r\n {\r\n category: 4,\r\n title: \"Fortoyningsbolter\",\r\n uri: \"Fortoyningsbolter\",\r\n icon: \"Fortoyningsbolter\",\r\n },\r\n\r\n {\r\n category: 6,\r\n title: \"Fortoyningsboye\",\r\n uri: \"Fortoyningsboye\",\r\n icon: \"Fortoyningsboye\",\r\n },\r\n\r\n { category: 24, title: \"Ankring\", uri: \"Ankring\", icon: \"Ankring\" },\r\n {\r\n category: 5,\r\n title: \"Batutsettingsrampe\",\r\n uri: \"Batutsettingsrampe\",\r\n icon: \"Batutsettingsrampe\",\r\n },\r\n ],\r\n\r\n // Aktiviteter\r\n\r\n aktiviteter: [\r\n {\r\n category: 3,\r\n title: \"Badeplass\",\r\n uri: \"Badeplass\",\r\n icon: \"Badeplass\",\r\n },\r\n {\r\n category: 14,\r\n title: \"Lek\",\r\n uri: \"Lek\",\r\n icon: \"Lek\",\r\n },\r\n {\r\n category: 10,\r\n title: \"Padling\",\r\n uri: \"Padling\",\r\n icon: \"Padling\",\r\n },\r\n {\r\n // Fisketur og fiskeplass fra land\r\n category: 11,\r\n title: \"Fiske\",\r\n uri: \"Fiske\",\r\n icon: \"Fiske\",\r\n },\r\n {\r\n category: 12,\r\n title: \"Dykking\",\r\n uri: \"Dykking\",\r\n icon: \"Dykking\",\r\n },\r\n\r\n { category: 15, title: \"klatring\", uri: \"klatring\", icon: \"klatring\" },\r\n { category: 16, title: \"Sykling\", uri: \"Sykling\", icon: \"Sykling\" },\r\n { category: 17, title: \"Fottur\", uri: \"Fottur\", icon: \"Fottur\" },\r\n {\r\n category: 13,\r\n title: \"Grill & b�l\",\r\n uri: \"Grillogbaal\",\r\n icon: \"Grillogbaal\",\r\n },\r\n ],\r\n\r\n // Overnatting\r\n\r\n overnatting: [\r\n { category: 26, title: \"Teltplass\", uri: \"Teltplass\", icon: \"teltplass\" },\r\n {\r\n category: 111,\r\n title: \"�pen hytte\",\r\n uri: \"�pen hytte\",\r\n icon: \"�penhytte\",\r\n },\r\n {\r\n category: 444,\r\n title: \"Utleiehytte\",\r\n uri: \"Utleiehytte\",\r\n icon: \"utleiehytte\",\r\n },\r\n {\r\n category: 555,\r\n title: \"Kystledhus\",\r\n uri: \"Kystledhus\",\r\n icon: \"kystledhus\",\r\n },\r\n ],\r\n\r\n // Fasiliteter\r\n\r\n fasiliteter: [\r\n {\r\n category: 23,\r\n title: \"Rasteplass\",\r\n uri: \"Rasteplass\",\r\n icon: \"Rasteplass\",\r\n },\r\n {\r\n category: 21,\r\n title: \"Gapahuk\",\r\n uri: \"Gapahuk\",\r\n icon: \"Gapahuk\",\r\n },\r\n {\r\n category: 9,\r\n title: \"Toalett\",\r\n uri: \"Toalett\",\r\n icon: \"Toalett\",\r\n },\r\n {\r\n category: 7,\r\n title: \"Ferskvann\",\r\n uri: \"Ferskvann\",\r\n icon: \"Ferskvann\",\r\n },\r\n {\r\n category: 22,\r\n title: \"Parkeringsplass\",\r\n uri: \"Parkeringsplass\",\r\n icon: \"Parkeringsplass\",\r\n },\r\n {\r\n category: 8,\r\n title: \"Offentlig transport\",\r\n uri: \"Offentligtransport\",\r\n icon: \"Offentligtransport\",\r\n },\r\n ],\r\n\r\n // Update necessary\r\n\r\n friluftselementerFilter: [\r\n {\r\n title: \"Badeplass\",\r\n uri: \"Badeplass\",\r\n icon: \"Badeplass\",\r\n },\r\n {\r\n title: \"Batutsettplass\",\r\n uri: \"Batutsettplass\",\r\n icon: \"batutsettplass\",\r\n },\r\n {\r\n title: \"Gapahuk\",\r\n uri: \"Gapahuk\",\r\n icon: \"gapahuk\",\r\n },\r\n {\r\n title: \"Havn\",\r\n uri: \"Havn\",\r\n icon: \"Havn\",\r\n },\r\n {\r\n title: \"Rasteplass\",\r\n uri: \"Rasteplass\",\r\n icon: \"Rasteplass\",\r\n },\r\n {\r\n title: \"TilrettelagtFriluftsomrade\",\r\n uri: \"TilrettelagtFriluftsomrade\",\r\n icon: \"tilrettelagt\",\r\n },\r\n {\r\n title: \"Utleiehytte\",\r\n uri: \"Utleiehytte\",\r\n icon: \"lockedCabin\",\r\n },\r\n {\r\n title: \"ApentHusvaere\",\r\n uri: \"ApentHusvaere\",\r\n icon: \"apentHusvaere\",\r\n },\r\n ],\r\n\r\n seasonFilter: [\r\n {\r\n title: \"Host\",\r\n uri: \"Host\",\r\n },\r\n {\r\n title: \"Var\",\r\n uri: \"Var\",\r\n },\r\n {\r\n title: \"Sommer\",\r\n uri: \"Sommer\",\r\n },\r\n {\r\n title: \"Vinter\",\r\n uri: \"Vinter\",\r\n },\r\n {\r\n title: \"Alle\",\r\n uri: \"Alle\",\r\n },\r\n {\r\n title: \"Barmark\",\r\n uri: \"Barmark\",\r\n },\r\n {\r\n title: \"Snofore\",\r\n uri: \"Snofore\",\r\n },\r\n {\r\n title: \"Bade_barmark_og_snofore\",\r\n uri: \"Bade_barmark_og_snofore\",\r\n },\r\n ],\r\n cms_site_id: 2,\r\n};\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport config from \"../config/index\";\r\n\r\nexport default class Title extends React.Component {\r\n componentDidMount() {\r\n this.oldTitle = document.title;\r\n const { title } = this.props;\r\n if (title) {\r\n document.title = title + \" | \" + config.appName;\r\n }\r\n }\r\n\r\n componentWillReceiveProps(props) {\r\n if (props.title) {\r\n document.title = props.title + \" | \" + config.appName;\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n document.title = this.oldTitle;\r\n }\r\n\r\n render() {\r\n return null;\r\n }\r\n}\r\n\r\nTitle.propTypes = {\r\n title: PropTypes.string,\r\n};\r\n","import React from \"react\";\r\nimport \"./LoadingIndicator.scss\";\r\n\r\nclass LoadingIndicator extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = { timer: null, displayLoadingIndicator: false };\r\n }\r\n\r\n componentWillMount() {\r\n const timer = setTimeout(() => {\r\n this.setState({ timer: null, displayLoadingIndicator: true });\r\n }, 50);\r\n this.setState({ timer });\r\n }\r\n\r\n componentWillUnmount() {\r\n const timer = this.state.timer;\r\n if (timer !== null) {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n render() {\r\n const { displayLoadingIndicator } = this.state;\r\n if (!displayLoadingIndicator) {\r\n return null;\r\n }\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default LoadingIndicator;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport \"./Icon.scss\";\r\n\r\nconst icons = {\r\n // Symbols:\r\n\r\n // Uthavner:\r\n\r\n Flytebrygge: (\r\n \r\n \r\n \r\n ),\r\n\r\n Kai: (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ),\r\n\r\n Fortoyningsbolter: (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n\r\n Batutsettingsrampe: (\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n\r\n Fortoyningsboye: (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ),\r\n\r\n Ankring: (\r\n \r\n \r\n \r\n ),\r\n\r\n // Aktiviteter:\r\n\r\n Fiske: (\r\n \r\n \r\n \r\n ),\r\n\r\n Badeplass: (\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n Padling: (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ),\r\n\r\n Dykking: (\r\n \r\n \r\n \r\n ),\r\n\r\n Grillogbaal: (\r\n \r\n \r\n \r\n ),\r\n\r\n Lek: (\r\n \r\n \r\n \r\n ),\r\n\r\n Klatring: (\r\n \r\n \r\n \r\n ),\r\n\r\n Sykling: (\r\n \r\n \r\n \r\n ),\r\n\r\n Fottur: (\r\n \r\n \r\n \r\n\r\n \r\n \r\n ),\r\n\r\n // Overnatting :\r\n\r\n // Fasiliteter :\r\n\r\n Ferskvann: (\r\n \r\n \r\n \r\n ),\r\n\r\n // Offentligtransport:\r\n\r\n Toalett: (\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n\r\n Gapahuk: (\r\n \r\n \r\n \r\n \r\n ),\r\n\r\n Parkeringsplass: (\r\n \r\n \r\n \r\n ),\r\n\r\n Rasteplass: (\r\n \r\n \r\n \r\n ),\r\n\r\n // Other:\r\n\r\n search: (\r\n \r\n \r\n \r\n ),\r\n pencil: (\r\n \r\n \r\n \r\n ),\r\n unlock: (\r\n \r\n \r\n \r\n ),\r\n checkmark: (\r\n \r\n \r\n \r\n ),\r\n userplus: (\r\n \r\n \r\n \r\n \r\n ),\r\n userminus: (\r\n \r\n \r\n \r\n \r\n ),\r\n cross: (\r\n \r\n \r\n \r\n ),\r\n profile: (\r\n \r\n \r\n \r\n ),\r\n share: (\r\n \r\n \r\n \r\n ),\r\n facebook: (\r\n \r\n \r\n \r\n ),\r\n envelope: (\r\n \r\n \r\n \r\n ),\r\n twitter: (\r\n \r\n \r\n \r\n ),\r\n load: (\r\n \r\n \r\n \r\n ),\r\n chevronRight: (\r\n \r\n \r\n \r\n ),\r\n chevronLeft: (\r\n \r\n \r\n \r\n ),\r\n info: (\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n expand: (\r\n \r\n \r\n \r\n ),\r\n compress: (\r\n \r\n \r\n \r\n ),\r\n filter: (\r\n \r\n \r\n \r\n ),\r\n godTurLogo: (\r\n \r\n \r\n \r\n ),\r\n equalizer: (\r\n \r\n \r\n \r\n ),\r\n bin: (\r\n \r\n \r\n \r\n \r\n ),\r\n cloud: (\r\n \r\n \r\n \r\n ),\r\n bookmark: (\r\n \r\n \r\n \r\n ),\r\n map: (\r\n \r\n \r\n \r\n ),\r\n pin: (\r\n \r\n \r\n \r\n ),\r\n triangle_up: (\r\n \r\n \r\n \r\n ),\r\n\r\n triangle_down: (\r\n \r\n \r\n \r\n ),\r\n line: (\r\n \r\n \r\n \r\n ),\r\n point: (\r\n \r\n \r\n \r\n ),\r\n fiskeTur: (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ),\r\n fotTur: (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ),\r\n padleTur: (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ),\r\n sykkelTur: (\r\n \r\n \r\n \r\n ),\r\n skiTur: (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ),\r\n annenTur: (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ),\r\n badeplass: (\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n gapahuk: (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ),\r\n tilrettelagt: (\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n utleiehytte: (\r\n \r\n \r\n \r\n ),\r\n apentHusvaere: (\r\n \r\n \r\n \r\n ),\r\n infotavle: (\r\n \r\n \r\n \r\n ),\r\n bru: (\r\n \r\n \r\n \r\n ),\r\n attraksjon: (\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n rasteplass: (\r\n \r\n \r\n \r\n ),\r\n batutsettplass: (\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n havn: (\r\n \r\n \r\n \r\n ),\r\n teltplass: (\r\n \r\n \r\n \r\n ),\r\n heartOutline: (\r\n \r\n \r\n \r\n ),\r\n heart: (\r\n \r\n \r\n \r\n ),\r\n close: (\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n eye: (\r\n \r\n \r\n \r\n ),\r\n eyeBlocked: (\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n fullscreen: (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ),\r\n fullscreenShrink: (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ),\r\n earth: (\r\n \r\n \r\n \r\n ),\r\n radioUnchecked: (\r\n \r\n \r\n \r\n ),\r\n radioChecked: (\r\n \r\n \r\n \r\n ),\r\n lockedCabin: (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ),\r\n addTour: (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ),\r\n};\r\n\r\nconst Icon = (props) => {\r\n const { name } = props;\r\n return {icons[name]};\r\n};\r\n\r\nIcon.propTypes = {\r\n name: PropTypes.string.isRequired,\r\n};\r\n\r\nexport default Icon;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport \"./BannerContent.scss\";\r\nimport { translate } from \"react-translate\";\r\nimport { Link } from \"react-router-dom\";\r\nimport Icon from \"../Icon\";\r\n\r\nclass BannerContent extends React.Component {\r\n render() {\r\n const { t } = this.props;\r\n return (\r\n
\r\n

{t(\"title\")}

\r\n

{t(\"description\")}

\r\n \r\n \r\n {t(\"map\")}\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nBannerContent.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default translate(\"BannerContent\")(BannerContent);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { translate } from \"react-translate\";\r\nimport { Link } from \"react-router-dom\";\r\nimport checkcircle from \"../../static/frontpage/checkcircle.svg\";\r\nimport \"./AboutPreview.scss\";\r\n\r\nclass AboutPreview extends React.Component {\r\n render() {\r\n const { t } = this.props;\r\n const listValues = [\r\n t(\"nature\"),\r\n t(\"biology\"),\r\n t(\"natureGiven\"),\r\n t(\"esthetics\"),\r\n t(\"health\"),\r\n ];\r\n return (\r\n \r\n
\r\n
\r\n

{t(\"title\")}

\r\n {listValues.map((content, i) => {\r\n return (\r\n \r\n \"\"\r\n

{content}

\r\n
\r\n );\r\n })}\r\n
\r\n \r\n {t(\"about\")}\r\n \r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nAboutPreview.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default translate(\"AboutPreview\")(AboutPreview);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { translate } from \"react-translate\";\r\nimport { Link } from \"react-router-dom\";\r\nimport KayakImg from \"../../static/frontpage/kayak_img.jpg\";\r\nimport \"./OutportInfo.scss\";\r\n\r\nclass OutportInfo extends React.Component {\r\n render() {\r\n const { t } = this.props;\r\n return (\r\n
\r\n \"\"\r\n
\r\n

{t(\"title\")}

\r\n

{t(\"description\")}

\r\n \r\n {t(\"map\")}\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nOutportInfo.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default translate(\"OutportInfo\")(OutportInfo);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { translate } from \"react-translate\";\r\nimport { Link } from \"react-router-dom\";\r\nimport Img from \"../../static/frontpage/padlehuk_skarvoy.png\";\r\nimport \"./BuoyInfo.scss\";\r\n\r\nclass BuoyInfo extends React.Component {\r\n render() {\r\n const { t } = this.props;\r\n return (\r\n
\r\n

{t(\"title\")}

\r\n \r\n \r\n \"\"\r\n \r\n \r\n

{t(\"description\")}

\r\n \r\n {t(\"map\")}\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nBuoyInfo.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n};\r\nexport default translate(\"BuoyInfo\")(BuoyInfo);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport { pageActions } from \"@avinet/react-adaptive-cms\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport { connect } from \"react-redux\";\r\nimport ContactComponent from \"../components/ContactComponent\";\r\nimport { getPath, fixLinks } from \"../utils/Path\";\r\nimport Title from \"../components/Title\";\r\nimport LoadingIndicator from \"../components/LoadingIndicator\";\r\nimport BannerContent from \"../components/FrontPage/BannerContent\";\r\nimport AboutPreview from \"../components/FrontPage/AboutPreview\";\r\nimport OutportInfo from \"../components/FrontPage/OutportInfo\";\r\nimport BuoyInfo from \"../components/FrontPage/BuoyInfo\";\r\nimport \"./PageView.scss\";\r\n\r\nconst mapStateToProps = (state) => ({\r\n page: state.page.page,\r\n pageLoading: state.page.pageLoading,\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch) =>\r\n bindActionCreators(Object.assign({}, pageActions), dispatch);\r\n\r\nclass PageView extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n currentPath: \"\",\r\n };\r\n }\r\n componentDidMount() {\r\n const { loadPage, location } = this.props;\r\n const path = getPath(location);\r\n this.setState({ currentPath: path });\r\n loadPage(path);\r\n }\r\n\r\n componentWillReceiveProps(nextProps) {\r\n const path = getPath(nextProps.location);\r\n if (path !== this.state.currentPath) {\r\n this.setState({ currentPath: path });\r\n nextProps.loadPage(path);\r\n }\r\n }\r\n\r\n componentDidUpdate() {\r\n const { history } = this.props;\r\n fixLinks(history);\r\n }\r\n\r\n render() {\r\n const {\r\n page: { content, title },\r\n pageLoading,\r\n } = this.props;\r\n const { currentPath } = this.state;\r\n\r\n return (\r\n
\r\n \r\n {pageLoading ? (\r\n <div className=\"loader\">\r\n <LoadingIndicator />\r\n </div>\r\n ) : (\r\n <div\r\n className=\"god-tur--cms\"\r\n dangerouslySetInnerHTML={{ __html: content }}\r\n />\r\n )}\r\n <div className=\"godtur--div-components\">\r\n {currentPath === \"index\" && (\r\n <React.Fragment>\r\n <BannerContent />\r\n <div className=\"index-page--flex-wrapper\">\r\n <AboutPreview />\r\n <BuoyInfo />\r\n </div>\r\n <OutportInfo />\r\n </React.Fragment>\r\n )}\r\n {currentPath === \"kontakt\" && <ContactComponent />}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nPageView.propTypes = {\r\n page: PropTypes.object,\r\n pageLoading: PropTypes.bool,\r\n loadPage: PropTypes.func,\r\n location: PropTypes.object,\r\n history: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(withRouter(PageView));\r\n","/** @format */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport fottur from \"../../static/defaultImages/fottur.jpg\";\r\nimport fisketur from \"../../static/defaultImages/fisketur.jpg\";\r\nimport padletur from \"../../static/defaultImages/padletur.jpg\";\r\nimport sykkeltur from \"../../static/defaultImages/sykkeltur.jpg\";\r\nimport baatutsetting from \"../../static/defaultImages/baatutsetting.jpg\";\r\nimport badeplass from \"../../static/defaultImages/badeplass.jpg\";\r\nimport gapahuk from \"../../static/defaultImages/gapahuk.jpg\";\r\nimport rasteplass from \"../../static/defaultImages/rasteplass.jpg\";\r\nimport flytebrygge from \"../../static/defaultImages/flytebrygge.png\";\r\nimport defaultImage from \"../../static/defaultImages/defaultImage.jpeg\";\r\nimport friluftsomraade from \"../../static/defaultImages/friluftsomraade.png\";\r\nimport dykking from \"../../static/defaultImages/dykking.png\";\r\nimport ankring from \"../../static/defaultImages/ankring.png\";\r\nimport baal from \"../../static/defaultImages/baal.png\";\r\nimport lek from \"../../static/defaultImages/lek.png\";\r\nimport parkering from \"../../static/defaultImages/parkering.png\";\r\nimport drikkevann from \"../../static/defaultImages/drikkevann.png\";\r\nimport fortoyningsbolter from \"../../static/defaultImages/fortoyningsbolter.png\";\r\nimport klatre from \"../../static/defaultImages/klatre.png\";\r\nimport boye from \"../../static/defaultImages/boye.png\";\r\nimport toalett from \"../../static/defaultImages/toalett.png\";\r\nimport teltplass from \"../../static/defaultImages/teltplass.png\";\r\nimport kai from \"../../static/defaultImages/kai.png\";\r\nimport tellturLogo from \"../../static/logo_telltur.png\";\r\nimport {\r\n buildStaticFlickrUrl,\r\n loadPrimaryPhotoUrlFromSet,\r\n} from \"../../utils/flickr\";\r\nimport \"./GodTurArticleListComponent.scss\";\r\n\r\nclass GodTurArticleListComponent extends React.Component {\r\n constructor(props) {\r\n super();\r\n this.state = {};\r\n }\r\n\r\n componentDidMount() {\r\n this.loadFlickrImage();\r\n }\r\n\r\n async loadFlickrImage() {\r\n const { article } = this.props;\r\n if (article.properties.flickr_url) {\r\n const flickrObject = await loadPrimaryPhotoUrlFromSet(\r\n article.properties.flickr_url\r\n );\r\n this.setState({ flickrObject });\r\n }\r\n }\r\n\r\n // eslint-disable-next-line getter-return\r\n get getFlickrImageUrl() {\r\n const { flickrObject } = this.state;\r\n if (flickrObject) {\r\n return buildStaticFlickrUrl(flickrObject);\r\n }\r\n }\r\n\r\n get defaultImage() {\r\n const {\r\n article: {\r\n // eslint-disable-next-line\r\n properties: { kategori_array, datakilde /**kategori**/ },\r\n },\r\n } = this.props;\r\n // eslint-disable-next-line\r\n\r\n if (datakilde === 2) {\r\n return friluftsomraade;\r\n }\r\n\r\n switch (kategori_array[0]) {\r\n case 0:\r\n return friluftsomraade;\r\n case 1:\r\n return flytebrygge;\r\n case 2:\r\n return kai;\r\n case 3:\r\n return badeplass;\r\n case 4:\r\n return fortoyningsbolter;\r\n case 5:\r\n return baatutsetting;\r\n case 6:\r\n return boye;\r\n case 7:\r\n return drikkevann;\r\n case 9:\r\n return toalett;\r\n case 10:\r\n return padletur;\r\n case 11:\r\n return fisketur;\r\n case 12:\r\n return dykking;\r\n case 13:\r\n return baal;\r\n case 14:\r\n return lek;\r\n case 15:\r\n return klatre;\r\n case 16:\r\n return sykkeltur;\r\n case 17:\r\n return fottur;\r\n case 21:\r\n return gapahuk;\r\n case 22:\r\n return parkering;\r\n case 23:\r\n return rasteplass;\r\n case 24:\r\n return ankring;\r\n case 26:\r\n return teltplass;\r\n default:\r\n return defaultImage;\r\n }\r\n }\r\n\r\n render() {\r\n const {\r\n onArticleOpen,\r\n thumbnailClassName,\r\n thumbnail,\r\n article,\r\n // eslint-disable-next-line\r\n article: { statskog_url: statskogUrl },\r\n loadImage,\r\n } = this.props;\r\n const flickrImage = this.getFlickrImageUrl;\r\n\r\n const thumbnailProp =\r\n (article.properties.id.startsWith(\"05\") ||\r\n article.properties.id.startsWith(\"06\")) &&\r\n article.properties.thumbnail\r\n ? `https://bof.avinet.no/WebServices/generic/Media.asmx/Download?uuid=${article.properties.thumbnail}&thumbnail_size=small`\r\n : thumbnail;\r\n\r\n return (\r\n <div\r\n className={\r\n thumbnailClassName +\r\n (thumbnail\r\n ? \" articleList--withThumbnail\"\r\n : \" articleList--withDefaultThumbnail\") +\r\n \" articleList--entry clearfix\"\r\n }\r\n onMouseOver={() => article.olFeature.set(\"hover\", true)}\r\n onMouseOut={() => article.olFeature.set(\"hover\", false)}\r\n onClick={() =>\r\n article.properties.id_telltur\r\n ? window.open(\r\n `https://telltur.no/turmaal/${article.properties.kat_telltur}/${article.properties.id_telltur}`,\r\n \"_blank\"\r\n )\r\n : onArticleOpen(article)\r\n }\r\n >\r\n <div className=\"thumbnailWrapper\">\r\n <div className=\"thumbnail-type-title\">\r\n {article.properties.type_friluftselement && (\r\n <p>\r\n <b>{article.properties.type_friluftselement}</b>\r\n </p>\r\n )}\r\n </div>\r\n {loadImage ? (\r\n <img\r\n data-original={flickrImage || statskogUrl || thumbnailProp}\r\n src={\r\n flickrImage || statskogUrl || thumbnailProp || this.defaultImage\r\n }\r\n className=\"loaded\"\r\n alt=\"\"\r\n />\r\n ) : (\r\n <img\r\n data-original={flickrImage || statskogUrl || thumbnailProp}\r\n alt=\"\"\r\n />\r\n )}\r\n {article.properties.id_telltur && (\r\n <span className=\"thumbnail--badge\">\r\n <img src={tellturLogo} alt=\"\" />\r\n </span>\r\n )}\r\n </div>\r\n\r\n <div className=\"thumbnail-description\">\r\n {/* <div className=\"btn-bg\">\r\n <button\r\n className=\"read-more-btn\"\r\n onClick={() =>\r\n article.properties.id_telltur\r\n ? window.open(\r\n `https://telltur.no/turmaal/${article.properties.kat_telltur}/${article.properties.id_telltur}`,\r\n \"_blank\"\r\n )\r\n : onArticleOpen(article)\r\n }\r\n >\r\n Les Mer\r\n </button>\r\n </div> */}\r\n {article.properties.title && <h4>{`${article.properties.title}`}</h4>}\r\n\r\n {article.properties && article.properties.content && (\r\n <p\r\n dangerouslySetInnerHTML={{\r\n __html: `${article.properties.content}`,\r\n }}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nGodTurArticleListComponent.propTypes = {\r\n onArticleOpen: PropTypes.func.isRequired,\r\n thumbnailClassName: PropTypes.string.isRequired,\r\n thumbnail: PropTypes.string,\r\n article: PropTypes.object.isRequired,\r\n loadImage: PropTypes.bool,\r\n};\r\n\r\nexport default GodTurArticleListComponent;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { translate } from \"react-translate\";\r\nimport \"./SourceSelector.scss\";\r\n\r\nclass SourceSelector extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n didJustSetSource: false,\r\n };\r\n this.toggleSource = this.toggleSource.bind(this);\r\n }\r\n\r\n toggleSource() {\r\n this.setState({ didJustSetSource: true });\r\n }\r\n\r\n render() {\r\n const {\r\n sources,\r\n toggleSource,\r\n type,\r\n t,\r\n id,\r\n stayOpen,\r\n disabled,\r\n } = this.props;\r\n\r\n return (\r\n <div className=\"source-selector-general-container\">\r\n <div\r\n className={\r\n disabled\r\n ? \"source-selector--container disabled\"\r\n : \"source-selector--container\"\r\n }\r\n >\r\n <div className=\"source-selector-background\">\r\n {sources.map((source, i) => (\r\n <button\r\n key={`menu_item_${i}`}\r\n className={\r\n type.includes(source.category) ? \"btn-active\" : \"btn-inactive\"\r\n }\r\n onClick={() => {\r\n toggleSource(source, id);\r\n stayOpen && this.toggleSource();\r\n }}\r\n >\r\n <span>{t(source.category)}</span>\r\n </button>\r\n ))}{\" \"}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nSourceSelector.propTypes = {\r\n sources: PropTypes.array.isRequired,\r\n type: PropTypes.array.isRequired,\r\n toggleSource: PropTypes.func.isRequired,\r\n t: PropTypes.func.isRequired,\r\n id: PropTypes.string,\r\n stayOpen: PropTypes.bool,\r\n disabled: PropTypes.bool,\r\n};\r\n\r\nSourceSelector.defaultProps = {\r\n disabled: false,\r\n};\r\n\r\nexport default translate(\"vkpKategori\")(SourceSelector);\r\n","/** @format */\r\n\r\n// ------------------------------------\r\n// Constants\r\n// ------------------------------------\r\nexport const UPDATE_FILTERS = \"UPDATE_FILTERS\";\r\nconst SET_SOURCES = \"SET_SOURCES\";\r\nconst RESET_FILTER = \"RESET_FILTER\";\r\n\r\nexport const TURMAL_LAYER = \"turmal\";\r\nexport const FRILUFTSELEMENTER_LAYER = \"friluftselementer\";\r\nexport const VESTKYSTPARKELEMENTER_LAYER = \"vestkystparkelementer\";\r\n/**export const UTHAVNERELEMENTER_LAYER = \"vestkystparkelementer\"; // vkpelementer\r\nexport const AKTIVITETERELEMENTER_LAYER = \"vestkystparkelementer\";\r\nexport const FASILITETERELEMENTER_LAYER = \"fasilitetelementer\";\r\nexport const OVERNATTINGELEMENTER_LAYER = \"overnattingelementer\";**/\r\nexport const VKP_TILGJENGELIG = \"vkp_tilgjengelig\";\r\n\r\n// ------------------------------------\r\n// Actions\r\n// ------------------------------------\r\nconst updateFilter = (key, value) => ({\r\n type: UPDATE_FILTERS,\r\n payload: {\r\n key,\r\n value,\r\n },\r\n});\r\n\r\nconst setSources = (sources) => ({\r\n type: SET_SOURCES,\r\n payload: { sources },\r\n});\r\n\r\nconst resetFilter = () => ({\r\n type: RESET_FILTER,\r\n payload: {},\r\n});\r\n\r\n// ------------------------------------\r\n// Action creators\r\n// ------------------------------------\r\nexport const updateFilterState = (key, value) => {\r\n return (dispatch) => {\r\n dispatch(updateFilter(key, value));\r\n };\r\n};\r\n\r\nexport const updateActiveSources = (sources) => {\r\n return (dispatch) => {\r\n dispatch(setSources(sources));\r\n };\r\n};\r\n\r\nexport const resetFilterState = () => {\r\n return (dispatch) => {\r\n dispatch(resetFilter());\r\n };\r\n};\r\n\r\n// ------------------------------------\r\n// Reducer\r\n// ------------------------------------\r\nconst initialState = {\r\n turmal__type: [],\r\n turmal__season: [],\r\n turmal__avstandFra: 0,\r\n turmal__avstandTil: 50,\r\n activeSources: \"\",\r\n friluftselementer__type: [],\r\n vestkystparkelementer__type: [],\r\n // hovedkategori__type: [], //\r\n uthavnelementer__type: [],\r\n aktivitetelementer__type: [],\r\n overnattingelementer__type: [],\r\n fasilitetelementer__type: [],\r\n vkp__sesong: \"\",\r\n vkp__tilgjengelig: false,\r\n overnatting__type: [],\r\n};\r\n\r\nexport function filterReducer(state = initialState, action) {\r\n switch (action.type) {\r\n case RESET_FILTER: {\r\n return initialState;\r\n }\r\n case SET_SOURCES: {\r\n const { sources } = action.payload;\r\n\r\n return { ...state, activeSources: sources };\r\n }\r\n case UPDATE_FILTERS: {\r\n const { key, value } = action.payload;\r\n if (value.length === 0) {\r\n return initialState;\r\n }\r\n\r\n if (key === \"vkp__sesong\") {\r\n return { ...state, [key]: value };\r\n } else if (key === \"vkp__tilgjengelig\") {\r\n return { ...state, vkp__tilgjengelig: !state.vkp__tilgjengelig };\r\n } else {\r\n var ttIdx = state[key].indexOf(value);\r\n const newFilter = Array.isArray(value)\r\n ? [...new Set([...state[key], ...value])]\r\n : [...new Set([...state[key], value])];\r\n\r\n if (key === \"vestkystparkelementer__type\" && Array.isArray(value)) {\r\n if (state[key].some((val) => value.includes(val))) {\r\n return {\r\n ...state,\r\n [key]: state.vestkystparkelementer__type.filter(\r\n (f) => !value.includes(f)\r\n ),\r\n };\r\n }\r\n return { ...state, [key]: newFilter };\r\n }\r\n\r\n /** if (key === 'hovedkategori__type' && ttIdx !== -1) {\r\n newFilter.splice(ttIdx, 1);\r\n return {\r\n ...state,\r\n [key]: newFilter,\r\n vestkystparkelementer__type: state.vestkystparkelementer__type.filter(\r\n f => !config[value].map(n => +n.category).includes(f)\r\n )\r\n };\r\n } **/\r\n if (ttIdx !== -1) {\r\n newFilter.splice(ttIdx, 1);\r\n }\r\n return { ...state, [key]: newFilter };\r\n }\r\n // Fix here\r\n }\r\n default:\r\n return state;\r\n }\r\n}\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Icon from \"./Icon.js\";\r\nimport \"./Switch.scss\";\r\n\r\nconst Switch = (props) => {\r\n const { onChange, checked, disabled } = props;\r\n // debugger;\r\n return (\r\n <label className={disabled ? \"switch no-pointer-events\" : \"switch\"}>\r\n <input\r\n className=\"checkbox-label\"\r\n type=\"checkbox\"\r\n onChange={() => onChange(!checked)}\r\n checked={checked}\r\n />\r\n <div className={checked ? \"checkmark-active\" : \"checkmark-inactive\"}>\r\n <Icon name=\"checkmark\" />\r\n </div>\r\n </label>\r\n );\r\n};\r\n\r\nSwitch.defaultProps = {\r\n disabled: false,\r\n};\r\n\r\nSwitch.propTypes = {\r\n onChange: PropTypes.func.isRequired,\r\n checked: PropTypes.bool.isRequired,\r\n disabled: PropTypes.bool,\r\n};\r\n\r\nexport default Switch;\r\n","import React from \"react\";\r\n\r\n/**\r\n * Higher order component (HOC) that allows any other component to monitor view\r\n * state.\r\n *\r\n * Provides props viewWidth, viewHeight.\r\n */\r\nexport function provideViewSize(WrappedComponent) {\r\n return class extends React.Component {\r\n constructor() {\r\n super();\r\n this.handleViewSizeChange = this.handleViewSizeChange.bind(this);\r\n this.state = {\r\n viewWidth: window.innerWidth,\r\n viewHeight: window.innerHeight,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n window.addEventListener(\"resize\", this.handleViewSizeChange);\r\n }\r\n\r\n componentWillUnmount() {\r\n window.removeEventListener(\"resize\", this.handleViewSizeChange);\r\n }\r\n\r\n handleViewSizeChange() {\r\n this.setState({\r\n viewWidth: window.innerWidth,\r\n viewHeight: window.innerHeight,\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n <WrappedComponent\r\n viewHeight={this.state.viewHeight}\r\n viewWidth={this.state.viewWidth}\r\n {...this.props}\r\n />\r\n );\r\n }\r\n };\r\n}\r\n","/** @format */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport SourceSelector from \"../components/SourceSelector\";\r\nimport Icon from \"../components/Icon\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport { translate } from \"react-translate\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport { connect } from \"react-redux\";\r\nimport { updateFilterState, resetFilterState } from \"../redux/filterReducer\";\r\nimport Switch from \"../components/Switch\";\r\nimport Handicap from \"../static/handicap_sign.svg\";\r\nimport { provideViewSize } from \"../hocs/provideViewSize\";\r\nimport config from \"../config/index\";\r\n\r\nimport \"react-input-range/lib/css/index.css\";\r\nimport \"./SlideMenu.scss\";\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n updateFilterState: bindActionCreators(updateFilterState, dispatch),\r\n resetFilterState: bindActionCreators(resetFilterState, dispatch),\r\n };\r\n};\r\n\r\nconst mapStateToProps = (reducers) => ({\r\n turmalType: reducers.filterReducer.turmal__type,\r\n avstandFra: reducers.filterReducer.turmal__avstandFra,\r\n avstandTil: reducers.filterReducer.turmal__avstandTil,\r\n activeLayers: reducers.filterReducer.activeLayers,\r\n friluftselementerType: reducers.filterReducer.friluftselementer__type,\r\n vestkystparkelementerType: reducers.filterReducer.vestkystparkelementer__type,\r\n vkpSesong: reducers.filterReducer.vkp__sesong,\r\n vkpTilgjengelig: reducers.filterReducer.vkp__tilgjengelig,\r\n});\r\n\r\nclass SlideMenu extends React.PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n value: { min: 0, max: 50 },\r\n slideMenuOpen: false,\r\n showButtons: false,\r\n // TODO: Change names\r\n showDetailsTurforslag: false,\r\n showDetailsFriluftselementer: false,\r\n showDetailsVkpelementer: false,\r\n showDetailsuthavnerelementer: false,\r\n showDetailaktiviteterelementer: false,\r\n showDetailsovernattingelementer: false,\r\n showDetailsfasiliteterelementer: false,\r\n showTilgjengeligelementer: false,\r\n };\r\n this.toggleTypeSource = this.toggleTypeSource.bind(this);\r\n this.extractLayerNameFromId = this.extractLayerNameFromId.bind(this);\r\n this.checkIfTypeIsActive = this.checkIfTypeIsActive.bind(this);\r\n this.handleTilgjengeligClick = this.handleTilgjengeligClick.bind(this);\r\n this.toggleAllSources = this.toggleAllSources.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n const { slideMenuOpen } = this.state;\r\n const { viewWidth } = this.props;\r\n\r\n if (viewWidth > 768) {\r\n this.setState({ slideMenuOpen: !slideMenuOpen });\r\n }\r\n this.updateQuery();\r\n this.updateFilterFromUrl();\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps !== this.props) {\r\n this.updateQuery();\r\n }\r\n }\r\n\r\n updateFilterFromUrl() {\r\n let {\r\n location: { search },\r\n updateFilterState,\r\n resetFilterState,\r\n } = this.props;\r\n search = search.slice(1);\r\n var queries = search.split(\"&\");\r\n if (search.length) {\r\n resetFilterState();\r\n }\r\n queries.forEach((q) => {\r\n var tmp = q.split(\"=\");\r\n if (tmp[0] && tmp[1]) {\r\n if (tmp[0].toLowerCase() === \"turmal__type\") {\r\n updateFilterState(tmp[0], tmp[1].split(\",\"));\r\n } else if (tmp[0].toLowerCase() === \"turmal__avstandtil\") {\r\n updateFilterState(tmp[0], tmp[1].split(\",\"));\r\n } else if (tmp[0].toLowerCase() === \"turmal__avstandfra\") {\r\n updateFilterState(tmp[0], tmp[1].split(\",\"));\r\n } else if (tmp[0].toLowerCase() === \"friluftselementer__type\") {\r\n updateFilterState(tmp[0], tmp[1].split(\",\"));\r\n } else if (tmp[0].toLowerCase() === \"vestkystparkelementer__type\") {\r\n updateFilterState(\r\n tmp[0],\r\n tmp[1].split(\",\").map((k) => +k)\r\n );\r\n }\r\n }\r\n });\r\n }\r\n\r\n checkIfTypeIsActive(id, vestkystparkelementerType) {\r\n switch (id) {\r\n case \"uthavner\":\r\n // 1,2,4,5,6,24\r\n if (\r\n vestkystparkelementerType.indexOf(1) > -1 ||\r\n vestkystparkelementerType.indexOf(2) > -1 ||\r\n vestkystparkelementerType.indexOf(4) > -1 ||\r\n vestkystparkelementerType.indexOf(5) > -1 ||\r\n vestkystparkelementerType.indexOf(6) > -1 ||\r\n vestkystparkelementerType.indexOf(24) > -1\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n case \"aktiviteter\":\r\n // 3,10,11,12,16,15,14,13,17\r\n if (\r\n vestkystparkelementerType.indexOf(3) > -1 ||\r\n vestkystparkelementerType.indexOf(10) > -1 ||\r\n vestkystparkelementerType.indexOf(11) > -1 ||\r\n vestkystparkelementerType.indexOf(12) > -1 ||\r\n vestkystparkelementerType.indexOf(15) > -1 ||\r\n vestkystparkelementerType.indexOf(14) > -1 ||\r\n vestkystparkelementerType.indexOf(16) > -1 ||\r\n vestkystparkelementerType.indexOf(13) > -1 ||\r\n vestkystparkelementerType.indexOf(17) > -1\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n case \"overnatting\":\r\n // 111,444,555\r\n if (\r\n vestkystparkelementerType.indexOf(26) > -1 ||\r\n vestkystparkelementerType.indexOf(111) > -1 ||\r\n vestkystparkelementerType.indexOf(444) > -1 ||\r\n vestkystparkelementerType.indexOf(555) > -1\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n case \"fasiliteter\":\r\n // 7,8,9,23,22,21\r\n if (\r\n vestkystparkelementerType.indexOf(7) > -1 ||\r\n vestkystparkelementerType.indexOf(8) > -1 ||\r\n vestkystparkelementerType.indexOf(9) > -1 ||\r\n vestkystparkelementerType.indexOf(23) > -1 ||\r\n vestkystparkelementerType.indexOf(22) > -1 ||\r\n vestkystparkelementerType.indexOf(21) > -1\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n updateQuery() {\r\n const {\r\n vestkystparkelementerType,\r\n vkpSesong,\r\n vkpTilgjengelig,\r\n history,\r\n baseUrl,\r\n activeSources,\r\n } = this.props;\r\n let queries = [];\r\n\r\n if (vestkystparkelementerType.length !== 0) {\r\n queries.push(\"vestkystparkelementer__type=\" + vestkystparkelementerType);\r\n }\r\n if (vkpSesong.length !== 0) {\r\n queries.push(\"vkp__sesong=\" + vkpSesong);\r\n }\r\n if (vkpTilgjengelig.length !== 0 && vkpTilgjengelig) {\r\n queries.push(\"vkp__tilgjengelig=\" + vkpTilgjengelig);\r\n }\r\n if (queries.length !== 0) {\r\n history.push(baseUrl + activeSources + \"?\" + queries.join(\"&\"));\r\n } else {\r\n history.push(baseUrl + activeSources);\r\n }\r\n }\r\n\r\n extractLayerNameFromId(id) {\r\n return id.split(\"__\")[0];\r\n }\r\n\r\n toggleTypeSource(source, id) {\r\n const { updateFilterState } = this.props;\r\n const layer = this.extractLayerNameFromId(id);\r\n updateFilterState(layer + \"__type\", source.category);\r\n }\r\n\r\n toggleAllSources = (elementerType) => {\r\n const { updateFilterState } = this.props;\r\n updateFilterState(\"vestkystparkelementer__type\", elementerType);\r\n };\r\n\r\n handleTilgjengeligClick = (boolean) => {\r\n if (boolean) {\r\n const { updateFilterState } = this.props;\r\n updateFilterState(\"vkp__tilgjengelig\", boolean);\r\n }\r\n };\r\n\r\n handleChange = (value) => {\r\n const { updateFilterState } = this.props;\r\n updateFilterState(\"turmal__avstandFra\", value.min);\r\n updateFilterState(\"turmal__avstandTil\", value.max);\r\n };\r\n\r\n slideMenuHandler = () => {\r\n const { slideMenuOpen } = this.state;\r\n this.setState({ slideMenuOpen: !slideMenuOpen });\r\n };\r\n\r\n render() {\r\n const { t, vestkystparkelementerType, vkpTilgjengelig } = this.props;\r\n const {\r\n slideMenuOpen,\r\n showDetailsuthavnerelementer,\r\n showDetailsaktiviteterelementer,\r\n showDetailsovernattingelementer,\r\n showDetailsfasiliteterelementer,\r\n } = this.state;\r\n\r\n const uthavnerelementerIsActive = this.checkIfTypeIsActive(\r\n \"uthavner\",\r\n vestkystparkelementerType\r\n );\r\n const aktiviteterelementerIsActive = this.checkIfTypeIsActive(\r\n \"aktiviteter\",\r\n vestkystparkelementerType\r\n );\r\n const overnattingelementerIsActive = this.checkIfTypeIsActive(\r\n \"overnatting\",\r\n vestkystparkelementerType\r\n );\r\n const fasiliteterelementerIsActive = this.checkIfTypeIsActive(\r\n \"fasiliteter\",\r\n vestkystparkelementerType\r\n );\r\n\r\n const tilgjengeligIsActive = !!vkpTilgjengelig;\r\n\r\n const uthavnerElementerType = [1, 2, 4, 6, 5, 24];\r\n const aktiviteterElementerType = [3, 10, 11, 12, 16, 15, 14, 13, 17];\r\n const overnattingElementerType = [26, 111, 444, 555];\r\n const fasiliteterElementerType = [7, 8, 9, 23, 22, 21];\r\n\r\n return (\r\n <div className=\"slideMenu-general-div\">\r\n <div className=\"slideMenu--container open\">\r\n <div className=\"slideMenu--content\">\r\n <div\r\n className={\r\n \"slideMenu--content-fieldset\" +\r\n (!uthavnerelementerIsActive ? \" disabled\" : \"\")\r\n }\r\n >\r\n <Switch\r\n onChange={() => this.toggleAllSources(uthavnerElementerType)}\r\n checked={uthavnerelementerIsActive}\r\n />\r\n <span className=\"showSuggestion-title\">\r\n {\" \"}\r\n {t(\"ShowuthavnerElements\")}{\" \"}\r\n </span>\r\n <span className=\"showDetail-icon\">\r\n <span\r\n className=\"showDetails-text\"\r\n onClick={() =>\r\n this.setState({\r\n showDetailsuthavnerelementer: !showDetailsuthavnerelementer,\r\n })\r\n }\r\n >\r\n {t(\"ShowButtons\")}\r\n </span>\r\n <button\r\n className=\"detailbutton\"\r\n onClick={() =>\r\n this.setState({\r\n showDetailsuthavnerelementer: !showDetailsuthavnerelementer,\r\n })\r\n }\r\n title={slideMenuOpen ? t(\"hideFilter\") : t(\"showFilter\")}\r\n >\r\n {showDetailsuthavnerelementer ? (\r\n <Icon name=\"triangle_up\" />\r\n ) : (\r\n <Icon name=\"triangle_down\" />\r\n )}\r\n </button>\r\n </span>\r\n </div>\r\n {showDetailsuthavnerelementer ? (\r\n <SourceSelector\r\n sources={config.uthavner}\r\n type={vestkystparkelementerType}\r\n toggleSource={this.toggleTypeSource}\r\n id=\"vestkystparkelementer__type\"\r\n displayName={t(\"chooseOutdoorElementType\")}\r\n stayOpen\r\n // disabled={!uthavnerelementerIsActive}\r\n />\r\n ) : (\r\n \"\"\r\n )}\r\n\r\n <div\r\n className={\r\n \"slideMenu--content-fieldset\" +\r\n (!aktiviteterelementerIsActive ? \" disabled\" : \"\")\r\n }\r\n >\r\n <Switch\r\n onChange={() => this.toggleAllSources(aktiviteterElementerType)}\r\n checked={aktiviteterelementerIsActive}\r\n />\r\n <span className=\"showSuggestion-title\">\r\n {\" \"}\r\n {t(\"ShowaktiviteterElements\")}{\" \"}\r\n </span>\r\n <span className=\"showDetail-icon\">\r\n <span\r\n className=\"showDetails-text\"\r\n onClick={() =>\r\n this.setState({\r\n showDetailsaktiviteterelementer: !showDetailsaktiviteterelementer,\r\n })\r\n }\r\n >\r\n {t(\"ShowButtons\")}\r\n </span>\r\n <button\r\n className=\"detailbutton\"\r\n onClick={() =>\r\n this.setState({\r\n showDetailsaktiviteterelementer: !showDetailsaktiviteterelementer,\r\n })\r\n }\r\n title={slideMenuOpen ? t(\"hideFilter\") : t(\"showFilter\")}\r\n >\r\n {showDetailsaktiviteterelementer ? (\r\n <Icon name=\"triangle_up\" />\r\n ) : (\r\n <Icon name=\"triangle_down\" />\r\n )}\r\n </button>\r\n </span>\r\n </div>\r\n {showDetailsaktiviteterelementer ? (\r\n <SourceSelector\r\n sources={config.aktiviteter}\r\n type={vestkystparkelementerType}\r\n toggleSource={this.toggleTypeSource}\r\n id=\"vestkystparkelementer__type\"\r\n displayName={t(\"chooseOutdoorElementType\")}\r\n stayOpen\r\n // disabled={!aktiviteterelementerIsActive}\r\n />\r\n ) : (\r\n \"\"\r\n )}\r\n\r\n <div\r\n className={\r\n \"slideMenu--content-fieldset\" +\r\n (!overnattingelementerIsActive ? \" disabled\" : \"\")\r\n }\r\n >\r\n <Switch\r\n onChange={() => this.toggleAllSources(overnattingElementerType)}\r\n checked={overnattingelementerIsActive}\r\n />\r\n <span className=\"showSuggestion-title\">\r\n {\" \"}\r\n {t(\"ShowovernattingElements\")}{\" \"}\r\n </span>\r\n <span className=\"showDetail-icon\">\r\n <span\r\n className=\"showDetails-text\"\r\n onClick={() =>\r\n this.setState({\r\n showDetailsovernattingelementer: !showDetailsovernattingelementer,\r\n })\r\n }\r\n >\r\n {t(\"ShowButtons\")}\r\n </span>\r\n <button\r\n className=\"detailbutton\"\r\n onClick={() =>\r\n this.setState({\r\n showDetailsovernattingelementer: !showDetailsovernattingelementer,\r\n })\r\n }\r\n title={slideMenuOpen ? t(\"hideFilter\") : t(\"showFilter\")}\r\n >\r\n {showDetailsovernattingelementer ? (\r\n <Icon name=\"triangle_up\" />\r\n ) : (\r\n <Icon name=\"triangle_down\" />\r\n )}\r\n </button>\r\n </span>\r\n </div>\r\n {showDetailsovernattingelementer ? (\r\n <SourceSelector\r\n sources={config.overnatting}\r\n type={vestkystparkelementerType}\r\n toggleSource={this.toggleTypeSource}\r\n id=\"vestkystparkelementer__type\"\r\n displayName={t(\"chooseOutdoorElementType\")}\r\n stayOpen\r\n // disabled={!overnattingelementerIsActive}\r\n />\r\n ) : (\r\n \"\"\r\n )}\r\n\r\n <div\r\n className={\r\n \"slideMenu--content-fieldset\" +\r\n (!fasiliteterelementerIsActive ? \" disabled\" : \"\")\r\n }\r\n >\r\n <Switch\r\n onChange={() => this.toggleAllSources(fasiliteterElementerType)}\r\n checked={fasiliteterelementerIsActive}\r\n />\r\n <span className=\"showSuggestion-title\">\r\n {\" \"}\r\n {t(\"ShowfasiliteterElements\")}{\" \"}\r\n </span>\r\n <span className=\"showDetail-icon\">\r\n <span\r\n className=\"showDetails-text\"\r\n onClick={() =>\r\n this.setState({\r\n showDetailsfasiliteterelementer: !showDetailsfasiliteterelementer,\r\n })\r\n }\r\n >\r\n {t(\"ShowButtons\")}\r\n </span>\r\n <button\r\n className=\"detailbutton\"\r\n onClick={() =>\r\n this.setState({\r\n showDetailsfasiliteterelementer: !showDetailsfasiliteterelementer,\r\n })\r\n }\r\n title={slideMenuOpen ? t(\"hideFilter\") : t(\"showFilter\")}\r\n >\r\n {showDetailsfasiliteterelementer ? (\r\n <Icon name=\"triangle_up\" />\r\n ) : (\r\n <Icon name=\"triangle_down\" />\r\n )}\r\n </button>\r\n </span>\r\n </div>\r\n {showDetailsfasiliteterelementer ? (\r\n <SourceSelector\r\n sources={config.fasiliteter}\r\n type={vestkystparkelementerType}\r\n toggleSource={this.toggleTypeSource}\r\n id=\"vestkystparkelementer__type\"\r\n displayName={t(\"chooseOutdoorElementType\")}\r\n stayOpen\r\n // disabled={!fasiliteterelementerIsActive}\r\n />\r\n ) : (\r\n \"\"\r\n )}\r\n\r\n <Switch\r\n onChange={() => this.handleTilgjengeligClick(true)}\r\n checked={tilgjengeligIsActive}\r\n />\r\n <span className=\"showSuggestion-title\"> {t(\"availability\")} </span>\r\n <span>\r\n <img\r\n src={Handicap}\r\n className=\"handicap-symbol-img\"\r\n alt=\"handicap symbol\"\r\n />\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nSlideMenu.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n location: PropTypes.object.isRequired,\r\n vkpSesong: PropTypes.string.isRequired,\r\n vkpTilgjengelig: PropTypes.bool.isRequired,\r\n vestkystparkelementerType: PropTypes.array.isRequired,\r\n updateFilterState: PropTypes.func.isRequired,\r\n resetFilterState: PropTypes.func.isRequired,\r\n viewWidth: PropTypes.number.isRequired,\r\n history: PropTypes.object,\r\n baseUrl: PropTypes.string,\r\n activeSources: PropTypes.string.isRequired,\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(withRouter(translate(\"SlideMenu\")(provideViewSize(SlideMenu))));\r\n","import { bindActionCreators as originalBindActionCreator } from \"redux\";\r\n\r\nconst wrapAction = (action, reducerKey) => {\r\n return {\r\n ...action,\r\n type: reducerKey + \"@@\" + action.type,\r\n };\r\n};\r\n\r\nconst wrapDispatch = (dispatch, reducerKey) => {\r\n const wrappedDispatch = (action) => {\r\n let wrappedAction;\r\n if (typeof action === \"function\") {\r\n wrappedAction = (globalDispatch, getState, extraArgument) => {\r\n return action(\r\n wrappedDispatch,\r\n getState,\r\n () => getState()[reducerKey],\r\n globalDispatch,\r\n reducerKey,\r\n extraArgument\r\n );\r\n };\r\n } else if (typeof action === \"object\") {\r\n wrappedAction = wrapAction(action, reducerKey);\r\n }\r\n return dispatch(wrappedAction);\r\n };\r\n return wrappedDispatch;\r\n};\r\n\r\nexport const bindActionCreators = (actionCreators, dispatch, reducerKey) => {\r\n const wrappedDispatch = wrapDispatch(dispatch, reducerKey);\r\n return originalBindActionCreator(actionCreators, wrappedDispatch);\r\n};\r\n","import request from \"superagent\";\r\nimport {\r\n getSessionToken,\r\n authReducerActions,\r\n} from \"@avinet/react-adaptive-auth\";\r\nimport { createAction, handleActions } from \"redux-actions\";\r\nimport config from \"../config/index\";\r\n\r\n// ------------------------------------\r\n// Constants\r\n// ------------------------------------\r\nexport const SAVING_DIGI_THEME_RECORD = \"SAVING_DIGI_THEME_RECORD\";\r\nexport const LOADING_DIGI_THEME_RECORDS = \"LOADING_ DIGI_THEME_RECORDS\";\r\nexport const SAVE_SUCCESS_DIGI_THEME_RECORD = \"SAVE_SUCCESS_DIGI_THEME_RECORD\";\r\nexport const SAVE_FAILED_DIGI_THEME_RECORD = \"SAVE_FAILED_DIGI_THEME_RECORD\";\r\nexport const READ_FAILED_DIGI_THEME_RECORDS = \"READ_FAILED_DIGI_THEME_RECORDS\";\r\nexport const READ_SUCCESS_DIGI_THEME_RECORDS =\r\n \"READ_SUCCESS_DIGI_THEME_RECORDS\";\r\nexport const READ_OBJECT_SUCCESS_DIGI_THEME = \"READ_OBJECT_SUCCESS_DIGI_THEME\";\r\nexport const DELETING_DIGI_THEME_RECORD = \"DELETING_DIGI_THEME_RECORD\";\r\nexport const DELETE_DIGI_THEME_RECORD_SUCCESS =\r\n \"DELETE_DIGI_THEME_RECORD_SUCCESS\";\r\nexport const DELETE_DIGI_THEME_RECORD_FAILED =\r\n \"DELETE_DIGI_THEME_RECORD_FAILED\";\r\nexport const RESET_DIGI_THEME_REDUCER = \"RESET_DIGI_THEME_REDUCER\";\r\n\r\n// ------------------------------------\r\n// Actions\r\n// ------------------------------------\r\nconst saving = createAction(SAVING_DIGI_THEME_RECORD);\r\n\r\nconst saveFailed = createAction(SAVE_FAILED_DIGI_THEME_RECORD, (error) => ({\r\n error,\r\n}));\r\n\r\nconst saveSuccess = createAction(SAVE_SUCCESS_DIGI_THEME_RECORD, (data) => ({\r\n data,\r\n}));\r\n\r\nconst loading = createAction(LOADING_DIGI_THEME_RECORDS);\r\n\r\nconst readSuccess = createAction(\r\n READ_SUCCESS_DIGI_THEME_RECORDS,\r\n (records, total) => ({\r\n records,\r\n total,\r\n })\r\n);\r\n\r\nconst readObjectSuccess = createAction(\r\n READ_OBJECT_SUCCESS_DIGI_THEME,\r\n (record) => ({\r\n record,\r\n })\r\n);\r\n\r\nconst readFailed = createAction(READ_FAILED_DIGI_THEME_RECORDS, (error) => ({\r\n error,\r\n}));\r\n\r\nconst deleting = createAction(DELETING_DIGI_THEME_RECORD);\r\n\r\nconst deleteSuccess = createAction(\r\n DELETE_DIGI_THEME_RECORD_SUCCESS,\r\n (data) => ({\r\n data,\r\n })\r\n);\r\n\r\nconst deleteFailed = createAction(DELETE_DIGI_THEME_RECORD_FAILED, (data) => ({\r\n data,\r\n}));\r\n\r\nexport const resetDigiTheme = () => ({ type: RESET_DIGI_THEME_REDUCER });\r\n// ------------------------------------\r\n// Action creators\r\n// ------------------------------------\r\nexport const save = (data, srid) => {\r\n return (dispatch, getState, getReducerState) => {\r\n dispatch(saving());\r\n\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/client/DataView.asmx/Save\")\r\n .send({\r\n data,\r\n theme_uuid: getReducerState().themeUuid,\r\n })\r\n .set(\"X-Adaptive-Srid\", srid)\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .then((res) => res.body)\r\n .then((res) => {\r\n res = res.d;\r\n\r\n if (res.sessionExpired) {\r\n dispatch(authReducerActions.sessionExpired());\r\n }\r\n\r\n if (!res.success) {\r\n dispatch(\r\n saveFailed({ code: \"SAVE_FAILED\", message: res.exception.message })\r\n );\r\n return;\r\n }\r\n\r\n dispatch(saveSuccess(res.data[0].value));\r\n })\r\n .catch((e) => {\r\n dispatch(saveFailed(e || { message: \"saveFailed\" }));\r\n });\r\n };\r\n};\r\n\r\nexport const deleteRecord = (id) => {\r\n return (dispatch, getState, getReducerState) => {\r\n dispatch(deleting());\r\n\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/client/DataView.asmx/Delete\")\r\n .send({\r\n id,\r\n theme_uuid: getReducerState().themeUuid,\r\n })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .then((res) => res.body)\r\n .then((res) => {\r\n res = res.d;\r\n\r\n if (res.sessionExpired) {\r\n dispatch(authReducerActions.sessionExpired());\r\n }\r\n\r\n if (!res.success) {\r\n dispatch(\r\n deleteFailed({\r\n code: \"DELETE_FAILED\",\r\n message: res.exception.message,\r\n })\r\n );\r\n return;\r\n }\r\n\r\n dispatch(deleteSuccess());\r\n })\r\n\r\n .catch((e) => {\r\n dispatch(deleteFailed(e || { message: \"deleteFailed\" }));\r\n });\r\n };\r\n};\r\n\r\nexport const readChildren = (\r\n columns,\r\n filter,\r\n fkColumn,\r\n fkColumnId,\r\n srid,\r\n start,\r\n limit,\r\n extraParams\r\n) => {\r\n return (dispatch, getState, getReducerState) => {\r\n dispatch(loading());\r\n\r\n readAny(\r\n {\r\n theme_uuid: getReducerState().themeUuid,\r\n filter,\r\n fk_column: fkColumn,\r\n fk_column_id: fkColumnId,\r\n columns,\r\n srid,\r\n start,\r\n limit,\r\n extraParams,\r\n },\r\n srid,\r\n false,\r\n dispatch\r\n );\r\n };\r\n};\r\n\r\n// Hent ut themenavn og putt etter readany\r\n\r\nconst readAny = (data, srid, readObject = false, dispatch) => {\r\n request\r\n .post(\r\n config.adaptiveUrl +\r\n \"WebServices/client/DataView.asmx/ReadAny?\" +\r\n data.theme_uuid\r\n )\r\n .send({\r\n request: data,\r\n })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .set(\"X-Adaptive-SRID\", srid)\r\n .then((res) => res.body)\r\n .then((res) => {\r\n res = res.d;\r\n\r\n if (res.sessionExpired) {\r\n dispatch(authReducerActions.sessionExpired());\r\n }\r\n\r\n if (!res.success) {\r\n dispatch(readFailed(res.exception.message));\r\n return;\r\n }\r\n if (readObject) {\r\n if (res.records.length !== 1) {\r\n dispatch(\r\n readFailed({\r\n code: \"NO_RECORD_FOUND\",\r\n message: \"Kunne ikke finne record\",\r\n })\r\n );\r\n } else {\r\n dispatch(readObjectSuccess(res.records[0], res.total));\r\n }\r\n return;\r\n }\r\n dispatch(readSuccess(res.records, res.total));\r\n })\r\n .catch((e) => {\r\n dispatch(readFailed(e || { message: \"Kunne ikke lese data\" }));\r\n });\r\n};\r\n\r\nexport const readObject = (id, columns, srid, only_owned = false) => {\r\n return (dispatch, getState, getReducerState) => {\r\n dispatch(loading());\r\n\r\n readAny(\r\n {\r\n theme_uuid: getReducerState().themeUuid,\r\n object_id: id,\r\n columns,\r\n only_owned,\r\n },\r\n srid,\r\n true,\r\n dispatch\r\n );\r\n };\r\n};\r\n\r\nexport const readOwned = (columns, filter, srid, start, limit, extraParams) => {\r\n return (dispatch, getState, getReducerState) => {\r\n dispatch(loading());\r\n\r\n readAny(\r\n {\r\n theme_uuid: getReducerState().themeUuid,\r\n filter,\r\n columns,\r\n srid,\r\n start,\r\n limit,\r\n extraParams,\r\n only_owned: true,\r\n },\r\n srid,\r\n false,\r\n dispatch\r\n );\r\n };\r\n};\r\n\r\nexport const readFiltered = (\r\n columns,\r\n filter,\r\n srid,\r\n start,\r\n limit,\r\n extraParams\r\n) => {\r\n return (dispatch, getState, getReducerState) => {\r\n dispatch(loading());\r\n\r\n readAny(\r\n {\r\n theme_uuid: getReducerState().themeUuid,\r\n filter,\r\n columns,\r\n srid,\r\n start,\r\n limit,\r\n extraParams,\r\n },\r\n srid,\r\n false,\r\n dispatch\r\n );\r\n };\r\n};\r\n\r\nexport const actions = {\r\n save,\r\n readFiltered,\r\n readAny,\r\n};\r\n\r\n// ------------------------------------\r\n// Reducer\r\n// ------------------------------------\r\nconst initialState = {\r\n loading: false,\r\n saving: false,\r\n deleting: false,\r\n error: undefined,\r\n records: [],\r\n record: undefined,\r\n};\r\n\r\nexport default (key, themeUuid) =>\r\n handleActions(\r\n {\r\n [key + \"@@\" + SAVING_DIGI_THEME_RECORD]: (state, { payload }) => {\r\n return Object.assign({}, state, {\r\n saving: true,\r\n error: undefined,\r\n });\r\n },\r\n [key + \"@@\" + LOADING_DIGI_THEME_RECORDS]: (state, { payload }) => {\r\n return Object.assign({}, state, {\r\n loading: true,\r\n error: undefined,\r\n });\r\n },\r\n [key + \"@@\" + SAVE_SUCCESS_DIGI_THEME_RECORD]: (state, { payload }) =>\r\n Object.assign({}, state, {\r\n saving: false,\r\n record: payload.data,\r\n }),\r\n [key + \"@@\" + SAVE_FAILED_DIGI_THEME_RECORD]: (state, { payload }) =>\r\n Object.assign({}, state, {\r\n saving: false,\r\n error: payload.error,\r\n }),\r\n [key + \"@@\" + READ_FAILED_DIGI_THEME_RECORDS]: (state, { payload }) =>\r\n Object.assign({}, state, {\r\n loading: false,\r\n error: payload.error,\r\n }),\r\n [key + \"@@\" + READ_SUCCESS_DIGI_THEME_RECORDS]: (state, { payload }) => {\r\n const { records, total } = payload;\r\n return Object.assign({}, state, {\r\n loading: false,\r\n records,\r\n total,\r\n });\r\n },\r\n [key + \"@@\" + READ_OBJECT_SUCCESS_DIGI_THEME]: (state, { payload }) => {\r\n const { record } = payload;\r\n return Object.assign({}, state, {\r\n record: record,\r\n loading: false,\r\n });\r\n },\r\n [key + \"@@\" + DELETING_DIGI_THEME_RECORD]: (state, { payload }) => {\r\n return Object.assign({}, state, {\r\n deleting: true,\r\n error: undefined,\r\n });\r\n },\r\n [key + \"@@\" + DELETE_DIGI_THEME_RECORD_SUCCESS]: (state, { payload }) => {\r\n return Object.assign({}, state, {\r\n deleting: false,\r\n error: undefined,\r\n });\r\n },\r\n [key + \"@@\" + DELETE_DIGI_THEME_RECORD_FAILED]: (state, { payload }) => {\r\n return Object.assign({}, state, {\r\n deleting: false,\r\n error: payload.error,\r\n });\r\n },\r\n [key + \"@@\" + RESET_DIGI_THEME_REDUCER]: (state, { payload }) => {\r\n return Object.assign({}, state, initialState);\r\n },\r\n },\r\n { ...initialState, themeUuid }\r\n );\r\n","import flytebrygge from \"../static/typeIcons/flytebrygge.svg\";\r\nimport kai from \"../static/typeIcons/kai.svg\";\r\nimport fortoyningsbolter from \"../static/typeIcons/fortoyningsbolter.svg\";\r\nimport batutsettingsrampe from \"../static/typeIcons/batutsettingsrampe.svg\";\r\nimport fortoyningsboye from \"../static/typeIcons/fortoyningsboye.svg\";\r\nimport ankring from \"../static/typeIcons/ankring.svg\";\r\nimport badeplass from \"../static/typeIcons/badeplass.svg\";\r\nimport padling from \"../static/typeIcons/padling.svg\";\r\nimport fiske from \"../static/typeIcons/fiske.svg\";\r\nimport baalOgGrill from \"../static/typeIcons/baalOgGrill.svg\";\r\nimport lek from \"../static/typeIcons/lek.svg\";\r\nimport lekeplass from \"../static/typeIcons/lekeplass.svg\";\r\nimport klatring from \"../static/typeIcons/klatrefelt.svg\";\r\nimport fottur from \"../static/typeIcons/fottur.svg\";\r\nimport ferskvann from \"../static/typeIcons/ferskvann.svg\";\r\nimport basseng from \"../static/typeIcons/basseng.svg\";\r\nimport toalett from \"../static/typeIcons/toalett.svg\";\r\nimport gapahuk from \"../static/typeIcons/gapahuk.svg\";\r\nimport parkeringsplass from \"../static/typeIcons/parkeringsplass.svg\";\r\nimport friluftsomrade from \"../static/typeIcons/friluftsomrade.svg\";\r\nimport rasteplass from \"../static/typeIcons/rasteplass.svg\";\r\nimport utedo from \"../static/typeIcons/utedo.svg\";\r\nimport stupebrett from \"../static/typeIcons/stupebrett.svg\";\r\nimport utsettingKanoKajakk from \"../static/typeIcons/utsettingKanoKajakk.svg\";\r\nimport grill from \"../static/typeIcons/grill.svg\";\r\nimport aktivitetsanlegg from \"../static/typeIcons/aktivitetsanlegg.svg\";\r\nimport ballokke from \"../static/typeIcons/ballokke.svg\";\r\nimport hyttemer from \"../static/typeIcons/hyttemer.svg\";\r\nimport hytte from \"../static/typeIcons/hytte.svg\";\r\nimport teltplass from \"../static/typeIcons/teltplass.svg\";\r\nimport sykkeltur from \"../static/typeIcons/sykling.svg\";\r\nimport badeflaate from \"../static/typeIcons/badeflaate.png\";\r\nimport { Style, Circle, Icon, Fill, Stroke } from \"ol/style\";\r\n\r\nconst featureStyle = (f, resolution) => {\r\n const symbol = f.get(\"symbol_id\");\r\n const opacity = f.get(\"faded\") ? 0.5 : 1;\r\n const datakilde = f.get(\"datakilde\");\r\n const zIndex = 99;\r\n\r\n if (datakilde === 2 && resolution > 50) {\r\n return new Style({\r\n image: new Icon({\r\n src: friluftsomrade,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n }\r\n\r\n switch (symbol) {\r\n case 4:\r\n return new Style({\r\n image: new Icon({\r\n src: badeflaate,\r\n anchor: [0.5, 1],\r\n opacity,\r\n scale: 0.5,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 5:\r\n return new Style({\r\n image: new Icon({\r\n src: badeplass,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 6:\r\n return new Style({\r\n image: new Icon({\r\n src: badeplass,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 8:\r\n return new Style({\r\n image: new Icon({\r\n src: ballokke,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 9:\r\n return new Style({\r\n image: new Icon({\r\n src: basseng,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 13:\r\n return new Style({\r\n image: new Icon({\r\n src: baalOgGrill,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 14:\r\n return new Style({\r\n image: new Icon({\r\n src: batutsettingsrampe,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 17:\r\n return new Style({\r\n image: new Icon({\r\n src: fottur,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 18:\r\n return new Style({\r\n image: new Icon({\r\n src: utsettingKanoKajakk,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 20:\r\n return new Style({\r\n image: new Icon({\r\n src: ferskvann,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 21:\r\n return new Style({\r\n image: new Icon({\r\n src: fiske,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 22:\r\n return new Style({\r\n image: new Icon({\r\n src: flytebrygge,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 24:\r\n return new Style({\r\n image: new Icon({\r\n src: fortoyningsbolter,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 25:\r\n return new Style({\r\n image: new Icon({\r\n src: fortoyningsboye,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 29:\r\n return new Style({\r\n image: new Icon({\r\n src: gapahuk,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 33:\r\n return new Style({\r\n image: new Icon({\r\n src: grill,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 37:\r\n return new Style({\r\n image: new Icon({\r\n src: aktivitetsanlegg,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 40:\r\n return new Style({\r\n image: new Icon({\r\n src: kai,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 42:\r\n return new Style({\r\n image: new Icon({\r\n src: klatring,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 47:\r\n return new Style({\r\n image: new Icon({\r\n src: lek,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 48:\r\n return new Style({\r\n image: new Icon({\r\n src: lekeplass,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 55:\r\n return new Style({\r\n image: new Icon({\r\n src: parkeringsplass,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 56:\r\n return new Style({\r\n image: new Icon({\r\n src: rasteplass,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 66:\r\n return new Style({\r\n image: new Icon({\r\n src: stupebrett,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 67:\r\n return new Style({\r\n image: new Icon({\r\n src: teltplass,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 68: // Rett eller?\r\n return new Style({\r\n image: new Icon({\r\n src: toalett,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 70:\r\n return new Style({\r\n image: new Icon({\r\n src: utedo,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 71:\r\n return new Style({\r\n image: new Icon({\r\n src: ankring,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 277:\r\n return new Style({\r\n image: new Icon({\r\n src: padling,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n // Offentlig transport\r\n\r\n case 281:\r\n return new Style({\r\n image: new Icon({\r\n src: sykkeltur,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 282:\r\n return new Style({\r\n image: new Icon({\r\n src: fottur,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 111:\r\n return new Style({\r\n image: new Icon({\r\n src: hytte,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n case 555:\r\n case 444:\r\n return new Style({\r\n image: new Icon({\r\n src: hyttemer,\r\n anchor: [0.5, 1],\r\n opacity,\r\n }),\r\n zIndex,\r\n });\r\n\r\n default:\r\n return new Style({\r\n image: new Circle({\r\n radius: 10,\r\n fill: new Fill({ color: \"#003b5c\" }),\r\n stroke: new Stroke({ color: \"#fff\", width: 2 }),\r\n anchor: [0.5, 1],\r\n }),\r\n zIndex,\r\n });\r\n }\r\n};\r\n\r\nexport default featureStyle;\r\n","/** @format */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { bindActionCreators as scopedBindActionCreator } from \"../utils/scopedReducer\";\r\nimport { readFiltered } from \"../redux/digiThemeReducer\";\r\nimport { ensureArticleModuleConfig } from \"@avinet/react-article-module\";\r\nimport { connect } from \"react-redux\";\r\nimport {\r\n ClusterSource,\r\n clusterStackStyle,\r\n clusterText,\r\n olUtils,\r\n VectorSource,\r\n provideMapState,\r\n} from \"@avinet/react-openlayers\";\r\nimport { Style, Fill, Stroke } from \"ol/style\";\r\nimport featureStyle from \"../utils/featureStyle\";\r\nimport config from \"../config/index\";\r\n\r\nexport const clusterStyle = clusterStackStyle({\r\n clusterLabelText: clusterText({ color: \"#333\" }),\r\n clusterLabelOffsetX: 10, // 0 is on top of each other.\r\n clusterLabelOffsetY: 20, // 0 is on top of each other.\r\n typeField: \"type\",\r\n featureStyle,\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n readAllVkpElements: scopedBindActionCreator(\r\n readFiltered,\r\n dispatch,\r\n \"vkpElementGeomReducer\"\r\n ),\r\n };\r\n};\r\nconst mapStateToProps = (state) => ({\r\n vkpElementGeoms: state.vkpElementGeomReducer.records,\r\n vkpElementGeomsLoading: state.vkpElementGeomReducer.loading,\r\n});\r\n\r\nclass ArticleLayers extends React.PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n vkpElementFeatures: [],\r\n vkpElementFeaturesPolygon: [],\r\n vkpElementFeaturesPolygonPoint: [],\r\n };\r\n }\r\n componentDidMount() {\r\n this.readVkpElements();\r\n }\r\n componentDidUpdate(prevProps) {\r\n const { filterColumns } = this.props;\r\n\r\n if (\r\n JSON.stringify(filterColumns.vestkystparkelementer) !==\r\n JSON.stringify(prevProps.filterColumns.vestkystparkelementer)\r\n ) {\r\n this.readVkpElements();\r\n }\r\n }\r\n polygonStyle = (f, resolution) => {\r\n const zIndex = 9999;\r\n\r\n return new Style({\r\n fill: new Fill({\r\n color: \"rgba(65, 90, 149, 0.6)\",\r\n }),\r\n stroke: new Stroke({\r\n color: \"rgba(65, 90, 149, 0.8)\",\r\n }),\r\n zIndex,\r\n });\r\n //}\r\n };\r\n\r\n readVkpElements() {\r\n const {\r\n readAllVkpElements,\r\n filterColumns,\r\n vkpElementGeomsLoading,\r\n } = this.props;\r\n const me = this;\r\n\r\n if (vkpElementGeomsLoading) {\r\n setTimeout(() => me.readVkpElements(), 50);\r\n return;\r\n }\r\n\r\n try {\r\n readAllVkpElements(\r\n config.vestkystparkElementerPublic.columns,\r\n {\r\n filterColumns: [...filterColumns.vestkystparkelementer],\r\n },\r\n config.mapProjCode,\r\n 0,\r\n 0\r\n );\r\n this.setState({\r\n shouldUpdateVkpElementFeatures: true,\r\n });\r\n } catch (error) {\r\n // eslint-disable-next-line\r\n console.error(\"error: \", error);\r\n this.readVkpElements();\r\n }\r\n }\r\n\r\n getDatasource(dataIndex) {\r\n return this.props.sources.find((s) => s.dataIndex === dataIndex);\r\n }\r\n static getDerivedStateFromProps(props, state) {\r\n state.vestkystparkelementerIsActive = props.activeSources.some(\r\n (as) => as === config.vestkystparkElementerPublic.dataIndex\r\n );\r\n if (state.shouldUpdateVkpElementFeatures && !props.vkpElementGeomsLoading) {\r\n state.vkpElementFeatures = props.vkpElementGeoms\r\n .filter((e) => e.datakilde !== 2)\r\n .map((geom) => {\r\n const f = olUtils.createFeatureFromWkt(geom.geom_wkt, {\r\n dataIndex: config.vestkystparkElementerPublic.dataIndex,\r\n id: config.vestkystparkElementerPublic.dataIndex + \"_\" + geom.id,\r\n type: geom.type,\r\n symbol_id: geom.symbol_id,\r\n datakilde: geom.datakilde,\r\n });\r\n f.onClick = () => {\r\n props.onArticleOpen(f);\r\n };\r\n return f;\r\n });\r\n state.vkpElementFeaturesPolygon = props.vkpElementGeoms\r\n .filter((e) => e.datakilde === 2 && !!e.geom_omraade)\r\n .map((geom) => {\r\n const f = olUtils.createFeatureFromWkt(geom.geom_omraade, {\r\n dataIndex: config.vestkystparkElementerPublic.dataIndex,\r\n id: config.vestkystparkElementerPublic.dataIndex + \"_\" + geom.id,\r\n type: geom.type,\r\n symbol_id: geom.symbol_id,\r\n datakilde: geom.datakilde,\r\n });\r\n\r\n f.onClick = () => {\r\n props.onArticleOpen(f);\r\n };\r\n return f;\r\n });\r\n\r\n state.vkpElementFeaturesPolygonPoint = props.vkpElementGeoms\r\n .filter((e) => e.datakilde === 2)\r\n .map((geom) => {\r\n const f = olUtils.createFeatureFromWkt(geom.geom_wkt, {\r\n dataIndex: config.vestkystparkElementerPublic.dataIndex,\r\n id: config.vestkystparkElementerPublic.dataIndex + \"_\" + geom.id,\r\n type: geom.type,\r\n symbol_id: geom.symbol_id,\r\n datakilde: geom.datakilde,\r\n });\r\n\r\n f.onClick = () => {\r\n props.onArticleOpen(f);\r\n };\r\n return f;\r\n });\r\n state.shouldUpdateVkpElementFeatures = false;\r\n }\r\n return state;\r\n }\r\n render() {\r\n const {\r\n vkpElementFeatures,\r\n vkpElementFeaturesPolygon,\r\n vkpElementFeaturesPolygonPoint,\r\n } = this.state;\r\n const { mapZoom } = this.props;\r\n\r\n const vestkystparkElementSource = this.getDatasource(\r\n config.vestkystparkElementerPublic.dataIndex\r\n );\r\n\r\n return (\r\n <React.Fragment>\r\n <ClusterSource\r\n key={vestkystparkElementSource.dataIndex}\r\n layerName={vestkystparkElementSource.dataIndex}\r\n features={vkpElementFeatures}\r\n style={clusterStyle}\r\n zIndex={100}\r\n clusterThreshold={50}\r\n />\r\n {mapZoom >= 11.5 ? (\r\n <VectorSource\r\n key={\"polygon_layer\"}\r\n layerName={\"polygon_layer\"}\r\n features={vkpElementFeaturesPolygon}\r\n zIndex={-1}\r\n style={this.polygonStyle}\r\n />\r\n ) : (\r\n <ClusterSource\r\n key={\"polygon_layer_point\"}\r\n layerName={\"polygon_layer_point\"}\r\n features={vkpElementFeaturesPolygonPoint}\r\n style={clusterStyle}\r\n zIndex={100}\r\n clusterThreshold={50}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n }\r\n}\r\nArticleLayers.propTypes = {\r\n sources: PropTypes.array.isRequired,\r\n // eslint-disable-next-line\r\n activeSources: PropTypes.array.isRequired,\r\n // eslint-disable-next-line\r\n onArticleOpen: PropTypes.func.isRequired,\r\n filterColumns: PropTypes.object,\r\n readAllVkpElements: PropTypes.func.isRequired,\r\n // eslint-disable-next-line\r\n vkpElementGeomsLoading: PropTypes.bool,\r\n // eslint-disable-next-line\r\n tripGeoms: PropTypes.array,\r\n // eslint-disable-next-line\r\n tripGeomsLoading: PropTypes.bool,\r\n};\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(provideMapState(ensureArticleModuleConfig(ArticleLayers)));\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport LazyLoad from \"../lib/lazyload\";\r\nimport GodTurArticleListComponent from \"../components/Article/GodTurArticleListComponent\";\r\nimport SlideMenu from \"../containers/SlideMenu\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport { provideViewSize } from \"../hocs/provideViewSize\";\r\nimport {\r\n Articles,\r\n ensureArticleModuleConfig,\r\n} from \"@avinet/react-article-module\";\r\nimport { translate } from \"react-translate\";\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport { provideMapState, MapPadding } from \"@avinet/react-openlayers\";\r\nimport ArticleLayers from \"./ArticleLayers\";\r\nimport Icon from \"../components/Icon\";\r\nimport {\r\n resetFilterState,\r\n updateActiveSources,\r\n updateFilterState,\r\n} from \"../redux/filterReducer\";\r\nimport config from \"../config/index\";\r\nimport \"./ArticleView.scss\";\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n updateActiveSources: bindActionCreators(updateActiveSources, dispatch),\r\n resetFilterState: bindActionCreators(resetFilterState, dispatch),\r\n updateFilterState: bindActionCreators(updateFilterState, dispatch),\r\n };\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n activeSourcesFromReducer: state.filterReducer.activeSources,\r\n});\r\n\r\nconst generateFilterColumns = (sources, queryString) => {\r\n const allFilters = {};\r\n // eslint-disable-next-line array-callback-return\r\n sources.map((source) => {\r\n const filterColumns = [];\r\n if (\r\n queryString !== undefined &&\r\n queryString !== null &&\r\n queryString.length > 1\r\n ) {\r\n const queries = queryString.substring(1).split(\"&\");\r\n // eslint-disable-next-line array-callback-return\r\n queries.map((q) => {\r\n if (q.length) {\r\n const kvp = q.split(\"=\");\r\n const dataIndex = kvp[0].split(\"__\")[0];\r\n const filterProperty = kvp[0].split(\"__\")[1];\r\n const key = kvp[1];\r\n const categoryKey = key.split(\",\");\r\n if (filterProperty === \"tilgjengelig\") {\r\n const filter = getFilterColumn(\r\n \"vestkystparkelementer\",\r\n filterProperty\r\n );\r\n filterColumns.push(filter);\r\n }\r\n // eslint-disable-next-line array-callback-return\r\n categoryKey.map((k) => {\r\n if (\r\n k === \"uthavner\" ||\r\n k === \"aktiviteter\" ||\r\n k === \"fasiliteter\" ||\r\n k === \"overnatting\"\r\n ) {\r\n const filter = getFilterColumn(\"vestkystparkelementer\", k);\r\n filterColumns.push(filter);\r\n }\r\n });\r\n\r\n if (filterProperty === \"sesong\") {\r\n const filter = getFilterColumn(\r\n \"vestkystparkelementer\",\r\n filterProperty\r\n );\r\n filter.value = key;\r\n filterColumns.push(filter);\r\n }\r\n\r\n if (dataIndex === source.dataIndex) {\r\n const filter = getFilterColumn(source.dataIndex, filterProperty);\r\n if (filter.name === \"distance\") {\r\n filter.value = key * 1000;\r\n } else {\r\n filter.value = key\r\n .replace(\"_\", \" \")\r\n .split(\",\")\r\n .map((k) => +k);\r\n }\r\n filterColumns.push(filter);\r\n }\r\n }\r\n });\r\n }\r\n allFilters[source.dataIndex] = filterColumns;\r\n });\r\n return allFilters;\r\n};\r\n\r\nconst getFilterColumn = (dataIndex, key) => {\r\n if (key) {\r\n const object = Object.assign(\r\n {},\r\n config.articleModuleFilters[dataIndex][key]\r\n );\r\n return object;\r\n }\r\n return undefined;\r\n};\r\n\r\nclass ArticleView extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n articleLimit: 20,\r\n };\r\n this.onSourceSelect = this.onSourceSelect.bind(this);\r\n this.updateActiveSourcesFilter = this.updateActiveSourcesFilter.bind(this);\r\n }\r\n\r\n calcMapPadding() {\r\n const { viewHeight, viewWidth } = this.props;\r\n\r\n if (viewWidth < 769) {\r\n return [0, 0, viewHeight / 3, 0];\r\n }\r\n return [0, viewWidth / 2, 0, 90];\r\n }\r\n\r\n componentDidMount() {\r\n this.lazyLoad = new LazyLoad({\r\n threshold: 500,\r\n container: window.innerWidth < 769 ? window : window, // document.getElementById('article-view--scrollPane'),\r\n elements_selector: \".articleList--entry img\",\r\n });\r\n this.checkActiveSourcesFilter();\r\n\r\n window.scrollTo(0, 0);\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.location.pathname !== this.props.location.pathname) {\r\n this.updateActiveSourcesFilter();\r\n }\r\n }\r\n\r\n checkActiveSourcesFilter() {\r\n const { location } = this.props;\r\n if (location.pathname && location.pathname.length < 12) {\r\n this.pushActiveSources();\r\n } else {\r\n this.updateActiveSourcesFilter();\r\n }\r\n }\r\n\r\n pushActiveSources() {\r\n const baseUrl = \"/alleturer/\";\r\n const url = baseUrl + this.props.activeSourcesFromReducer;\r\n this.props.history.push(url);\r\n }\r\n\r\n updateActiveSourcesFilter() {\r\n const { location, updateActiveSources } = this.props;\r\n if (location.pathname && location.pathname.length > 11) {\r\n const activeSourcesFromUrl = location.pathname.substring(11);\r\n updateActiveSources(activeSourcesFromUrl);\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n this.lazyLoad.destroy();\r\n }\r\n\r\n onSourceSelect(source) {\r\n const { history, location } = this.props;\r\n const sources = this.state.activeSources;\r\n let enable = false;\r\n if (sources.indexOf(source) === -1) {\r\n enable = true;\r\n }\r\n const filteredSources = sources.filter((s) => s !== source);\r\n\r\n if (enable) {\r\n filteredSources.push(source);\r\n }\r\n const baseUrl = \"/alleturer\";\r\n const query = location.search || \"\";\r\n history.push(baseUrl + \"/\" + filteredSources.join(\"+\") + query);\r\n }\r\n\r\n onArticleOpen(article) {\r\n const { history } = this.props;\r\n const baseUrl = \"/tur\";\r\n\r\n history.push(baseUrl + \"/\" + article.id.replace(\"_\", \"/\"));\r\n window.scroll(0, 0);\r\n }\r\n\r\n static getDerivedStateFromProps(props, state) {\r\n const filterColumns = generateFilterColumns(\r\n props.sources,\r\n props.location.search\r\n );\r\n state.filterColumns = filterColumns;\r\n\r\n let {\r\n match: {\r\n params: { activeSources },\r\n },\r\n } = props;\r\n state.activeSources = activeSources ? activeSources.split(\"+\") : [];\r\n return state;\r\n }\r\n\r\n menuHandler = () => {\r\n this.setState({ open: !this.state.open });\r\n };\r\n\r\n render() {\r\n const { t } = this.props;\r\n const { filterColumns, activeSources } = this.state;\r\n const { open } = this.state;\r\n\r\n return (\r\n <>\r\n {open ? (\r\n <button\r\n className=\"menu-close-btn\"\r\n onClick={this.menuHandler}\r\n aria-label=\"Close filters\"\r\n >\r\n <Icon name=\"close\" />\r\n </button>\r\n ) : (\r\n <button className=\"filter-btn\" onClick={this.menuHandler}>\r\n <Icon name=\"filter\" />\r\n {t(\"filter\")}\r\n </button>\r\n )}\r\n <div\r\n className={\r\n open\r\n ? \"article-view--container open\"\r\n : \"article-view--container closed\"\r\n }\r\n id=\"scrollPane\"\r\n >\r\n <MapPadding padding={this.calcMapPadding()} />\r\n <SlideMenu\r\n baseUrl={\"/alleturer/\"}\r\n activeSources={activeSources.join(\"+\")}\r\n onSourceSelect={this.onSourceSelect}\r\n />\r\n <div className=\"article-view--content\" id=\"article-view--scrollPane\">\r\n <Articles\r\n hideSelector\r\n hideLayers\r\n filterColumns={filterColumns}\r\n activeSources={activeSources}\r\n onContentChange={() => this.lazyLoad.update()}\r\n onArticleOpen={this.onArticleOpen}\r\n articleComponent={GodTurArticleListComponent}\r\n thumbnailSize=\"small\"\r\n />\r\n </div>\r\n <ArticleLayers\r\n activeSources={activeSources}\r\n filterColumns={filterColumns}\r\n onArticleOpen={this.props.onArticleOpen}\r\n />\r\n </div>\r\n </>\r\n );\r\n }\r\n}\r\n\r\nArticleView.propTypes = {\r\n history: PropTypes.object.isRequired,\r\n location: PropTypes.object.isRequired,\r\n updateActiveSources: PropTypes.func.isRequired,\r\n activeSourcesFromReducer: PropTypes.string,\r\n viewHeight: PropTypes.number.isRequired,\r\n viewWidth: PropTypes.number.isRequired,\r\n t: PropTypes.func.isRequired,\r\n onArticleOpen: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(\r\n provideViewSize(\r\n withRouter(\r\n translate(\"ArticleView\")(\r\n provideMapState(ensureArticleModuleConfig(ArticleView))\r\n )\r\n )\r\n )\r\n);\r\n","import request from \"superagent\";\r\nimport {\r\n getSessionToken,\r\n authReducerActions,\r\n} from \"@avinet/react-adaptive-auth\";\r\nimport { fixKeyValueArraysToJsObject } from \"../utils/utils\";\r\nimport config from \"../config/index\";\r\n\r\n// ------------------------------------\r\n// Constants\r\n// ------------------------------------\r\nexport const DIGI_THEME_MEDIA_SAVING = \"DIGI_THEME_MEDIA_SAVING\";\r\nexport const DIGI_THEME_MEDIA_SAVE_SUCCESS = \"DIGI_THEME_MEDIA_SAVE_SUCCESS\";\r\nexport const DIGI_THEME_MEDIA_SAVE_ERROR = \"DIGI_THEME_MEDIA_SAVE_ERROR\";\r\nexport const DIGI_THEME_MEDIA_READING = \"DIGI_THEME_MEDIA_READING\";\r\nexport const DIGI_THEME_MEDIA_READ_SUCCESS = \"DIGI_THEME_MEDIA_READ_SUCCCESS\";\r\nexport const DIGI_THEME_MEDIA_READ_ERROR = \"DIGI_THEME_MEDIA_READ_ERROR\";\r\nexport const DIGI_THEME_MEDIA_DELETING = \"DIGI_THEME_MEDIA_DELETING\";\r\nexport const DIGI_THEME_MEDIA_DELETE_SUCCESS =\r\n \"DIGI_THEME_MEDIA_DELETE_SUCCESS\";\r\nexport const DIGI_THEME_MEDIA_DELETE_ERROR = \"DIGI_THEME_MEDIA_DELETE_ERROR\";\r\nexport const DIGI_THEME_MEDIA_RESET = \"DIGI_THEME_MEDIA_RESET\";\r\n\r\n// ------------------------------------\r\n// Actions\r\n// ------------------------------------\r\nconst saving = () => ({ type: DIGI_THEME_MEDIA_SAVING });\r\n\r\nconst saveSuccess = (data) => ({\r\n type: DIGI_THEME_MEDIA_SAVE_SUCCESS,\r\n payload: {\r\n data,\r\n },\r\n});\r\n\r\nconst saveFailed = (error) => ({\r\n type: DIGI_THEME_MEDIA_SAVE_ERROR,\r\n payload: {\r\n error,\r\n },\r\n});\r\n\r\nconst reading = () => ({ type: DIGI_THEME_MEDIA_READING });\r\n\r\nconst readSuccess = (records, total) => ({\r\n type: DIGI_THEME_MEDIA_READ_SUCCESS,\r\n payload: {\r\n records,\r\n total,\r\n },\r\n});\r\n\r\nconst readFailed = (error) => ({\r\n type: DIGI_THEME_MEDIA_READ_ERROR,\r\n payload: {\r\n error,\r\n },\r\n});\r\n\r\nconst deleting = () => ({ type: DIGI_THEME_MEDIA_DELETING });\r\n\r\nconst deleteSuccess = () => ({ type: DIGI_THEME_MEDIA_DELETE_SUCCESS });\r\n\r\nconst deleteFailed = (error) => ({\r\n type: DIGI_THEME_MEDIA_DELETE_ERROR,\r\n payload: {\r\n error,\r\n },\r\n});\r\n\r\nexport const resetMedia = () => ({ type: DIGI_THEME_MEDIA_RESET });\r\n\r\n// ------------------------------------\r\n// Action creators\r\n// ------------------------------------\r\nexport const readMedia = (recordUuid, srid) => {\r\n return (dispatch, getState, getReducerState) => {\r\n dispatch(reading());\r\n const themeUuid = getReducerState().themeUuid;\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/generic/Media.asmx/Read\")\r\n .send({\r\n extraParams: [\r\n {\r\n key: \"owner_uuid\",\r\n value: recordUuid,\r\n },\r\n {\r\n key: \"parent_object_uuid\",\r\n value: themeUuid,\r\n },\r\n ],\r\n filter: {\r\n filterColumns: [],\r\n defaultFilter: [],\r\n secondFilter: [],\r\n },\r\n limit: 100,\r\n page: 1,\r\n start: 0,\r\n })\r\n .set(\"X-Adaptive-SRID\", srid)\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .then((res) => res.body)\r\n .then((res) => {\r\n res = res.d;\r\n if (res.sessionExpired) {\r\n dispatch(authReducerActions.sessionExpired());\r\n }\r\n if (!res.success) {\r\n dispatch(\r\n readFailed({\r\n code: \"NO_RECORD_FOUND\",\r\n message: res.exception.message,\r\n })\r\n );\r\n }\r\n\r\n dispatch(readSuccess(res.records, res.total));\r\n })\r\n .catch((e) => {\r\n dispatch(readFailed(e || { message: \"readFailed\" }));\r\n });\r\n };\r\n};\r\n\r\nexport const updateMedia = (record) => {\r\n return (dispatch) => {\r\n dispatch(saving());\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/generic/Media.asmx/Update\")\r\n .send({ data: record, extraParams: [] })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .then((res) => res.body)\r\n .then((res) => {\r\n res = res.d;\r\n if (res.sessionExpired) {\r\n dispatch(authReducerActions.sessionExpired());\r\n }\r\n if (!res.success) {\r\n dispatch(\r\n saveFailed({ code: \"SAVE_FAILED\", message: res.exception.message })\r\n );\r\n }\r\n\r\n dispatch(saveSuccess());\r\n })\r\n .catch((e) => {\r\n dispatch(saveFailed(e || { message: \"readFailed\" }));\r\n });\r\n };\r\n};\r\n\r\nexport const deleteMedia = (mediaUuid) => {\r\n return (dispatch, getState, getReducerState) => {\r\n dispatch(deleting());\r\n // const themeUuid = getReducerState().themeUuid;\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/generic/Media.asmx/Destroy\")\r\n .send({ uuid: mediaUuid, extraParams: [] })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .then((res) => res.body)\r\n .then((res) => {\r\n res = res.d;\r\n if (res.sessionExpired) {\r\n dispatch(authReducerActions.sessionExpired());\r\n }\r\n if (!res.success) {\r\n dispatch(\r\n deleteFailed({\r\n code: \"DELETE_FAILED\",\r\n message: res.exception.message,\r\n })\r\n );\r\n }\r\n\r\n dispatch(deleteSuccess());\r\n })\r\n .catch((e) => {\r\n dispatch(deleteFailed(e || { message: \"readFailed\" }));\r\n });\r\n };\r\n};\r\n\r\nexport const saveMedia = (files, recordUuid, srid) => {\r\n return (dispatch, getState, getReducerState) => {\r\n dispatch(saving());\r\n\r\n create(dispatch, files, recordUuid, getReducerState().themeUuid, srid);\r\n };\r\n};\r\n\r\nconst create = (dispatch, files, recordUuid, themeUuid, srid, iterator = 0) => {\r\n const mediaFile = files[iterator];\r\n const media = {\r\n name: mediaFile.name,\r\n mime: mediaFile.type,\r\n owner_uuid: recordUuid,\r\n parent_object_type: \"digi_theme\",\r\n parent_object_uuid: themeUuid,\r\n config: { configs: [{ key: \"isPublic\", value: true }] },\r\n };\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/generic/Media.asmx/Create\")\r\n .send({ data: media, extraParams: [] })\r\n .set(\"X-Adaptive-SRID\", srid)\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .then((res) => res.body)\r\n .then((res) => {\r\n res = res.d;\r\n\r\n if (res.sessionExpired) {\r\n dispatch(authReducerActions.sessionExpired());\r\n }\r\n\r\n if (!res.success) {\r\n dispatch(\r\n saveFailed({ code: \"SAVE_FAILED\", message: res.exception.message })\r\n );\r\n }\r\n\r\n const dataObj = fixKeyValueArraysToJsObject(res.data).find(\r\n (r) => r.type === \"Cartomatic.Utils.OpsIO.DataObj\"\r\n );\r\n if (dataObj.uuid) {\r\n upload(\r\n dispatch,\r\n files,\r\n dataObj.uuid,\r\n recordUuid,\r\n themeUuid,\r\n srid,\r\n iterator\r\n );\r\n }\r\n })\r\n .catch((e) => {\r\n dispatch(saveFailed(e || { message: \"saveFailed\" }));\r\n });\r\n};\r\n\r\nconst upload = (\r\n dispatch,\r\n files,\r\n uuid,\r\n recordUuid,\r\n themeUuid,\r\n srid,\r\n iterator\r\n) => {\r\n const url =\r\n config.adaptiveUrl +\r\n \"WebServices/generic/Media.asmx/Upload?\" +\r\n \"uuid=\" +\r\n uuid +\r\n \"&gm_session_id=\" +\r\n getSessionToken();\r\n const file = files[iterator];\r\n\r\n request\r\n .post(url)\r\n .attach(\"file\", file)\r\n .set(\"Accept\", \"application/json\")\r\n .then((res) => JSON.parse(res.text))\r\n .then((res) => {\r\n if (res.sessionExpired) {\r\n dispatch(authReducerActions.sessionExpired());\r\n }\r\n\r\n if (!res.success) {\r\n dispatch(\r\n saveFailed({ code: \"SAVE_FAILED\", message: res.exception.message })\r\n );\r\n }\r\n if (files.length - 1 !== iterator) {\r\n create(dispatch, files, recordUuid, themeUuid, srid, iterator + 1);\r\n } else {\r\n dispatch(saveSuccess());\r\n }\r\n })\r\n .catch((e) => {\r\n dispatch(saveFailed(e || { message: \"saveFailed\" }));\r\n });\r\n};\r\n\r\n// ------------------------------------\r\n// Reducer\r\n// ------------------------------------\r\nconst initialState = {\r\n deleting: false,\r\n loading: false,\r\n error: undefined,\r\n records: [],\r\n total: undefined,\r\n};\r\n\r\nexport default (key, themeUuid) => {\r\n return (state = initialState, action) => {\r\n switch (action.type) {\r\n case key + \"@@\" + DIGI_THEME_MEDIA_SAVING:\r\n return Object.assign({}, state, {\r\n deleting: true,\r\n error: undefined,\r\n });\r\n case key + \"@@\" + DIGI_THEME_MEDIA_SAVE_SUCCESS:\r\n return Object.assign({}, state, {\r\n deleting: false,\r\n });\r\n case key + \"@@\" + DIGI_THEME_MEDIA_SAVE_ERROR:\r\n return Object.assign({}, state, {\r\n deleting: false,\r\n error: action.payload.error,\r\n });\r\n case key + \"@@\" + DIGI_THEME_MEDIA_READING:\r\n return Object.assign({}, state, {\r\n loading: true,\r\n records: [],\r\n error: undefined,\r\n });\r\n case key + \"@@\" + DIGI_THEME_MEDIA_READ_SUCCESS:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n records: action.payload.records,\r\n total: action.payload.total,\r\n });\r\n case key + \"@@\" + DIGI_THEME_MEDIA_READ_ERROR:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n error: action.payload.error,\r\n });\r\n case key + \"@@\" + DIGI_THEME_MEDIA_DELETING:\r\n return Object.assign({}, state, {\r\n deleting: true,\r\n error: undefined,\r\n });\r\n case key + \"@@\" + DIGI_THEME_MEDIA_DELETE_SUCCESS:\r\n return Object.assign({}, state, {\r\n deleting: false,\r\n });\r\n case key + \"@@\" + DIGI_THEME_MEDIA_DELETE_ERROR:\r\n return Object.assign({}, state, {\r\n deleting: false,\r\n error: action.payload.error,\r\n });\r\n case key + \"@@\" + DIGI_THEME_MEDIA_RESET:\r\n return Object.assign({}, state, initialState);\r\n default:\r\n return state ? { ...state, themeUuid } : { ...initialState, themeUuid };\r\n }\r\n };\r\n};\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Slider from \"react-slick\";\r\nimport LoadingIndicator from \"./LoadingIndicator\";\r\nimport config from \"../config/index\";\r\nimport \"./SingleCarousel.scss\";\r\n\r\nconst SingleCarousel = ({\r\n mainImage,\r\n images,\r\n loading,\r\n externalUrl,\r\n isFlickr,\r\n}) => {\r\n var sliderImages = [];\r\n if (mainImage) {\r\n if (externalUrl) {\r\n sliderImages = sliderImages.concat([mainImage]);\r\n } else {\r\n const uuid = mainImage\r\n .substring(mainImage.indexOf(\"uuid=\") + 5)\r\n .split(\"&\")[0];\r\n sliderImages = images.filter((i) => i.uuid !== uuid);\r\n sliderImages.unshift(images.find((i) => i.uuid === uuid));\r\n }\r\n } else {\r\n sliderImages = sliderImages.concat(images);\r\n }\r\n\r\n const settings = {\r\n dots: false,\r\n infinite: true,\r\n speed: 500,\r\n slidesToShow: 1,\r\n slidesToScroll: 1,\r\n };\r\n\r\n const sliderContents = sliderImages.map((i) => {\r\n if (i === undefined) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className=\"slider-image--container\" key={i.uuid || externalUrl}>\r\n {externalUrl ? (\r\n isFlickr ? (\r\n <a href={externalUrl} target=\"_blank\" rel=\"noopener noreferrer\">\r\n <img src={i} alt=\"\" />\r\n <div className=\"slider-image--caption\">\r\n <span>Klikk for flere bilder p� Flickr</span>\r\n </div>\r\n </a>\r\n ) : (\r\n <img src={i} alt=\"\" />\r\n )\r\n ) : (\r\n <React.Fragment>\r\n <img\r\n src={\r\n config.adaptiveUrl +\r\n \"WebServices/generic/Media.asmx/Download?uuid=\" +\r\n i.uuid +\r\n \"&thumbnail_size=medium\"\r\n }\r\n alt=\"\"\r\n />\r\n {i.comment && (\r\n <div className=\"slider-image--caption\">\r\n <span>{i.comment}</span>\r\n </div>\r\n )}\r\n </React.Fragment>\r\n )}\r\n </div>\r\n );\r\n });\r\n\r\n return (\r\n <div className=\"single-carousel\">\r\n {loading ? (\r\n <LoadingIndicator />\r\n ) : (\r\n <Slider {...settings}>{sliderContents}</Slider>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nSingleCarousel.propTypes = {\r\n mainImage: PropTypes.string,\r\n images: PropTypes.array,\r\n loading: PropTypes.bool,\r\n flickrUrl: PropTypes.string,\r\n isFlickr: PropTypes.bool,\r\n externalUrl: PropTypes.string,\r\n};\r\n\r\nexport default SingleCarousel;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { connect } from \"react-redux\";\r\nimport { readChildren, resetDigiTheme } from \"../redux/digiThemeReducer\";\r\nimport { bindActionCreators as bindScopedActionCreators } from \"../utils/scopedReducer\";\r\nimport { Style, Circle, Fill, Stroke, Text } from \"ol/style\";\r\nimport { olUtils, VectorSource } from \"@avinet/react-openlayers\";\r\nimport config from \"../config/index\";\r\n\r\nexport const pointStyle = (f) => {\r\n const zIndex = 0;\r\n const name = f.get(\"name\");\r\n return new Circle({\r\n fill: new Fill({\r\n color: \"#007681\",\r\n }),\r\n stroke: new Stroke({\r\n color: \"#003b5c\",\r\n }),\r\n text: new Text({\r\n text: name || \"Ikke tilgjengelig\",\r\n fill: new Fill({\r\n color: \"white\",\r\n }),\r\n stroke: new Stroke({\r\n color: \"grey\",\r\n }),\r\n offsetX: 20,\r\n offsetY: 0,\r\n backgroundFill: new Fill({\r\n color: \"#003b5c\",\r\n }),\r\n textAlign: \"left\",\r\n font: \"14px sans-serif\",\r\n padding: [5, 5, 5, 5],\r\n }),\r\n zIndex,\r\n });\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return Object.assign(\r\n {},\r\n bindScopedActionCreators(\r\n {\r\n pointsReadChildren: readChildren,\r\n resetPointChildrenDt: resetDigiTheme,\r\n },\r\n dispatch,\r\n \"tripPoints\"\r\n ),\r\n bindScopedActionCreators(\r\n { linesReadChildren: readChildren, resetLineChildrenDt: resetDigiTheme },\r\n dispatch,\r\n \"tripLines\"\r\n )\r\n );\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n tripPoints: state.tripPoints,\r\n tripLines: state.tripLines,\r\n});\r\n\r\nclass TripGeometryContainer extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.readPoints = this.readPoints.bind(this);\r\n this.readLines = this.readLines.bind(this);\r\n this.getFeatureStyleTrip = this.getFeatureStyleTrip.bind(this);\r\n this.getFeatureStylePoint = this.getFeatureStylePoint.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n const id = this.props.tripId;\r\n if (id) {\r\n this.readPoints(id);\r\n this.readLines(id);\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n const prevId = prevProps.tripId;\r\n const id = this.props.tripId;\r\n\r\n if (!prevId && id) {\r\n this.readPoints(id);\r\n this.readLines(id);\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n this.props.resetLineChildrenDt();\r\n this.props.resetPointChildrenDt();\r\n }\r\n\r\n readPoints(id) {\r\n if (id && typeof id === \"string\") {\r\n id = parseInt(id);\r\n }\r\n if (id && id > 0) {\r\n this.props.pointsReadChildren(\r\n config.dtPoint.columns,\r\n undefined,\r\n config.dtPoint.fkColumn,\r\n id,\r\n config.mapProjCode,\r\n 0,\r\n 0\r\n );\r\n }\r\n }\r\n\r\n readLines(id) {\r\n if (id && typeof id === \"string\") {\r\n id = parseInt(id);\r\n }\r\n this.props.linesReadChildren(\r\n config.dtLine.columns,\r\n undefined,\r\n config.dtLine.fkColumn,\r\n id,\r\n config.mapProjCode,\r\n 0,\r\n 0\r\n );\r\n }\r\n\r\n getFeatureStyleTrip = (f) => {\r\n const name = f.get(\"name\");\r\n return new Style({\r\n stroke: new Stroke({\r\n color: \"rgb(204, 23, 164)\",\r\n width: 3,\r\n lineDash: [4, 8],\r\n lineDashOffset: 6,\r\n }),\r\n text: new Text({\r\n text: name || \"Ikke tilgjengelig\",\r\n fill: new Fill({\r\n color: \"white\",\r\n }),\r\n stroke: new Stroke({\r\n color: \"grey\",\r\n }),\r\n offsetX: 20,\r\n offsetY: 0,\r\n backgroundFill: new Fill({\r\n color: \"#003b5c\",\r\n }),\r\n textAlign: \"left\",\r\n font: \"14px sans-serif\",\r\n padding: [5, 5, 5, 5],\r\n }),\r\n });\r\n };\r\n\r\n getFeatureStylePoint = (f) => {\r\n const name = f.get(\"name\");\r\n return new Style({\r\n image: new Circle({\r\n fill: new Fill({\r\n color: \"#f0a055\",\r\n opacity: 100,\r\n }),\r\n radius: 10,\r\n }),\r\n text: new Text({\r\n text: name || \"Ikke tilgjengelig\",\r\n fill: new Fill({\r\n color: \"white\",\r\n }),\r\n stroke: new Stroke({\r\n color: \"grey\",\r\n }),\r\n offsetX: 20,\r\n offsetY: 0,\r\n backgroundFill: new Fill({\r\n color: \"#003b5c\",\r\n }),\r\n textAlign: \"left\",\r\n font: \"14px sans-serif\",\r\n padding: [5, 5, 5, 5],\r\n }),\r\n });\r\n };\r\n\r\n render() {\r\n const { tripPoints, tripLines } = this.props;\r\n\r\n this.props.zoomToExtent(tripLines.records);\r\n\r\n return (\r\n <React.Fragment>\r\n {tripPoints && (\r\n <VectorSource\r\n features={tripPoints.records.map((r) =>\r\n olUtils.createFeatureFromWkt(r.geom_wkt, r)\r\n )}\r\n layerName=\"tripPoints\"\r\n style={this.getFeatureStylePoint}\r\n />\r\n )}\r\n {tripLines && (\r\n <VectorSource\r\n features={tripLines.records.map((r) =>\r\n olUtils.createFeatureFromWkt(r.geom_wkt, r)\r\n )}\r\n layerName=\"tripLines\"\r\n style={this.getFeatureStyleTrip}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n }\r\n}\r\n\r\nTripGeometryContainer.propTypes = {\r\n pointsReadChildren: PropTypes.func.isRequired,\r\n linesReadChildren: PropTypes.func.isRequired,\r\n tripPoints: PropTypes.object.isRequired,\r\n tripLines: PropTypes.object.isRequired,\r\n tripId: PropTypes.any,\r\n resetLineChildrenDt: PropTypes.func.isRequired,\r\n resetPointChildrenDt: PropTypes.func.isRequired,\r\n zoomToExtent: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(TripGeometryContainer);\r\n","/** @format */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Title from \"../Title\";\r\nimport { connect } from \"react-redux\";\r\nimport { translate } from \"react-translate\";\r\nimport { readMedia } from \"../../redux/mediaReducer\";\r\nimport SingleCarousel from \"../SingleCarousel\";\r\nimport { bindActionCreators as bindScopedActionCreators } from \"../../utils/scopedReducer\";\r\nimport \"./GodTurArticle.scss\";\r\nimport { olUtils, provideMapState, MapPadding } from \"@avinet/react-openlayers\";\r\nimport { provideViewSize } from \"../../hocs/provideViewSize\";\r\nimport TripGeometryContainer from \"../../containers/TripGeometryContainer\";\r\nimport config from \"../../config/index\";\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return Object.assign(\r\n {},\r\n bindScopedActionCreators({ readMedia }, dispatch, \"mediaTrips\")\r\n );\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n municipalities: state.municipalities.records,\r\n municipalitiesLoading: state.municipalities.loading,\r\n mediaLoading: state.mediaTrips.loading,\r\n mediaFiles: state.mediaTrips.records,\r\n sessionToken: state.auth.sessionToken,\r\n});\r\n\r\nfunction getArticleId(props) {\r\n if (props && props.article && props.article.id) {\r\n var arr = props.article.id.split(\"_\");\r\n if (arr.length > 0) {\r\n return arr[arr.length - 1];\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nclass GodTurArticle extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n municipalityName: \"\",\r\n initialized: false,\r\n };\r\n\r\n this.updateMunicipalityName = this.updateMunicipalityName.bind(this);\r\n this.zoomToExtent = this.zoomToExtent.bind(this);\r\n }\r\n\r\n calcMapPadding() {\r\n const { viewHeight } = this.props;\r\n\r\n return [0, 0, viewHeight / 2, 0];\r\n }\r\n\r\n async componentWillMount() {\r\n const id = getArticleId(this.props);\r\n if (id) {\r\n this.updateMunicipalityName(this.props);\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.checkArticle(this.props);\r\n }\r\n\r\n componentDidUpdate(prevProps, prevState) {\r\n this.checkArticle(this.props);\r\n const prevId = getArticleId(prevProps);\r\n const id = getArticleId(this.props);\r\n\r\n if (!prevId && id) {\r\n this.updateMunicipalityName(this.props);\r\n }\r\n\r\n if (\r\n !prevState.initialized &&\r\n this.state.initialized &&\r\n this.props.article\r\n ) {\r\n this.props.readMedia(\r\n this.props.article.properties.uuid,\r\n config.mapProjCode\r\n );\r\n }\r\n }\r\n\r\n zoomToExtent(tripLines) {\r\n const { fitViewAndZoom } = this.props;\r\n\r\n const features =\r\n tripLines &&\r\n tripLines.map((geom) => {\r\n const f = olUtils.createFeatureFromWkt(geom.geom_wkt, geom);\r\n return f;\r\n });\r\n\r\n if (features.length) {\r\n const extent = olUtils.bufferExtent(\r\n olUtils.getExtentFromFeatures(features),\r\n 1.2\r\n );\r\n setTimeout(() => fitViewAndZoom(extent), 100);\r\n }\r\n }\r\n\r\n checkArticle(props) {\r\n const { initialized } = this.state;\r\n\r\n if (\r\n props.article &&\r\n props.article.id &&\r\n props.article.id !== \"\" &&\r\n !initialized\r\n ) {\r\n this.setState({ initialized: true });\r\n }\r\n }\r\n\r\n updateMunicipalityName(props) {\r\n const municipality = props.municipalities.find((m) => {\r\n return m.komm.toString() === props.article.properties.municipality;\r\n });\r\n if (municipality) {\r\n this.setState({ municipalityName: municipality.navn });\r\n }\r\n }\r\n\r\n formatContent(content) {\r\n return content && content.replace(/\\n/g, \"</br>\");\r\n }\r\n\r\n render() {\r\n const {\r\n id,\r\n title,\r\n content,\r\n t,\r\n mediaFiles,\r\n mediaLoading,\r\n // eslint-disable-next-line camelcase\r\n type_friluftselement,\r\n author,\r\n article,\r\n lengde,\r\n sesong,\r\n tid,\r\n // eslint-disable-next-line camelcase\r\n bilde_multimedia,\r\n } = this.props;\r\n\r\n var contentType = type_friluftselement;\r\n\r\n if (content.length > 0) {\r\n contentType = content;\r\n }\r\n\r\n /* eslint-disable camelcase */\r\n const image =\r\n (id.startsWith(\"05\") || id.startsWith(\"06\")) && bilde_multimedia\r\n ? `https://bof.avinet.no/WebServices/generic/Media.asmx/Download?uuid=${bilde_multimedia}&thumbnail_size=small`\r\n : bilde_multimedia &&\r\n `https://friluftsforvaltning.avinet.no/WebServices/generic/Media.asmx/Download?uuid=${bilde_multimedia}&thumbnail_size=small`;\r\n /* eslint-disable camelcase */\r\n\r\n return (\r\n <div>\r\n <div className=\"type-title-bg\">\r\n {type_friluftselement && (\r\n <div className=\"godtur--article-type\">{type_friluftselement}</div>\r\n )}\r\n </div>\r\n <div className=\"godtur--article\">\r\n <div className=\"godtur--article-flex-container\">\r\n <MapPadding padding={this.calcMapPadding()} />\r\n <Title title={title} />\r\n <article className=\"godtur--article--hero\">\r\n <div className=\"godtur--article-content\">\r\n <div className=\"godtur--article-content-title\">\r\n <div className=\"title-details\">\r\n {title && title !== null && <h1>{title}</h1>}\r\n </div>\r\n </div>\r\n\r\n <div\r\n className=\"godtur--article-content-meta\"\r\n dangerouslySetInnerHTML={{\r\n __html: this.formatContent(contentType),\r\n }}\r\n />\r\n <div className=\"godtur--article-content-meta.small\">\r\n <p>{author}</p>\r\n </div>\r\n </div>\r\n </article>\r\n <aside>\r\n <div className=\"img-container-div\">\r\n <b>\r\n <p>{image && t(\"bilder\")}</p>\r\n </b>\r\n <SingleCarousel\r\n key=\"godtur-article--carousel\"\r\n mainImage={image}\r\n images={mediaFiles}\r\n loading={mediaLoading}\r\n />\r\n </div>\r\n <div className=\"tripinfo-container-div\">\r\n <div className=\"godtur-article-flex-box\">\r\n <div className=\"godtur-article-meta-cols\">\r\n <span className=\"godtur-article--meta-cols-label\">\r\n {t(\"length\")}\r\n </span>\r\n <span className=\"godtur-article--meta-cols-value\">\r\n <b>\r\n {lengde && lengde >= 1000\r\n ? `${(lengde / 1000).toFixed(1)} km`\r\n : `${lengde} m`}\r\n </b>\r\n </span>\r\n </div>\r\n <div className=\"godtur-article-meta-cols\">\r\n <span className=\"godtur-article--meta-cols-label\">\r\n {t(\"time\")}\r\n </span>\r\n <span className=\"godtur-article--meta-cols-value\">\r\n <b>{tid && tid}</b>\r\n </span>\r\n </div>\r\n <div className=\"godtur-article-meta-cols\">\r\n <span className=\"godtur-article--meta-cols-label\">\r\n {t(\"season\")}\r\n </span>\r\n <span className=\"godtur-article--meta-cols-value\">\r\n <b>{sesong && sesong}</b>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </aside>\r\n {this.props.godtur_id && (\r\n <TripGeometryContainer\r\n tripId={this.props.godtur_id}\r\n motherGeom={article.olFeature}\r\n zoomToExtent={this.zoomToExtent}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nGodTurArticle.propTypes = {\r\n title: PropTypes.string,\r\n author: PropTypes.string,\r\n content: PropTypes.string,\r\n bilde_multimedia: PropTypes.string,\r\n id: PropTypes.string,\r\n lengde: PropTypes.string,\r\n tid: PropTypes.string,\r\n t: PropTypes.func.isRequired,\r\n sesong: PropTypes.string,\r\n article: PropTypes.object,\r\n mediaLoading: PropTypes.bool.isRequired,\r\n mediaFiles: PropTypes.array.isRequired,\r\n type: PropTypes.string.isRequired,\r\n godtur_id: PropTypes.string,\r\n viewHeight: PropTypes.number,\r\n fitViewAndZoom: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(provideViewSize(provideMapState(translate(\"GodTurArticle\")(GodTurArticle))));\r\n","import { useEffect, useState } from \"react\";\r\nimport request from \"superagent\";\r\n\r\nfunction useBadeTemp(id) {\r\n const [loading, setLoading] = useState(false);\r\n const [data, setData] = useState();\r\n\r\n useEffect(() => {\r\n setLoading(true);\r\n setData(undefined);\r\n\r\n if (id === undefined || id === null || id === \"\") {\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n request\r\n .get(\r\n \"https://api-badetassen.eu.ngrok.io/test/get/iot/bof/data?deviceID=\" +\r\n id\r\n )\r\n .then((res) => res.body)\r\n .then((res) => {\r\n if (res && res[0].records) {\r\n // only use the latest record\r\n const data = res[0].records.slice(-1);\r\n setData(data);\r\n }\r\n\r\n setLoading(false);\r\n })\r\n .catch(() => {\r\n setLoading(false);\r\n });\r\n }, [id]);\r\n\r\n return { data, loading };\r\n}\r\n\r\nexport default useBadeTemp;\r\n","import React, { useMemo } from \"react\";\r\nimport bathTemp from \"../static/bathTemp.svg\";\r\nimport badetassen from \"../static/badetassen.svg\";\r\nimport useBadeTemp from \"../hocs/useBadeTemp\";\r\n\r\nconst BadeTemp = ({ id }) => {\r\n const { data } = useBadeTemp(id);\r\n\r\n const date = useMemo(() => {\r\n if (!data) return null;\r\n\r\n // hide if older than 7 days\r\n if (\r\n new Date(data[0].updatedAt) <\r\n new Date(Date.now() - 7 * 24 * 60 * 60 * 1000)\r\n ) {\r\n return null;\r\n }\r\n\r\n let dateString = new Date(data[0].updatedAt).toLocaleDateString(\"nb-NO\", {\r\n day: \"2-digit\",\r\n month: \"short\",\r\n year: \"numeric\",\r\n });\r\n\r\n if (dateString.at(0) === \"0\") {\r\n dateString = dateString.slice(1);\r\n }\r\n\r\n const date = dateString;\r\n\r\n return date;\r\n }, [data]);\r\n\r\n if (!data || !date) return null;\r\n\r\n return (\r\n <div className=\"badetemp-container\">\r\n <div className=\"temp-icon\">\r\n <img alt=\"badetemp\" src={bathTemp} />\r\n </div>\r\n <div className=\"temp-info\">\r\n <span className=\"celcius\">\r\n {`${data?.[0].measValue}˚`}\r\n <span>c</span>\r\n </span>\r\n <span className=\"date\">{date}</span>\r\n <a\r\n href=\"https://badetassen.no/\"\r\n className=\"badetassen\"\r\n rel=\"noopener noreferrer\"\r\n target=\"_blank\"\r\n >\r\n <img alt=\"badetassen\" src={badetassen} />\r\n </a>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default BadeTemp;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport request from \"superagent\";\r\nimport bathTemp from \"../static/bathTemp.svg\";\r\n\r\nconst months = [\r\n \"jan\",\r\n \"feb\",\r\n \"mar\",\r\n \"apr\",\r\n \"mai\",\r\n \"jun\",\r\n \"jul\",\r\n \"aug\",\r\n \"sep\",\r\n \"okt\",\r\n \"nov\",\r\n \"des\",\r\n];\r\n\r\nfunction useBadeTemp(id) {\r\n const [loading, setLoading] = useState(false);\r\n const [data, setData] = useState();\r\n\r\n useEffect(() => {\r\n setLoading(true);\r\n setData(undefined);\r\n\r\n request\r\n .get(\r\n \"https://water-temp.prod.front.bkk.no/api/v1/temperatures/\" + id + \"\"\r\n )\r\n .then((res) => res.body)\r\n .then((res) => {\r\n if (res.temperature !== null) {\r\n const data = {\r\n ...res,\r\n date: new Date(res.time),\r\n };\r\n\r\n setData(data);\r\n setLoading(false);\r\n }\r\n })\r\n .catch(() => {\r\n setLoading(false);\r\n });\r\n }, [id]);\r\n\r\n return { data, loading };\r\n}\r\n\r\nconst BadeTempBkk = ({ id }) => {\r\n const { data } = useBadeTemp(id);\r\n return data ? (\r\n <div\r\n className={[\r\n \"badetemp-container\",\r\n data.date < new Date().setDate(new Date().getDate() - 7)\r\n ? \"hidden\"\r\n : \"\",\r\n ].join(\" \")}\r\n >\r\n <div className=\"temp-icon\">\r\n <img alt=\"badetemp\" src={bathTemp} />\r\n </div>\r\n <div className=\"temp-info\">\r\n <span className=\"celcius\">\r\n {`${data.temperature}˚`}\r\n <span>c</span>\r\n </span>\r\n <span className=\"date\">{`${data.date.getDate()}.${\r\n months[data.date.getMonth()]\r\n } kl ${data.date.getHours()}.${\r\n data.date.getMinutes().toString().length === 1\r\n ? \"0\" + data.date.getMinutes()\r\n : data.date.getMinutes()\r\n }`}</span>\r\n </div>\r\n </div>\r\n ) : null;\r\n};\r\n\r\nexport default BadeTempBkk;\r\n","import React, { useMemo } from \"react\";\r\nimport { useRef } from \"react\";\r\nimport { useEffect } from \"react\";\r\nimport { useState } from \"react\";\r\nimport { useCallback } from \"react\";\r\nimport Icon from \"./Icon\";\r\nimport request from \"superagent\";\r\nimport config from \"../config\";\r\nimport \"./ImageCarousel.scss\";\r\n\r\nconst ImageCarousel = ({ record, small = false }) => {\r\n const ref = useRef();\r\n const [scrollPos, setScrollPos] = useState(0);\r\n const [imageUuids, setImageUuids] = useState([]);\r\n\r\n useEffect(() => {\r\n const recordUuid = record.properties.uuid;\r\n const featuredImage = record.properties.bilde_multimedia;\r\n\r\n request\r\n .get(config.adaptiveUrl + \"api/fl/vkp/\" + recordUuid)\r\n .then((res) => res.body.map((image) => image.uuid))\r\n .then((resImages) => {\r\n setImageUuids(() => {\r\n if (featuredImage) {\r\n const resImageUuids = resImages.filter(\r\n (img) => featuredImage !== img\r\n );\r\n\r\n return [featuredImage, ...resImageUuids];\r\n } else {\r\n return [...resImages];\r\n }\r\n });\r\n })\r\n .catch((e) => {\r\n console.error(e);\r\n });\r\n\r\n return () => setImageUuids([]);\r\n }, [record.properties.uuid, record.properties.bilde_multimedia]);\r\n\r\n const images = useMemo(\r\n () =>\r\n imageUuids.map(\r\n (uuid) =>\r\n config.adaptiveUrl +\r\n \"WebServices/generic/Media.asmx/Download?uuid=\" +\r\n uuid\r\n ),\r\n [imageUuids]\r\n );\r\n\r\n const handleClick = useCallback(\r\n (e) => {\r\n const scrollValue = parseInt(e.currentTarget.value);\r\n const width = ref.current.offsetWidth;\r\n const newValue = scrollPos + scrollValue;\r\n\r\n if (newValue < 0 || newValue >= images.length) return scrollPos;\r\n\r\n const scrollTo = newValue * width;\r\n ref.current.scrollTo(scrollTo, 0);\r\n },\r\n [images, scrollPos, ref]\r\n );\r\n\r\n useEffect(() => {\r\n const width = ref.current.offsetWidth;\r\n\r\n function debounce(fn, ms) {\r\n let timer;\r\n return (_) => {\r\n clearTimeout(timer);\r\n timer = setTimeout((_) => {\r\n timer = null;\r\n fn.apply(this, arguments);\r\n }, ms);\r\n };\r\n }\r\n\r\n const handleScroll = debounce(() => {\r\n const refScrollPos = Math.round(ref.current.scrollLeft);\r\n const elementScrollState = Math.round(refScrollPos / width);\r\n setScrollPos(elementScrollState);\r\n }, 100);\r\n\r\n const carousel = ref.current;\r\n\r\n carousel.addEventListener(\"scroll\", handleScroll, true);\r\n return () => carousel.removeEventListener(\"scroll\", handleScroll, true);\r\n }, [ref]);\r\n\r\n const indicatorsRef = useRef();\r\n\r\n useEffect(() => {\r\n const width = indicatorsRef.current.offsetWidth;\r\n const scrollTo = (width / 5) * scrollPos - width / 2 + 10;\r\n indicatorsRef.current.scrollTo(scrollTo, 0);\r\n }, [scrollPos]);\r\n\r\n return (\r\n <div className={\"image-carousel \" + (small ? \"small\" : \"\")}>\r\n {images.length > 1 && (\r\n <>\r\n <button\r\n className={\r\n \"navigate-arrow left \" + (scrollPos < 1 ? \"unactive\" : \"active\")\r\n }\r\n value={-1}\r\n type=\"button\"\r\n onClick={handleClick}\r\n >\r\n <Icon name=\"chevronLeft\" />\r\n </button>\r\n <button\r\n className={\r\n \"navigate-arrow right \" +\r\n (scrollPos === images.length - 1 ? \"unactive\" : \"active\")\r\n }\r\n value={1}\r\n type=\"button\"\r\n onClick={handleClick}\r\n >\r\n <Icon name=\"chevronRight\" />\r\n </button>\r\n </>\r\n )}\r\n <div className=\"image-carousel-frame\" ref={ref}>\r\n {images.map((image, i) => (\r\n <img key={i} src={image} alt={`bilde-${i}`} />\r\n ))}\r\n </div>\r\n <div className=\"image-indicators\" ref={indicatorsRef}>\r\n {images.length > 1 &&\r\n images.map((image, i) => (\r\n <span\r\n key={i}\r\n className={\r\n scrollPos === i\r\n ? \"active\"\r\n : scrollPos < i - 1\r\n ? \"small\"\r\n : scrollPos > i + 1\r\n ? \"small\"\r\n : \"\"\r\n }\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default ImageCarousel;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport request from \"superagent\";\r\nimport config from \"../config\";\r\n\r\nconst cache = {};\r\n\r\nfunction useVimeo(id) {\r\n const [vimeo, setVimeo] = useState();\r\n useEffect(() => {\r\n setVimeo(null);\r\n if (!id) return;\r\n\r\n if (cache[id]) {\r\n setVimeo(cache[id]);\r\n return;\r\n }\r\n\r\n request\r\n .get(config.adaptiveUrl + \"proxies/xVimeoEmbed.ashx?url=\" + id)\r\n .then((res) => res.body)\r\n .then((res) => {\r\n cache[id] = res;\r\n setVimeo(res);\r\n });\r\n }, [id]);\r\n return vimeo;\r\n}\r\n\r\nconst VimeoVideo = ({ id }) => {\r\n const vimeo = useVimeo(id);\r\n\r\n return vimeo ? (\r\n <div\r\n className=\"article--vimeo\"\r\n style={{\r\n paddingBottom: (100 * vimeo.height) / vimeo.width + \"%\",\r\n }}\r\n >\r\n <iframe\r\n title={vimeo.title || vimeo.video_id}\r\n src={\"https://player.vimeo.com/video/\" + vimeo.video_id}\r\n frameBorder={0}\r\n allowFullScreen\r\n />\r\n </div>\r\n ) : null;\r\n};\r\n\r\nexport default VimeoVideo;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Title from \"../Title\";\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators as bindScopedActionCreators } from \"../../utils/scopedReducer\";\r\nimport { translate } from \"react-translate\";\r\nimport { readFiltered } from \"../../redux/digiThemeReducer\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport featureStyle from \"../../utils/featureStyle\";\r\nimport {\r\n olUtils,\r\n VectorSource,\r\n provideMapState,\r\n ClusterSource,\r\n clusterStackStyle,\r\n clusterText,\r\n MapPadding,\r\n} from \"@avinet/react-openlayers\";\r\nimport { provideViewSize } from \"../../hocs/provideViewSize\";\r\nimport { Style, Circle, Fill, Stroke } from \"ol/style\";\r\nimport config from \"../../config/index\";\r\nimport BadeTemp from \"../BadeTemp\";\r\nimport BadeTempBkk from \"../BadeTempBkk\";\r\n\r\nimport \"./FriluftselementArticle.scss\";\r\nimport ImageCarousel from \"../ImageCarousel\";\r\nimport VimeoVideo from \"../VimeoVideo\";\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n readAllVkpElements: bindScopedActionCreators(\r\n readFiltered,\r\n dispatch,\r\n \"vkpElementGeomReducer\"\r\n ),\r\n };\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n mediaLoading: state.mediaFriluft.loading,\r\n mediaFiles: state.mediaFriluft.records,\r\n vkpElementGeoms: state.vkpElementGeomReducer.records,\r\n vkpElementGeomsLoading: state.vkpElementGeomReducer.loading,\r\n filterColumn: state.filterReducer,\r\n});\r\n\r\nexport const clusterStyle = clusterStackStyle({\r\n clusterLabelText: clusterText({ color: \"#333\" }),\r\n clusterLabelOffsetX: 10, // 0 is on top of each other.\r\n clusterLabelOffsetY: 20, // 0 is on top of each other.\r\n typeField: \"type\",\r\n featureStyle,\r\n});\r\n\r\nclass GodTurArticle extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n initialized: false,\r\n averageRating: 0,\r\n };\r\n }\r\n\r\n calcMapPadding() {\r\n const { viewHeight } = this.props;\r\n\r\n return [0, 0, viewHeight / 2, 0];\r\n }\r\n\r\n componentDidMount() {\r\n if (this.props.vkpElementGeoms && this.props.vkpElementGeoms.length === 0) {\r\n this.readVkpElements();\r\n }\r\n }\r\n\r\n readVkpElements() {\r\n const { readAllVkpElements, vkpElementGeomsLoading } = this.props;\r\n const me = this;\r\n if (vkpElementGeomsLoading) {\r\n setTimeout(() => me.readVkpElements(), 50);\r\n return;\r\n }\r\n readAllVkpElements(\r\n config.vestkystparkElementerPublic.columns,\r\n null,\r\n config.mapProjCode,\r\n 0,\r\n 0\r\n );\r\n this.setState({\r\n shouldUpdateVkpElementFeatures: true,\r\n });\r\n }\r\n\r\n formatContent(content) {\r\n return content && content.replace(/\\n/g, \"</br>\");\r\n }\r\n\r\n getFeatureStyle() {\r\n return new Style({\r\n image: new Circle({\r\n fill: new Fill({\r\n color: \"rgb(204, 23, 134)\",\r\n }),\r\n radius: 10,\r\n }),\r\n });\r\n }\r\n\r\n getFeatureStylePolygon() {\r\n return new Style({\r\n fill: new Fill({\r\n color: \"rgba(65, 90, 149, 0.9)\",\r\n }),\r\n stroke: new Stroke({\r\n color: \"rgba(65, 90, 149)\",\r\n }),\r\n });\r\n }\r\n\r\n get getLinks() {\r\n const {\r\n tittel1,\r\n tittel2,\r\n tittel3,\r\n tittel4,\r\n tittel5,\r\n lenke1,\r\n lenke2,\r\n lenke3,\r\n lenke4,\r\n lenke5,\r\n } = this.props;\r\n\r\n const arr = [];\r\n\r\n if (lenke1 && tittel1) {\r\n arr.push({ name: tittel1, url: lenke1 });\r\n }\r\n if (lenke2 && tittel2) {\r\n arr.push({ name: tittel2, url: lenke2 });\r\n }\r\n\r\n if (lenke3 && tittel2) {\r\n arr.push({ name: tittel3, url: lenke3 });\r\n }\r\n\r\n if (lenke4 && tittel4) {\r\n arr.push({ name: tittel4, url: lenke4 });\r\n }\r\n\r\n if (lenke5 && tittel5) {\r\n arr.push({ name: tittel5, url: lenke5 });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n render() {\r\n const { title, content, type_friluftselement, article } = this.props;\r\n\r\n const links = this.getLinks;\r\n\r\n const features =\r\n this.props.vkpElementGeoms &&\r\n this.props.vkpElementGeoms\r\n .filter((e) => e.datakilde !== 2)\r\n .map((geom) => {\r\n const f = olUtils.createFeatureFromWkt(geom.geom_wkt, {\r\n dataIndex: config.vestkystparkElementerPublic.dataIndex,\r\n id: config.vestkystparkElementerPublic.dataIndex + \"_\" + geom.id,\r\n type: geom.type,\r\n symbol_id: geom.symbol_id,\r\n datakilde: geom.datakilde,\r\n });\r\n return f;\r\n });\r\n\r\n const vimeoUrl = article.properties.vimeo_url;\r\n\r\n return (\r\n <div>\r\n <div className=\"type-title-bg\">\r\n {type_friluftselement && (\r\n <div className=\"godtur--article-type\">{type_friluftselement}</div>\r\n )}\r\n </div>\r\n <div className=\"godtur--article\">\r\n <div className=\"article-image-carusel\">\r\n <ImageCarousel record={this.props.article} />\r\n </div>\r\n <div className=\"godtur--article-flex-container\">\r\n <MapPadding padding={this.calcMapPadding()} />\r\n {article.properties.datakilde === 2 ? (\r\n <React.Fragment>\r\n <ClusterSource\r\n key=\"symbol-ontop-polygon\"\r\n layerName=\"symbol-ontop-polygon\"\r\n features={features}\r\n style={clusterStyle}\r\n clusterThreshold={100}\r\n zIndex={100}\r\n />\r\n <VectorSource\r\n layerName=\"friluftselement-polygon\"\r\n features={[\r\n olUtils.createFeatureFromWkt(\r\n article.properties.geom_omraade\r\n ),\r\n ]}\r\n styleFn={() => this.getFeatureStylePolygon}\r\n zIndex={0}\r\n />\r\n </React.Fragment>\r\n ) : (\r\n <VectorSource\r\n layerName=\"friluftselement-vector-layer\"\r\n features={[article.olFeature]}\r\n styleFn={() => this.getFeatureStyle}\r\n />\r\n )}\r\n <Title title={title} />\r\n {/* TODO refactor code */}\r\n <article className=\"godtur--article--hero\">\r\n <div className=\"godtur--article-content\">\r\n <div className=\"godtur--article-content-title\">\r\n <div className=\"title-details\">\r\n {title && title !== null && <h1>{title}</h1>}\r\n </div>\r\n </div>\r\n {article.properties && article.properties.badetemp_id && (\r\n <BadeTemp id={article.properties.badetemp_id} />\r\n )}\r\n {article.properties && article.properties.badetemp_bkk && (\r\n <BadeTempBkk id={article.properties.badetemp_bkk} />\r\n )}\r\n <div\r\n className={\r\n \"godtur--article-content-meta\" +\r\n (article.properties.datakilde === 1 ? \" punkt\" : \"\")\r\n }\r\n dangerouslySetInnerHTML={{\r\n __html: this.formatContent(content),\r\n }}\r\n />\r\n\r\n {links.length > 0 && (\r\n <div className=\"godtur--article-content-meta\">\r\n <p>Linker</p>\r\n {links.map((item, i) => (\r\n <p key={i}>\r\n <a\r\n href={item.url}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n >\r\n {item.name}\r\n </a>\r\n </p>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </article>\r\n </div>\r\n {vimeoUrl && vimeoUrl !== \"\" && <VimeoVideo id={vimeoUrl} />}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nGodTurArticle.propTypes = {\r\n // eslint-disable-next-line\r\n bilde_multimedia: PropTypes.string,\r\n id: PropTypes.string,\r\n statskog_url: PropTypes.string,\r\n title: PropTypes.string,\r\n content: PropTypes.string,\r\n article: PropTypes.object,\r\n type: PropTypes.string,\r\n tittel1: PropTypes.string,\r\n tittel2: PropTypes.string,\r\n tittel3: PropTypes.string,\r\n tittel4: PropTypes.string,\r\n tittel5: PropTypes.string,\r\n lenke1: PropTypes.string,\r\n lenke2: PropTypes.string,\r\n lenke3: PropTypes.string,\r\n lenke4: PropTypes.string,\r\n lenke5: PropTypes.string,\r\n vkpElementGeoms: PropTypes.array,\r\n readAllVkpElements: PropTypes.func.isRequired,\r\n vkpElementGeomsLoading: PropTypes.bool,\r\n viewHeight: PropTypes.number,\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(\r\n provideViewSize(\r\n withRouter(provideMapState(translate(\"GodTurArticle\")(GodTurArticle)))\r\n )\r\n);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Title from \"../components/Title\";\r\nimport GodTurArticle from \"../components/Article/GodTurArticle\";\r\nimport FriluftselementArticle from \"../components/Article/FriluftselementArticle\";\r\nimport Icon from \"../components/Icon\";\r\nimport { translate } from \"react-translate\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport { ArticleWindow } from \"@avinet/react-article-module\";\r\nimport { connect } from \"react-redux\";\r\nimport \"./ArticleDetailView.scss\";\r\n\r\nconst mapStateToProps = (state) => ({\r\n articles: state.articles.articles,\r\n});\r\n\r\nclass ArticleDetailView extends React.Component {\r\n constructor() {\r\n super();\r\n this.onClose = this.onClose.bind(this);\r\n }\r\n\r\n onClose() {\r\n const { history } = this.props;\r\n history.push(\"/alleturer/vestkystparkelementer\"); // usikker\r\n }\r\n\r\n render() {\r\n const {\r\n t,\r\n match: {\r\n params: { sourceId, articleId },\r\n },\r\n articles,\r\n } = this.props;\r\n\r\n const aid = sourceId + \"_\" + articleId;\r\n const godTurId = articles[aid] && articles[aid].properties.godtur_id;\r\n\r\n return (\r\n <div className=\"article-detail-view--container\" id=\"scrollPane\">\r\n <Title title={t(\"title\")} />\r\n {godTurId ? (\r\n <ArticleWindow\r\n articleComponent={GodTurArticle}\r\n id={aid}\r\n hideOpenExternalBtn\r\n hideLayers\r\n disableZoom\r\n >\r\n <div className=\"article-detail-view--children\">\r\n <button\r\n className=\"article-detail-view--close-btn btn\"\r\n onClick={this.onClose}\r\n >\r\n <Icon name=\"cross\" />\r\n </button>\r\n </div>\r\n </ArticleWindow>\r\n ) : (\r\n <ArticleWindow\r\n articleComponent={FriluftselementArticle}\r\n id={aid}\r\n hideOpenExternalBtn\r\n hideLayers\r\n maxZoom={15}\r\n >\r\n <div className=\"article-detail-view--children\">\r\n <button\r\n className=\"article-detail-view--close-btn btn\"\r\n onClick={this.onClose}\r\n >\r\n <Icon name=\"cross\" />\r\n </button>\r\n </div>\r\n </ArticleWindow>\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nArticleDetailView.propTypes = {\r\n articles: PropTypes.object,\r\n t: PropTypes.func.isRequired,\r\n match: PropTypes.object.isRequired,\r\n history: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default connect(mapStateToProps)(\r\n withRouter(translate(\"ArticleDetailView\")(ArticleDetailView))\r\n);\r\n","import React from \"react\";\r\nimport { Link as ReactLink } from \"react-router-dom\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nclass Link extends React.Component {\r\n isExternal(uri) {\r\n return uri.startsWith(\"http://\") || uri.startsWith(\"https://\");\r\n }\r\n\r\n prepareUri(uri) {\r\n if (this.isExternal(uri)) {\r\n return uri;\r\n } else if (uri.startsWith(\"/\")) {\r\n return uri;\r\n }\r\n return \"/\" + uri;\r\n }\r\n\r\n render() {\r\n const { to, title, ...rest } = this.props;\r\n return this.isExternal(to) ? (\r\n // eslint-disable-next-line jsx-a11y/anchor-has-content\r\n <a\r\n href={to}\r\n title=\"Avansert kartløsning tilpasset nettbrett/PC\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n {...this.props}\r\n />\r\n ) : (\r\n <ReactLink to={this.prepareUri(to)} {...rest} />\r\n );\r\n }\r\n}\r\n\r\nLink.propTypes = {\r\n to: PropTypes.string.isRequired,\r\n title: PropTypes.string,\r\n onClick: PropTypes.func,\r\n};\r\n\r\nexport default Link;\r\n","import React from \"react\";\r\nimport { translate } from \"react-translate\";\r\n\r\nclass SearchResultComponent extends React.Component {\r\n render() {\r\n const { result, onResultSelected, t } = this.props;\r\n\r\n return (\r\n <li\r\n key={result.id}\r\n className=\"clearfix\"\r\n onClick={() => onResultSelected(result)}\r\n onMouseOver={() =>\r\n result.olFeature && result.olFeature.set(\"hover\", true)\r\n }\r\n onMouseOut={() =>\r\n result.olFeature && result.olFeature.set(\"hover\", false)\r\n }\r\n >\r\n {result.length === 0 ? (\r\n <p className=\"no-results\">{t(\"noResults\")}</p>\r\n ) : (\r\n <>\r\n <h3>{result.properties.title}</h3>\r\n {result.properties.content && (\r\n <p className=\"searchSource--content\">\r\n {result.properties.content\r\n .replace(/<.*?>/g, \"\")\r\n .replace(/(&.+;)/gi, \" \")\r\n .substring(0, 150)}\r\n </p>\r\n )}\r\n <p className=\"searchSource--provider\">\r\n {result.properties.provider}\r\n </p>\r\n </>\r\n )}\r\n </li>\r\n );\r\n }\r\n}\r\n\r\nexport default translate(\"SearchResultComponent\")(SearchResultComponent);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Link from \"./Link\";\r\nimport { translate } from \"react-translate\";\r\nimport KystledLogo from \"../static/footer/Kystledlogo.png\";\r\nimport SkaergaardsLogo from \"../static/footer/Logo-Skjaergaardstjenesten.png\";\r\nimport Icon from \"../components/Icon\";\r\nimport { Search } from \"@avinet/react-article-module\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport SearchResultComponent from \"./SearchResultComponent\";\r\n\r\nconst Nav = ({ nav, navbarOpen, onNavClick, children, t, history }) => {\r\n const onResultSelected = (result) => {\r\n history.push(`/tur/${result.id.replace(\"_\", \"/\")}`);\r\n navbarOpen();\r\n };\r\n\r\n return (\r\n <div className=\"cms--nav\">\r\n <div className=\"cms--menu-links\">\r\n <Search\r\n className=\"nav-bar--search\"\r\n onResultSelected={onResultSelected}\r\n placeholder={t(\"SearchPlaceholder\")}\r\n clearButtonIcon={<Icon name=\"cross\" />}\r\n searchResult={SearchResultComponent}\r\n />\r\n {nav &&\r\n nav.map((n) => (\r\n <Link\r\n key={n.uri}\r\n to={n.menu_uri}\r\n onClick={() => onNavClick && onNavClick()}\r\n >\r\n {n.title}\r\n </Link>\r\n ))}\r\n {children}\r\n\r\n <span className=\"imgageLink-container\">\r\n <a\r\n href=\"https://kystled.no/\"\r\n target=\"_blank\"\r\n className=\"imageLink\"\r\n rel=\"noopener noreferrer\"\r\n >\r\n <img src={KystledLogo} alt=\"Kystled-logo\" />\r\n </a>\r\n <a\r\n className=\"imageLink\"\r\n href=\"https://www.friluftsrad.no/arbeidsomrader/sjo-og-friluftslivet/skjaergardstjeneste\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n >\r\n <img src={SkaergaardsLogo} alt=\"skaergaard-logo\" />\r\n </a>\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nNav.propTypes = {\r\n nav: PropTypes.array,\r\n onNavClick: PropTypes.func,\r\n children: PropTypes.element,\r\n history: PropTypes.object.isRequired,\r\n navbarOpen: PropTypes.func.isRequired,\r\n t: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default withRouter(translate(\"Nav\")(Nav));\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport { navActions } from \"@avinet/react-adaptive-cms\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport Logo from \"../static/logo_vestlandskysten.png\";\r\nimport Link from \"../components/Link\";\r\nimport Nav from \"../components/Nav\";\r\nimport \"./NavBar.scss\";\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return bindActionCreators(Object.assign({}, navActions), dispatch);\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n nav: state.nav.nav,\r\n});\r\n\r\nclass NavBar extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n navOpen: false,\r\n };\r\n\r\n this.onHamburgerClick = this.onHamburgerClick.bind(this);\r\n this.onSeachDone = this.onSeachDone.bind(this);\r\n }\r\n\r\n onSeachDone = () => {\r\n this.setState({ navOpen: false });\r\n };\r\n\r\n componentDidMount() {\r\n const { loadNav } = this.props;\r\n loadNav();\r\n }\r\n\r\n onHamburgerClick() {\r\n const { navOpen } = this.state;\r\n this.setState({ navOpen: !navOpen });\r\n }\r\n\r\n renderCmsLinks(nav) {\r\n nav = nav.filter(\r\n (n) => n.menu_uri !== \"minside\" && n.menu_uri !== \"kystled\"\r\n );\r\n return nav;\r\n }\r\n\r\n renderMapLinks() {\r\n return [\r\n {\r\n menu_uri: \"alleturer/vestkystparkelementer\",\r\n title: \"KART\",\r\n uri: \"alleturer/vestkystparkelementer\",\r\n },\r\n ];\r\n }\r\n\r\n renderBrochuresLinks(nav) {\r\n nav = nav.filter((n) => n.menu_uri === \"kystled\");\r\n return nav;\r\n }\r\n\r\n render() {\r\n const { nav } = this.props;\r\n const { navOpen } = this.state;\r\n\r\n const cmsLinks = this.renderCmsLinks(nav);\r\n const brochureLinks = this.renderBrochuresLinks(nav);\r\n const mapLinks = this.renderMapLinks();\r\n\r\n return (\r\n <div className=\"nav-bar--container\">\r\n <Link className=\"nav-bar--index-link\" to=\"/\">\r\n <img src={Logo} alt=\"navbar logo\" />\r\n </Link>\r\n <div className=\"vestlandskyst--menu\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"nav-bar--hamburger\"\r\n checked={navOpen}\r\n onChange={this.onHamburgerClick}\r\n />\r\n <span />\r\n <span />\r\n <span />\r\n <Nav\r\n className=\"nav-bar--map-menu\"\r\n nav={mapLinks}\r\n onNavClick={this.onHamburgerClick}\r\n navbarOpen={this.onSeachDone}\r\n >\r\n <React.Fragment>\r\n <div className=\"nav-bar--brochure-menu\">\r\n {brochureLinks.map((n) => (\r\n <Link\r\n key={n.uri}\r\n to={n.menu_uri}\r\n onClick={() =>\r\n this.setState({\r\n navOpen: false,\r\n })\r\n }\r\n >\r\n {n.title}\r\n </Link>\r\n ))}\r\n </div>\r\n <div className=\"nav-bar--cms-menu\">\r\n {cmsLinks.map((n) => (\r\n <Link\r\n key={n.uri}\r\n to={n.menu_uri}\r\n onClick={() =>\r\n this.setState({\r\n navOpen: false,\r\n })\r\n }\r\n >\r\n {n.title}\r\n </Link>\r\n ))}\r\n </div>\r\n </React.Fragment>\r\n </Nav>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nNavBar.propTypes = {\r\n nav: PropTypes.array,\r\n loadNav: PropTypes.func,\r\n};\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(withRouter(NavBar));\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { translate } from \"react-translate\";\r\nimport \"./Footer.scss\";\r\n\r\nclass Footer extends React.Component {\r\n render() {\r\n const { t } = this.props;\r\n return (\r\n <div className=\"footer--container\">\r\n <span>\r\n <a href=\"mailto:vestkystparken@bof.no\">{t(\"contact\")}</a>\r\n </span>\r\n |\r\n <span>\r\n <a\r\n href=\"https://www.friluftsrad.no/om-fl/forvaltningslosning/samtykke\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n >\r\n {t(\"privacy\")}\r\n </a>\r\n </span>\r\n |\r\n <span>\r\n {\" \"}\r\n {t(\"developedBy\")}\r\n <a\r\n href=\"https://avinet.no/\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n >\r\n {t(\"avinet\")}\r\n </a>\r\n </span>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nFooter.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default translate(\"Footer\")(Footer);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport NavBar from \"../containers/NavBar\";\r\nimport Footer from \"../components/Footer/Footer\";\r\nimport \"./PageLayout.scss\";\r\n\r\nclass PageLayout extends React.Component {\r\n componentDidMount() {\r\n window.scrollTo(0, 0);\r\n document\r\n .getElementsByClassName(\"react-openlayers--map\")[0]\r\n .classList.add(\"hide-map\");\r\n }\r\n\r\n render() {\r\n const { children } = this.props;\r\n return (\r\n <div className=\"page-layout--root\">\r\n <NavBar />\r\n <div className=\"page-layout--container\">\r\n <div className=\"page-layout--components\">{children}</div>\r\n </div>\r\n <Footer />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nPageLayout.propTypes = {\r\n children: PropTypes.element,\r\n};\r\n\r\nexport default PageLayout;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport NavBar from \"../containers/NavBar\";\r\nimport Footer from \"../components/Footer/Footer\";\r\nimport \"./IndexLayout.scss\";\r\n\r\nclass IndexLayout extends React.Component {\r\n componentDidMount(prevProps) {\r\n window.scrollTo(0, 0);\r\n document\r\n .getElementsByClassName(\"react-openlayers--map\")[0]\r\n .classList.add(\"hide-map\");\r\n }\r\n\r\n render() {\r\n const { children } = this.props;\r\n return (\r\n <div className=\"index-layout--root\">\r\n <NavBar />\r\n <div className=\"index-layout--container\">\r\n <div className=\"index-layout--components\">{children}</div>\r\n </div>\r\n <Footer />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nIndexLayout.propTypes = {\r\n children: PropTypes.element,\r\n};\r\n\r\nexport default IndexLayout;\r\n","import React from \"react\";\r\nimport { provideMapState } from \"@avinet/react-openlayers\";\r\nimport { PropTypes } from \"prop-types\";\r\nimport Icon from \"./Icon\";\r\nimport config from \"../config/index\";\r\n\r\nclass InitExtentButton extends React.Component {\r\n constructor() {\r\n super();\r\n this.onClick = this.onClick.bind(this);\r\n }\r\n\r\n onClick() {\r\n this.props.fitViewAndZoom(config.initExtent);\r\n }\r\n\r\n render() {\r\n const { className } = this.props;\r\n\r\n return (\r\n <div\r\n className={`init-extent-button ${className || \"\"}`}\r\n onClick={this.onClick}\r\n title=\"Zoom til hele landet\"\r\n >\r\n <Icon name={\"earth\"} />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nInitExtentButton.propTypes = {\r\n fitViewAndZoom: PropTypes.func.isRequired,\r\n className: PropTypes.string,\r\n};\r\n\r\nexport default provideMapState(InitExtentButton);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Icon from \"../components/Icon\";\r\nimport \"./Checkbox.scss\";\r\n\r\nconst Checkbox = (props) => {\r\n const { onCheckChange, checked } = props;\r\n return (\r\n <span\r\n className=\"checkbox--container\"\r\n onClick={() => onCheckChange(!checked)}\r\n >\r\n {checked && <Icon name=\"checkmark\" />}\r\n </span>\r\n );\r\n};\r\n\r\nCheckbox.propTypes = {\r\n onCheckChange: PropTypes.func.isRequired,\r\n checked: PropTypes.bool,\r\n};\r\n\r\nexport default Checkbox;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Checkbox from \"./Checkbox\";\r\nimport \"./PopupBox.scss\";\r\n\r\nclass PopupBox extends React.Component {\r\n componentWillMount() {\r\n this.setState({ checked: this.props.checkBoxChecked });\r\n }\r\n\r\n render() {\r\n const { onClose, closeBtnText, checkBoxText, children } = this.props;\r\n return (\r\n <div className=\"popup-box--overlay\">\r\n <div className=\"popup-box--container\">\r\n <div className=\"popup-box--content\">{children}</div>\r\n <div className=\"popup-box--btn-container\">\r\n {checkBoxText && (\r\n <div className=\"popup-box--checkbox-container\">\r\n <Checkbox\r\n onCheckChange={(newChecked) => {\r\n this.setState({ checked: newChecked });\r\n }}\r\n checked={this.state.checked}\r\n />\r\n <label>{checkBoxText}</label>\r\n </div>\r\n )}\r\n <button\r\n onClick={() => onClose(this.state.checked)}\r\n className=\"btn popup-box--close-btn\"\r\n >\r\n {closeBtnText}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nPopupBox.propTypes = {\r\n children: PropTypes.element,\r\n onClose: PropTypes.func.isRequired,\r\n closeBtnText: PropTypes.string.isRequired,\r\n checkBoxText: PropTypes.string,\r\n checkBoxChecked: PropTypes.bool,\r\n};\r\n\r\nexport default PopupBox;\r\n","import { useRef, useEffect } from \"react\";\r\n\r\n/**\r\n * Creates DOM element to be used as React root.\r\n * @returns {HTMLElement}\r\n */\r\nfunction createRootElement(id) {\r\n const rootContainer = document.createElement(\"div\");\r\n rootContainer.setAttribute(\"id\", id);\r\n return rootContainer;\r\n}\r\n\r\n/**\r\n * Appends element as last child of body.\r\n * @param {HTMLElement} rootElem\r\n */\r\nfunction addRootElement(rootElem) {\r\n document.body.insertBefore(\r\n rootElem,\r\n document.body.lastElementChild.nextElementSibling\r\n );\r\n}\r\n\r\n/**\r\n * Hook to create a React Portal.\r\n * Automatically handles creating and tearing-down the root elements (no SRR\r\n * makes this trivial), so there is no need to ensure the parent target already\r\n * exists.\r\n * @example\r\n * const target = usePortal(id, [id]);\r\n * return createPortal(children, target);\r\n * @param {String} id The id of the target container, e.g 'modal' or 'spotlight'\r\n * @returns {HTMLElement} The DOM node to use as the Portal target.\r\n */\r\nfunction usePortal(id, className) {\r\n const rootElemRef = useRef(null);\r\n\r\n useEffect(\r\n function setupElement() {\r\n // Look for existing target dom element to append to\r\n const existingParent = document.querySelector(`#${id}`);\r\n // Parent is either a new root or the existing dom element\r\n const parentElem = existingParent || createRootElement(id);\r\n\r\n // If there is no existing DOM element, add a new one.\r\n if (!existingParent) {\r\n addRootElement(parentElem);\r\n }\r\n\r\n // Add the detached element to the parent\r\n parentElem.appendChild(rootElemRef.current);\r\n\r\n parentElem.className = className;\r\n\r\n return function removeElement() {\r\n rootElemRef.current.remove();\r\n if (parentElem.childNodes.length === -1) {\r\n parentElem.remove();\r\n }\r\n };\r\n },\r\n [id, className]\r\n );\r\n\r\n /**\r\n * It's important we evaluate this lazily:\r\n * - We need first render to contain the DOM element, so it shouldn't happen\r\n * in useEffect. We would normally put this in the constructor().\r\n * - We can't do 'const rootElemRef = useRef(document.createElement('div))',\r\n * since this will run every single render (that's a lot).\r\n * - We want the ref to consistently point to the same DOM element and only\r\n * ever run once.\r\n * @link https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily\r\n */\r\n function getRootElem() {\r\n if (!rootElemRef.current) {\r\n rootElemRef.current = document.createElement(\"div\");\r\n }\r\n return rootElemRef.current;\r\n }\r\n\r\n return getRootElem();\r\n}\r\n\r\nexport default usePortal;\r\n","import { useRef, useEffect } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { ensureMap, provideMapState } from \"@avinet/react-openlayers\";\r\nimport Overlay from \"ol/Overlay\";\r\nimport usePortal from \"../hocs/usePortal\";\r\n\r\nconst MapOverlay = ensureMap(\r\n ({\r\n id,\r\n coords,\r\n children,\r\n map,\r\n autoPan = false,\r\n selectedFeature,\r\n changePopupClass,\r\n fitViewAndZoom,\r\n }) => {\r\n const overlayRef = useRef();\r\n const portal = usePortal(id);\r\n\r\n useEffect(() => {\r\n const overlay = new Overlay({\r\n element: portal,\r\n autoPan,\r\n stopEvent: true,\r\n positioning: \"top-center\",\r\n });\r\n\r\n map.addOverlay(overlay);\r\n\r\n overlayRef.current = overlay;\r\n\r\n return () => map.removeOverlay(overlay);\r\n }, [map, portal, autoPan]);\r\n\r\n useEffect(() => {\r\n if (overlayRef.current) {\r\n overlayRef.current.setPosition(coords);\r\n }\r\n }, [overlayRef, coords]);\r\n\r\n useEffect(() => {\r\n const top = overlayRef.current.element.style.top.replace(\"px\", \"\");\r\n const left = overlayRef.current.element.style.left.replace(\"px\", \"\");\r\n\r\n const positioning = {\r\n x: \"center\",\r\n y: \"\",\r\n };\r\n\r\n const thresholdTop = Math.round((window.innerHeight / 2 + 39) * 0.5);\r\n const thresholdBottom = window.innerHeight * 0.65;\r\n const thresholdLeft = Math.round((window.innerWidth / 2) * 0.2);\r\n const thresholdRight = window.innerWidth - thresholdLeft;\r\n\r\n if (selectedFeature.getGeometry().getType() !== \"Point\") {\r\n fitViewAndZoom(selectedFeature.getGeometry().getExtent());\r\n positioning.y = \"center\";\r\n positioning.x = \"left\";\r\n changePopupClass(\"left\");\r\n } else {\r\n if (top < thresholdTop) {\r\n positioning.y = \"top\";\r\n changePopupClass(\"top\");\r\n } else if (top > thresholdBottom) {\r\n positioning.y = \"bottom\";\r\n changePopupClass(\"bottom\");\r\n } else {\r\n positioning.y = \"center\";\r\n changePopupClass(\"\");\r\n }\r\n\r\n if (left < thresholdLeft) {\r\n positioning.x = \"left\";\r\n changePopupClass(\"left\");\r\n } else if (left > thresholdRight) {\r\n positioning.x = \"right\";\r\n changePopupClass(\"right\");\r\n } else {\r\n if (positioning.y !== \"center\") {\r\n positioning.x = \"center\";\r\n } else {\r\n const screenXCenter = Math.round(window.innerWidth / 2);\r\n\r\n if (left > screenXCenter) {\r\n positioning.x = \"right\";\r\n changePopupClass(\"right\");\r\n } else {\r\n positioning.x = \"left\";\r\n changePopupClass(\"left\");\r\n }\r\n }\r\n }\r\n }\r\n\r\n overlayRef.current.setPositioning(positioning.y + \"-\" + positioning.x);\r\n\r\n return () => {\r\n overlayRef.current.setPositioning(\"top-center\");\r\n };\r\n }, [selectedFeature, changePopupClass, fitViewAndZoom]);\r\n\r\n return createPortal(children, portal);\r\n }\r\n);\r\n\r\nexport default provideMapState(MapOverlay);\r\n","import React, { useCallback } from \"react\";\r\nimport Icon from \"./Icon\";\r\nimport \"./FeaturePopup.scss\";\r\nimport config from \"../config\";\r\nimport { useState } from \"react\";\r\nimport { useEffect } from \"react\";\r\nimport { useRef } from \"react\";\r\nimport { useMemo } from \"react\";\r\nimport ImageCarousel from \"./ImageCarousel\";\r\nimport useBadeTemp from \"../hocs/useBadeTemp\";\r\nimport bathTempSmall from \"../static/bathTempSmall.svg\";\r\n\r\nfunction TripInfo({ properties, t }) {\r\n return (\r\n <div className=\"trip-info\">\r\n <div className=\"meta-col\">\r\n <span className=\"label\">{t(\"length\")}</span>\r\n <span className=\"value\">\r\n {properties.lengde >= 1000\r\n ? `${(properties.lengde / 1000).toFixed(1)} km`\r\n : `${properties.lengde} m`}\r\n </span>\r\n </div>\r\n <div className=\"meta-col\">\r\n <span className=\"label\">{t(\"time\")}</span>\r\n <span className=\"value\">{properties.tid}</span>\r\n </div>\r\n <div className=\"meta-col\">\r\n <span className=\"label\">{t(\"season\")}</span>\r\n <span className=\"value\">{properties.sesong}</span>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction FeaturePopup({\r\n selectedFeature,\r\n articles,\r\n history,\r\n onArticleClose,\r\n t,\r\n popupClass,\r\n}) {\r\n const [properties, setProperties] = useState(null);\r\n const [imageurl, setImageurl] = useState(null);\r\n const closeRef = useRef();\r\n\r\n const shortentView = useMemo(() => {\r\n const id = selectedFeature.values_.id.split(\"_\")[1];\r\n return id.startsWith(\"02\") || id.startsWith(\"03\");\r\n }, [selectedFeature]);\r\n\r\n const handleClose = useCallback(() => {\r\n onArticleClose();\r\n }, [onArticleClose]);\r\n\r\n const handleClick = useCallback(\r\n (e) => {\r\n if (!shortentView) return;\r\n if (\r\n e.target !== closeRef.current &&\r\n !closeRef.current.contains(e.target)\r\n ) {\r\n const baseUrl = \"/tur\";\r\n\r\n history.push(\r\n baseUrl + \"/\" + selectedFeature.values_.id.replace(\"_\", \"/\")\r\n );\r\n window.scroll(0, 0);\r\n }\r\n },\r\n [shortentView, history, selectedFeature.values_.id]\r\n );\r\n\r\n useEffect(() => {\r\n if (!selectedFeature || !articles) return;\r\n\r\n const aid = selectedFeature.values_.id;\r\n\r\n const properties = articles[aid]?.properties;\r\n const imageid = properties?.bilde_multimedia;\r\n\r\n if (imageid) {\r\n const imageurl =\r\n config.adaptiveUrl +\r\n \"WebServices/generic/Media.asmx/Download?uuid=\" +\r\n imageid +\r\n \"&thumbnail_size=small\";\r\n\r\n setImageurl(imageurl);\r\n }\r\n setProperties(properties);\r\n\r\n return () => {\r\n setImageurl(null);\r\n setProperties(null);\r\n };\r\n }, [articles, selectedFeature]);\r\n\r\n const convertToClick = useCallback((e) => {\r\n const evt = new MouseEvent(\"click\", { bubbles: true });\r\n evt.stopPropagation = () => {};\r\n e.target.dispatchEvent(evt);\r\n }, []);\r\n\r\n const record = useMemo(() => articles[selectedFeature.values_.id], [\r\n articles,\r\n selectedFeature.values_.id,\r\n ]);\r\n\r\n const { data } = useBadeTemp(properties?.badetemp_id || null);\r\n\r\n if (!properties) return null;\r\n\r\n return (\r\n <>\r\n <div className=\"mobile-overlay\" />\r\n <div className={\"feature-popup \" + popupClass} onMouseUp={convertToClick}>\r\n <button className=\"close-btn\" onClick={handleClose} ref={closeRef}>\r\n <Icon name=\"close\" />\r\n </button>\r\n {record && <ImageCarousel record={record} small />}\r\n <div className={imageurl ? \"category\" : \"category large\"}>\r\n <div>{properties.type_friluftselement} </div>\r\n\r\n {data && (\r\n <div className=\"badetemp-container\">\r\n <div className=\"temp-icon\">\r\n <img alt=\"badetemp\" src={bathTempSmall} />\r\n </div>\r\n {data?.[0].measValue + \"˚C\"}\r\n </div>\r\n )}\r\n </div>\r\n {properties.lengde && <TripInfo properties={properties} t={t} />}\r\n <div\r\n className={\"popup-text-content\" + (shortentView ? \" selectable\" : \"\")}\r\n onClick={handleClick}\r\n >\r\n <h4>{properties.title}</h4>\r\n {shortentView ? (\r\n <>\r\n <div\r\n className=\"shortent\"\r\n dangerouslySetInnerHTML={{ __html: properties.content }}\r\n />\r\n <button onClick={handleClick} className=\"btn-link see-more\">\r\n {t(\"seeMore\")}\r\n <Icon name=\"chevronRight\" />\r\n </button>\r\n </>\r\n ) : (\r\n <div dangerouslySetInnerHTML={{ __html: properties.content }} />\r\n )}\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n\r\nexport default FeaturePopup;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport NavBar from \"../containers/NavBar\";\r\nimport {\r\n WmsLayer,\r\n provideMapState,\r\n LayerSwitch,\r\n LayerGroup,\r\n MapPadding,\r\n Zoom,\r\n olUtils,\r\n XYZLayer,\r\n} from \"@avinet/react-openlayers\";\r\nimport { provideViewSize } from \"../hocs/provideViewSize\";\r\nimport InitExtentButton from \"../components/InitExtentButton\";\r\nimport PopupBox from \"../components/PopupBox\";\r\nimport { translate } from \"react-translate\";\r\nimport { Search } from \"@avinet/react-article-module\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport Icon from \"../components/Icon\";\r\nimport \"./MapLayout.scss\";\r\nimport SearchResultComponent from \"../components/SearchResultComponent\";\r\nimport MapOverlay from \"../components/MapOverlay\";\r\nimport FeaturePopup from \"../components/FeaturePopup\";\r\n\r\nclass MapLayout extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n fullscreen: false,\r\n searchOpen: false,\r\n showTipBox: true,\r\n tmpHideTipBox: false,\r\n };\r\n this.onFullScreenBtnClick = this.onFullScreenBtnClick.bind(this);\r\n this.onResultSelected = this.onResultSelected.bind(this);\r\n this.onTipBoxVisibilityChange = this.onTipBoxVisibilityChange.bind(this);\r\n this.changePopupClass = this.changePopupClass.bind(this);\r\n }\r\n\r\n componentWillMount() {\r\n const tipBoxDeactivated = localStorage.getItem(\"vkp_tipboxdeactivated\");\r\n const tipboxTimestamp = localStorage.getItem(\"vkp_tipboxtimestamp\");\r\n\r\n if (tipBoxDeactivated) {\r\n this.setState({ showTipBox: false });\r\n }\r\n\r\n if (tipboxTimestamp) {\r\n const diff = Math.abs(Date.now() - tipBoxDeactivated);\r\n const diffDays = Math.floor(diff / (1000 * 3600 * 24));\r\n if (diffDays > 0) {\r\n this.setState({ tmpHideTipBox: true });\r\n }\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n document\r\n .getElementsByClassName(\"react-openlayers--map\")[0]\r\n .classList.remove(\"hide-map\");\r\n }\r\n\r\n componentDidUpdate() {\r\n const { fullscreen } = this.state;\r\n\r\n if (fullscreen) {\r\n document\r\n .getElementsByClassName(\"react-openlayers--map\")[0]\r\n .classList.add(\"map-fullscreen\");\r\n } else {\r\n document\r\n .getElementsByClassName(\"react-openlayers--map\")[0]\r\n .classList.remove(\"map-fullscreen\");\r\n }\r\n this.props.forceUpdateMap();\r\n }\r\n\r\n onResultSelected(result) {\r\n const { history } = this.props;\r\n history.push(`/tur/${result.id.replace(\"_\", \"/\")}`);\r\n this.setState({ searchOpen: false });\r\n }\r\n\r\n onFullScreenBtnClick() {\r\n const { fullscreen } = this.state;\r\n this.setState({ fullscreen: !fullscreen });\r\n }\r\n\r\n calcMapPadding() {\r\n const { viewHeight, viewWidth } = this.props;\r\n if (viewWidth < 769) {\r\n return [48, 0, viewHeight / 4, 0];\r\n }\r\n return [56, viewWidth / 2, 0, 0];\r\n }\r\n\r\n onTipBoxVisibilityChange(neverShowAgain) {\r\n if (neverShowAgain) {\r\n localStorage.setItem(\"vkp_tipboxdeactivated\", true);\r\n } else {\r\n localStorage.removeItem(\"vkp_tipboxdeactivated\");\r\n localStorage.setItem(\"vkp_tipboxtimestamp\", Date.now());\r\n }\r\n this.setState({ showTipBox: !this.state.showTipBox });\r\n }\r\n\r\n changePopupClass(className) {\r\n this.setState({ popupClass: className });\r\n }\r\n\r\n render() {\r\n const { children, t, selectedFeature, articles } = this.props;\r\n const { searchOpen, showTipBox, tmpHideTipBox, popupClass } = this.state;\r\n const checkBoxChecked = localStorage.getItem(\"vkp_tipboxdeactivated\");\r\n const mobileLayout = window.innerWidth < 700;\r\n const coords =\r\n selectedFeature &&\r\n olUtils.getCenterFromGeom(selectedFeature?.getGeometry());\r\n\r\n return (\r\n <div className=\"map-layout--root\">\r\n <MapPadding padding={this.calcMapPadding()} />\r\n <div className=\"popup-box-container\">\r\n {showTipBox && !tmpHideTipBox && (\r\n <PopupBox\r\n onClose={this.onTipBoxVisibilityChange}\r\n closeBtnText={t(\"closeTipBox\")}\r\n checkBoxText={t(\"dontshowTipBox\")}\r\n checkBoxChecked={!!checkBoxChecked}\r\n >\r\n <div\r\n dangerouslySetInnerHTML={{\r\n __html: t(\"tipboxContent\"),\r\n }}\r\n />\r\n </PopupBox>\r\n )}\r\n <div className=\"buttons\">\r\n <button\r\n className=\"map-layout--tip-btn\"\r\n onClick={() =>\r\n this.setState({ showTipBox: true, tmpHideTipBox: false })\r\n }\r\n >\r\n <Icon name=\"info\" />\r\n </button>\r\n </div>\r\n </div>\r\n <NavBar />\r\n <div\r\n className={[\"map-layout--search\", searchOpen ? \"active\" : \"\"].join(\r\n \" \"\r\n )}\r\n >\r\n <button\r\n className=\"map-layout--search-button\"\r\n onClick={() =>\r\n this.setState((prevState) => ({\r\n searchOpen: !prevState.searchOpen,\r\n }))\r\n }\r\n >\r\n <Icon name={searchOpen ? \"cross\" : \"search\"} />\r\n </button>\r\n <Search\r\n onResultSelected={this.onResultSelected}\r\n placeholder={t(\"SearchPlaceholder\")}\r\n isOpen={searchOpen}\r\n clearButtonIcon={<Icon name=\"cross\" />}\r\n searchResult={SearchResultComponent}\r\n />\r\n </div>\r\n <InitExtentButton />\r\n <Zoom\r\n zoomInTipLabel={t(\"zoomInTip\")}\r\n zoomOutTipLabel={t(\"zoomOutTip\")}\r\n />\r\n <LayerSwitch tooltip={t(\"kartlagsVelger\")}>\r\n <LayerGroup\r\n id=\"basemap_group\"\r\n enabledLayers={[\"norgeskart\"]}\r\n name={t(\"basemapGroup\")}\r\n activeIcon={<Icon name=\"radioChecked\" />}\r\n inactiveIcon={<Icon name=\"radioUnchecked\" />}\r\n singleSelect\r\n >\r\n <XYZLayer\r\n id=\"norgeskart\"\r\n name=\"Norgeskart\"\r\n key=\"norgeskart\"\r\n url=\"https://cache.kartverket.no/v1/wmts/1.0.0/topo/default/webmercator/{z}/{y}/{x}.png\"\r\n zIndex={-1}\r\n />\r\n\r\n <WmsLayer\r\n key=\"sjokart\"\r\n name=\"Sjøkart\"\r\n uri={[\"https://wms.geonorge.no/skwms1/wms.sjokartraster2\"]}\r\n id=\"sjokartraster\"\r\n layerName=\"all\"\r\n version=\"1.3.0\"\r\n zIndex={-2}\r\n useBaat\r\n />\r\n </LayerGroup>\r\n </LayerSwitch>\r\n\r\n <WmsLayer\r\n key=\"hsukart\"\r\n name=\"hsukart\"\r\n id=\"hsukart\"\r\n layerName={[\"ocean_3857\"].join(\",\")}\r\n version=\"1.3.0\"\r\n uri=\"http://map-adaptive3.avinet.no/mapserv.ashx?map=public\\world&color=219%20255%20254\"\r\n singleTile\r\n zIndex={-6}\r\n useBaat\r\n />\r\n {selectedFeature &&\r\n (mobileLayout ? (\r\n <FeaturePopup\r\n selectedFeature={selectedFeature}\r\n articles={articles}\r\n history={this.props.history}\r\n onArticleClose={this.props.onArticleClose}\r\n t={t}\r\n popupClass={popupClass}\r\n />\r\n ) : (\r\n <MapOverlay\r\n coords={coords}\r\n selectedFeature={selectedFeature}\r\n changePopupClass={this.changePopupClass}\r\n >\r\n <FeaturePopup\r\n selectedFeature={selectedFeature}\r\n articles={articles}\r\n history={this.props.history}\r\n onArticleClose={this.props.onArticleClose}\r\n t={t}\r\n popupClass={popupClass}\r\n />\r\n </MapOverlay>\r\n ))}\r\n <div>\r\n <div className=\"map-layout--components\">{children}</div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nMapLayout.propTypes = {\r\n children: PropTypes.element,\r\n t: PropTypes.func.isRequired,\r\n forceUpdateMap: PropTypes.func.isRequired,\r\n viewWidth: PropTypes.number,\r\n viewHeight: PropTypes.number,\r\n history: PropTypes.object,\r\n};\r\n\r\nexport default provideViewSize(\r\n provideMapState(withRouter(translate(\"MapLayout\")(MapLayout)))\r\n);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport PageView from \"../views/PageView\";\r\nimport ArticleView from \"../views/ArticleView\";\r\nimport ArticleDetailView from \"../views/ArticleDetailView\";\r\nimport PageLayout from \"../layouts/PageLayout\";\r\nimport IndexLayout from \"../layouts/IndexLayout\";\r\nimport MapLayout from \"../layouts/MapLayout\";\r\nimport { connect } from \"react-redux\";\r\nimport { BrowserRouter as Router, Route, Switch } from \"react-router-dom\";\r\nimport { readFiltered } from \"../redux/digiThemeReducer\";\r\nimport { bindActionCreators } from \"../utils/scopedReducer\";\r\nimport config from \"../config/index\";\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return bindActionCreators({ readFiltered }, dispatch, \"municipalities\");\r\n};\r\nconst mapStateToProps = (state) => ({\r\n municipalities: state.municipalities.records,\r\n municipalitiesLoading: state.municipalities.loading,\r\n articles: state.articles.articles,\r\n});\r\n\r\nclass AppRouter extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.onArticleOpen = this.onArticleOpen.bind(this);\r\n this.onArticleClose = this.onArticleClose.bind(this);\r\n this.state = {\r\n selectedFeature: undefined,\r\n };\r\n }\r\n componentDidMount() {\r\n const splashScreen = document.getElementById(\"splash-screen\");\r\n if (splashScreen) {\r\n splashScreen.remove();\r\n }\r\n const cfg = config;\r\n this.props.readFiltered(\r\n cfg.dtMunicipality.columns,\r\n null,\r\n cfg.mapProjCode,\r\n 0,\r\n 1000,\r\n null\r\n );\r\n }\r\n\r\n onArticleOpen(article) {\r\n this.setState({ selectedFeature: article });\r\n }\r\n\r\n onArticleClose() {\r\n this.setState({ selectedFeature: null });\r\n }\r\n\r\n render() {\r\n const { articles } = this.props;\r\n\r\n return (\r\n <Router basename={process.env.PUBLIC_URL + \"/\"}>\r\n <Switch>\r\n <Route path=\"/alleturer\">\r\n <MapLayout\r\n selectedFeature={this.state.selectedFeature}\r\n articles={articles}\r\n onArticleClose={this.onArticleClose}\r\n >\r\n <Switch>\r\n <Route\r\n path=\"/alleturer/:activeSources*\"\r\n render={(props) => (\r\n <ArticleView\r\n {...props}\r\n onArticleOpen={this.onArticleOpen}\r\n />\r\n )}\r\n />\r\n </Switch>\r\n </MapLayout>\r\n </Route>\r\n <Route path=\"/tur\">\r\n <MapLayout>\r\n <Switch>\r\n <Route\r\n path=\"/tur/:sourceId/:articleId\"\r\n component={ArticleDetailView}\r\n />\r\n </Switch>\r\n </MapLayout>\r\n </Route>\r\n\r\n <Route path=\"/:params\">\r\n <PageLayout>\r\n <Switch>\r\n <Route path=\"/:params\" component={PageView} />\r\n </Switch>\r\n </PageLayout>\r\n </Route>\r\n\r\n <Route path=\"/\">\r\n <IndexLayout>\r\n <Switch>\r\n <Route exact path=\"/index\" component={PageView} />\r\n <Route exact path=\"/\" component={PageView} />\r\n </Switch>\r\n </IndexLayout>\r\n </Route>\r\n </Switch>\r\n </Router>\r\n );\r\n }\r\n}\r\n\r\nAppRouter.propTypes = {\r\n readFiltered: PropTypes.func,\r\n onArticleOpen: PropTypes.func,\r\n};\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(AppRouter);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Map } from \"@avinet/react-openlayers\";\r\nimport { translate } from \"react-translate\";\r\nimport config from \"../config/index\";\r\n\r\nclass MapWrapper extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n center: window.innerWidth > 768 ? [1000000, 8400000] : [700000, 7900000],\r\n zoom: window.innerWidth > 768 ? 7 : 6,\r\n searchOpen: true,\r\n };\r\n }\r\n\r\n render() {\r\n const { center, zoom } = this.state;\r\n const { t, children } = this.props;\r\n\r\n return (\r\n <Map\r\n center={center}\r\n zoom={zoom}\r\n minZoom={config.minZoom}\r\n maxZoom={config.maxZoom}\r\n track\r\n baatUrl={config.adaptiveUrl}\r\n trackTipLabel={t(\"trackTip\")}\r\n hitTolerance={20}\r\n >\r\n {children}\r\n </Map>\r\n );\r\n }\r\n}\r\n\r\nMapWrapper.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n children: PropTypes.element,\r\n};\r\n\r\nexport default translate(\"App\")(MapWrapper);\r\n","// CONSTANTS\r\nexport const LOCATION_CHANGE = \"LOCATION_CHANGE\";\r\n\r\n// ACTIONS\r\nexport function locationChange(location = \"/\") {\r\n return {\r\n type: \"LOCATION_CHANGE\",\r\n payload: location,\r\n };\r\n}\r\n\r\n// SPECIALIZED ACTION CREATER\r\nexport const updateLocation = ({ dispatch }) => {\r\n return (nextLocation) => dispatch(locationChange(nextLocation));\r\n};\r\n\r\n// REDUCER\r\nconst initialState = null;\r\nexport default function locationReducer(state = initialState, action) {\r\n return action.type === LOCATION_CHANGE ? action.payload : state;\r\n}\r\n","import request from \"superagent\";\r\nimport {\r\n getSessionToken,\r\n authReducerActions,\r\n} from \"@avinet/react-adaptive-auth\";\r\nimport jsSHA from \"jssha\";\r\nimport { fixDate } from \"../utils/date\";\r\nimport config from \"../config/index\";\r\n\r\n// ------------------------------------\r\n// Constants\r\n// ------------------------------------\r\nexport const READING_USER = \"READING_USER\";\r\nexport const USER_READ = \"USER_READ\";\r\n\r\nexport const REGISTERING_USER = \"REGISTERING_USER\";\r\nexport const USER_REGISTERED = \"USER_REGISTERED\";\r\n\r\nexport const UPDATING_USER = \"UPDATING_USER\";\r\nexport const USER_UPDATED = \"USER_UPDATED\";\r\n\r\nexport const DELETING_USER = \"DELETING_USER\";\r\nexport const USER_DELETED = \"USER_DELETED\";\r\n\r\n// ------------------------------------\r\n// Actions\r\n// ------------------------------------\r\n\r\nconst readingUser = () => ({ type: READING_USER });\r\n\r\nconst userRead = (error, user) => ({\r\n type: USER_READ,\r\n payload: {\r\n error,\r\n user,\r\n },\r\n});\r\n\r\nconst userRegistered = (error, email) => ({\r\n type: USER_REGISTERED,\r\n payload: {\r\n error,\r\n email,\r\n },\r\n});\r\n\r\nconst userUpdated = (error) => ({\r\n type: USER_UPDATED,\r\n payload: {\r\n error,\r\n },\r\n});\r\n\r\nconst updatingUser = () => ({\r\n type: UPDATING_USER,\r\n});\r\n\r\nconst userDeleted = (error) => ({\r\n type: USER_DELETED,\r\n payload: {\r\n error,\r\n },\r\n});\r\n\r\nconst deletingUser = () => ({\r\n type: DELETING_USER,\r\n});\r\n\r\n// ------------------------------------\r\n// Action creators\r\n// ------------------------------------\r\nexport function getUserDetails() {\r\n return (dispatch) => {\r\n var sessionId = getSessionToken();\r\n if (!sessionId) {\r\n dispatch(userRead({ message: \"Not logged in. Cannot get user.\" }, null));\r\n return;\r\n }\r\n\r\n dispatch(readingUser());\r\n\r\n request\r\n .post(\r\n config.adaptiveUrl +\r\n \"WebServices/generic/Authentication.asmx/GetUserDetails\"\r\n )\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"Content-Type\", \"application/json\")\r\n .set(\"gm_session_id\", sessionId)\r\n .set(\"gm_lang_code\", config.gm_lang_code)\r\n .send()\r\n .end((err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(\r\n userRead(err || { message: \"Received an error from server\" }, null)\r\n );\r\n return;\r\n }\r\n response = response.body.d;\r\n\r\n if (response.sessionExpired) {\r\n dispatch(authReducerActions.sessionExpired());\r\n }\r\n\r\n if (response.exception || !response.success) {\r\n dispatch(\r\n userRead(\r\n response.exception || {\r\n message: \"Received an error from server\",\r\n },\r\n null\r\n )\r\n );\r\n return;\r\n }\r\n\r\n if (!response.data || !response.data.length) {\r\n dispatch(userRead({ message: \"Empty response from server\" }, null));\r\n return;\r\n }\r\n const user = response.data[0].value;\r\n if (user.create_date) {\r\n user.create_date = fixDate(user.create_date);\r\n }\r\n if (user.last_logged_in) {\r\n user.last_logged_in = fixDate(user.last_logged_in);\r\n }\r\n if (user.last_pass_change) {\r\n user.last_pass_change = fixDate(user.last_pass_change);\r\n }\r\n if (user.modify_date) {\r\n user.modify_date = fixDate(user.modify_date);\r\n }\r\n if (user.user_data.create_date) {\r\n user.user_data.create_date = fixDate(user.user_data.create_date);\r\n }\r\n if (user.user_data.modify_date) {\r\n user.user_data.modify_date = fixDate(user.user_data.modify_date);\r\n }\r\n dispatch(userRead(null, user));\r\n });\r\n };\r\n}\r\n\r\nexport function clearUser() {\r\n return (dispatch) => {\r\n dispatch(userRead(null, null));\r\n };\r\n}\r\n\r\nexport function registerUser(\r\n firstname,\r\n surname,\r\n email,\r\n pass,\r\n mobile,\r\n organization\r\n) {\r\n return (dispatch) => {\r\n dispatch({ type: REGISTERING_USER, payload: true });\r\n\r\n // eslint-disable-next-line\r\n var shaObj = new jsSHA(\"SHA-512\", \"TEXT\");\r\n shaObj.update(pass);\r\n var hash = shaObj.getHash(\"HEX\");\r\n\r\n const params = {\r\n url: config.guiUrl,\r\n email: email,\r\n pass: hash,\r\n mobile: mobile,\r\n company: organization,\r\n first_name: firstname,\r\n last_name: surname,\r\n };\r\n\r\n request\r\n .post(\r\n config.adaptiveUrl +\r\n \"WebServices/generic/Authentication.asmx/RegisterUser\"\r\n )\r\n .send(params)\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_lang_code\", config.gm_lang_code)\r\n .end((err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(\r\n userRegistered({ message: \"Error returned from service\" }, null)\r\n );\r\n return;\r\n }\r\n response = response.body.d;\r\n\r\n if (response.sessionExpired) {\r\n dispatch(authReducerActions.sessionExpired());\r\n }\r\n\r\n if (response.exception || !response.success) {\r\n dispatch(\r\n userRegistered(\r\n response.exception || {\r\n message: \"Error returned from service\",\r\n },\r\n null\r\n )\r\n );\r\n return;\r\n }\r\n dispatch(userRegistered(null, email));\r\n });\r\n };\r\n}\r\n\r\nexport const updateUser = (user) => {\r\n return (dispatch) => {\r\n const sessionId = getSessionToken();\r\n if (!sessionId) {\r\n dispatch(\r\n userUpdated({ message: \"Not logged in. Cannot get user.\" }, null)\r\n );\r\n return;\r\n }\r\n const data = {\r\n firstname: user.user_data.first_name,\r\n surname: user.user_data.last_name,\r\n mobile: user.user_data.mobile,\r\n organization: user.user_data.company,\r\n email: user.email,\r\n };\r\n dispatch(updatingUser());\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/godtur/User.asmx/UpdateUser\")\r\n .send(data)\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_lang_code\", config.gm_lang_code)\r\n .set(\"gm_session_id\", sessionId)\r\n .end((err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(\r\n userUpdated(\r\n err || { message: \"Received an error from server\" },\r\n null\r\n )\r\n );\r\n return;\r\n }\r\n response = response.body.d;\r\n\r\n if (response.sessionExpired) {\r\n dispatch(authReducerActions.sessionExpired());\r\n }\r\n\r\n if (response.exception || !response.success) {\r\n dispatch(\r\n userUpdated(\r\n response.exception || {\r\n message: \"Received an error from server\",\r\n },\r\n null\r\n )\r\n );\r\n return;\r\n }\r\n dispatch(userUpdated(null));\r\n });\r\n };\r\n};\r\n\r\nexport function deleteUser(uuid, callback) {\r\n return (dispatch) => {\r\n var sessionId = getSessionToken();\r\n if (!sessionId) {\r\n dispatch(\r\n userDeleted({ message: \"Not logged in. Cannot get user.\" }, null)\r\n );\r\n return;\r\n }\r\n\r\n dispatch(deletingUser());\r\n\r\n request\r\n .post(\r\n config.adaptiveUrl +\r\n \"WebServices/telltur/Users.asmx/DeleteTellTurAccount\"\r\n )\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"Content-Type\", \"application/json\")\r\n .set(\"gm_session_id\", sessionId)\r\n .set(\"gm_lang_code\", config.gm_lang_code)\r\n .send({\r\n uuid,\r\n })\r\n .end((err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(\r\n userDeleted(\r\n err || { message: \"Received an error from server\" },\r\n null\r\n )\r\n );\r\n return;\r\n }\r\n response = response.body.d;\r\n\r\n if (response.sessionExpired) {\r\n dispatch(authReducerActions.sessionExpired());\r\n }\r\n\r\n if (response.exception || !response.success) {\r\n dispatch(\r\n userDeleted(\r\n response.exception || {\r\n message: \"Received an error from server\",\r\n },\r\n null\r\n )\r\n );\r\n return;\r\n }\r\n dispatch(userDeleted(null));\r\n if (callback) {\r\n callback();\r\n }\r\n });\r\n };\r\n}\r\n\r\n// ------------------------------------\r\n// Reducer\r\n// ------------------------------------\r\nconst initialState = {\r\n loading: false,\r\n error: null,\r\n user: null,\r\n registeredUserEmail: \"\",\r\n};\r\n\r\nexport function userReducer(state = initialState, action) {\r\n switch (action.type) {\r\n case READING_USER:\r\n return Object.assign({}, state, {\r\n loading: true,\r\n user: null,\r\n error: null,\r\n });\r\n case REGISTERING_USER:\r\n return Object.assign({}, state, {\r\n loading: true,\r\n user: null,\r\n error: null,\r\n registeredUserEmail: \"\",\r\n });\r\n case USER_READ:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n user: action.payload.user,\r\n error: action.payload.error,\r\n });\r\n case USER_REGISTERED:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n error: action.payload.error,\r\n user: null,\r\n registeredUserEmail: action.payload.email,\r\n });\r\n case USER_UPDATED:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n error: action.payload.error,\r\n });\r\n case UPDATING_USER:\r\n return Object.assign({}, state, {\r\n loading: true,\r\n error: null,\r\n });\r\n case USER_DELETED:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n error: action.payload.error,\r\n });\r\n case DELETING_USER:\r\n return Object.assign({}, state, {\r\n loading: true,\r\n error: null,\r\n });\r\n default:\r\n return state;\r\n }\r\n}\r\n","// ------------------------------------\r\n// Constants\r\n// ------------------------------------\r\nexport const UPDATE_MAP_HISTORY = \"UPDATE_MAP_HISTORY\";\r\n\r\n// ------------------------------------\r\n// Actions\r\n// ------------------------------------\r\n\r\nconst updateHistory = (lastZoomLevel, lastMapCenter) => ({\r\n type: UPDATE_MAP_HISTORY,\r\n payload: {\r\n lastZoomLevel,\r\n lastMapCenter,\r\n },\r\n});\r\n\r\n// ------------------------------------\r\n// Action creators\r\n// ------------------------------------\r\nexport function updateMapHistory(lastZoomLevel, lastMapCenter) {\r\n return (dispatch) => {\r\n dispatch(updateHistory(lastZoomLevel, lastMapCenter));\r\n };\r\n}\r\n\r\n// ------------------------------------\r\n// Reducer\r\n// ------------------------------------\r\nconst initialState = {\r\n lastZoomLevel: undefined,\r\n lastMapCenter: undefined,\r\n};\r\n\r\nexport function mapHistoryReducer(state = initialState, action) {\r\n switch (action.type) {\r\n case UPDATE_MAP_HISTORY:\r\n return Object.assign({}, state, {\r\n lastMapCenter: action.payload.lastMapCenter,\r\n lastZoomLevel: action.payload.lastZoomLevel,\r\n });\r\n default:\r\n return state;\r\n }\r\n}\r\n","import { readFiltered } from \"../utils/DigiTheme\";\r\nimport config from \"../config/index\";\r\n\r\nconst columns = [\"id\", \"title\", \"type\", \"date\", \"county\", \"municipality\"];\r\n\r\n// ------------------------------------\r\n// Constants\r\n// ------------------------------------\r\n\r\nexport const READING_ACTIVITIES = \"READING_ACTIVITIES\";\r\nexport const ACTIVITIES_READ = \"READ_ACTIVITIES\";\r\n\r\n// ------------------------------------\r\n// Actions\r\n// ------------------------------------\r\n\r\nconst readActivities = () => ({ type: READING_ACTIVITIES });\r\n\r\nconst activitiesRead = (error, activities) => {\r\n return {\r\n type: ACTIVITIES_READ,\r\n payload: {\r\n error,\r\n activities,\r\n },\r\n };\r\n};\r\n\r\n// ------------------------------------\r\n// Action creators\r\n// ------------------------------------\r\n\r\nexport function getActivities() {\r\n return (dispatch) => {\r\n dispatch(readActivities());\r\n\r\n const filter = {\r\n filterColumns: [],\r\n sortColumns: [\r\n {\r\n name: \"date\",\r\n },\r\n ],\r\n secondFilter: [],\r\n defaultFilter: [],\r\n distinctColumns: [],\r\n };\r\n readFiltered(\r\n config.activitiesDigiThemeUuid,\r\n columns,\r\n filter,\r\n (err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(\r\n activitiesRead(\r\n err || { message: \"Received an error from server\" },\r\n undefined\r\n )\r\n );\r\n return;\r\n }\r\n response = response.body.d;\r\n\r\n if (response.exception || !response.success) {\r\n dispatch(\r\n activitiesRead(\r\n response.exception || {\r\n message: \"Received an error from server\",\r\n },\r\n undefined\r\n )\r\n );\r\n return;\r\n }\r\n\r\n dispatch(activitiesRead(undefined, response.records));\r\n }\r\n );\r\n };\r\n}\r\n\r\n// ------------------------------------\r\n// Reducer\r\n// ------------------------------------\r\n\r\nconst initialState = {\r\n activities: [],\r\n loading: false,\r\n};\r\n\r\nexport function activityReducer(state = initialState, action) {\r\n switch (action.type) {\r\n case READING_ACTIVITIES:\r\n return Object.assign({}, state, { loading: true });\r\n case ACTIVITIES_READ:\r\n return Object.assign({}, state, {\r\n activities: action.payload.activities,\r\n loading: false,\r\n });\r\n default:\r\n return state;\r\n }\r\n}\r\n","/** @format */\r\n\r\nimport { combineReducers } from \"redux\";\r\nimport locationReducer from \"./location\";\r\nimport { articleReducer } from \"@avinet/react-article-module\";\r\nimport { userReducer } from \"./user\";\r\nimport { pageReducer, navReducer } from \"@avinet/react-adaptive-cms\";\r\nimport { mapHistoryReducer } from \"./mapHistory\";\r\nimport { filterReducer } from \"./filterReducer\";\r\nimport { activityReducer } from \"./activities\";\r\nimport digiThemeReducer from \"./digiThemeReducer\";\r\nimport mediaReducer from \"./mediaReducer\";\r\nimport { authReducer } from \"@avinet/react-adaptive-auth\";\r\nimport config from \"../config/index\";\r\n\r\nexport const makeRootReducer = (asyncReducers) => {\r\n return combineReducers({\r\n location: locationReducer,\r\n articles: articleReducer,\r\n page: pageReducer,\r\n user: userReducer,\r\n mapHistory: mapHistoryReducer,\r\n filterReducer: filterReducer,\r\n newsReducer: digiThemeReducer(\"newsReducer\", config.dtNews.uuid),\r\n tripPoints: digiThemeReducer(\"tripPoints\", config.dtPoint.uuid),\r\n tripLines: digiThemeReducer(\"tripLines\", config.dtLine.uuid),\r\n municipalities: digiThemeReducer(\r\n \"municipalities\",\r\n config.dtMunicipality.uuid\r\n ),\r\n trips: digiThemeReducer(\"trips\", config.dtTrips.uuid),\r\n activityReducer: activityReducer,\r\n nav: navReducer,\r\n mediaTrips: mediaReducer(\"mediaTrips\", config.dtTrips.uuid),\r\n mediaFriluft: mediaReducer(\"mediaFriluft\", config.dtFriluft.uuid),\r\n auth: authReducer,\r\n vkpElementGeomReducer: digiThemeReducer(\r\n \"vkpElementGeomReducer\",\r\n config.vestkystparkElementerPublic.uuid\r\n ),\r\n\r\n ...asyncReducers,\r\n });\r\n};\r\n\r\nexport const injectReducer = (store, { key, reducer }) => {\r\n if (Object.hasOwnProperty.call(store.asyncReducers, key)) return;\r\n store.asyncReducers[key] = reducer;\r\n store.replaceReducer(makeRootReducer(store.asyncReducers));\r\n};\r\n\r\nexport default makeRootReducer;\r\n","/** @format */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Provider } from \"react-redux\";\r\nimport { TranslatorProvider } from \"react-translate\";\r\nimport translations from \"./translations/translations\";\r\n\r\nimport {\r\n translations as reactArticleModuleTranslations,\r\n ArticleModule,\r\n} from \"@avinet/react-article-module\";\r\nimport Router from \"./router\";\r\nimport MapWrapper from \"./components/MapWrapper\";\r\nimport \"./App.scss\";\r\nimport { withReducer } from \"./hocs/withReducer\";\r\nimport config from \"./config/index\";\r\n\r\nclass App extends React.Component {\r\n getTranslations(lang) {\r\n return Object.assign(\r\n translations[lang],\r\n reactArticleModuleTranslations[lang]\r\n );\r\n }\r\n\r\n render() {\r\n const { store } = this.props;\r\n\r\n return (\r\n <Provider store={store}>\r\n <TranslatorProvider translations={this.getTranslations(\"no\")}>\r\n <MapWrapper>\r\n <ArticleModuleComponent>\r\n <Router />\r\n </ArticleModuleComponent>\r\n </MapWrapper>\r\n </TranslatorProvider>\r\n </Provider>\r\n );\r\n }\r\n}\r\n\r\nApp.propTypes = {\r\n store: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default App;\r\n\r\nconst ArticleModuleComponent = withReducer((props) => {\r\n return (\r\n <ArticleModule\r\n adaptiveUrl={config.adaptiveUrl}\r\n articleModuleUuid={config.articleModuleUuid}\r\n onSearchInit={(reducer) => props.injectReducer(\"searchSources\", reducer)}\r\n >\r\n {props.children}\r\n </ArticleModule>\r\n );\r\n});\r\n","import React from \"react\";\r\nimport { injectReducer as defaultInjectReducer } from \"../redux/reducers\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n/**\r\n * Higher order component (HOC) that allows any other component to monitor view\r\n * state.\r\n *\r\n * Provides props viewWidth, viewHeight.\r\n */\r\nexport function withReducer(WrappedComponent) {\r\n class WithReducer extends React.Component {\r\n constructor() {\r\n super();\r\n this.injectReducer = this.injectReducer.bind(this);\r\n }\r\n\r\n injectReducer(key, reducer) {\r\n defaultInjectReducer(this.context.store, { key, reducer });\r\n }\r\n\r\n render() {\r\n return (\r\n <WrappedComponent injectReducer={this.injectReducer} {...this.props} />\r\n );\r\n }\r\n }\r\n\r\n WithReducer.contextTypes = {\r\n store: PropTypes.object,\r\n };\r\n\r\n return WithReducer;\r\n}\r\n","// In production, we register a service worker to serve assets from local cache.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === \"localhost\" ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === \"[::1]\" ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport default function register() {\r\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener(\"load\", () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n \"This web app is being served cache-first by a service \" +\r\n \"worker. To learn more, visit https://goo.gl/SC7cgQ\"\r\n );\r\n });\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then((registration) => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === \"installed\") {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log(\"New content is available; please refresh.\");\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log(\"Content is cached for offline use.\");\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch((error) => {\r\n console.error(\"Error during service worker registration:\", error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then((response) => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n if (\r\n response.status === 404 ||\r\n response.headers.get(\"content-type\").indexOf(\"javascript\") === -1\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then((registration) => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n \"No internet connection found. App is running in offline mode.\"\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if (\"serviceWorker\" in navigator) {\r\n navigator.serviceWorker.ready.then((registration) => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport App from \"./App\";\r\nimport createStore from \"./redux/createStore\";\r\nimport { unregister } from \"./registerServiceWorker\";\r\nimport { CmsConfig } from \"@avinet/react-adaptive-cms\";\r\nimport flickr from \"./utils/flickr\";\r\nimport config from \"./config/index\";\r\nimport \"./index.scss\";\r\n\r\nconst initialState = window.__INITIAL_STATE__;\r\nconst store = createStore(initialState);\r\n\r\nCmsConfig.init(config.adaptiveUrl, config.cms_site_id);\r\nflickr(config.flickrConfig.flickrApiKey, config.flickrConfig.userId);\r\nReactDOM.render(<App store={store} />, document.getElementById(\"root\"));\r\nunregister();\r\n","import { applyMiddleware, compose, createStore } from \"redux\";\r\nimport thunk from \"redux-thunk\";\r\n// import logger from 'redux-logger';\r\nimport makeRootReducer from \"./reducers\";\r\n\r\nexport default (initalState = {}) => {\r\n // Middleware Configuration\r\n const middleware = [thunk];\r\n\r\n // eslint-disable-next-line\r\n if (process.env.NODE_ENV !== \"production\") {\r\n // middleware.push(logger);\r\n }\r\n // Store Enhancers\r\n const enhancers = [];\r\n if (window.__REDUX_DEVTOOLS_EXTENSION__) {\r\n enhancers.push(window.__REDUX_DEVTOOLS_EXTENSION__());\r\n }\r\n\r\n let composeEnhancers = compose;\r\n\r\n // Store Instatiation and HMR Setup\r\n const store = createStore(\r\n makeRootReducer(),\r\n initalState,\r\n composeEnhancers(applyMiddleware(...middleware), ...enhancers)\r\n );\r\n\r\n store.asyncReducers = {};\r\n\r\n // eslint-disable-next-line\r\n if (module.hot) {\r\n // eslint-disable-next-line\r\n module.hot.accept(\"./reducers\", () => {\r\n // eslint-disable-next-line\r\n const reducers = require(\"./reducers\").default;\r\n store.replaceReducer(reducers(store.asyncReducers));\r\n });\r\n }\r\n return store;\r\n};\r\n"],"sourceRoot":""}