{"version":3,"sources":["static/p_charger_map.svg","static/logo_telltur_hvit.png","static/header-bg.jfif","static/benk.png","static/fiske.svg","static/sykle.svg","static/ballek.png","lib/lazyload.js","static/gradering_enkel.jpg","static/gradering_middels.jpg","static/gradering_krevende.jpg","static/gradering_ekspert.jpg","static/telefon_telltur_BF-red.png","static/friluftsraad-bg.svg","static/parking_blue.svg","static/parking_map.svg","translations/translations.js","translations/en.js","translations/no.js","components/Icon.js","components/LoadingIndicator.js","config/TellTur.js","hooks/useSearch.js","hooks/useActiveSources.js","containers/TellturSearch.js","utils/Path.js","containers/NavBar.js","components/Footer.js","layouts/CoreLayout.js","hocs/provideViewSize.js","layouts/MapLayout.js","layouts/IndexLayout.js","utils/date.js","redux/user.js","components/Title.js","components/Checkbox.js","components/PopupBox.js","utils/profile.js","components/ProfileValidator.js","components/IndexPage.js","utils/scopedReducer.js","utils/digiTheme.js","views/PageView.js","utils/Page.js","redux/DigiTheme.js","redux/companies.js","components/TranslatedServerError.js","components/UserRegistrationForm.js","components/UserRegistrationPage.js","components/LoginPage.js","components/TextEditableControl.js","components/EditableSearchDropdown.js","components/MyProfileForm.js","utils/privacy.js","components/ProfilePage.js","redux/familymembers.js","components/Modal.js","redux/competition.js","containers/competition/CompetitionPage.js","containers/MyProfile.js","components/ResetPasswordPage.js","components/ChangePasswordPage.js","components/AddMemberPage.js","components/AddMemberContainer.js","components/MyTrips/TripList.js","components/MyTrips/MemberSelect.js","redux/trips.js","containers/MyTripsContainer.js","components/Results/ResultList.js","containers/competition/CompetitionResults.js","components/Switch.js","components/YearSelector.js","components/Pagination.js","requests.js","utils/array.js","redux/statistics.js","containers/Results/ResultCard.js","components/Results/ResultsPage.js","containers/Results/ResultsContainer.js","containers/competition/JoinCompetitionForm.js","containers/competition/CompetitionsList.js","containers/competition/Competitions.js","components/FriluftsradPage.js","views/HybridPageView.js","views/LogoutView.js","components/TellturArticleListComponent.js","redux/mapHistory.js","components/ErrorBoundary.js","components/Map/StiLayer.js","views/ArticleView.js","components/TellturArticle.js","redux/destination.js","containers/DestinationStats.js","views/ArticleDetailView.js","components/RegisterTripForm.js","components/RegisterTripPage.js","views/RegisterTripView.js","routes/PrivateRoute.js","components/FriluftsradListPage.js","routes/index.js","components/Parking.js","components/Map/ParkingLayer.js","components/Map/VectorTileLayer.js","components/Map/XYZLayer.js","components/Map/DefaultMap.js","containers/App.js","redux/location.js","redux/friluftsraad.js","redux/reducers.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","translations","en","locale","LoginPage","LogIn","Username","Password","ForgotPassword","NewUser","RegisterHere","Error","sessionExpired","UserRegistrationPage","UsernameTooShort","PasswordsDoNotMatch","PasswordIsTooShort","FirstnameNotValid","SurnameNotValid","MobileNotValid","EmailAddressNotValid","MunicipalityNotValid","YearOfBirthNotValid","ToLogin","SelectedFriluftsraadIdIsMissing","SelectedCompanyIdIsInvalid","UserRegistrationForm","Register","PasswordRepeat","Firstname","Surname","Mobile","Email","Municipality","YearOfBirth","AddCompany","ChooseFriluftsraad","ChooseMunicipality","Agree","ResetPasswordPage","SendNewPassword","Cancel","CouldNotResetPassword","PasswordResetInfoText","GoBack","ChangePasswordPage","CurrentPassword","NewPassword","RepeatNewPassword","SaveNewPassword","PasswordChanged","CouldNotChangePassword","MyProfilePage","ChangePassword","EditFamilyMembers","DeleteAccount","ConfirmDelete","SelectedFriluftsraadIsInvalid","SelectFriluftsraad","ConnectedToFriluftsraad","ConnectedToCompany","EditableDropdown","Save","MyProfileForm","Nickname","Fullname","SelectedFriluftsraad","AddMemberPage","Year","AddNewUser","Delete","FriluftsraadNotValid","RegisterTripForm","RegisterTrip","SeeRegisteredTripsOn","ThisPage","TripCode","TripDate","RegisterTripAsMember","RegisterTripPage","NotLoggedIn","TripCodeNotValid","TripDateNotValid","SelectAMember","CantRegisterTripsFromLastYear","CantRegisterTripsInFuture","Title","MemberList","Trips","ArticleView","showFriluftsrad","showTipBox","ArticleDetailView","title","NavBar","MyProfile","LogOut","TellturSearch","tellturSearchPlaceholder","tellturSearchPlaceholderSelected","DestinationStats","lastVisitors","topVisitors","visitorStatistics","noVisitors","ResultsPage","MostPoints","Points","LoadAll","showTopFive","UniqueDestinations","Destination","Friluftsraad","Company","TranslatedServerError","UserExists","InvalidUser","InvalidTurmaal","InvalidOwner","EmailInUse","TurmaalNotActive","TURMAAL_ALREADY_REGISTERED_TODAY","DATO_ERROR","INVALID_FAMILY_MEMBER","MyTripsContainer","NoTrips","TripList","PageView","Welcome","ReminderText1","ReminderText2","Competitions","CompetitionsTheme","Description","LinkToResults","LinkToYourProfile","NoCompetitions","CompetitionsList","YearOfBirthFrom","YearOfBirthTo","StartDate","EndDate","Participate","CompetitionResults","CompetitionDescription","LinkToFriluftsrad","NoUniqueJoinedCompetitions","JoinCompetitionForm","ConfirmJoin","ConfirmDescription","ChooseMember","Success","ButtonCancel","ButtonClose","ButtonConfirm","CompetitionPage","Note","NoMemberCompetitions","CancelationConfirm","CancelationDescription","CancelationDescriptionNote","no","DefaultMap","zoomInTip","zoomOutTip","ProfileValidator","RepeatPassword","Unjoin","General","ArticleList","NoResults","NoResultsTryChange","Loading","tipboxContent","closeTipBox","dontshowTipBox","sourceselectorText1","sourceselectorText2","InstafeedComponent","instagramHeader","instafeedEmpty","CompanyName","Participants","PointsNorm","TotalPoints","Search","AllFr","MyFr","AllCompanies","MyCompany","ResultCard","ChooseYear","cannot_change_frilufstrad_active_competitions","TellturArticle","InactiveTrip","MovedTrip","copyLinkBtn","copyLink","linkCopied","copyLinkCloseBtn","elevation","points","startDate","endDate","Trip","DeleteTrip","IndexPage","ActiveCompetitions","JoinNow","FindTrip","CheckCompetitions","Description1","Description2","Description3","Description4","UseMapLink","GoToFrLink","GoToAboutLink","GoodLuck","Covid1","Covid2","readMore","terms","destinations","Started","Ends","invalid_user","invalid_family_member","compotition_not_found","competition_wrong_friluftsrad","already_joined_competition","competition_not_active","user_too_young","user_too_old","competition_not_found","icons","search","viewBox","d","pencil","unlock","checkmark","userplus","userminus","usersGroup","xmlns","width","height","transform","trash","cross","profile","share","facebook","load","chevronUp","chevronDown","chevronRight","chevronLeft","info","checkmarkInCircle","map","medal","print","Icon","props","name","LoadingIndicator","state","timer","displayLoadingIndicator","setState","React","Component","guiId","activeStiLayer","grayStiLayer","uuid","columns","navn","nummer","useSearch","query","sources","mapExtent","mapCenter","projCode","useContext","ArticleModuleContext","useState","loading","setLoading","results","setResults","useEffect","extent","Promise","resolve","reject","bbox","olUtils","transformExtent","bottom","right","data","q","srsid","start","limit","layers","s","value","layerId","join","request","post","config","send","set","then","res","success","exception","records","rec","desc","elementType","geom","layerName","uid","values","relevance","objId","split","find","toString","id","dataIndex","feature","createFeatureFromWkt","color","fillColor","getGeometry","properties","content","geometry","type","getType","coordinates","getCoordinates","olFeature","filter","parseIndexerResponse","catch","performIndexQuery","console","error","useActiveSources","useLocation","pathname","useMemo","test","activeSources","styleFunction","Style","image","Circle","stroke","Stroke","get","fill","Fill","radius","zIndex","SearchResultComponent","result","onResultSelected","key","onClick","onMouseOver","onMouseOut","style","display","borderRadius","background","marginRight","text","dangerouslySetInnerHTML","__html","substring","provideMapState","ensureArticleModuleConfig","isOpen","t","useTranslate","setQuery","debouncedQuery","setDebouncedQuery","visible","setVisible","searchField","useRef","tId","current","focus","activeSourceIds","indexOf","features","Object","f","handleResultSelected","useCallback","toLowerCase","required","ref","onChange","onFocus","getPath","location","fixLinks","history","pageContent","getElementsByClassName","links","getElementsByTagName","forEach","link","host","href","onclick","nl","preventDefault","hash","elem","getElementById","substr","scrollIntoView","scrollBy","navOpen","searchOpen","currentPath","bind","loadNav","path","nextProps","getSessionToken","menu_uri","uri","nav","some","includes","nextState","navItems","getNavItems","profileNav","getProfileNav","omTellTurNav","getOmTellTurNav","to","Logo","alt","checked","onNavClick","Fragment","n","connect","dispatch","bindActionCreators","assign","navActions","translate","withRouter","Footer","currentPage","rel","CoreLayout","children","WrappedComponent","MapLayout","viewHeight","viewWidth","padding","calcMapPadding","provideViewSize","handleViewSizeChange","IndexLayout","fixDate","date","parseInt","userRead","user","payload","userRegistered","email","userUpdated","userDeleted","getUserDetails","sessionId","end","err","response","ok","authReducerActions","userObj","create_date","last_logged_in","last_pass_change","modify_date","user_data","familyMembersObj","familymembers","undefined","message","clearUser","registerUser","firstname","surname","pass","userData","yearOfBirth","selectedFriluftsraadId","selectedCompanyId","consentEmail","shaObj","jsSHA","getHash","params","url","mobile","nick_name","first_name","last_name","address_city","description","selected_friluftsraad_uuid","bedrift_id","telltur_user_email_consent","updateUser","extraParams","deleteUser","initialState","registeredUserEmail","userReducer","action","oldTitle","Checkbox","onCheckChange","PopupBox","checkBoxChecked","onClose","closeBtnText","checkBoxText","newChecked","validateProfile","familymember","validationErrors","general","valid","errors","setHours","yearofbirth","getFullYear","isNaN","municipality","keys","onDisplayProfilePopupClose","displayProfileUpdatePopup","localStorage","setItem","mainMember","is_main_familymember","competitions","friluftsraadHref","getAssocietedFriluftsraadUri","tomorrow","setDate","getDate","activeCompetitions","competition","end_date","headerImg","fiske","sykle","benk","wrapDispatch","reducerKey","wrappedDispatch","wrappedAction","globalDispatch","getState","extraArgument","wrapAction","actionCreators","originalBindActionCreator","createAction","readSuccess","total","readObjectSuccess","record","readFailed","readAny","srid","readObject","getReducerState","adaptiveUrl","code","actions","theme_uuid","themeUuid","saving","deleting","handleActions","geom_wkt","r","loadPage","resetDigiTheme","readFriluftsraadCompetitions","readCompetitions","filterColumns","netType","comparisonOperator","logicalOperator","sortColums","page","pageLoading","userLoading","friluftsraad","myFr","fr","myFrUri","competitionsLoading","readFriluftsraad","pageActions","scopedBindActionCreators","digiThemeActions","getPageSections","sections","sectionArray","concat","trim","readFiltered","editable","onlyOwned","objectId","fkColumn","fkColumnIds","only_owned","object_id","fk_column","fk_column_ids","companiesRead","companies","getCompanies","friluftsraadId","sortColumns","secondFilter","defaultFilter","distinctColumns","companyReducer","cssClass","meta","errorMessage","username","msg","getServerErrorMessage","errorCssClass","onTextChange","evt","handleChange","proposedFriluftsraad","getAssociatedFriluftsraad","prevProps","newValue","associatedFriluftsraadArr","allFriluftsraad","friluftsraadMedlemskommuner","associatedFriluftsraad","kommune","asf","fr_id","rolle_id","label","options","password","passwordRepeat","municipalities","registerUserError","handleSubmit","min","max","classNamePrefix","getGroupedMunicipalities","getOptionLabel","o","getOptionValue","komm","di","fylke","String","sort","a","b","redirect","validateForm","getAllFriluftsraad","readFriluftsraadMedlemskommuner","numberRegex","createdUser","friluftsraadMedlemskommunerLoading","onLogin","onLoggingIn","loggedIn","baseUrl","showLabels","loginText","emailLabelText","passwordLabelText","errorText","onLoading","auth","TextEditableControl","editMode","editedControlValue","controlValue","onBlur","onSubmit","onPencilClick","nativeEvent","explicitOriginalTarget","nodeName","controlClassName","labelText","submitText","inputType","disabled","input","autoFocus","onMouseDown","defaultProps","EditableSearchDropdown","valuePropName","labelPropName","controlKey","selectedItem","errorClassName","dropdownItems","collapsible","styles","flatten","item","option","valueObject","m","handleCancel","displayPopup","handlePopUp","handleUserSubmit","isLoading","handleFamilyMemberSubmit","getConsents","onChangeConsent","consentLoading","category","version","warn","toggleDisplayPopup","prevState","displayDeleteInfoBox","confirmDelete","deleteAccount","setMainMember","setUserFields","updateFriluftsraadForMembers","validateValue","handleCompanySubmit","members","checkForConsent","serverError","userError","validProfile","c","logout","member","addMember","changeFriluftsraad","selectedFriluftsraadErrorText","restOfProps","restOfState","groupedMunicipalities","dummyCompanyArray","unjoin","dummyCompanyArrayStyles","borderBottom","defaultValue","memberAdded","memberDeleted","membersRead","clearMembers","deleteMember","readMembers","userUuid","user_uuid","familyMembersReducer","Modal","PureComponent","competitionJoinedError","competitionUnjoinedError","joinCompetitionReadError","uniqueJoinedCompetitionReadError","competitionResultsReadError","resetState","joinCompetition","competitionId","userId","competition_id","user_id","unjoinCompetition","joined_competition_id","readJoinedCompetitions","readUniqueJoinedCompetitions","uniqueJoinedCompetitionReadSuccess","readCompetitionResults","competitionResultsReadSuccess","joining","unjoining","joinCompetitionReducer","showModal","handleUnjoinCompetition","unjoiningCompetition","memberCompetitions","mca","mc","unjoinCompetitionLoadig","joinedCompetitions","unjoinCompetitionSuccess","joinedCompetitionsLoading","addThenReadMembers","memberError","membersLoading","companiesLoading","allFriluftsraadLoading","rest","familyMembers","passwordSuccessfullyReset","handleReset","goBack","emailText","cancelText","onCancel","onPasswordReset","passwordChanged","handlePasswordChange","currentPasswordText","newPasswordText","repeatPasswordText","onPasswordChange","newUserNickname","newUserYearOfBirth","membersToDelete","reload","deleteMembers","updateMembersToDelete","addNew","year","findIndex","mtd","memberId","addNewMember","hasMembersToDelete","nameIsValid","validateName","yearIsValid","validateYear","gender","generateMemberList","AddMemberContainer","parent_user_uuid","ballek","generateTripRows","trips","handleDeleteTrip","trip","telltur_turmaal_id","turmaal_navn","toLocaleDateString","noTripsText","sortedByMunicipality","reduce","aggregateTripsByMunicipality","turmaal_kommune","k","generateTripList","infoText","changeCurrentMember","selectedMemberId","hideTripCount","isSearchable","trip_count","tripAdded","tripsReadAction","tripDeleted","clearAddedTrip","deleteTrip","tripId","familyMemberId","addTrip","tripcode","tripdate","userid","readTrips","sortDescending","UTC","sortDesc","tripsReducer","thisYear","selectedYear","onYearSelected","Number","fromYear","tripsLoading","tripsError","generateOptionsFromYear","MemberSelect","y","ResultList","headers","displayProps","pageLimit","ignorePlace","h","prop1","prop2","prop3","prop4","place","mapResults","index","fixedStartDate","fixedEndDate","Math","sign","uniqueJoinedCompetitions","competitionResults","competitionResultsLoading","idx","start_date","Switch","labelOn","labelOff","valueOn","valueOff","disable","YearSelector","renderYears","LEFT_PAGE","range","from","step","Pagination","gotoPage","onPageChanged","totalPages","paginationData","totalRecords","handleClick","handleMoveLeft","pageNeighbours","handleMoveRight","fetchPageNumbers","totalNumbers","startPage","endPage","pages","hasLeftSpill","hasRightSpill","spillOffset","extraPages","ceil","aria-hidden","fixKeyValueArraysToJsObject","Key","Value","STATISTICS_TYPE","freeze","POINTS","UNIQUE","readingStats","statisticsType","statsRead","stats","readingCompanyStats","companyStatsRead","getUrl","readCompanyStatistics","companyId","Accept","gm_lang_code","gm_session_id","ReadAllCompaniesPointStatistics","fromDate","toDate","ReadStatisticsWithSearch","company","statisticsReducer","offset","currentRecords","switchValue","searchValue","searchResults","handleSearch","isCompany","updateStatistics","refs","isGuest","myFriluftsraad","myBedrift","selectedFrilufstraadId","switchLabel","switchKey","switchDisable","handleSwitchToggle","headersWithSearch","On","Off","getHeaders","currentFriluftsraadStatisticsType","currentCompanyStatisticsType","companyStatistics","friluftsraadStatistics","selectedMember","ResultsContainer","updateProps","statistics","handleCompetitionJoin","users","resetCompetitionState","joinCompetitionLoading","joinCompetitionError","joinCompetitionSuccess","toggleModal","CompetitonsList","readKonkurannser","readKonkurannseTurmal","turmalRecords","turmalLoading","hasExpired","year_of_birth_from","year_of_birth_to","turmal","turmal_navn","konkurannseTurmal","Competitons","readFriluftsradCompetitions","readCompetions","friluftsradUuid","friluftsrad","FriluftsradPage","isFriluftsradPage","friluftsrad_uuid","HybridPageView","municipalitiesLoading","match","LogoutView","loggedOut","TellturArticleListComponent","onArticleOpen","thumbnailClassName","thumbnail","article","loadImage","validTitle","cleanText","borderTop","data-original","gradering","Button","bsStyle","updateMapHistory","lastZoomLevel","lastMapCenter","updateHistory","mapHistoryReducer","ErrorBoundary","hasError","errorInfo","errorContent","onError","StiLayer","articleId","setVersion","v","singleTile","minZoom","wmsLayerParams","DIM_FK_TURMAL","GUI","onSourceSelect","onTipBoxVisibilityChange","tmpHideTipBox","tipBoxDeactivated","getItem","tipboxTimestamp","diff","abs","floor","lazyLoad","createPoint","fitViewAndZoom","mapZoom","scroll","neverShowAgain","removeItem","onContentChange","sourceSelectorPlaceholder","count","articleComponent","useHoverStyle","useActiveStyle","articleLimit","pressed","mapHistory","getGraderingImage","enkel","middels","krevende","ekspert","linkShareOpen","onShareLinkClick","onShareLinkPopupClose","onClipBoardBtnClick","startdato","sluttdato","startDateParts","endDateParts","currentDate","provider","hoydemeter","lengde","poeng","displayInactiveWarning","displayMovedWarning","sanitizeHtml","prefix","open","openUrl","readOnly","select","loadLastFive","destinationId","lastFive","lastFiveLoading","loadTopFive","topFive","topFiveLoading","ACTION_HANDLERS","handler","dateOpts","month","day","toLocaleString","visits","destination","destinationActions","useHistory","useParams","sourceId","aid","useArticle","maxZoom","hideOpenExternalBtn","registrationError","memberOptions","generateMemberOptions","regTripImg","dateString","separator","dateArray","convertDateString","submitting","datestring","validDatePattern","timestamp","parse","isValidDate","isWithinYear","isInFuture","selectedMemberIdInt","RegisterTripView","sessionToken","component","loginPath","render","friluftsrradBG","ScrollToTop","scrollTo","AppRouter","splashScreen","readMunicipalities","basename","process","exact","strict","FriluftsradListPage","Parking","parkingIcon","parkingChargIconMap","ParkingLayer","featureStyle","parkingIconMap","scale","showParkingDetails","handleClose","readParkings","parkings","setFeatures","p","type_id","media","bilde_multimedia","beskrivelse","accessibility","tilrettelagt","selectedParking","styleFn","loadingParkings","defaultVectorTileStyle","VectorTileLayer","MapContext","projection","getView","getProjection","VectorTileSource","format","MVT","layer","VectorTile","selectable","addLayer","removeLayer","XYZLayer","ensureMap","urls","crossOrigin","opacity","TileLayer","XYZ","center","zoom","zoomInTipText","zoomOutTipText","track","hitTolerance","hideScaleLine","App","lang","reactArticleModuleTranslations","store","getTranslations","articleModuleUuid","locationReducer","friluftsraadReducer","makeRootReducer","asyncReducers","combineReducers","pageReducer","navReducer","authReducer","digiThemeReducer","initalState","middleware","thunk","enhancers","__REDUX_DEVTOOLS_EXTENSION__","composeEnhancers","compose","createStore","applyMiddleware","__INITIAL_STATE__","addReducerToStore","reducer","replaceReducer","injectReducer","CmsConfig","init","ReactDOM"],"mappings":"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","file":"static/js/main.9f177f47.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/p_charger_map.114ccb71.svg\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAY8AAABjCAYAAABja4yqAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkE2QzkwNDVCQTZFMTFFM0FDNzJGQjk1REE0MTNFOEMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QkE2QzkwNDZCQTZFMTFFM0FDNzJGQjk1REE0MTNFOEMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQTZDOTA0M0JBNkUxMUUzQUM3MkZCOTVEQTQxM0U4QyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQTZDOTA0NEJBNkUxMUUzQUM3MkZCOTVEQTQxM0U4QyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsnXjSkAABUlSURBVHja7F0JuBTVmb3vAeoTERXiFkRQCWgIAlnEJeZJ+JzRuEXjNxIzUeMa1GgmmcEhKrhFokjMaGJGjcNEiRujODGaRIy4S0AkURMQkAeiooj4FCMo8Oac1O3x0XR33dq6lj7n+85X73Xfrv/WvX/Vqbv9t6mjo8MIgiAIQhA0qwgEQRAEiYcgCIIg8RAEQRAkHoIgCILEQxAEQZB4CIIgCILEQxAEQUgCXSt92NTUpJKJER0dHYNxuLyBi+AO+NQd8gT5mHwst/7lJh45vLAtcTgPPNJe0wxwEpypPSNZ7A0e3cC+Ny9l/7gUh6NiPOVp8K05GbMrHxPSb3nkTDh64vAguH+nj0eAx+O7UbjZlmcgm1s2uJ+lff19wX1jPN82GbQrHxPqilyPeVjh+H2ZcJQwEJyJNH0ykNWWBvezFt1qKmNdv8Qja8LxhRrJ9syIgHRpcD/roltNZazrLxZy2W3lKBzlAtKaYhdWjwb3s7Svfy64nf17e3AncK86PHDqaVc+JtT9QbwZsy4c4KyO4FiUVgsEdk8OkM9l4ATwQHCHgHZaA5ZJa8DzbwPuC54Nzg5gZ0oG/YjXclRIX2rNml35WPZ8rPA6kSfxiCAcqQoIbJ7nkLcNnJ0DbhHBTmu9HoLW3rHgKgc792bYp5rAq+tZbknYlY9l18eKKh7NKWZmZ/Bb4Dng0Ji7qvy6sOotIC4LZ77Z1NR0MfhhXhwKeb3HeDPbVsZw/WldA9+W/g18KOd25WNCXZGKeODhfRIOS8BfgNeBz+Gzm8EuCQpHmgLS3ef7a3CTTM2jAyHfC/lQinj9WRCQCTm3Kx8Tii0eeGh/G4cp4FZlX50K3sjmfATh+DV4UwYFpFuN794DL8mzE+Hm/i0OD4e8/qzgafDtHNuVjwnFFQ8rHD+rkeRb4NURhONr4JngzzMmILUWMN2GG+O9AvjS9SGvP0utj5dybFc+JhRTPByEo4TvIe24MMLBvlx7M47JmIC0+OS9CPgduC7E9WcJq3NsVz4mFE88AghHCVcYb458IOEoe5sLIiAzkMck54nXmtf/eBEcCWX+AQ6zQlx/lvBhju3Kx4RiiQceymMCCkcJe4QRjpACMtCmTQrVhGkp8rmmQP70QsDrF+Rj8jGJR0XhuACHnyZ0+qrCEVJADkyh/BcUzJ8W6JZSneh6JB5xCMeVaQlHCAFJckBx2yqfLymYPy0NeP2CfEw+JvEIJRzvgm1JCUdAAbkrhXJuK5g/vZJGC1eQj8nHCiAeAYXjUMu3khKOCgLyHxW+vhbf35dgOW/dIDf2soDXL8jH5GM5RaxRdYMKBx7Ys+zvuNsaFwD5TTf8WpTQClZAGAPodhwPsx8/iM+fSbict2iEGxvl+BbKdq3ZfAGoFnAlD/mYkE/xsFtuXuSQlK2Mw+EEszs5xNP4PRf4Ta/iBJGFo8wBKRbP1LGcT6jg7MTyAvrUAFOQ7Y1zBvmYkD/xwIN/Ig5jHYVjJB7ez1d4oD+A8/yz2Tx0yZ3GC+j2YV4LGXlf0SgOlZFtfxsO8jEhd+IRh3B0coo7cb5H8eeRxps98WQdupQEQRCEeopHnMJR9gZ1k6N9rird1dRndSlDn7wmlxEEIW/As5KTo/qDDMW0feljsN144XEW4Pm2ti7ikYRwBLTPkCeXgb3qWAGcM38uruU3ckdBiOWeGo5D35hO9wQH1EPmg2GKPhNTPuYiH8tq2KKdPSOcf4VLjwzscPyYY8lfB1vBbWok34j0i3G8H7yb49AuhRZoJ8GAO6C9bgsqboc7pSM9fATun9EbsbXeO+IV7EE2PY1yS8tuFnyM28fGeG+2Rriu82PMx8k+tq6NeP4XHa6HWx0viWDjIbBfLZ3oGrCAudcG41Sd5ZD8VaodFGxRAj78gxTvn662xXWMHrehb9SdcRhs3752s29EPWwzmnGYuNqfK4lfBufAh95VqQnC/2MQ7qEWGyiyUvfUNeD5EW2MArmH/CGw80KkbqusCAfysVXEJl8c+JT8N/BLx8HgaHCk8aZaBvj539+02FV4F3xqrkpUaHBQIPY1lZcb8Bl9Zkx2eoNsFfNFb22lTOSpxUFslYHK01RBN7/ZAjzLtiBmWqceEPA0TbaVwtbeszjfM6BafUKjY2iF+21MjMJRAl/UTwrV8siYcGQFP5Xv+vrNIcbbo75/zKfeD7wX538ExzHwtfkq7Vzj++Bk44UX2R0cZryp+vvUOR+3gDOMF+WCM5I+Df6jSSba9qX23uA1c7LAEPBwcHiAcwwvu9/2wmFSQmXDl7X/rHSTVx0wt4PjNzgOsLxiLyDph9J2KQ6WfwCem+EHduoD5pw+DU6uU32sAb8eY941YJ4BH7PPnWPBFRnw5/3Al+McMK9h6zBwmaON2WW//d8azyzulno3+DtwZYj7bH6gAXO7hmIK+A2H615sWxxZ6M65DvxDAud9H5yNa3xHL4tVfYZvUnfbt6gg4PqZt43XJbmjcQ+v3R2cCrt9US8TVQPFgI1Bdw/q9S+850ztKaZJ52UW8sHxuueMNwaQpK0HYesg4+2i6rcEYTDSdsVv1uP4edta64z14A/BazpPOLHP9a+CN5qP13v4Ydug3Va/yKFwEJxjPV23YN2Fg4H5GJl4lEPyj6zI3AY+hvp6v+xc7Gc9AmQrz2VyxJX4zTqc58eqiUKJCN94L8efE1POx3Ib9PXmOthiy+Pf7cO9FviitTfI9XPls08pFsfhXDMqnH8DDtNgg+thHnHM1qpKHzZXeRAwyu1JORQOIT1McRQORlIeCp85kW9a5cJhHXwx+BP8OQi83NH+JPjtoaqGwoEvsR0ZyMevbO9DPXAr+IFDumHweY7NHN3ps43g8ZWEo+wem2m8MR4XPBuk5XGc40m5uVLkgGwogC1x4HjJLrZpyCZbN9tcasaFTtA9lOlWx+nGm4brh2ngia5BLtkkx+Ei9rnaVkot8EXoVqQdhN+tVq0UpvXBEOwLTcrT47mmAvmYgz+/VAdba2GL3WQH+IlHhfxchd//3tHU/zi+8N0XRDxcN1a5GvwXXOgvbUbm2P7KWg8aLgbjjBmu0h5hm167m9rThiUe2RWOfjhc65D0sSDCUXYzcVyDrZALfZJyvOQq8HTVTKHwmsnG2qq2eoiHhUtvzjlm07h+fJG/IoCNWQ5pngoqHk8aLyaKC9haGGv5Dm5yZugl4+34xTfHDfam7m+VcpCJtoNhd91LmcJEh5cN9sGOjhhWn9MbjwcH+qRj6JofNcB08UZCe0byUc/JMi7dVuXP78vh92sC2HjZ53tOWGAX2MZKYauqiQfn9HJvjeEBL3g78B8sk4J2DMtOq+NzOPyTQ9JLokYkxu8ZU4wt0Nt9kvJNjAOIp6iGhAYCQ/pMCXhPtVeJZdhuNeCyWmLUXOWkVD0ujrnSth4EoRK+65DmTfCGmOxNM25jbKO5HkjVIzQQbq80+cQBT1o+AP7IeOPdO+NcY/1aMc01VGktOM54Kz2nqW6EslYHgxse75D0lkoB3EK2Pvgic4dDUk7AOEG1JDQQ7gp5Tx1k+RXwAvAe1309mh1OvhDkQ4JdWJyu9pHqSbDC4dKF+MuY7T7gmE7xr4RGAccUH6u3UeeBawjIc5ybb7yBb27C1JZgvjhXmf1uSy2F7MFlOjdfPP4as92nrH/44WAbgVkQio4/cEyw3kYD7ySITDL44cW4Mcfj+FnjLYv/Mvg5213gCvancXXkn4w3O4sLDjn6zz7tVX5TfoX0gLrvicMXHZLOiNs2+3Vhn/4yyCdpi/XJJ1RjQsGRio93jXAT8+E+x3K8DU/B8ZHSug1Oz2XsFEbl5RRNTnN73QoF30aXSCByiwMcW62PJ2R/sYN4EEMlHkID4KlciUcFMaFAzLMUio2DHNMl5Qttjuk+o6oSGgDPp2HU9+0RLYpdNe1RKMMwhzScGbUwZfHYXVUlFBxLAy4MTL7lAcE4AweOa+xq/2fTiBumTOPikhQLyy9c9zGdN24PgNLDbjqub518siZcuoxet1Nrk8Bbjul2VVUJBceCtAx3rSIcZ+NwfdnHB1hej+9/a7w9pR+IunLY2mO8K4adYPwarh/4hPFWq7fY1tF42Fni2Fo62mwaZTIoFjE6ayd7wqZ1taXjG/2rCWbDVdx3Vo0JBceyTIkHMK7Gbzj98RhLPkw4W4oDo2yZcBOTRTZmfK2HDzdvZ1BErmLfz+FhNLmOZcLovreZZLafLAJ2M26D5UmG6XdddLiFqksoOFakZbiaeOwS4Bz7Wp5TurEhEFybwQ1EGBq7JCQ7gDuBe5gYB+oTwgF2d7pl8s3N4LqbWn8biyoJ7OGYbhtVl1BwrMqaeHD67edDnpNdTYMKUCnbyi8rYkfHdJ+1TBNdVF1CwfG3tAxX6374tvGWvDcquCZlofyyInZQEQiCxKNaVF1uO8iuqJtMY8ayGqcZV3qbF4QcYE1ahquOPeDh2YbDGbbf+lTwNLBvSvl8L0BaDqaG2XRoo21tXI1rVxTh6uihIhAEwXfg2k7FvQwi8kMcW423w+BhJpkFWOwuYnyrNyzbrRAEEY8xyPMUVW3qCCvigiAUQTw6iQhnTT1sySm3nNLK4HgMPseB0X0CvJVSDF4E/2y8EBY8zoeNVaqSwuB81OeNKgZBaHDxqCAm3COa/K/SZxAUTuPkNMpPGm+hX2lva3YJcUc5zklmQESFWc8vXKMLbK2iEgSJh6ugMGzEWyrWQmODYzqtsRCERhUPGzaEkUk5Hez5WivHhYbBm47pdlJRCUJx0VxFNLqAV9pWBDdHfw5cgs84cD5QxdbQcI1l9gkVlVAwaGdKh5bHReAFZZ8xptGFpI1ndb/x9pOeFaVFYmNdDbQcYLwVzCR3q+tuvHUFp8HGAlVXrsSjn4pKKBjUFesgHuf6/K4Uz+oH4GoIAFsnT9kWyp/woH+9hlhwQJ2hTxihd39wuPFfeNaiqsoGOK6FOuSsuF4+ST+l0hLqjG4Jn7+3ithfPHoGOAe3mj3CsiQQa43X5fU2/7Ufb21bL0k3/bS2IHlw57JWP7+AH+xS60VCEGJG94TPv5uK+GNUi201M+J5KRB9wCGdWikDTH36DP+mak0ccx3TjVBRCTHAdZFwYtEPOA5svO0aBB/x4C6Cr6h4hCp4zDHdF1VUQgx43zFdkkE7uQha+8P4iUdTUxNDhHCKLsc0tG5DqNQydZkkcYSKSogBbzimS7JloBchx5YHBaQdZDwr9vN9E3xCxSWUfMOx9TEAzf2hKjEhIlzHzQYkmIfDVQ2bwiUwIge/byXxINgTx+NsQXK2VJyzGzi4zqi23Dt8pfEWozHcMEOja0e/7GEqeIhDOkZkPlfFJUTAfMd0ibyo4LnHNUuHqhoCikeZkCzG4SoSBcrZU9x/vHNgRE7D9ZvxwO4OrtlgMEQOvDIw4lwFRUynERHhtwxbf53xn0Z9KiMy12PWFewwphpbzGtUtYXwsRL+6phuJ/jAENT/n2O+hrNN8tOAiy0eZULCWU2PWHa+gbnArzwwIsGxEwZGXIbfajptMmgOmL5XhPpvR13f7NCqoLiMB89KWDg4k+834Eb8fSDy90GI07TEnC7rdjPtY5187Q3UKV9c93RIPtq+mMbZ6jg/B+WcH/GoUdHsbnrTCGmgT8D0/SLam2RFwe+t7EzchHfDNx5OSDg4C+Yu400JJ84DJ4Y4lev6pl4xX0JadvPgYyXMdBQP+tpEOy4XB24wwda9xfVc7V1HW8VUNyEQhgdMf1DEFwWORf3EMfkduKn7JyAcnJ7JUDlHRrkunIfdK4Pq/EBMzW5efKwTpjum2z7ki0OlumE4puNC/DSOHVcH1tFW6ALajFkGZ+901EZDDmzx7Rt8rSMY1tlxgih2e4CvOtpbDu4d4zWPBNsq2HkkxLlGBCi3R2O8hlTs5snHrO1u4MoAds+IIujcfrvCOf/oeP2PRrzWAQGu877UdKKA4tHaoOJxYUc43GPffqPYHgVucLS3BjwdbI5gb2/wVzVsTA5xznsDltsXYqq3VOzmzces/csC2p0ItgS0MRB8qMK51oOfDlBfQyNc5y0BrvEju6urxEPiEapMzgrw8K6En9txgyh5uDigzb+Ap4E9Hc/fE/wGeD+4scZ5+d2QgHk/O0SZLbCTQ6KUWSp2c+xjvcH2gHaXgePAQdUEDJ9vCx7NcTkrEpVwhU17haPd58FeIa7xxBBl+wyvQeIh8XAth37gyeCcjniwCPwuODhMq8A29W8IYXe9dX4+XMbaVgmv6zv2TXcKOM++YbngpgB57gPeGKHMXrF57RawrFKxm3cfs3n6TgT77daXZlo+bcXFD3+0W0cEfbhzD6TRYFeH69qRLWafF6NamA8eG6VFH1Q8miqJRVNTU6bFw3ih36vhEOR/ZkEEgvsH3G//3cqS62j6mGSDTK4HXwXfMd4izdK01xNQtitqCYjxZqecmVKRzQZHlq/zsONg+9gy62HLj340JCa7tMcIDJxOyinpnOnTYcvwkynYnYoyWFlQH2u2+T2sTj7FPI5AnpZb+8OMe2DQEt413pYVDPvEeundqa7oHwwFxYkIcTx4V1tbXGy9ypZvCStxHVPDisdmOiHxyLR4bGedISvoj7Jtc8g313782Pjv0xInOEj5VeRvdYX8TMHhpBTK69dm01lg9cIwlMO8ovqYnWHH+h6ccF6WgqOQn0WdbG9tRbsph48U7rUUaiymkk7kcaquX0C+dUZIFXBQrjznhl/P1sEcF5xOsDf5apV+Q/gXQxmNNO7RncOALbr9OwuHtc3F0W2qhXyKB+NfVYvvzzhcL6haM3GDs3XI8DWn2G6VJF4i/ptvn7B1Cbhepd5Q/sXuny+Dl8b8wshWxb/aHoxqIXVeVA3kUDxsoMYLq3w9Ad+/p2rNTF1tAKcYb8HTUeCdVuCjYJ6t/74498ngQpV0w/rXenC89S8uVn03wukoFJxRxW6zST4vI/NV+jkc8yiB0zZxGGu8YIzsm5yMfN+sKs18vXEQlsE0DzYfB9Nk2H8OKHPwtottWXIA9U1bty8Zrwvs0dLApSBU8C3OPmu1ZLDWvaxvlU8R5kAyoyO0gU+Dj4Oz+bLjaIczr6LGGVuTp9ZyIQbMBUEQAj74utoXk7W250JISjwEQRAEoRYUGFEQBEGQeAiCIAgSD0EQBEHiIQiCIEg8BEEQBImHIAiCIEg8BEEQhETwfwIMACVoLDoTtpI/AAAAAElFTkSuQmCC\"","module.exports = __webpack_public_path__ + \"static/media/header-bg.6d38eb66.jfif\";","module.exports = __webpack_public_path__ + \"static/media/benk.56417653.png\";","module.exports = __webpack_public_path__ + \"static/media/fiske.bfa91f01.svg\";","module.exports = __webpack_public_path__ + \"static/media/sykle.e519cffe.svg\";","module.exports = __webpack_public_path__ + \"static/media/ballek.37998da0.png\";","(function(root, factory) {\r\n // eslint-disable-next-line no-undef\r\n if (typeof define === \"function\" && define.amd) {\r\n // eslint-disable-next-line no-undef\r\n define([], factory);\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 = \"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABkAAD/4QMqaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzE0MiA3OS4xNjA5MjQsIDIwMTcvMDcvMTMtMDE6MDY6MzkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY4REU1NjIyOTFCMTFFOEEyNEJEQ0Y5RTIyN0Q5MjAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY4REU1NjMyOTFCMTFFOEEyNEJEQ0Y5RTIyN0Q5MjAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjhERTU2MDI5MUIxMUU4QTI0QkRDRjlFMjI3RDkyMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjhERTU2MTI5MUIxMUU4QTI0QkRDRjlFMjI3RDkyMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/uAA5BZG9iZQBkwAAAAAH/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEB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\"","module.exports = \"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABkAAD/4QMqaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzE0MiA3OS4xNjA5MjQsIDIwMTcvMDcvMTMtMDE6MDY6MzkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY4REU1NjYyOTFCMTFFOEEyNEJEQ0Y5RTIyN0Q5MjAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY4REU1NjcyOTFCMTFFOEEyNEJEQ0Y5RTIyN0Q5MjAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjhERTU2NDI5MUIxMUU4QTI0QkRDRjlFMjI3RDkyMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjhERTU2NTI5MUIxMUU4QTI0QkRDRjlFMjI3RDkyMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/uAA5BZG9iZQBkwAAAAAH/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEB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\"","module.exports = \"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABkAAD/4QMqaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzE0MiA3OS4xNjA5MjQsIDIwMTcvMDcvMTMtMDE6MDY6MzkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY5MzQwNDIyOTFCMTFFOEEyNEJEQ0Y5RTIyN0Q5MjAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY5MzQwNDMyOTFCMTFFOEEyNEJEQ0Y5RTIyN0Q5MjAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjhERTU2ODI5MUIxMUU4QTI0QkRDRjlFMjI3RDkyMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjhERTU2OTI5MUIxMUU4QTI0QkRDRjlFMjI3RDkyMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/uAA5BZG9iZQBkwAAAAAH/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEB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\"","module.exports = \"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABkAAD/4QMqaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzE0MiA3OS4xNjA5MjQsIDIwMTcvMDcvMTMtMDE6MDY6MzkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY5MzQwNDYyOTFCMTFFOEEyNEJEQ0Y5RTIyN0Q5MjAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY5MzQwNDcyOTFCMTFFOEEyNEJEQ0Y5RTIyN0Q5MjAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjkzNDA0NDI5MUIxMUU4QTI0QkRDRjlFMjI3RDkyMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjkzNDA0NTI5MUIxMUU4QTI0QkRDRjlFMjI3RDkyMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/uAA5BZG9iZQBkwAAAAAH/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEB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\"","module.exports = __webpack_public_path__ + \"static/media/telefon_telltur_BF-red.a9c90db8.png\";","module.exports = __webpack_public_path__ + \"static/media/friluftsraad-bg.dff967bc.svg\";","module.exports = __webpack_public_path__ + \"static/media/parking_blue.189547d5.svg\";","module.exports = __webpack_public_path__ + \"static/media/parking_map.f2b25c33.svg\";","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 LoginPage: {\r\n LogIn: \"Log in\",\r\n Username: \"Email\",\r\n Password: \"Password\",\r\n ForgotPassword: \"Forgot your password?\",\r\n NewUser: \"New TellTur-user?\",\r\n RegisterHere: \"Register here\",\r\n Error: \"Login failed. Please ensure your email and password are correct\",\r\n sessionExpired: \"Your session has expired. Please sign in again, to get a new session.\"\r\n },\r\n\r\n UserRegistrationPage: {\r\n UsernameTooShort: \"Username is too short\",\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 MunicipalityNotValid: \"Municipality not valid\",\r\n YearOfBirthNotValid: \"Year of birth is not valid\",\r\n ToLogin: \"Go to login\",\r\n SelectedFriluftsraadIdIsMissing: \"Please choose a friluftsråd\",\r\n SelectedCompanyIdIsInvalid: \"Selected company is invalid\"\r\n },\r\n\r\n UserRegistrationForm: {\r\n Register: \"Register\",\r\n Username: \"* Username/nickname\",\r\n Password: \"* Password\",\r\n PasswordRepeat: \"* Repeat the password\",\r\n Firstname: \"* First name (only visible to the staff of friluftsrådene)\",\r\n Surname: \"* Surname (only visible to the staff of friluftsrådene)\",\r\n Mobile: \"* Mobile phone number\",\r\n Email: \"* Email address\",\r\n Municipality: \"* Municipality\",\r\n YearOfBirth: \"* Year of birth\",\r\n AddCompany: \"Choose a company (optional)\",\r\n ChooseFriluftsraad: \"Choose friluftsråd\",\r\n ChooseMunicipality: \"Choose municipality\",\r\n Agree: \"Yes, I allow Friluftsrådene to send me emails regarding TellTur and trip competitions.\"\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 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 ChangePasswordPage: {\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\r\n MyProfilePage: {\r\n ChangePassword: \"Change password\",\r\n EditFamilyMembers: \"Edit familymembers\",\r\n DeleteAccount: \"Delete account\",\r\n ConfirmDelete: \"I understand, delete my account\",\r\n SelectedFriluftsraadIsInvalid: \"Selected friluftsråd is invalid\",\r\n SelectFriluftsraad: \"Select friluftsraad\",\r\n ConnectedToFriluftsraad: \"Connected to friluftsråd\",\r\n UsernameTooShort: \"Username 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 MunicipalityNotValid: \"Municipality not valid\",\r\n YearOfBirthNotValid: \"Year of birth is not valid\",\r\n ConnectedToCompany: \"Connect to company (optional)\"\r\n },\r\n\r\n EditableDropdown: {\r\n Cancel: \"Cancel\",\r\n Save: \"Save\"\r\n },\r\n\r\n MyProfileForm: {\r\n Save: \"Save\",\r\n Nickname: \"Username/nickname (will be visible in result tables)\",\r\n Fullname: \"Full name (only visible to you and the employees of friluftsrådene)\",\r\n Mobile: \"Mobile phone number\",\r\n Email: \"Email address\",\r\n Municipality: \"Municipality\",\r\n YearOfBirth: \"Year of birth\",\r\n SelectedFriluftsraad: \"Select friluftsråd\"\r\n },\r\n\r\n AddMemberPage: {\r\n Nickname: \"Nickname\",\r\n Year: \"Year\",\r\n AddNewUser: \"Add\",\r\n Delete: \"Delete\",\r\n FriluftsraadNotValid: \"Cannot find valid friluftsråd-id. Please update your profile\"\r\n },\r\n\r\n RegisterTripForm: {\r\n RegisterTrip: \"Register your trip\",\r\n SeeRegisteredTripsOn: \"You can see all your registered trips on \",\r\n ThisPage: \"this page\",\r\n TripCode: \"* Trip code (the code you found at the trip destination)\",\r\n TripDate: \"* Trip date\",\r\n Cancel: \"Cancel\",\r\n Save: \"Lagre\",\r\n RegisterTripAsMember: \"* Register trip as member\"\r\n },\r\n\r\n RegisterTripPage: {\r\n NotLoggedIn: \"You need to be logged in to register trips\",\r\n TripCodeNotValid: \"Trip code is not valid\",\r\n TripDateNotValid:\r\n \"Trip date is not valid. Please enter a date in the following format: dd.mm.yyyy\",\r\n SelectAMember: \"Please select a family member\",\r\n CantRegisterTripsFromLastYear: \"Cannot register trips from last year\",\r\n CantRegisterTripsInFuture: \"Cannot register trips from the future\",\r\n Title: \"Register trip\"\r\n },\r\n\r\n MemberList: {\r\n Trips: \"Trips\"\r\n },\r\n\r\n ArticleView: {\r\n showFriluftsrad: \"Show friluftsråd\",\r\n showTipBox: \"Show tipbox\",\r\n Title: \"All destinations\"\r\n },\r\n\r\n ArticleDetailView: {\r\n title: \"TellTur: Destination\"\r\n },\r\n\r\n NavBar: {\r\n MyProfile: \"My profile\",\r\n LogOut: \"Log out\"\r\n },\r\n\r\n TellturSearch: {\r\n tellturSearchPlaceholder: \"Search for hiking destinations\",\r\n tellturSearchPlaceholderSelected: \"Search for {{sources}}\"\r\n },\r\n\r\n DestinationStats: {\r\n locale: \"en\",\r\n lastVisitors: \"Last five\",\r\n topVisitors: \"Top five\",\r\n visitorStatistics: \"Visitor statistics\",\r\n noVisitors: \"No visitors registered\"\r\n },\r\n\r\n ResultsPage: {\r\n MostPoints: \"Most points\",\r\n Points: \"Points\",\r\n Nickname: \"Username\",\r\n LoadAll: \"Load all\",\r\n showTopFive: \"Show top five\",\r\n UniqueDestinations: \"Unique destinations\",\r\n Destination: \"Destination\",\r\n Friluftsraad: \"Friluftsråd\",\r\n Company: \"Company\"\r\n },\r\n\r\n TranslatedServerError: {\r\n UserExists: 'A user with the username \"{{username}}\" already exists',\r\n InvalidUser: \"Invalid user-data\",\r\n InvalidTurmaal: \"No destination with this code was found.\",\r\n InvalidOwner: \"You do not own the object you are changing. Contact your administrator.\",\r\n EmailInUse: \"This email adress is already in use\",\r\n TurmaalNotActive: \"The contest for this hiking destination is not currently active.\",\r\n TURMAAL_ALREADY_REGISTERED_TODAY:\r\n \"You have already registered a visit on this destinatnion on the chosen date.\",\r\n DATO_ERROR: \"Dateformat is invalid\",\r\n INVALID_FAMILY_MEMBER: \"Invaldig familymember chosen, please try again\"\r\n },\r\n\r\n MyTripsContainer: {\r\n NoTrips: \"No trips registered\"\r\n },\r\n\r\n TripList: {\r\n locale: \"en\"\r\n },\r\n\r\n PageView: {\r\n Welcome: \"Welcome\",\r\n ReminderText1:\r\n \"We noticed that this was your first login to the new telltur.no. Please ensure that your profile contains the correct informaion by reviewing your profile.\",\r\n ReminderText2: \"This reminder will only be shown once.\"\r\n },\r\n\r\n Competitions: {\r\n CompetitionsTheme: \"Competitions\",\r\n Description:\r\n \"In this box you will find a list of the competitions in {0}. \" +\r\n \"Click the arrows to read more. The competitions you can enter has a green \" +\r\n \"button at the bottom.\",\r\n LinkToResults: \"Your results.\",\r\n LinkToYourProfile: \"Your registered trips.\",\r\n NoCompetitions: \"This Friluftsråd does not have any active competitions.\"\r\n },\r\n\r\n CompetitionsList: {\r\n locale: \"en\",\r\n Municipality: \"Municipality: \",\r\n YearOfBirthFrom: \"From year of birth: \",\r\n YearOfBirthTo: \"To year of birth: \",\r\n StartDate: \"Start date: \",\r\n EndDate: \"End date: \",\r\n Participate: \"Join\"\r\n },\r\n\r\n CompetitionResults: {\r\n Title: \"Resultater fra temakonkurranser\",\r\n CompetitionDescription:\r\n \"Nedenfor vises resultatlister fra de temakonkurranser du deltar i. Oversikt over disse med mulighet for påmelding finner du på \",\r\n LinkToFriluftsrad: \"dit friluftsråds informasjonsside\",\r\n NoUniqueJoinedCompetitions: \"No joined competitions\",\r\n Nickname: \"Brukernavn\",\r\n Points: \"Poeng\"\r\n },\r\n\r\n JoinCompetitionForm: {\r\n ConfirmJoin: \"Bekreft påmelding\",\r\n ConfirmDescription:\r\n \"Betingelser for konkurranser. f.eks. at den kun er for deltagere mellom 8 og 11 år. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\",\r\n ChooseMember: \"Velg brukeren som skal meldes på temakonkurransen: \",\r\n Success: \"You have successfully joined competition\",\r\n ButtonCancel: \"Cancel\",\r\n ButtonClose: \"Close\",\r\n ButtonConfirm: \"OK\"\r\n },\r\n\r\n CompetitionPage: {\r\n title: \"Dine temakonkurranser\",\r\n Description:\r\n \"Nedenfor vises de lokale temakonkurranser du og dine ekstra turgåere er påmeldt. Du kan \" +\r\n \"melde deg av ved å klikke på krysset til høyre for hver konkurranse. Les mer om hver \" +\r\n \"enkelt temakonkurranse \",\r\n LinkToFriluftsrad: \"hos ditt friluftsråd\",\r\n Note: \"Merk at du fremdeles er med i TellTurkonkurransen selv om du melder deg av en temakonkurranse\",\r\n NoMemberCompetitions: \"No joined competitions\",\r\n CancelationConfirm: \"Bekreft avmelding\",\r\n CancelationDescription:\r\n \"Når du melder deg av en temakonkurranse blir alle poeng du har samlet i denne konkurransen slettet. Dersom du ønsker å gjenoppta deltagelsen vil du måtte starte poengsankingen på nytt.\",\r\n CancelationDescriptionNote:\r\n \"De ordinære TellTurpoengene dine (i den nasjonale konkurransen) blir ikke berørt av avmeldingen.\",\r\n ButtonCancel: \"Avbyrt\",\r\n ButtonConfirm: \"Meld av\"\r\n }\r\n};\r\n","export default {\r\n locale: \"no\",\r\n\r\n DefaultMap: {\r\n zoomInTip: \"Zoom inn\",\r\n zoomOutTip: \"Zoom ut\"\r\n },\r\n\r\n ProfileValidator: {\r\n Welcome: \"Velkommen\",\r\n ReminderText1:\r\n \"Det ser ut til at vi mangler litt informasjon om deg. Vennligst sjekk at din profil inneholder korrekte opplysninger, og at du er knyttet til riktig friluftsråd.\",\r\n ReminderText2:\r\n \"Denne påminnelsen vil vises ved innlogging frem til du har oppdatert profilen din.\"\r\n },\r\n\r\n LoginPage: {\r\n LogIn: \"Logg inn\",\r\n Username: \"E-postadresse\",\r\n Password: \"Passord\",\r\n ForgotPassword: \"Glemt passord?\",\r\n NewUser: \"Ny på TellTur?\",\r\n RegisterHere: \"Registrer deg her\",\r\n Error: \"Login feilet. Vennligst sjekk at e-post og passord er korrekt\",\r\n sessionExpired: \"Din innlogging er utløpt. Vennligst logg inn på nytt.\"\r\n },\r\n\r\n UserRegistrationPage: {\r\n UsernameTooShort: \"Brukernavn er for kort\",\r\n PasswordsDoNotMatch: \"Passordene er ikke like\",\r\n PasswordIsTooShort: \"Passordet er for kort\",\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 MunicipalityNotValid: \"Bostedskommune er ikke gyldig\",\r\n YearOfBirthNotValid: \"Fødselsår er ikke gyldig\",\r\n ToLogin: \"Gå til innlogging\",\r\n SelectedFriluftsraadIdIsMissing: \"Vennligst velg et friluftsråd\",\r\n SelectedCompanyIdIsInvalid: \"Valgt bedrift er ugyldig\"\r\n },\r\n\r\n UserRegistrationForm: {\r\n Register: \"Registrer meg\",\r\n Username: \"* Brukernavn/kallenavn (dette vil være synlig på resultatlister)\",\r\n Password: \"* Passord (benyttes for å logge inn på TellTur)\",\r\n PasswordRepeat: \"* Gjenta passordet\",\r\n Firstname: \"* Fornavn\",\r\n Surname: \"* Etternavn\",\r\n Mobile: \"* Mobiltelefonnummer\",\r\n Email: \"* E-postadresse\",\r\n Municipality: \"* Bostedskommune\",\r\n YearOfBirth: \"* Fødselsår\",\r\n SelectedFriluftsraad:\r\n \"* Velg friluftsråd. Alle deltagere i Telltur må ha tilhørighet til et friluftsråd, dette er for at arrangørene skal kunne hente ut statistikker til de ulike konkurransene. Velg friluftsrådet for regionen der du regner med å gå de fleste turene dine i år\",\r\n AddCompany: \"Tilknytt firma (valgfritt)\",\r\n ChooseFriluftsraad: \"Velg friluftsråd\",\r\n ChooseMunicipality: \"Velg kommune\",\r\n Agree: \"Ja, jeg tillater at Friluftsrådene kan sende meg e-post om TellTur og turkonkurranser.\"\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 på mail. Dersom du ikke mottar den, sjekk om den kan ligge i søppelpost-filteret\",\r\n GoBack: \"Gå tilbake til innlogging\"\r\n },\r\n\r\n ChangePasswordPage: {\r\n CurrentPassword: \"Nåværende passord\",\r\n NewPassword: \"Nytt passord\",\r\n RepeatPassword: \"Gjenta nytt passord\",\r\n Cancel: \"Avbryt\",\r\n SaveNewPassword: \"Lagre nytt passord\",\r\n PasswordChanged: \"Ditt passord har blitt endret\",\r\n GoBack: \"Tilbake til min profil\",\r\n CouldNotChangePassword: \"Kan ikke endre passordet\"\r\n },\r\n\r\n MyProfilePage: {\r\n ChangePassword: \"Endre passord\",\r\n EditFamilyMembers: \"Vis ekstra turgåere\",\r\n DeleteAccount: \"Slett konto\",\r\n ConfirmDelete: \"Jeg forstår, slett brukerkontoen min\",\r\n SelectedFriluftsraadIsInvalid: \"Valgt friluftsråd er ikke gyldig\",\r\n SelectFriluftsraad: \"Velg friluftsråd\",\r\n ConnectedToFriluftsraad: \"Tilknyttet friluftsråd\",\r\n UsernameTooShort: \"Brukernavn er for kort\",\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 MunicipalityNotValid: \"Bostedskommune er ikke gyldig\",\r\n YearOfBirthNotValid: \"Fødselsår er ikke gyldig\",\r\n ConnectedToCompany: \"Tilknytt bedrift (valgfritt)\",\r\n Unjoin: \"Ingen bedrift\",\r\n General:\r\n \"Det ser ut til at vi mangler litt informasjon om deg. Vennligst sjekk at din profil inneholder korrekte opplysninger, og at du er knyttet til riktig friluftsråd. Denne påminnelsen vil vises ved innlogging frem til du har oppdatert profilen din.\",\r\n Agree: \"Ja, jeg tillater at Friluftsrådene kan sende meg e-post om TellTur og turkonkurranser.\"\r\n },\r\n\r\n EditableDropdown: {\r\n Cancel: \"Avbryt\",\r\n Save: \"Lagre\"\r\n },\r\n\r\n MyProfileForm: {\r\n Save: \"Lagre\",\r\n Nickname: \"Brukernavn/kallenavn (dette vil være synlig på resultatlister)\",\r\n Firstname: \"Fornavn (vil kun være synlig for deg og friluftsrådenes ansatte)\",\r\n Surname: \"Etternavn (vil kun være synlig for deg og friluftsrådenes ansatte)\",\r\n Mobile: \"Mobiltelefonnummer\",\r\n Email: \"E-postadresse\",\r\n Municipality: \"Bostedskommune\",\r\n YearOfBirth: \"Fødselsår\",\r\n ReminderText1:\r\n 'Du har endret bostedskommune, kontroller at du er tilknyttet riktig friluftsråd etter endringen. Friluftsrådet for din kommune ligger øverst i listen under feltet \"Tilknyttet friluftsråd\".'\r\n },\r\n\r\n ArticleList: {\r\n NoResults: \"Ingen turer funnet\",\r\n NoResultsTryChange: \"Prøv å velg andre turtyper eller flytte på kartet\",\r\n Loading: \"Laster turer\"\r\n },\r\n\r\n AddMemberPage: {\r\n Nickname: \"Kallenavn\",\r\n Year: \"Fødselsår\",\r\n AddNewUser: \"Legg til\",\r\n Delete: \"Slett\",\r\n FriluftsraadNotValid: \"Kan ikke finne gyldig friluftsråd-id. Vennligst oppdater din profil\"\r\n },\r\n\r\n RegisterTripForm: {\r\n RegisterTrip: \"Registrer en tur\",\r\n SeeRegisteredTripsOn: \"Du kan se dine registrerte turer på \",\r\n ThisPage: \"denne siden\",\r\n TripCode: \"* Turkode (koden du fant på turmålet)\",\r\n TripDate: \"* Turdato\",\r\n Cancel: \"Avbryt\",\r\n Save: \"Lagre\",\r\n RegisterTripAsMember: \"* Registrer tur som bruker\"\r\n },\r\n\r\n RegisterTripPage: {\r\n NotLoggedIn: \"Du må være logget inn for å registrere turer\",\r\n TripCodeNotValid: \"Turkode er ikke gyldig\",\r\n TripDateNotValid: \"Turdato er ikke gyldig. Vennligst oppgi dato på formatet dd.mm.yyyy\",\r\n SelectAMember: \"Vennligst velg et familiemedlem\",\r\n CantRegisterTripsFromLastYear: \"Kan ikke registrere turer fra ifjor\",\r\n CantRegisterTripsInFuture: \"Kan ikke registrere turer frem i tid\",\r\n Title: \"Registrer tur\"\r\n },\r\n\r\n MemberList: {\r\n Trips: \"Turer\"\r\n },\r\n\r\n ArticleView: {\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 grønne knappen med kompasspilen 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 \"

Artikkellisten viser forslag til turmål basert på kartutstnittet. Når du zoomer i kartet, med musescroll eller fingre, vil listen oppdateres automatisk.

\" +\r\n \"

Klikk på det blå feltet over artiklene merket «{0}», og sett hake kun ved de turtyper du ønsker å vise.

\" +\r\n \"

Bruk gjerne søkefeltet helt øverst til høyre for å finne informasjon om kjente turmål.

\" +\r\n '

Disse tipsene kan hentes frem igjen når du ønsker ved å klikke på den grønne «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 },\r\n\r\n ArticleDetailView: {\r\n title: \"TellTur: Turmål\"\r\n },\r\n\r\n NavBar: {\r\n MyProfile: \"Min profil\",\r\n LogOut: \"Logg ut\"\r\n },\r\n\r\n TellturSearch: {\r\n tellturSearchPlaceholder: \"Søk etter turmål her\",\r\n tellturSearchPlaceholderSelected: \"Søk etter {{sources}}\"\r\n },\r\n\r\n DestinationStats: {\r\n locale: \"no\",\r\n lastVisitors: \"Siste fem (dato)\",\r\n topVisitors: \"Topp fem (besøk)\",\r\n visitorStatistics: \"Besøksstatistikk\",\r\n noVisitors: \"Ingen besøkende registrert\"\r\n },\r\n\r\n InstafeedComponent: {\r\n locale: \"no\",\r\n instagramHeader: \"Følg {0} på Instagram\",\r\n instafeedEmpty:\r\n \"Bli den første til å poste bilde fra {0} på Instagram. Tag bildet ditt med #{1} og #{2}!\"\r\n },\r\n\r\n ResultsPage: {\r\n MostPoints: \"Flest poeng\",\r\n Points: \"Poeng\",\r\n CompanyName: \"Bedrift/lag\",\r\n Participants: \"Deltagere\",\r\n PointsNorm: \"Poeng\",\r\n TotalPoints: \"Total poeng\",\r\n Nickname: \"Brukernavn\",\r\n Search: \"søk på brukernavn\",\r\n AllFr: \"Alle friluftsråd\",\r\n MyFr: \"Mitt friluftsråd\",\r\n AllCompanies: \"Alle bedrifter\",\r\n MyCompany: \"Min bedrift\",\r\n UniqueDestinations: \"Unike turmål\",\r\n Destination: \"Turmål\",\r\n Friluftsraad:\r\n \"

Her kan du se statistikk for alle turene i {0} i {1}.
\" +\r\n \"Dersom du ønsker å delta under et annet friluftsråd kan du endre dette inne på din brukerprofil.

\",\r\n Company:\r\n \"

Statistikk for bedriftskonkuransen til {0} i {1}.
\" +\r\n \"Dersom du ønsker å knytte deg til en annen bedrift kan du endre dette inne på din brukerprofil.

\"\r\n },\r\n\r\n ResultCard: {\r\n MostPoints: \"Flest poeng\",\r\n Points: \"Poeng\",\r\n UniqueDestinations: \"Unike turmål\",\r\n Destination: \"Turmål\",\r\n ChooseYear: \"Velg år:\"\r\n },\r\n\r\n TranslatedServerError: {\r\n UserExists: 'Bruker med brukernavnet \"{{username}}\" finnes allerede. ',\r\n InvalidUser: \"Ugyldige brukerdata sendt inn. Forsøk å logg inn igjen på nytt.\",\r\n InvalidTurmaal: \"Kunne ikke finne turmål med denne koden.\",\r\n InvalidOwner: \"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 TurmaalNotActive: \"Denne datoen er utenfor konkurranseperioden for dette turmålet.\",\r\n TURMAAL_ALREADY_REGISTERED_TODAY:\r\n \"Du har allerede en registrert tur på dette turmålet på den valgte datoen\",\r\n DATO_ERROR: \"Datoformat kunne ikke håndteres\",\r\n INVALID_FAMILY_MEMBER: \"Ugyldig familiemedlem valgt, velg familiemedlem igjen og prøv på nytt\",\r\n cannot_change_frilufstrad_active_competitions:\r\n \"Du er meldt på én eller flere aktive konkurranser i et annet friluftsråd. For å kunne bytte friluftsråd må du først melde deg av aktive konkurranser.\"\r\n },\r\n\r\n MyTripsContainer: {\r\n NoTrips: \"Ingen turer registrert\"\r\n },\r\n\r\n TellturArticle: {\r\n locale: \"nb-NO\",\r\n InactiveTrip: \"MERK: Denne turen er ikke i sesong for poengtelling nå\",\r\n MovedTrip:\r\n \"Friluftsrådet har flyttet sin turregistrering til StikkUt\",\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 },\r\n\r\n TripList: {\r\n locale: \"no\",\r\n Date: \"Dato\",\r\n Trip: \"Turmål\",\r\n Points: \"Poeng\",\r\n DeleteTrip: \"Slett tur\"\r\n },\r\n\r\n IndexPage: {\r\n ActiveCompetitions: \"Det er {0} aktive temakonkurranser hos ditt friluftsråd\",\r\n JoinNow: \"delta nå!\",\r\n FindTrip: \"Finn et turmål\",\r\n CheckCompetitions: \"Se konkurranser\",\r\n Description1:\r\n \"er friluftsrådenes elektroniske postkassetrim. Her kan du finne turmål og registrere resultatene dine. Konkurrer med deg selv eller med andre turgåere om å nå flere mål!\",\r\n Description2: \"for å se hvilke turmål som finnes, eller gå til ditt nærmeste friluftsråd og\",\r\n Description3:\r\n 'Telltur finner du i appen \"Norgeskart friluftsliv\" som er gratis for deltakere på Telltur.',\r\n Description4: \"\",\r\n UseMapLink: \"Bruk kartet \",\r\n GoToFrLink: \" les om hvilke konkurranser du kan delta i.\",\r\n GoToAboutLink: \"Mer om bruk av appen her.\",\r\n GoodLuck: \"Lykke til og god tur!\",\r\n Covid1:\r\n \"Covid-19 restriksjoner: På grunn av smittefare frarådes bruk av postkassen på turmålet. Du kan i stedet registrere turen din her på nettsiden eller via egen mobilapp.\",\r\n Covid2:\r\n \"Merk også at Friluftsrådene stenger hytter og ber alle unngå samlingsplasser som gapahuker, rasteplasser og lignende.\",\r\n readMore: \"Les mer om dette her >\",\r\n dontshowTipBox: \"Ikke vis igjen\",\r\n closeTipBox: \"ok, lukk tipsboks\"\r\n },\r\n\r\n PageView: {\r\n Welcome: \"Velkommen\",\r\n ActiveCompetitions: \"Det pågar {0} temakonkurranser i ditt område\",\r\n ReminderText1:\r\n \"Det ser ut til at vi mangler litt informasjon om deg. Vennligst sjekk at din profil inneholder korrekte opplysninger, og at du er knyttet til riktig friluftsråd.\",\r\n ReminderText2:\r\n \"Denne påminnelsen vil vises ved innlogging frem til du har oppdatert profilen din.\"\r\n },\r\n\r\n Competitions: {\r\n CompetitionsTheme: \"Temakonkurranser\",\r\n Description:\r\n \"I denne boksen finner du en liste over konkurransene i {0}. \" +\r\n \"Klikk på pilene for å lese mer om hver. De konkurranser du kan delta i vil ha en grønn \" +\r\n \"påmeldingsknapp nederst.\",\r\n LinkToResults: \"Dine resultater.\",\r\n LinkToYourProfile: \"Dine registrerte turer.\",\r\n NoCompetitions: \"Friluftsrådet har ingen pågående temakonkurranser\"\r\n },\r\n\r\n CompetitionsList: {\r\n locale: \"nb-NO\",\r\n Municipality: \"Bostedskommune: \",\r\n YearOfBirthFrom: \"Fødselsår fra: \",\r\n YearOfBirthTo: \"Fødselsår til: \",\r\n StartDate: \"Startdato: \",\r\n EndDate: \"Sluttdato: \",\r\n Participate: \"Meld på\",\r\n terms: \"Betingelser\",\r\n destinations: \"Turmål\",\r\n points: \"poeng\"\r\n },\r\n\r\n CompetitionResults: {\r\n locale: \"nb-NO\",\r\n Started: \"Startdato\",\r\n Ends: \"Sluttdato\",\r\n Title: \"Resultater for temakonkurranser\",\r\n CompetitionDescription:\r\n \"Nedenfor vises resultatlister for temakonkurransene du deltar i. Oversikt over disse med mulighet for påmelding finner du på \",\r\n LinkToFriluftsrad: \"ditt friluftsråds informasjonsside\",\r\n NoUniqueJoinedCompetitions: \"Du er ikke påmeldt noen temakonkurranser\",\r\n Nickname: \"Brukernavn\",\r\n Points: \"Poeng\"\r\n },\r\n\r\n JoinCompetitionForm: {\r\n ConfirmJoin: \"Bekreft påmelding\",\r\n ChooseMember: \"Velg brukeren du ønsker å melde på konkurransen: \",\r\n Success: \"Du er nå påmeldt konkurransen\",\r\n ButtonCancel: \"Avbryt\",\r\n ButtonClose: \"Lukk\",\r\n ButtonConfirm: \"Meld på\",\r\n invalid_user: \"Ugyldig bruker\",\r\n invalid_family_member: \"Valgt bruker ble ikke funnet.\",\r\n compotition_not_found: \"Konkurransen du prøver å melde deg på finnes ikke.\",\r\n competition_wrong_friluftsrad:\r\n \"Konkurransen tilhører ikke ditt friluftsråd. Du kan derfor ikke melde deg.\",\r\n already_joined_competition: \"Du er allerede påmeldt denne konkurransen\",\r\n competition_not_active: \"Konkurransen er ikke lenger aktiv\",\r\n user_too_young: \"Brukeren er for ung til å delta\",\r\n user_too_old: \"Brukeren er for gammel til å delta\"\r\n },\r\n\r\n CompetitionPage: {\r\n title: \"Dine temakonkurranser\",\r\n Description:\r\n \"Nedenfor vises de lokale temakonkurranser du og dine ekstra turgåere er påmeldt. Du kan \" +\r\n \"melde deg av ved å klikke på krysset til høyre for hver konkurranse. Les mer om hver \" +\r\n \"enkelt temakonkurranse \",\r\n LinkToFriluftsrad: \"hos ditt friluftsråd\",\r\n Note: \"Merk at du fremdeles er med i TellTurkonkurransen selv om du melder deg av en temakonkurranse.\",\r\n NoMemberCompetitions: \"Du er ikke påmeldt noen temakonkurranser\",\r\n CancelationConfirm: \"Bekreft avmelding\",\r\n CancelationDescription:\r\n \"Når du melder deg av en temakonkurranse blir alle poeng du har samlet i denne konkurransen slettet. Dersom du ønsker å gjenoppta deltagelsen vil du måtte starte poengsankingen på nytt.\",\r\n CancelationDescriptionNote:\r\n \"De ordinære TellTurpoengene dine (i den nasjonale konkurransen) blir ikke berørt av avmeldingen.\",\r\n ButtonCancel: \"Avbryt\",\r\n ButtonConfirm: \"Meld av\",\r\n invalid_user: \"Ugyldig bruker\",\r\n invalid_family_member: \"Valgt bruker ble ikke funnet.\",\r\n competition_not_found: \"Konkurransen du prøver å melde deg på finnes ikke.\"\r\n }\r\n};\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport \"./Icon.scss\";\r\n\r\nconst icons = {\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 usersGroup: (\r\n \r\n \r\n \r\n ),\r\n trash: (\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 load: (\r\n \r\n \r\n \r\n ),\r\n chevronUp: (\r\n \r\n \r\n \r\n ),\r\n chevronDown: (\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 checkmarkInCircle: (\r\n \r\n \r\n \r\n ),\r\n map: (\r\n \r\n \r\n \r\n ),\r\n medal: (\r\n \r\n \r\n \r\n ),\r\n print: (\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\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 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\nexport default LoadingIndicator;\r\n","export default {\r\n adaptiveUrl: \"https://friluftsforvaltning.avinet.no/\",\r\n konkurannserUuid: \"1f21a335-cc5c-432d-a3bb-c2f74f70a643\",\r\n konkurannseTurmalUuid: \"7ef9fc8b-343a-4109-9563-5a42e16162c8\",\r\n cms_site_id: 0,\r\n guiUrl: \"https://www.telltur.no\",\r\n sti: {\r\n guiId: 40,\r\n activeStiLayer: \"layer_144\",\r\n grayStiLayer: \"layer_145\"\r\n },\r\n articleModuleUuid: \"c46f6991-8d03-4bbd-815e-443f38c445ba\",\r\n friluftsraadDt: {\r\n uuid: \"03845a0f-6d2e-4318-90d1-bd2a61812a5f\",\r\n columns: [\"id\", \"rolle_id\", \"uuid\", \"uri\", \"navn\", \"thumbnail\"]\r\n },\r\n friluftsraadMedlemskommunerDt: {\r\n uuid: \"c27e8c08-1c7c-4c3c-9775-644deb97637f\",\r\n columns: [\"id\", \"uuid\", \"fr_id\", \"kommune\"]\r\n },\r\n dtMunicipality: {\r\n uuid: \"2f0a64ec-6f85-4523-839b-2a439b86bc24\",\r\n columns: [\"gid\", \"komm\", \"navn\"]\r\n },\r\n parkingsDt: {\r\n uuid: \"324a9681-dede-48ee-abaf-af76481f95e3\",\r\n columns: [\"uuid\", \"id\", \"type_id\", \"beskrivelse\", \"bilde_multimedia\", \"navn\", \"tilrettlagt\"]\r\n },\r\n companyDigiThemeUuid: \"4b5ea2a3-434a-4802-b056-2f81d834b853\",\r\n emptyFriluftsraadUuid: \"559908b6-7603-4eeb-abc5-5f09220961d3\",\r\n vesteralenFriluftsraadUuid: \"ff0b7103-c420-4a3e-8a16-51f0c333da5e\",\r\n mapProjCode: \"3857\",\r\n gm_lang_code: \"nb\",\r\n appName: \"TellTur\",\r\n privacyVersion: 1,\r\n consentEmail: \"telltur_user_email_consent\",\r\n instagram: {\r\n userId: \"224871\",\r\n clientId: \"9f1162178b01c872612327e1f03b1188\",\r\n accessToken: \"224871.3a81a9f.96d4029a304b46c7b27c8f15344ffd43\"\r\n },\r\n fylkesnummer: [\r\n {\r\n navn: \"Agder\",\r\n nummer: \"42\"\r\n },\r\n {\r\n navn: \"Innlandet\",\r\n nummer: \"34\"\r\n },\r\n {\r\n navn: \"Møre og Romsdal\",\r\n nummer: \"15\"\r\n },\r\n {\r\n navn: \"Nordland\",\r\n nummer: \"18\"\r\n },\r\n {\r\n navn: \"Oslo\",\r\n nummer: \"03\"\r\n },\r\n {\r\n navn: \"Rogaland\",\r\n nummer: \"11\"\r\n },\r\n {\r\n navn: \"Troms og Finnmark\",\r\n nummer: \"54\"\r\n },\r\n {\r\n navn: \"Trøndelag\",\r\n nummer: \"50\"\r\n },\r\n {\r\n navn: \"Vestfold og Telemark\",\r\n nummer: \"38\"\r\n },\r\n {\r\n navn: \"Vestland\",\r\n nummer: \"46\"\r\n },\r\n {\r\n navn: \"Viken\",\r\n nummer: \"30\"\r\n }\r\n ]\r\n};\r\n","import { useContext, useEffect, useState } from \"react\";\r\nimport request from \"superagent\";\r\nimport { olUtils } from \"@avinet/react-openlayers\";\r\nimport { ArticleModuleContext } from \"@avinet/react-article-module\";\r\nimport config from \"../config/TellTur\";\r\n\r\nexport default function useSearch({ query, sources, mapExtent, mapCenter }) {\r\n const { projCode } = useContext(ArticleModuleContext);\r\n const [loading, setLoading] = useState(false);\r\n const [results, setResults] = useState([]);\r\n\r\n useEffect(() => {\r\n if (!query || !mapCenter) {\r\n setLoading(false);\r\n setResults([]);\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n\r\n performIndexQuery(query, sources, mapExtent, projCode)\r\n .then(data => {\r\n setResults(data);\r\n setLoading(false);\r\n })\r\n .catch(e => {\r\n setResults([]);\r\n console.error(\"Failed to load search results\", e);\r\n });\r\n }, [query, sources, mapExtent, mapCenter, projCode]);\r\n\r\n return { loading, results };\r\n}\r\n\r\nfunction performIndexQuery(query, sources, extent, projCode) {\r\n return new Promise((resolve, reject) => {\r\n extent = olUtils.transformExtent(extent, \"EPSG:3857\", \"EPSG:4326\");\r\n const bbox = {\r\n left: extent[0],\r\n bottom: extent[1],\r\n right: extent[2],\r\n top: extent[3]\r\n };\r\n\r\n const data = {\r\n q: query + \"*\",\r\n srsid: \"4326\",\r\n start: 0,\r\n limit: 100,\r\n bbox: bbox,\r\n layers: sources.map(s => s.value.layerId).join(\",\")\r\n };\r\n\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/search/SearchProxy.asmx/Search\")\r\n .send({ request: data })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"Content-Type\", \"application/json\")\r\n .then(res => res.body)\r\n .then(res => {\r\n res = res.d;\r\n if (res.success) {\r\n const data = parseIndexerResponse(res.records, sources);\r\n resolve(data);\r\n } else {\r\n throw new Error(res.d.exception);\r\n }\r\n })\r\n .catch(e => {\r\n reject(e);\r\n });\r\n });\r\n}\r\n\r\nfunction parseIndexerResponse(records, sources) {\r\n return records\r\n .map(rec => {\r\n const { desc, elementType, geom, layerId, layerName, title, uid, values, relevance } = rec;\r\n\r\n const objId = uid.split(\".\").slice(2).join(\".\");\r\n const source = sources.find(s => s.value.layerId.toString() === rec.layerId);\r\n const id = source.dataIndex + \"_\" + objId;\r\n\r\n if (!geom) {\r\n return false;\r\n }\r\n const feature = olUtils.createFeatureFromWkt(geom, { color: source.config.fillColor });\r\n if (feature && feature.getGeometry())\r\n feature.getGeometry().transform(\"EPSG:4326\", \"EPSG:3857\");\r\n\r\n return {\r\n id,\r\n uid,\r\n properties: {\r\n title,\r\n content: desc\r\n .replace(/^(.*?)<\\/b>/, \"**$1**\")\r\n .replace(/<[\\s\\S]*?>/gm, \" \")\r\n .replace(/\\s+/g, \" \")\r\n .replace(/^\\*\\*(.*?)\\*\\*/, \"$1\")\r\n },\r\n geometry: {\r\n type: feature.getGeometry().getType(),\r\n coordinates: feature.getGeometry().getCoordinates()\r\n },\r\n olFeature: feature,\r\n elementType,\r\n layerId,\r\n layerName,\r\n values,\r\n source,\r\n relevance\r\n };\r\n })\r\n .filter(i => !!i && i.relevance > 20);\r\n}\r\n","import { useMemo } from \"react\";\r\nimport { useLocation } from \"react-router\";\r\n\r\nfunction useActiveSources() {\r\n const { pathname, state } = useLocation();\r\n\r\n return useMemo(() => {\r\n if (/\\/alleturmaal\\/.*/.test(pathname)) return pathname.split(\"/\")[2].split(\"+\");\r\n if (state?.activeSources) return state.activeSources.split(\"+\");\r\n return [];\r\n }, [pathname, state]);\r\n}\r\n\r\nexport default useActiveSources;\r\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { useTranslate } from \"react-translate\";\r\nimport { ensureArticleModuleConfig } from \"@avinet/react-article-module\";\r\nimport Style from \"ol/style/Style\";\r\nimport Fill from \"ol/style/Fill\";\r\nimport Stroke from \"ol/style/Stroke\";\r\nimport Circle from \"ol/style/Circle\";\r\nimport LoadingIndicator from \"../components/LoadingIndicator\";\r\nimport Icon from \"../components/Icon\";\r\nimport useSearch from \"../hooks/useSearch\";\r\nimport { provideMapState, VectorSource } from \"@avinet/react-openlayers\";\r\nimport useActiveSources from \"../hooks/useActiveSources\";\r\nimport \"./TellturSearch.scss\";\r\n\r\nTellturSearch.propTypes = {\r\n sources: PropTypes.array.isRequired,\r\n onResultSelected: PropTypes.func.isRequired,\r\n isOpen: PropTypes.bool\r\n};\r\n\r\nconst styleFunction = feature => {\r\n return new Style({\r\n image: new Circle({\r\n stroke: new Stroke({ color: feature.get(\"hover\") ? \"#1173af\" : \"#ffffff\", width: 3 }),\r\n fill: new Fill({ color: \"rgb(\" + feature.get(\"color\") + \")\" }),\r\n radius: feature.get(\"hover\") ? 10 : 7\r\n }),\r\n zIndex: feature.get(\"hover\") ? 2 : 0\r\n });\r\n};\r\n\r\nfunction SearchResultComponent({ result, onResultSelected }) {\r\n return (\r\n onResultSelected(result, result.source)}\r\n onMouseOver={() => result.olFeature && result.olFeature.set(\"hover\", true)}\r\n onMouseOut={() => result.olFeature && result.olFeature.set(\"hover\", false)}\r\n >\r\n

\r\n \r\n {result.properties.title}\r\n

\r\n {result.properties.content && (\r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nfunction TellturSearch({ onResultSelected, sources, isOpen, mapExtent, mapCenter }) {\r\n const t = useTranslate(\"TellturSearch\");\r\n const [query, setQuery] = useState(\"\");\r\n const [debouncedQuery, setDebouncedQuery] = useState(\"\");\r\n const [visible, setVisible] = useState(false);\r\n const searchField = useRef();\r\n\r\n useEffect(() => {\r\n if (!query) {\r\n setDebouncedQuery(\"\");\r\n return;\r\n }\r\n const tId = setTimeout(() => setDebouncedQuery(query), 500);\r\n return () => clearTimeout(tId);\r\n }, [query]);\r\n\r\n useEffect(() => {\r\n if (searchField.current && isOpen) searchField.current.focus();\r\n }, [isOpen]);\r\n\r\n const activeSourceIds = useActiveSources();\r\n const activeSources = useMemo(() => {\r\n if ((activeSourceIds?.length ?? 0) === 0) return sources;\r\n return sources.filter(s => activeSourceIds.indexOf(s.dataIndex) !== -1);\r\n }, [activeSourceIds, sources]);\r\n\r\n const { loading, results } = useSearch({\r\n query: debouncedQuery,\r\n sources: activeSources,\r\n mapExtent,\r\n mapCenter\r\n });\r\n\r\n const features = useMemo(() => {\r\n if (!results) return [];\r\n return Object.values(results)\r\n .map(result => result.olFeature)\r\n .filter(f => !!f);\r\n }, [results]);\r\n\r\n const handleResultSelected = useCallback(\r\n (result, source) => {\r\n onResultSelected(result, source);\r\n setQuery(\"\");\r\n setVisible(false);\r\n },\r\n [onResultSelected]\r\n );\r\n\r\n return (\r\n
\r\n
\r\n s.text.replace(/Telltur - /, \"\").toLowerCase())\r\n .join(\", \")\r\n })\r\n }\r\n required\r\n ref={searchField}\r\n value={query}\r\n onChange={e => setQuery(e.target.value)}\r\n onFocus={() => setVisible(true)}\r\n />\r\n {\r\n setQuery(\"\");\r\n setVisible(false);\r\n }}\r\n >\r\n \r\n \r\n
\r\n {visible && (\r\n
\r\n {loading && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n
\r\n \r\n {!!results && (\r\n
    \r\n {results.slice(0, 50).map(result => (\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 provideMapState(ensureArticleModuleConfig(TellturSearch));\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 (link.host !== window.location.host || /\\..{3,4}$/.test(link.href) || link.target) {\r\n return;\r\n }\r\n\r\n link.onclick = e => {\r\n let nl = link.pathname;\r\n e.preventDefault();\r\n\r\n if (link.hash && link.pathname === window.location.pathname) {\r\n window.location.hash = link.hash;\r\n\r\n const elem = document.getElementById(link.hash.substr(1));\r\n if (elem) {\r\n elem.setAttribute('open', true);\r\n elem.scrollIntoView();\r\n window.scrollBy({\r\n top: -50,\r\n left: 0\r\n });\r\n }\r\n return;\r\n }\r\n\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","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { translate } from \"react-translate\";\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport Icon from \"../components/Icon\";\r\nimport { Nav, Link, navActions } from \"@avinet/react-adaptive-cms\";\r\nimport { getSessionToken } from \"@avinet/react-adaptive-auth\";\r\nimport TellturSearch from \"../containers/TellturSearch\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport Logo from \"../static/logo_telltur_hvit.png\";\r\nimport { getPath } from \"../utils/Path\";\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 searchOpen: false,\r\n currentPath: \"\"\r\n };\r\n\r\n this.onResultSelected = this.onResultSelected.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n const { loadNav, location } = this.props;\r\n const path = getPath(location);\r\n this.setState({ currentPath: path });\r\n loadNav();\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 }\r\n }\r\n\r\n getProfileNav() {\r\n const { t } = this.props;\r\n\r\n if (getSessionToken()) {\r\n return [\r\n {\r\n menu_uri: \"minprofil\",\r\n title: t(\"MyProfile\"),\r\n uri: \"minprofil\"\r\n },\r\n {\r\n menu_uri: \"registrertur\",\r\n title: \"Registrer en tur\",\r\n uri: \"registrertur\"\r\n },\r\n {\r\n menu_uri: \"mineturer\",\r\n title: \"Mine turer\",\r\n uri: \"mineturer\"\r\n },\r\n {\r\n menu_uri: \"resultater\",\r\n title: \"Resultater\",\r\n uri: \"resultater\"\r\n },\r\n {\r\n menu_uri: \"loggut\",\r\n title: t(\"LogOut\"),\r\n uri: \"loggut\"\r\n }\r\n ];\r\n } else {\r\n return [\r\n {\r\n menu_uri: \"resultater\",\r\n title: \"Resultater\",\r\n uri: \"resultater\"\r\n },\r\n {\r\n menu_uri: \"logginn\",\r\n title: \"Logg inn / Registrer deg\",\r\n uri: \"logginn\"\r\n }\r\n ];\r\n }\r\n }\r\n\r\n getOmTellTurNav() {\r\n const { nav } = this.props;\r\n const omTellTurItems = nav.filter(i => {\r\n if ([\"omtelltur\", \"hjelp\"].some(nav => i.uri.includes(nav))) {\r\n return true;\r\n }\r\n return false;\r\n });\r\n return omTellTurItems;\r\n }\r\n\r\n getNavItems() {\r\n const { nav } = this.props;\r\n const navItems = nav.filter(i => {\r\n if (\r\n [\"resultater\", \"registrertur\", \"friluftsrad\", \"omtelltur\", \"hjelp\"].some(nav =>\r\n i.uri.includes(nav)\r\n )\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n return navItems;\r\n }\r\n\r\n shouldComponentUpdate(nextProps, nextState) {\r\n if (this.props.nav !== nextProps.nav) {\r\n return true;\r\n }\r\n if (nextState !== this.state) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n onResultSelected(result) {\r\n const { history } = this.props;\r\n history.push(\"/turmaal/\" + result.id.replace(\"_\", \"/\"));\r\n this.setState({ searchOpen: false });\r\n }\r\n\r\n render() {\r\n const { navOpen, searchOpen } = this.state;\r\n\r\n let navItems = this.getNavItems();\r\n let profileNav = this.getProfileNav();\r\n let omTellTurNav = this.getOmTellTurNav();\r\n\r\n return (\r\n
\r\n \r\n \"\"\r\n \r\n
\r\n \r\n
\r\n \r\n this.setState({\r\n searchOpen: !searchOpen,\r\n navOpen: false\r\n })\r\n }\r\n >\r\n \r\n \r\n
\r\n \r\n this.setState({\r\n navOpen: !navOpen,\r\n searchOpen: false\r\n })\r\n }\r\n />\r\n \r\n \r\n \r\n \r\n this.setState({\r\n navOpen: false,\r\n searchOpen: false\r\n })\r\n }\r\n >\r\n \r\n
\r\n {omTellTurNav.map(n => (\r\n \r\n this.setState({\r\n navOpen: false,\r\n searchOpen: false\r\n })\r\n }\r\n >\r\n {n.title}\r\n \r\n ))}\r\n
\r\n
\r\n {profileNav.map(n => (\r\n \r\n this.setState({\r\n navOpen: false,\r\n searchOpen: false\r\n })\r\n }\r\n >\r\n {n.title}\r\n \r\n ))}\r\n
\r\n
\r\n \r\n
\r\n {/* currentPath !== \"index\" && (\r\n \r\n ) */}\r\n
\r\n );\r\n }\r\n}\r\n\r\nNavBar.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n nav: PropTypes.array,\r\n loadNav: PropTypes.func,\r\n history: PropTypes.object.isRequired\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(translate(\"NavBar\")(withRouter(NavBar)));\r\n","import React from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\nimport Icon from \"./Icon\";\r\nimport { getPath } from \"../utils/Path\";\r\nimport \"./Footer.scss\";\r\n\r\nconst Footer = () => {\r\n // eslint-disable-next-line no-restricted-globals\r\n const currentPage = getPath(location);\r\n return (\r\n \r\n {currentPage.indexOf(\"friluftsrad\") === -1 && (\r\n
\r\n
\r\n {/* remove currentPage === 'telltur' before deployment */}\r\n {(currentPage === \"index\" || currentPage === \"telltur/\") && (\r\n
\r\n

Slik kommer du igang

\r\n

\r\n {\" \"}\r\n \r\n Gå til kartet\r\n {\" \"}\r\n og zoom inn i kartet for forslag til turmål. Filtrer treffene på ønsket turtype.\r\n

\r\n

\r\n Vet du navnet på turmålet kan du finne det fra\r\n søkefeltet.\r\n

\r\n

\r\n Klikk deg deretter inn på hver enkelt\r\n turmålbeskrivelse for detaljer om turen.\r\n

\r\n\r\n

\r\n Når du har gått turen kan du \"telle\" den ved å registrere turkoden som finnes ute\r\n på turmålet – her på nettsiden eller via GPS-registrering i appen \"Norgeskart\r\n friluftsliv\". Dermed kan du{\" \"}\r\n \r\n delta i konkurranser arrangert av ditt friluftsråd!\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

Vil du ha flere turforslag?

\r\n

\r\n Turportalen{\" \"}\r\n \r\n ut.no\r\n {\" \"}\r\n tilbyr ulike kart og flere turforslag, pluss tips om hytter og severdigheter rundt om i\r\n hele landet. Her kan alle søke frem turforslag som passer seg.\r\n

\r\n

\r\n Ut.no er Norges nasjonale turportal og er et samarbeidsprosjekt mellom DNT, Statskog og\r\n Friluftsrådenes Landsforbund.\r\n

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

Hva er et friluftsråd?

\r\n

\r\n Et friluftsråd er et samarbeid mellom to eller flere kommuner og eventuelt\r\n organisasjoner om felles friluftsoppgaver. Les mer om de mange friluftsrådene og det\r\n landsomfattende samarbeidsorganet Friluftsrådenes Landsforbund på{\" \"}\r\n \r\n www.friluftsrad.no\r\n \r\n .\r\n

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

\r\n © 2018{\" \"}\r\n \r\n Friluftsrådenes Landsforbund\r\n {\" \"}\r\n | Webløsning ved{\" \"}\r\n \r\n Asplan Viak AS\r\n {\" \"}\r\n |{\" \"}\r\n \r\n Personvern, informasjonskapsler\r\n \r\n

\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Footer;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport NavBar from \"../containers/NavBar\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport Footer from \"../components/Footer\";\r\n\r\nimport \"./CoreLayout.scss\";\r\nimport { fixLinks } from \"../utils/Path\";\r\n\r\nclass CoreLayout extends React.Component {\r\n componentDidMount() {\r\n document.getElementsByClassName(\"react-openlayers--map\")[0].classList.add(\"hide-map\");\r\n fixLinks(this.props.history);\r\n }\r\n\r\n componentDidUpdate() {\r\n fixLinks(this.props.history);\r\n }\r\n\r\n render() {\r\n const {\r\n children,\r\n location: { pathname }\r\n } = this.props;\r\n\r\n return (\r\n
\r\n \r\n
\r\n
{children}
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nCoreLayout.propTypes = {\r\n children: PropTypes.element,\r\n location: PropTypes.object,\r\n history: PropTypes.object\r\n};\r\n\r\nexport default withRouter(CoreLayout);\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 \r\n );\r\n }\r\n };\r\n}\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { MapPadding } from \"@avinet/react-openlayers\";\r\nimport { provideViewSize } from \"../hocs/provideViewSize\";\r\nimport NavBar from \"../containers/NavBar\";\r\nimport \"./MapLayout.scss\";\r\n\r\nclass MapLayout extends React.Component {\r\n componentDidMount() {\r\n document.getElementsByClassName(\"react-openlayers--map\")[0].classList.remove(\"hide-map\");\r\n }\r\n\r\n calcMapPadding() {\r\n const { viewHeight, viewWidth } = this.props;\r\n if (viewWidth < 769) {\r\n return [80, 0, viewHeight / 4, 0];\r\n }\r\n return [80, 420, 0, 0];\r\n }\r\n\r\n render() {\r\n const { children } = this.props;\r\n return (\r\n
\r\n \r\n \r\n
{children}
\r\n
\r\n );\r\n }\r\n}\r\n\r\nMapLayout.propTypes = {\r\n children: PropTypes.element,\r\n viewWidth: PropTypes.number.isRequired,\r\n viewHeight: PropTypes.number.isRequired\r\n};\r\n\r\nexport default provideViewSize(MapLayout);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport NavBar from '../containers/NavBar';\r\nimport Footer from '../components/Footer';\r\nimport './IndexLayout.scss';\r\n\r\nclass IndexLayout extends React.Component {\r\n componentDidMount () {\r\n document.getElementsByClassName('react-openlayers--map')[0].classList.add('hide-map');\r\n }\r\n\r\n render () {\r\n const { children } = this.props;\r\n return (\r\n
\r\n \r\n
\r\n
{children}
\r\n
\r\n
\r\n
\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","const fixDate = date => {\r\n if (date && typeof date === 'string') {\r\n if (date.indexOf('/Date') === 0) {\r\n date = date.replace('/Date(', '');\r\n date = date.replace(')/', '');\r\n return new Date(parseInt(date, 10) || date);\r\n } else {\r\n return new Date(date);\r\n }\r\n } else {\r\n return new Date(date);\r\n }\r\n};\r\n\r\nconst validateDatePattern = datestring => {\r\n const validDatePattern = /^\\d{4}-\\d{1,2}-\\d{1,2}$/; // yyyy.MM.dd\r\n if (!datestring || !validDatePattern.test(datestring)) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nconst isValidDate = datestring => {\r\n const timestamp = Date.parse(datestring);\r\n if (isNaN(timestamp)) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nconst isWithinYear = datestring => {\r\n const now = new Date();\r\n const then = new Date(datestring);\r\n if (now.getFullYear() === then.getFullYear()) {\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\nconst isInFuture = datestring => {\r\n const now = new Date();\r\n const then = new Date(datestring);\r\n if (then > now) {\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\nexport { fixDate, validateDatePattern, isValidDate, isWithinYear, isInFuture };\r\n","import request from \"superagent\";\r\nimport { getSessionToken, authReducerActions } from \"@avinet/react-adaptive-auth\";\r\nimport jsSHA from \"jssha\";\r\nimport { fixDate } from \"../utils/date\";\r\nimport config from \"../config/TellTur\";\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\nexport const CLEAR_USER = \"CLEAR_USER\";\r\n\r\n// ------------------------------------\r\n// Actions\r\n// ------------------------------------\r\n\r\nconst clearUserAction = () => ({\r\n type: CLEAR_USER\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(config.adaptiveUrl + \"WebServices/telltur/Users.asmx/GetTellTurUserData\")\r\n // .post('http://localhost/a_a3/WebServices/telltur/Users.asmx/GetTellTurUserData')\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(userRead(err || { message: \"Received an error from server\" }, null));\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 userObj = response.data.find(element => element.key === \"record\");\r\n if (!userObj) {\r\n dispatch(userRead({ message: \"Empty response from server\" }, null));\r\n return;\r\n }\r\n const user = userObj.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 const familyMembersObj = response.data.find(element => element.key === \"familymembers\");\r\n user.familymembers = familyMembersObj.value || undefined;\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(clearUserAction());\r\n };\r\n}\r\n\r\nexport function registerUser(\r\n firstname,\r\n surname,\r\n email,\r\n pass,\r\n userData,\r\n yearOfBirth,\r\n selectedFriluftsraadId,\r\n selectedCompanyId,\r\n consentEmail\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 var params = {\r\n url: config.guiUrl,\r\n email: email,\r\n pass: hash,\r\n firstname: firstname,\r\n surname: surname,\r\n mobile: userData.mobile,\r\n nick_name: userData.nick_name,\r\n first_name: userData.first_name,\r\n last_name: userData.last_name,\r\n address_city: userData.address_city,\r\n description: userData.description,\r\n yearOfBirth,\r\n selected_friluftsraad_uuid: selectedFriluftsraadId,\r\n bedrift_id: selectedCompanyId,\r\n telltur_user_email_consent: consentEmail\r\n };\r\n\r\n request\r\n //.post('http://localhost/a_a3/WebServices/telltur/Users.asmx/RegisterUserConsent')\r\n .post(config.adaptiveUrl + \"WebServices/telltur/Users.asmx/RegisterUserConsent\")\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(userRegistered({ message: \"Error returned from service\" }, null));\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 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 function updateUser(user) {\r\n return dispatch => {\r\n var sessionId = getSessionToken();\r\n if (!sessionId) {\r\n dispatch(userUpdated({ message: \"Not logged in. Cannot get user.\" }, null));\r\n return;\r\n }\r\n\r\n dispatch(updatingUser());\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/telltur/Users.asmx/UpdateUser\")\r\n // .post('http://localhost/a_a3/WebServices/telltur/Users.asmx/UpdateUser')\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 data: user,\r\n extraParams: null\r\n })\r\n .end((err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(userUpdated(err || { message: \"Received an error from server\" }, null));\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(userDeleted({ message: \"Not logged in. Cannot get user.\" }, null));\r\n return;\r\n }\r\n\r\n dispatch(deletingUser());\r\n\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/telltur/Users.asmx/DeleteTellTurAccount\")\r\n // .post('http://localhost/a_a3/WebServices/telltur/Users.asmx/DeleteTellTurAccount')\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(userDeleted(err || { message: \"Received an error from server\" }, null));\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: undefined,\r\n user: undefined,\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 CLEAR_USER:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n user: null,\r\n error: null,\r\n registeredUserEmail: \"\"\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","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport config from \"../config/TellTur\";\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 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 onCheckChange(!checked)}>\r\n {checked && }\r\n \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 '../components/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
\r\n
\r\n
{children}
\r\n
\r\n {checkBoxText && (\r\n
\r\n {\r\n this.setState({ checked: newChecked });\r\n }}\r\n checked={this.state.checked}\r\n />\r\n \r\n
\r\n )}\r\n onClose(this.state.checked)}\r\n className='btn popup-box--close-btn'\r\n >\r\n {closeBtnText}\r\n \r\n
\r\n
\r\n
\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 config from \"../config/TellTur\";\r\n\r\nconst validateProfile = (user, familymember) => {\r\n var numberRegex = /^-?\\d+\\.?\\d*$/;\r\n var validationErrors = {};\r\n\r\n if (!familymember) {\r\n validationErrors.general = \"General\";\r\n return { valid: false, errors: { validationErrors } };\r\n }\r\n\r\n if (\r\n user.modify_date.setHours(0, 0, 0, 0) <\r\n new Date(\"03.01.2020\").setHours(0, 0, 0, 0)\r\n ) {\r\n validationErrors.general = \"General\";\r\n return { valid: false, errors: { validationErrors } };\r\n }\r\n\r\n if (\r\n !familymember.selected_friluftsraad_uuid ||\r\n familymember.selected_friluftsraad_uuid === config.emptyFriluftsraadUuid\r\n ) {\r\n validationErrors.selected_friluftsraad_uuid =\r\n \"SelectedFriluftsraadIsInvalid\";\r\n }\r\n\r\n if (\r\n familymember.yearofbirth < new Date().getFullYear() - 120 ||\r\n familymember.yearofbirth > new Date().getFullYear()\r\n ) {\r\n validationErrors.yearofbirth = \"YearOfBirthNotValid\";\r\n }\r\n\r\n if (!familymember.nick_name || familymember.nick_name.length < 4) {\r\n validationErrors.nick_name = \"UsernameTooShort\";\r\n }\r\n\r\n if (!user.user_data.first_name || user.user_data.first_name.length < 2) {\r\n validationErrors.firstname = \"FirstnameNotValid\";\r\n }\r\n\r\n if (!user.user_data.last_name || user.user_data.last_name.length < 2) {\r\n validationErrors.surname = \"SurnameNotValid\";\r\n }\r\n\r\n if (\r\n !user.user_data.mobile ||\r\n user.user_data.mobile.length < 7 ||\r\n !numberRegex.test(user.user_data.mobile)\r\n ) {\r\n validationErrors.mobile = \"MobileNotValid\";\r\n }\r\n\r\n var emailRegEx = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\r\n if (user.email && !emailRegEx.test(user.email)) {\r\n validationErrors.email = \"EmailAddressNotValid\";\r\n }\r\n\r\n if (\r\n !user.user_data.address_city ||\r\n user.user_data.address_city.length < 2 ||\r\n isNaN(user.user_data.address_city)\r\n ) {\r\n validationErrors.municipality = \"MunicipalityNotValid\";\r\n }\r\n\r\n if (Object.keys(validationErrors).length > 0) {\r\n return { valid: false, errors: validationErrors };\r\n }\r\n return { valid: true, errors: {} };\r\n};\r\n\r\nexport { validateProfile };\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { translate } from \"react-translate\";\r\nimport PopupBox from \"../components/PopupBox\";\r\nimport { withRouter } from \"react-router\";\r\nimport { validateProfile } from \"../utils/profile\";\r\n\r\nimport \"./ProfileValidator.scss\";\r\n\r\nclass ProfileValidator extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n displayProfileUpdatePopup: false\r\n };\r\n this.onDisplayProfilePopupClose = this.onDisplayProfilePopupClose.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n const { user } = this.props;\r\n\r\n if (user && user.familymembers) {\r\n const mainMember = user.familymembers.find(f => f.is_main_familymember === true);\r\n var validProfile = validateProfile(user, mainMember);\r\n\r\n if (!validProfile.valid) {\r\n this.setState({ displayProfileUpdatePopup: true });\r\n }\r\n }\r\n }\r\n\r\n componentWillReceiveProps(nextProps) {\r\n const { user } = this.props;\r\n if (!user && nextProps.user && nextProps.user.familymembers) {\r\n const mainMember = nextProps.user.familymembers.find(f => f.is_main_familymember === true);\r\n var validProfile = validateProfile(nextProps.user, mainMember);\r\n\r\n if (!validProfile.valid) {\r\n this.setState({ displayProfileUpdatePopup: true });\r\n }\r\n }\r\n }\r\n\r\n onDisplayProfilePopupClose = () => {\r\n this.setState({ displayProfileUpdatePopup: false });\r\n localStorage.setItem(\"telltur_profilePopupShown\", \"true\");\r\n this.props.history.push(\"/minprofil\");\r\n };\r\n\r\n render() {\r\n const { displayProfileUpdatePopup } = this.state;\r\n const { t } = this.props;\r\n\r\n return (\r\n
\r\n {displayProfileUpdatePopup && (\r\n \r\n
\r\n

{t(\"Welcome\")}

\r\n

{t(\"ReminderText1\")}

\r\n

{t(\"ReminderText2\")}

\r\n
\r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nProfileValidator.propTypes = {\r\n user: PropTypes.object.isRequired,\r\n t: PropTypes.func.isRequired,\r\n history: PropTypes.object.isRequired\r\n};\r\n\r\nexport default withRouter(translate(\"ProfileValidator\")(ProfileValidator));\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Icon from \"./Icon\";\r\nimport { translate } from \"react-translate\";\r\nimport { Link } from \"react-router-dom\";\r\n\r\nimport headerImg from \"../static/header-bg.jfif\";\r\nimport benk from \"../static/benk.png\";\r\nimport fiske from \"../static/fiske.svg\";\r\nimport sykle from \"../static/sykle.svg\";\r\n\r\nimport \"./IndexPage.scss\";\r\nimport { fixDate } from \"../utils/date\";\r\n\r\nconst IndexPage = ({ competitions, friluftsraadHref, t, getAssocietedFriluftsraadUri }) => {\r\n var tomorrow = new Date();\r\n tomorrow.setDate(tomorrow.getDate() + 1);\r\n let activeCompetitions = [];\r\n\r\n if (competitions) {\r\n activeCompetitions = competitions.filter(competition => {\r\n const endDate = fixDate(competition.end_date);\r\n const hasExpired = competition.end_date ? endDate < tomorrow : false;\r\n return !hasExpired;\r\n });\r\n }\r\n\r\n return (\r\n
\r\n
\r\n {/**/}\r\n {activeCompetitions && activeCompetitions.length > 0 && (\r\n
\r\n

\r\n {t(\"ActiveCompetitions\").replace(\r\n \"{0}\",\r\n activeCompetitions && activeCompetitions.length\r\n )}{\" \"}\r\n - {t(\"JoinNow\")}\r\n

\r\n
\r\n )}\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n {t(\"FindTrip\")}\r\n \r\n 0 && getAssocietedFriluftsraadUri\r\n ? \"active-competitions--btn\"\r\n : \"\"\r\n ].join(\" \")}\r\n >\r\n \r\n {t(\"CheckCompetitions\")}\r\n \r\n
\r\n
\r\n\r\n
\r\n

\r\n TellTur {t(\"Description1\")}{\" \"}\r\n \r\n {t(\"UseMapLink\")}\r\n \r\n {t(\"Description2\")}\r\n \r\n {t(\"GoToFrLink\")}\r\n \r\n

\r\n

{t(\"Description3\")}

\r\n
\r\n \r\n {t(\"GoToAboutLink\")}\r\n \r\n
\r\n

{t(\"GoodLuck\")}

\r\n \"fiske\r\n \"sykle\r\n \"benk\r\n
\r\n
\r\n );\r\n};\r\n\r\nIndexPage.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n competitions: PropTypes.array,\r\n friluftsraadHref: PropTypes.string.isRequired\r\n};\r\n\r\nexport default translate(\"IndexPage\")(IndexPage);\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\nconst bindActionCreators = (actionCreators, dispatch, reducerKey) => {\r\n const wrappedDispatch = wrapDispatch(dispatch, reducerKey);\r\n return originalBindActionCreator(actionCreators, wrappedDispatch);\r\n};\r\n\r\nexport default bindActionCreators;\r\n","import request from \"superagent\";\r\nimport { getSessionToken, authReducerActions } from \"@avinet/react-adaptive-auth\";\r\nimport { createAction, handleActions } from \"redux-actions\";\r\nimport { olUtils } from \"@avinet/react-openlayers\";\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 = \"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 = \"DELETE_DIGI_THEME_RECORD_SUCCESS\";\r\nexport const DELETE_DIGI_THEME_RECORD_FAILED = \"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(READ_SUCCESS_DIGI_THEME_RECORDS, (records, total) => ({\r\n records,\r\n total\r\n}));\r\n\r\nconst readObjectSuccess = createAction(READ_OBJECT_SUCCESS_DIGI_THEME, record => ({\r\n record\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(DELETE_DIGI_THEME_RECORD_SUCCESS, data => ({\r\n data\r\n}));\r\n\r\nconst deleteFailed = createAction(DELETE_DIGI_THEME_RECORD_FAILED, data => ({\r\n data\r\n}));\r\n\r\nconst resetDigiTheme = () => ({ type: RESET_DIGI_THEME_REDUCER });\r\n// ------------------------------------\r\n// Action creators\r\n// ------------------------------------\r\nconst save = (data, srid) => {\r\n return (dispatch, getState, getReducerState) => {\r\n dispatch(saving());\r\n\r\n request\r\n .post(getReducerState().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(saveFailed({ code: \"SAVE_FAILED\", message: res.exception.message }));\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\nconst deleteRecord = id => {\r\n return (dispatch, getState, getReducerState) => {\r\n dispatch(deleting());\r\n\r\n request\r\n .post(getReducerState().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\nconst readChildren = (columns, filter, fkColumn, fkColumnId, 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 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 getReducerState\r\n );\r\n };\r\n};\r\n\r\nconst readAny = (data, srid, readObject = false, dispatch, getReducerState) => {\r\n request\r\n .post(getReducerState().adaptiveUrl + \"WebServices/client/DataView.asmx/ReadAny\")\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\nconst 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 getReducerState\r\n );\r\n };\r\n};\r\n\r\nconst 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 getReducerState\r\n );\r\n };\r\n};\r\n\r\nconst readFiltered = (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 },\r\n srid,\r\n false,\r\n dispatch,\r\n getReducerState\r\n );\r\n };\r\n};\r\n\r\nexport const actions = {\r\n save,\r\n deleteRecord,\r\n readFiltered,\r\n readObject,\r\n readOwned,\r\n readChildren,\r\n resetDigiTheme\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, adaptiveUrl, 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 if (payload.data.geom_wkt) {\r\n payload.data.olFeature = olUtils.createFeatureFromWkt(\r\n payload.data.geom_wkt,\r\n payload.data\r\n );\r\n }\r\n return Object.assign({}, state, {\r\n saving: false,\r\n record: payload.data\r\n });\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 if (records.length && records[0].geom_wkt) {\r\n records.forEach(r => {\r\n r.olFeature = olUtils.createFeatureFromWkt(r.geom_wkt, r);\r\n });\r\n }\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 if (record.geom_wkt) {\r\n record.olFeature = olUtils.createFeatureFromWkt(record.geom_wkt, record);\r\n }\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, adaptiveUrl, themeUuid }\r\n );\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Title from \"../components/Title\";\r\nimport LoadingIndicator from \"../components/LoadingIndicator\";\r\nimport ProfileValidator from \"../components/ProfileValidator\";\r\nimport IndexPage from \"../components/IndexPage\";\r\nimport scopedBindActionCreators from \"../utils/scopedReducer\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport { pageActions } from \"@avinet/react-adaptive-cms\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport { translate } from \"react-translate\";\r\nimport { connect } from \"react-redux\";\r\nimport { getSessionToken } from \"@avinet/react-adaptive-auth\";\r\nimport { actions as digiThemeActions } from \"../utils/digiTheme\";\r\nimport { getPath } from \"../utils/Path\";\r\nimport \"./PageView.scss\";\r\nimport config from \"../config/TellTur\";\r\n\r\nconst mapStateToProps = state => ({\r\n competitions: state.competition.records,\r\n competitionsLoading: state.competition.loading,\r\n friluftsraad: state.readFriluftsraad.records,\r\n page: state.page.page,\r\n pageLoading: state.page.pageLoading,\r\n user: state.user.user,\r\n userLoading: state.user.loading\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n loadPage: bindActionCreators(pageActions.loadPage, dispatch),\r\n readCompetitions: scopedBindActionCreators(\r\n digiThemeActions.readFiltered,\r\n dispatch,\r\n \"competition\"\r\n ),\r\n resetDigiTheme: scopedBindActionCreators(\r\n digiThemeActions.resetDigiTheme,\r\n dispatch,\r\n \"competition\"\r\n )\r\n };\r\n};\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, resetDigiTheme, user } = this.props;\r\n const path = getPath(location);\r\n this.setState({ currentPath: path });\r\n\r\n loadPage(path);\r\n\r\n if (!getSessionToken || !user) resetDigiTheme();\r\n\r\n if (user) {\r\n const mainMember = user.familymembers.find(f => f.is_main_familymember === true);\r\n this.readFriluftsraadCompetitions(mainMember);\r\n }\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 if (!this.props.user && nextProps.user && nextProps.user.familymembers) {\r\n const mainMember = nextProps.user.familymembers.find(f => f.is_main_familymember === true);\r\n\r\n this.readFriluftsraadCompetitions(mainMember);\r\n }\r\n }\r\n\r\n readFriluftsraadCompetitions(user) {\r\n const { readCompetitions } = this.props;\r\n if (!getSessionToken || !user) return;\r\n\r\n const friluftsraadUuid = user.selected_friluftsraad_uuid;\r\n\r\n readCompetitions(\r\n [\r\n \"id\",\r\n \"title\",\r\n \"description\",\r\n \"image\",\r\n \"municipality\",\r\n \"year_of_birth_to\",\r\n \"year_of_birth_from\",\r\n \"start_date\",\r\n \"end_date\"\r\n ],\r\n {\r\n filterColumns: [\r\n {\r\n name: \"_acl\",\r\n netType: \"Guid[]\",\r\n value: [friluftsraadUuid],\r\n comparisonOperator: \"@>\",\r\n logicalOperator: \"AND\"\r\n },\r\n {\r\n name: \"show\",\r\n netType: \"boolean\",\r\n value: true,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"AND\"\r\n }\r\n ],\r\n sortColums: [\r\n {\r\n name: \"name\"\r\n }\r\n ]\r\n },\r\n config.mapProjCode\r\n );\r\n }\r\n\r\n get getAssocietedFriluftsraadUri() {\r\n const { friluftsraad, user } = this.props;\r\n if (!getSessionToken || !user) return \"/friluftsrad\";\r\n\r\n const mainMember = user.familymembers.find(f => f.is_main_familymember === true);\r\n const myFr = friluftsraad.find(fr => fr.uuid === mainMember.selected_friluftsraad_uuid);\r\n\r\n if (!myFr) return \"/friluftsrad\";\r\n\r\n const myFrUri = myFr && myFr.uri;\r\n\r\n return `/friluftsrad/${myFrUri}`;\r\n }\r\n\r\n render() {\r\n let {\r\n page: { content, title },\r\n pageLoading,\r\n user,\r\n userLoading,\r\n competitions\r\n } = this.props;\r\n const { currentPath } = this.state;\r\n\r\n return (\r\n
\r\n \r\n {pageLoading || userLoading ? (\r\n <div className=\"loader\">\r\n <LoadingIndicator />\r\n </div>\r\n ) : (\r\n <div className=\"tell-tur-cms\">\r\n {currentPath === \"index\" ? (\r\n <IndexPage\r\n competitions={competitions}\r\n friluftsraadHref={this.getAssocietedFriluftsraadUri}\r\n getAssocietedFriluftsraadUri={this.getAssocietedFriluftsraadUri}\r\n />\r\n ) : (\r\n <div dangerouslySetInnerHTML={{ __html: content }} />\r\n )}\r\n </div>\r\n )}\r\n {user && <ProfileValidator user={user} />}\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 user: PropTypes.object,\r\n userLoading: PropTypes.bool,\r\n resetDigiTheme: PropTypes.func.isRequired,\r\n readCompetitions: PropTypes.func.isRequired,\r\n friluftsraad: PropTypes.array,\r\n competitions: PropTypes.array\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(withRouter(translate(\"PageView\")(PageView)));\r\n","var getPageSections = page => {\r\n var sections = null;\r\n if (page && page.content) {\r\n var sectionArray = [];\r\n var tmp1 = page.content.split('[');\r\n\r\n tmp1.forEach(s => {\r\n sectionArray = sectionArray.concat(s.split(']'));\r\n });\r\n\r\n sectionArray = sectionArray.filter(s => s.length !== 0);\r\n if (sectionArray.length < 2) {\r\n return null;\r\n }\r\n sections = {};\r\n var i = 0;\r\n for (i = 0; i < sectionArray.length - 1;) {\r\n var propertyName = sectionArray[i].trim();\r\n var value = sectionArray[i + 1];\r\n sections[propertyName] = value;\r\n i = i + 2;\r\n }\r\n }\r\n return sections;\r\n};\r\n\r\nexport { getPageSections };\r\n","import request from \"superagent\";\r\nimport { getSessionToken } from \"@avinet/react-adaptive-auth\";\r\nimport config from \"../config/TellTur\";\r\n\r\nconst readAny = (\r\n themeUuid,\r\n columns,\r\n editable,\r\n onlyOwned,\r\n objectId,\r\n fkColumn,\r\n fkColumnIds,\r\n filter,\r\n start,\r\n limit,\r\n srid,\r\n callback\r\n) => {\r\n const params = {\r\n theme_uuid: themeUuid,\r\n columns,\r\n editable,\r\n only_owned: onlyOwned,\r\n object_id: objectId,\r\n fk_column: fkColumn,\r\n fk_column_ids: fkColumnIds,\r\n filter,\r\n start,\r\n limit,\r\n srid\r\n };\r\n\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/client/DataView.asmx/ReadAny\")\r\n .send({ request: params })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .end((err, res) => {\r\n callback(err, res);\r\n });\r\n};\r\n\r\nconst readFiltered = (themeUuid, columns, filter, callback) => {\r\n return readAny(\r\n themeUuid,\r\n columns,\r\n false,\r\n false,\r\n null,\r\n null,\r\n null,\r\n filter,\r\n 0,\r\n 1000,\r\n config.mapProjCode,\r\n callback\r\n );\r\n};\r\n\r\nconst readChildren = (themeUuid, fkColumn, columns, filter, editable, fkColumnId, callback) => {\r\n let params = {\r\n theme_uuid: themeUuid,\r\n fk_column: fkColumn,\r\n fk_column_id: fkColumnId,\r\n columns,\r\n editable,\r\n filter\r\n };\r\n\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/client/DataView.asmx/ReadChildren\")\r\n .send(params)\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .end((err, res) => {\r\n callback(err, res);\r\n });\r\n};\r\n\r\nconst save = (themeUuid, data, callback) => {\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/client/DataView.asmx/Save\")\r\n .send({\r\n data,\r\n theme_uuid: themeUuid\r\n })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .end((err, res) => {\r\n callback(err, res);\r\n });\r\n};\r\n\r\nconst remove = (themeUuid, id, callback) => {\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/client/DataView.asmx/Delete\")\r\n .send({\r\n id,\r\n theme_uuid: themeUuid\r\n })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .end((err, res) => {\r\n callback(err, res);\r\n });\r\n};\r\n\r\nexport { readFiltered, readChildren, save, remove, readAny };\r\n","import { readFiltered } from \"./DigiTheme\";\r\nimport config from \"../config/TellTur\";\r\n\r\nconst columns = [\"id\", \"navn\", \"beskrivelse\"];\r\n// ------------------------------------\r\n// Constants\r\n// ------------------------------------\r\nexport const READING_COMPANIES = \"READING_COMPANIES\";\r\nexport const COMPANIES_READ = \"COMPANIES_READ\";\r\n\r\n// ------------------------------------\r\n// Actions\r\n// ------------------------------------\r\n\r\nconst readCompanies = () => ({ type: READING_COMPANIES });\r\n\r\nconst companiesRead = (error, companies) => ({\r\n type: COMPANIES_READ,\r\n payload: {\r\n error,\r\n companies\r\n }\r\n});\r\n\r\n// ------------------------------------\r\n// Action creators\r\n// ------------------------------------\r\nexport function getCompanies(friluftsraadId) {\r\n return dispatch => {\r\n dispatch(readCompanies());\r\n\r\n const filter = {\r\n filterColumns: [\r\n {\r\n name: \"_acl\",\r\n value: [friluftsraadId],\r\n comparisonOperator: \"@>\",\r\n netType: \"Guid[]\"\r\n }\r\n ],\r\n sortColumns: [\r\n {\r\n name: \"navn\"\r\n }\r\n ],\r\n secondFilter: [],\r\n defaultFilter: [],\r\n distinctColumns: []\r\n };\r\n\r\n readFiltered(\r\n config.companyDigiThemeUuid,\r\n columns,\r\n filter,\r\n (err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(\r\n companiesRead(\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 companiesRead(\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(companiesRead(undefined, response.records));\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: undefined,\r\n companies: undefined\r\n};\r\n\r\nexport function companyReducer(state = initialState, action) {\r\n switch (action.type) {\r\n case READING_COMPANIES:\r\n return Object.assign({}, state, {\r\n loading: true,\r\n companies: undefined,\r\n error: undefined\r\n });\r\n case COMPANIES_READ:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n error: action.payload.error,\r\n companies: action.payload.companies\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 { translate } from 'react-translate';\r\n\r\nconst getServerErrorMessage = (exception, t, meta) => {\r\n if (exception === undefined || exception === null) {\r\n return '';\r\n }\r\n if (exception.code) {\r\n if (exception.code === 'TURMAAL_INVALID') {\r\n return t('InvalidTurmaal');\r\n }\r\n if (exception.code === 'USER_EXISTS') {\r\n return t('UserExists', {username: meta.username});\r\n }\r\n if (exception.code === 'USER_INVALID') {\r\n return t('InvalidUser');\r\n }\r\n if (exception.code === 'OWNER_INVALID') {\r\n return t('InvalidOwner');\r\n }\r\n if (exception.code === 'user_3') {\r\n return t('EmailInUse');\r\n }\r\n if (exception.code === 'user_1') {\r\n return t('EmailInUse');\r\n }\r\n if (exception.code === 'TURMAAL_NOT_ACTIVE') {\r\n return t('TurmaalNotActive');\r\n }\r\n if (exception.code === 'TURMAAL_ALREADY_REGISTERED_TODAY') {\r\n return t(exception.code);\r\n }\r\n if (exception.code === 'DATO_ERROR') {\r\n return t(exception.code);\r\n }\r\n if (exception.code === 'INVALID_FAMILY_MEMBER') {\r\n return t(exception.code);\r\n }\r\n }\r\n if (exception.msg) {\r\n if (exception.msg === 'cannot_change_frilufstrad_active_competitions') {\r\n return t(exception.msg);\r\n }\r\n return exception.msg;\r\n }\r\n if (exception.message) {\r\n return exception.message;\r\n }\r\n return '';\r\n};\r\n\r\nconst TranslatedServerError = ({ error, t, cssClass, meta = {} }) => {\r\n const errorMessage = getServerErrorMessage(error, t, meta);\r\n const errorCssClass = cssClass || 'error';\r\n return <div className={errorCssClass}>{errorMessage}</div>;\r\n};\r\n\r\nTranslatedServerError.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n error: PropTypes.object,\r\n cssClass: PropTypes.string\r\n};\r\n\r\nexport default translate('TranslatedServerError')(TranslatedServerError);\r\n","import React from \"react\";\r\nimport { translate } from \"react-translate\";\r\nimport PropTypes from \"prop-types\";\r\nimport TranslatedServerError from \"./TranslatedServerError\";\r\nimport Select from \"react-select\";\r\nimport config from \"../config/TellTur\";\r\n\r\nclass UserRegistrationForm extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = { proposedFriluftsraad: undefined };\r\n }\r\n\r\n onTextChange = evt => {\r\n const { handleChange } = this.props;\r\n\r\n handleChange(evt.target.name, evt.target.value);\r\n };\r\n\r\n get getGroupedMunicipalities() {\r\n const { municipalities } = this.props;\r\n const fylker = config.fylkesnummer;\r\n\r\n const municipalitiesGroupedByCounties = fylker\r\n .map(fylke => {\r\n return {\r\n label: fylke.navn,\r\n options: municipalities\r\n .filter(municipality => {\r\n if (municipality.komm < 999) {\r\n return fylke.nummer === \"03\"; // this is bcs kommunenummer are stored in psql as int and for Oslo is stored as 301 instead 0301 becouse of leading 0\r\n }\r\n return String(municipality.komm).slice(0, 2) === fylke.nummer;\r\n })\r\n .sort((a, b) => (a.navn > b.navn ? 1 : b.navn > a.navn ? -1 : 0))\r\n };\r\n })\r\n .sort((a, b) => (a.navn > b.navn ? 1 : b.navn > a.navn ? -1 : 0));\r\n\r\n return municipalitiesGroupedByCounties;\r\n }\r\n\r\n componentDidMount() {\r\n this.getAssociatedFriluftsraad();\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.municipality !== this.props.municipality) {\r\n this.getAssociatedFriluftsraad(this.props.municipality);\r\n }\r\n }\r\n\r\n getAssociatedFriluftsraad(newValue) {\r\n const { allFriluftsraad, friluftsraadMedlemskommuner } = this.props;\r\n let associatedFriluftsraadArr = [];\r\n\r\n if (!newValue) {\r\n this.setState({ proposedFriluftsraad: allFriluftsraad });\r\n return;\r\n }\r\n\r\n const associatedFriluftsraad = friluftsraadMedlemskommuner.filter(\r\n fr => fr.kommune === newValue\r\n );\r\n\r\n if (!associatedFriluftsraad || !associatedFriluftsraad.length) {\r\n this.setState({ proposedFriluftsraad: allFriluftsraad });\r\n return;\r\n }\r\n\r\n associatedFriluftsraadArr = allFriluftsraad.filter(fr =>\r\n associatedFriluftsraad.some(asf => asf.fr_id === fr.rolle_id)\r\n );\r\n this.setState({\r\n proposedFriluftsraad: [\r\n {\r\n label: \"Friluftsråd for din bostedskommune\",\r\n options: associatedFriluftsraadArr\r\n },\r\n {\r\n label: \"Andre TellTur-friluftsråd\",\r\n options: allFriluftsraad.filter(fr =>\r\n associatedFriluftsraad.some(asf => asf.fr_id !== fr.rolle_id)\r\n )\r\n }\r\n ]\r\n });\r\n }\r\n\r\n render() {\r\n const {\r\n username,\r\n password,\r\n passwordRepeat,\r\n mobile,\r\n municipality,\r\n municipalities,\r\n firstname,\r\n surname,\r\n yearOfBirth,\r\n email,\r\n selectedFriluftsraadId,\r\n consentEmail,\r\n allFriluftsraad,\r\n validationErrors,\r\n registerUserError,\r\n t,\r\n handleChange,\r\n handleSubmit\r\n } = this.props;\r\n\r\n return (\r\n <form className=\"tell-tur-form\">\r\n <span className=\"tell-tur-form--control\">\r\n <label>{t(\"Username\")}</label>\r\n <input name=\"username\" type=\"text\" value={username} onChange={this.onTextChange} />\r\n <span className=\"error\">{validationErrors.username}</span>\r\n </span>\r\n <span className=\"tell-tur-form--control\">\r\n <label>{t(\"Password\")}</label>\r\n <input name=\"password\" type=\"password\" value={password} onChange={this.onTextChange} />\r\n <span className=\"error\">{validationErrors.password}</span>\r\n </span>\r\n <span className=\"tell-tur-form--control\">\r\n <label>{t(\"PasswordRepeat\")}</label>\r\n <input\r\n name=\"passwordRepeat\"\r\n type=\"password\"\r\n value={passwordRepeat}\r\n onChange={this.onTextChange}\r\n />\r\n <span className=\"error\">{validationErrors.passwordRepeat}</span>\r\n </span>\r\n <span className=\"tell-tur-form--control\">\r\n <label>{t(\"Firstname\")}</label>\r\n <input name=\"firstname\" type=\"text\" value={firstname} onChange={this.onTextChange} />\r\n <span className=\"error\">{validationErrors.firstname}</span>\r\n </span>\r\n <span className=\"tell-tur-form--control\">\r\n <label>{t(\"Surname\")}</label>\r\n <input name=\"surname\" type=\"text\" value={surname} onChange={this.onTextChange} />\r\n <span className=\"error\">{validationErrors.surname}</span>\r\n </span>\r\n <span className=\"tell-tur-form--control\">\r\n <label>{t(\"Mobile\")}</label>\r\n <input name=\"mobile\" type=\"tel\" value={mobile} onChange={this.onTextChange} />\r\n <span className=\"error\">{validationErrors.mobile}</span>\r\n </span>\r\n <span className=\"tell-tur-form--control\">\r\n <label>{t(\"Email\")}</label>\r\n <input name=\"email\" type=\"email\" value={email} onChange={this.onTextChange} />\r\n <span className=\"error\">{validationErrors.email}</span>\r\n </span>\r\n <span className=\"tell-tur-form--control\">\r\n <label>{t(\"YearOfBirth\")}</label>\r\n <input\r\n name=\"yearOfBirth\"\r\n type=\"number\"\r\n value={yearOfBirth}\r\n onChange={this.onTextChange}\r\n min={new Date().getFullYear() - 120}\r\n max={new Date().getFullYear()}\r\n />\r\n <span className=\"error\">{validationErrors.yearOfBirth}</span>\r\n </span>\r\n <span className=\"tell-tur-form--control\">\r\n <label>{t(\"Municipality\")}</label>\r\n <Select\r\n classNamePrefix=\"editable-search-dropdown\"\r\n placeholder={t(\"ChooseMunicipality\")}\r\n options={this.getGroupedMunicipalities}\r\n getOptionLabel={o => o.navn}\r\n getOptionValue={o => o.komm}\r\n value={municipalities.find(o => o.komm === municipality)}\r\n onChange={(di, action) => {\r\n if (action.action === \"select-option\") {\r\n handleChange(\"municipality\", di.komm);\r\n }\r\n }}\r\n />\r\n <span className=\"error\">{validationErrors.municipality}</span>\r\n </span>\r\n <span className=\"tell-tur-form--control\">\r\n <label>{t(\"SelectedFriluftsraad\")}</label>\r\n <Select\r\n classNamePrefix=\"editable-search-dropdown\"\r\n options={this.state.proposedFriluftsraad}\r\n placeholder={t(\"ChooseFriluftsraad\")}\r\n getOptionLabel={o => o.navn}\r\n getOptionValue={o => o.uuid}\r\n value={allFriluftsraad.find(o => o.uuid === selectedFriluftsraadId)}\r\n onChange={(di, action) => {\r\n if (action.action === \"select-option\") {\r\n handleChange(\"selectedFriluftsraadId\", di.uuid);\r\n }\r\n }}\r\n />\r\n\r\n <span className=\"error\">{validationErrors.selectedFriluftsraadId}</span>\r\n </span>\r\n <span className=\"tell-tur-form--control\">\r\n <label className=\"checkbox-wrapper\">\r\n <input\r\n type=\"checkbox\"\r\n checked={consentEmail || false}\r\n onChange={e => {\r\n handleChange(\"consentEmail\", e.target.checked);\r\n }}\r\n />\r\n <span className=\"checkmark\" />\r\n {t(\"Agree\")}\r\n </label>\r\n </span>\r\n {registerUserError && (\r\n <TranslatedServerError\r\n error={registerUserError}\r\n cssClass={\"error u-margin-top-small\"}\r\n meta={{ username }}\r\n />\r\n )}\r\n <div className=\"tell-tur-form--button-group\">\r\n <button onClick={handleSubmit} className=\"btn btn-primary\">\r\n {t(\"Register\")}\r\n </button>\r\n </div>\r\n </form>\r\n );\r\n }\r\n}\r\n\r\nUserRegistrationForm.propTypes = {\r\n username: PropTypes.string.isRequired,\r\n password: PropTypes.string.isRequired,\r\n passwordRepeat: PropTypes.string.isRequired,\r\n mobile: PropTypes.string.isRequired,\r\n municipality: PropTypes.number,\r\n firstname: PropTypes.string.isRequired,\r\n surname: PropTypes.string.isRequired,\r\n yearOfBirth: PropTypes.string.isRequired,\r\n email: PropTypes.string.isRequired,\r\n selectedFriluftsraadId: PropTypes.string,\r\n consentEmail: PropTypes.bool,\r\n allFriluftsraad: PropTypes.array,\r\n validationErrors: PropTypes.object,\r\n registerUserError: PropTypes.object,\r\n t: PropTypes.func.isRequired,\r\n handleChange: PropTypes.func.isRequired,\r\n handleSubmit: PropTypes.func.isRequired,\r\n municipalities: PropTypes.array,\r\n friluftsraadMedlemskommuner: PropTypes.array\r\n};\r\n\r\nexport default translate(\"UserRegistrationForm\")(UserRegistrationForm);\r\n","import React from \"react\";\r\nimport { translate } from \"react-translate\";\r\nimport PropTypes from \"prop-types\";\r\nimport { clearUser, registerUser } from \"../redux/user\";\r\nimport { getPageSections } from \"../utils/Page\";\r\nimport { withRouter, Link } from \"react-router-dom\";\r\nimport { getCompanies } from \"../redux/companies\";\r\nimport UserRegistrationForm from \"./UserRegistrationForm\";\r\nimport { connect } from \"react-redux\";\r\nimport Title from \"./Title\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport LoadingIndicator from \"./LoadingIndicator\";\r\nimport scopedBindActionCreators from \"../utils/scopedReducer\";\r\nimport { actions as digiThemeActions } from \"../utils/digiTheme\";\r\nimport config from \"../config/TellTur\";\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n registerUser: bindActionCreators(registerUser, dispatch),\r\n clearUser: bindActionCreators(clearUser, dispatch),\r\n getCompanies: bindActionCreators(getCompanies, dispatch),\r\n getAllFriluftsraad: scopedBindActionCreators(\r\n digiThemeActions.readFiltered,\r\n dispatch,\r\n \"readFriluftsraad\"\r\n ),\r\n readFriluftsraadMedlemskommuner: scopedBindActionCreators(\r\n digiThemeActions.readFiltered,\r\n dispatch,\r\n \"friluftsraadMedlemskommuner\"\r\n )\r\n };\r\n};\r\n\r\nconst mapStateToProps = state => ({\r\n registeredUserEmail: state.user.registeredUserEmail,\r\n registerUserError: state.user.error,\r\n user: state.user.user,\r\n allFriluftsraad: state.readFriluftsraad.records,\r\n companies: state.companies.companies,\r\n friluftsraadMedlemskommuner: state.friluftsraadMedlemskommuner.records,\r\n friluftsraadMedlemskommunerLoading: state.friluftsraadMedlemskommuner.loading\r\n});\r\n\r\nclass UserRegistrationPage extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n username: \"\",\r\n password: \"\",\r\n passwordRepeat: \"\",\r\n firstname: \"\",\r\n surname: \"\",\r\n mobile: \"\",\r\n email: \"\",\r\n municipality: undefined,\r\n yearOfBirth: \"\",\r\n validationErrors: {},\r\n selectedFriluftsraadId: \"\",\r\n selectedCompanyId: \"-1\"\r\n };\r\n\r\n this.redirect = this.redirect.bind(this);\r\n this.handleSubmit = this.handleSubmit.bind(this);\r\n this.validateForm = this.validateForm.bind(this);\r\n this.handleChange = this.handleChange.bind(this);\r\n }\r\n\r\n componentWillMount() {\r\n this.props.clearUser();\r\n this.props.getAllFriluftsraad(\r\n config.friluftsraadDt.columns,\r\n null,\r\n config.mapProjCode,\r\n 0,\r\n 1000,\r\n null\r\n );\r\n }\r\n\r\n componentDidMount() {\r\n this.props.readFriluftsraadMedlemskommuner(\r\n config.friluftsraadMedlemskommunerDt.columns,\r\n null,\r\n config.mapProjCode,\r\n 0,\r\n 0,\r\n null\r\n );\r\n }\r\n\r\n redirect() {\r\n this.props.history.push(\"/logginn\");\r\n }\r\n\r\n handleSubmit(evt) {\r\n evt.preventDefault();\r\n const {\r\n username,\r\n password,\r\n firstname,\r\n surname,\r\n mobile,\r\n email,\r\n municipality,\r\n yearOfBirth,\r\n selectedFriluftsraadId,\r\n selectedCompanyId,\r\n consentEmail\r\n } = this.state;\r\n\r\n if (!this.validateForm()) {\r\n return;\r\n }\r\n\r\n const userData = {\r\n first_name: firstname,\r\n last_name: surname,\r\n nick_name: username,\r\n mobile: mobile,\r\n address_city: municipality,\r\n description: yearOfBirth.toString()\r\n };\r\n this.props.registerUser(\r\n firstname,\r\n surname,\r\n email,\r\n password,\r\n userData,\r\n yearOfBirth,\r\n selectedFriluftsraadId,\r\n selectedCompanyId,\r\n consentEmail\r\n );\r\n }\r\n\r\n validateForm() {\r\n const { t } = this.props;\r\n const {\r\n username,\r\n password,\r\n firstname,\r\n surname,\r\n mobile,\r\n email,\r\n municipality,\r\n yearOfBirth,\r\n selectedFriluftsraadId,\r\n selectedCompanyId\r\n } = this.state;\r\n\r\n const validationErrors = {};\r\n if (username.length < 4) {\r\n validationErrors.username = t(\"UsernameTooShort\");\r\n }\r\n\r\n if (password !== this.state.passwordRepeat) {\r\n validationErrors.passwordRepeat = t(\"PasswordsDoNotMatch\");\r\n }\r\n\r\n if (password.length < 3) {\r\n validationErrors.password = t(\"PasswordIsTooShort\");\r\n }\r\n\r\n if (firstname.length < 2) {\r\n validationErrors.firstname = t(\"FirstnameNotValid\");\r\n }\r\n\r\n if (surname.length < 2) {\r\n validationErrors.surname = t(\"SurnameNotValid\");\r\n }\r\n\r\n var numberRegex = /^-?\\d+\\.?\\d*$/;\r\n if (mobile.length < 7 || !numberRegex.test(mobile)) {\r\n validationErrors.mobile = t(\"MobileNotValid\");\r\n }\r\n\r\n var emailRegEx =\r\n /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\r\n if (!emailRegEx.test(email)) {\r\n validationErrors.email = t(\"EmailAddressNotValid\");\r\n }\r\n\r\n if (municipality.length < 2 || isNaN(municipality)) {\r\n validationErrors.municipality = t(\"MunicipalityNotValid\");\r\n }\r\n\r\n if (\r\n yearOfBirth.length !== 4 ||\r\n !numberRegex.test(yearOfBirth) ||\r\n yearOfBirth < 1900 ||\r\n yearOfBirth > new Date().getFullYear()\r\n ) {\r\n validationErrors.yearOfBirth = t(\"YearOfBirthNotValid\");\r\n }\r\n\r\n if (\r\n selectedFriluftsraadId === undefined ||\r\n selectedFriluftsraadId === null ||\r\n selectedFriluftsraadId === \"\"\r\n ) {\r\n validationErrors.selectedFriluftsraadId = t(\"SelectedFriluftsraadIdIsMissing\");\r\n }\r\n\r\n if (!numberRegex.test(selectedCompanyId)) {\r\n validationErrors.selectedCompanyId = t(\"SelectedCompanyIdIsInvalid\");\r\n }\r\n\r\n this.setState({ validationErrors });\r\n\r\n if (Object.keys(validationErrors).length > 0) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n handleChange(key, value) {\r\n this.setState({\r\n [key]: value\r\n });\r\n }\r\n\r\n render() {\r\n const {\r\n t,\r\n page,\r\n registerUserError,\r\n allFriluftsraad,\r\n companies,\r\n municipalities,\r\n loading,\r\n friluftsraadMedlemskommuner\r\n } = this.props;\r\n const sections = getPageSections(page);\r\n const createdUser = this.props.registeredUserEmail;\r\n return (\r\n <div className=\"tell-tur-page\">\r\n {loading ? (\r\n <div className=\"trip-list--loader\">\r\n <LoadingIndicator />{\" \"}\r\n </div>\r\n ) : (\r\n <React.Fragment>\r\n <Title title={page.title} />\r\n <h1>{page.title}</h1>\r\n {!createdUser ? (\r\n <div>\r\n {sections && (\r\n <div\r\n className=\"tell-tur-page--intro-text\"\r\n dangerouslySetInnerHTML={{\r\n __html: sections[\"RegisterTextSection\"]\r\n }}\r\n />\r\n )}\r\n <UserRegistrationForm\r\n {...this.state}\r\n companies={companies}\r\n registerUserError={registerUserError}\r\n handleChange={this.handleChange}\r\n handleSubmit={this.handleSubmit}\r\n allFriluftsraad={allFriluftsraad}\r\n municipalities={municipalities}\r\n friluftsraadMedlemskommuner={friluftsraadMedlemskommuner}\r\n />\r\n </div>\r\n ) : (\r\n <div>\r\n {sections && (\r\n <div\r\n className=\"tell-tur-page--intro-text\"\r\n dangerouslySetInnerHTML={{\r\n __html: sections[\"SuccessSection\"]\r\n }}\r\n />\r\n )}\r\n <Link to=\"/logginn\">{t(\"ToLogin\")}</Link>\r\n </div>\r\n )}\r\n </React.Fragment>\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nUserRegistrationPage.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n page: PropTypes.object,\r\n registeredUserEmail: PropTypes.string,\r\n registerUserError: PropTypes.object,\r\n registerUser: PropTypes.func,\r\n clearUser: PropTypes.func,\r\n history: PropTypes.object,\r\n allFriluftsraad: PropTypes.array,\r\n getAllFriluftsraad: PropTypes.func,\r\n companies: PropTypes.array,\r\n getCompanies: PropTypes.func,\r\n municipalities: PropTypes.array,\r\n loading: PropTypes.bool,\r\n readFriluftsraadMedlemskommuner: PropTypes.func.isRequired,\r\n friluftsraadMedlemskommuner: PropTypes.array\r\n};\r\n\r\nexport default translate(\"UserRegistrationPage\")(\r\n connect(mapStateToProps, mapDispatchToProps)(withRouter(UserRegistrationPage))\r\n);\r\n","import React from \"react\";\r\nimport { translate } from \"react-translate\";\r\nimport { LoginForm, authReducerActions } from \"@avinet/react-adaptive-auth\";\r\nimport { connect } from \"react-redux\";\r\nimport { getUserDetails } from \"../redux/user\";\r\nimport { withRouter, Link } from \"react-router-dom\";\r\nimport PropTypes from \"prop-types\";\r\nimport Title from \"./Title\";\r\nimport LoadingIndicator from \"./LoadingIndicator\";\r\nimport \"./LoginPage.scss\";\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n getUserDetails: () => {\r\n dispatch(getUserDetails());\r\n },\r\n loggedIn: () => {\r\n dispatch(authReducerActions.loggedIn());\r\n }\r\n };\r\n};\r\n\r\nconst mapStateToProps = state => ({\r\n sessionExpired: state.auth.sessionExpired\r\n});\r\n\r\nclass LoginPage extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.onLogin = this.onLogin.bind(this);\r\n this.onLoggingIn = this.onLoggingIn.bind(this);\r\n\r\n this.state = {\r\n loading: false\r\n };\r\n }\r\n\r\n onLogin() {\r\n this.props.getUserDetails();\r\n this.props.loggedIn();\r\n this.props.history.push(\"/minprofil\");\r\n }\r\n\r\n onLoggingIn(loading) {\r\n this.setState({ loading });\r\n }\r\n\r\n render() {\r\n const { t, page, sessionExpired } = this.props;\r\n return (\r\n <div className=\"tell-tur-page\">\r\n <Title title={page.title} />\r\n <h1>{page.title}</h1>\r\n <div\r\n className=\"tell-tur-page--intro-text\"\r\n dangerouslySetInnerHTML={{ __html: page.content }}\r\n />\r\n {sessionExpired && (\r\n <p className=\"login-page--session-expired-container\">{t(\"sessionExpired\")}</p>\r\n )}\r\n <LoginForm\r\n baseUrl={this.props.baseUrl}\r\n showLabels\r\n loginText={t(\"LogIn\")}\r\n emailLabelText={t(\"Username\")}\r\n passwordLabelText={t(\"Password\")}\r\n errorText={t(\"Error\")}\r\n onLogin={this.onLogin}\r\n onLoading={this.onLoggingIn}\r\n >\r\n {this.state.loading && (\r\n <div className=\"loader\">\r\n <LoadingIndicator />\r\n </div>\r\n )}\r\n </LoginForm>\r\n <div className=\"tell-tur-page--footer\">\r\n <span>\r\n <Link to=\"/glemtpassord\">{t(\"ForgotPassword\")}</Link>\r\n </span>{\" \"}\r\n | <span>{t(\"NewUser\")} </span>\r\n <span>\r\n <Link to=\"/brukerregistrering\">{t(\"RegisterHere\")}</Link>\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nLoginPage.propTypes = {\r\n history: PropTypes.object.isRequired,\r\n t: PropTypes.func.isRequired,\r\n page: PropTypes.object,\r\n baseUrl: PropTypes.string,\r\n getUserDetails: PropTypes.func,\r\n loggedIn: PropTypes.func.isRequired,\r\n sessionExpired: PropTypes.bool\r\n};\r\n\r\nexport default withRouter(\r\n translate(\"LoginPage\")(connect(mapStateToProps, mapDispatchToProps)(LoginPage))\r\n);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Icon from '../components/Icon';\r\nimport './TextEditableControl.scss';\r\n\r\nclass TextEditableControl extends React.Component {\r\n constructor (props) {\r\n super(props);\r\n this.state = {\r\n editMode: false,\r\n editedControlValue: props.controlValue\r\n };\r\n\r\n this.onBlur = this.onBlur.bind(this);\r\n this.onFocus = this.onFocus.bind(this);\r\n this.onSubmit = this.onSubmit.bind(this);\r\n this.onPencilClick = this.onPencilClick.bind(this);\r\n }\r\n\r\n componentWillReceiveProps (nextProps) {\r\n if (\r\n (this.state.editedControlValue === null || this.state.editedControlValue === undefined) &&\r\n nextProps.controlValue\r\n ) {\r\n this.setState({ editedControlValue: nextProps.controlValue });\r\n }\r\n }\r\n\r\n onSubmit (evt) {\r\n evt.preventDefault();\r\n this.setState({ editMode: false });\r\n this.props.onSubmit(this.state.editedControlValue);\r\n }\r\n\r\n onBlur (evt) {\r\n if (\r\n evt.nativeEvent &&\r\n evt.nativeEvent.explicitOriginalTarget &&\r\n evt.nativeEvent.explicitOriginalTarget.nodeName === 'INPUT'\r\n ) {\r\n return;\r\n }\r\n this.setState({ editMode: false });\r\n }\r\n\r\n onFocus () {\r\n this.setState({ editedControlValue: this.props.controlValue });\r\n }\r\n\r\n onPencilClick () {\r\n this.setState({ editMode: true }, () => {});\r\n }\r\n\r\n render () {\r\n const { editMode, editedControlValue } = this.state;\r\n const {\r\n controlClassName,\r\n labelText,\r\n controlValue,\r\n submitText,\r\n inputType,\r\n disabled,\r\n errorText,\r\n ...props\r\n } = this.props;\r\n return (\r\n <span className={controlClassName}>\r\n <label>{labelText}</label>\r\n {!editMode && (\r\n <div>\r\n <p className='text-editable-control--value'>{controlValue}</p>\r\n <span className='text-editable-control--edit-toggle' onClick={this.onPencilClick}>\r\n <Icon name='pencil' />\r\n </span>\r\n </div>\r\n )}\r\n {editMode && (\r\n <div className='text-editable-control--edit-wrapper'>\r\n <input\r\n ref={input => input && input.focus()}\r\n autoFocus\r\n type={inputType}\r\n value={editedControlValue}\r\n onChange={e => this.setState({ editedControlValue: e.target.value })}\r\n onFocus={this.onFocus}\r\n onBlur={this.onBlur}\r\n {...props}\r\n />\r\n <button\r\n disabled={disabled}\r\n onMouseDown={this.onSubmit}\r\n onSubmit={evt => evt.preventDefault()}\r\n >\r\n {submitText}\r\n </button>\r\n </div>\r\n )}\r\n <span className='error'>{errorText}</span>\r\n </span>\r\n );\r\n }\r\n}\r\n\r\nTextEditableControl.defaultProps = {\r\n controlClassName: '',\r\n inputType: 'text'\r\n};\r\n\r\nTextEditableControl.propTypes = {\r\n controlClassName: PropTypes.string,\r\n inputType: PropTypes.string,\r\n labelText: PropTypes.string.isRequired,\r\n controlValue: PropTypes.any,\r\n onSubmit: PropTypes.func.isRequired,\r\n submitText: PropTypes.string,\r\n disabled: PropTypes.bool,\r\n errorText: PropTypes.string\r\n};\r\n\r\nexport default TextEditableControl;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Icon from \"../components/Icon\";\r\nimport Select from \"react-select\";\r\nimport { translate } from \"react-translate\";\r\nimport \"./EditableSearchDropdown.scss\";\r\n\r\nclass EditableSearchDropdown extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n editMode: false,\r\n valuePropName: props.valuePropName || \"value\",\r\n labelPropName: props.labelPropName || \"label\",\r\n };\r\n\r\n this.onSubmit = this.onSubmit.bind(this);\r\n this.onPencilClick = this.onPencilClick.bind(this);\r\n }\r\n\r\n onSubmit(evt) {\r\n const { controlKey, controlValue, onSubmit } = this.props;\r\n const { valuePropName, selectedItem } = this.state;\r\n evt.preventDefault();\r\n const value =\r\n selectedItem && selectedItem[valuePropName]\r\n ? selectedItem[valuePropName]\r\n : controlValue;\r\n onSubmit(controlKey, value);\r\n this.setState({ editMode: false, selectedItem: undefined });\r\n }\r\n\r\n onPencilClick() {\r\n this.setState({ editMode: true });\r\n }\r\n\r\n handleCancel(evt) {\r\n this.setState({\r\n editMode: false,\r\n });\r\n }\r\n\r\n render() {\r\n const { valuePropName, labelPropName, editMode, selectedItem } = this.state;\r\n const {\r\n controlClassName,\r\n labelText,\r\n errorText,\r\n errorClassName,\r\n dropdownItems,\r\n collapsible,\r\n placeholder,\r\n t,\r\n styles,\r\n } = this.props;\r\n let { controlValue } = this.props;\r\n\r\n const valueFunction = (o) => {\r\n return o[valuePropName];\r\n };\r\n\r\n const labelFunction = (o) => {\r\n return o[labelPropName];\r\n };\r\n\r\n let flatten = [];\r\n\r\n !dropdownItems.find((item) => item.options)\r\n ? (flatten = dropdownItems)\r\n : dropdownItems.forEach((item) =>\r\n item.options.map((option) => flatten.push(option))\r\n );\r\n\r\n const valueObject = flatten.find((m) => m[valuePropName] === controlValue);\r\n\r\n if (valueObject) {\r\n controlValue = valueObject[labelPropName];\r\n }\r\n\r\n return (\r\n <React.Fragment>\r\n <div\r\n className={[\r\n controlClassName,\r\n editMode ? \"editable-search-dropdown--open\" : \"\",\r\n ].join(\" \")}\r\n >\r\n {labelText && <label>{labelText}</label>}\r\n {!editMode && (\r\n <React.Fragment>\r\n <span\r\n className=\"editable-search-dropdown--edit-toggle\"\r\n onClick={this.onPencilClick}\r\n >\r\n <Icon name=\"pencil\" />\r\n </span>\r\n <div className=\"editable-search-dropdown--label\">\r\n <p className=\"editable-search-dropdown--value\">\r\n {controlValue}\r\n </p>\r\n </div>\r\n </React.Fragment>\r\n )}\r\n\r\n {editMode && (\r\n <div\r\n className={[\r\n \"editable-search-dropdown--edit-wrapper\",\r\n !editMode ? \"closed\" : \"open\",\r\n collapsible ? \"collapsible\" : \"\",\r\n ].join(\" \")}\r\n >\r\n <div className=\"dropdown-container\">\r\n <Select\r\n classNamePrefix=\"editable-search-dropdown\"\r\n placeholder={placeholder}\r\n options={dropdownItems}\r\n getOptionLabel={labelPropName && labelFunction}\r\n getOptionValue={valuePropName && valueFunction}\r\n value={selectedItem || valueObject}\r\n autoFocus\r\n onBlur={(evt) => this.handleCancel(evt)}\r\n onChange={(di, action) => {\r\n if (action.action === \"select-option\") {\r\n this.setState({ selectedItem: di });\r\n }\r\n }}\r\n styles={styles}\r\n />\r\n </div>\r\n <button onMouseDown={this.onSubmit}>{t(\"Save\")}</button>\r\n </div>\r\n )}\r\n <span className={errorClassName || \"error\"}>{errorText}</span>\r\n </div>\r\n </React.Fragment>\r\n );\r\n }\r\n}\r\n\r\nEditableSearchDropdown.defaultProps = {\r\n controlClassName: \"\",\r\n};\r\n\r\nEditableSearchDropdown.propTypes = {\r\n controlClassName: PropTypes.string,\r\n labelText: PropTypes.string,\r\n controlValue: PropTypes.any,\r\n onSubmit: PropTypes.func.isRequired,\r\n controlKey: PropTypes.string,\r\n errorText: PropTypes.string,\r\n errorClassName: PropTypes.string,\r\n dropdownItems: PropTypes.array,\r\n collapsible: PropTypes.bool,\r\n labelPropName: PropTypes.string,\r\n valuePropName: PropTypes.string,\r\n placeholder: PropTypes.string,\r\n t: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default translate(\"EditableDropdown\")(EditableSearchDropdown);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport TextEditableControl from \"./TextEditableControl\";\r\nimport EditableSearchDropdown from \"./EditableSearchDropdown\";\r\nimport PopupBox from \"./PopupBox\";\r\nimport { translate } from \"react-translate\";\r\n\r\nclass MyProfileForm extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = { displayPopup: false, key: undefined, newValue: undefined };\r\n this.handlePopUp = this.handlePopUp.bind(this);\r\n }\r\n\r\n handlePopUp() {\r\n const { handleUserSubmit, t } = this.props;\r\n const { key, newValue } = this.state;\r\n\r\n return (\r\n <PopupBox onClose={() => handleUserSubmit(key, newValue)} closeBtnText={\"Ok\"}>\r\n <div className=\"telltur-profile-form--popup\">\r\n <p>{t(\"ReminderText1\")}</p>\r\n </div>\r\n </PopupBox>\r\n );\r\n }\r\n\r\n render() {\r\n const {\r\n t,\r\n isLoading,\r\n // eslint-disable-next-line\r\n nick_name,\r\n firstname,\r\n surname,\r\n mobile,\r\n email,\r\n municipality,\r\n municipalities,\r\n yearofbirth,\r\n validationErrors,\r\n handleFamilyMemberSubmit,\r\n handleUserSubmit\r\n } = this.props;\r\n\r\n return (\r\n <div>\r\n {this.state.displayPopup && this.handlePopUp()}\r\n <form className=\"tell-tur-form no-buttons\">\r\n <TextEditableControl\r\n controlClassName=\"tell-tur-form--control\"\r\n inputType=\"text\"\r\n labelText={t(\"Nickname\")}\r\n /* eslint-disable */\r\n controlValue={nick_name}\r\n submitText={t(\"Save\")}\r\n disabled={isLoading}\r\n errorText={validationErrors.nick_name}\r\n onSubmit={newValue => handleFamilyMemberSubmit(\"nick_name\", newValue)}\r\n /* eslint-enable */\r\n />\r\n <TextEditableControl\r\n controlClassName=\"tell-tur-form--control\"\r\n inputType=\"text\"\r\n labelText={t(\"Firstname\")}\r\n controlValue={firstname}\r\n submitText={t(\"Save\")}\r\n disabled={isLoading}\r\n errorText={validationErrors.firstname}\r\n onSubmit={newValue => handleUserSubmit(\"firstname\", newValue)}\r\n />\r\n <TextEditableControl\r\n controlClassName=\"tell-tur-form--control\"\r\n inputType=\"text\"\r\n labelText={t(\"Surname\")}\r\n controlValue={surname}\r\n submitText={t(\"Save\")}\r\n disabled={isLoading}\r\n errorText={validationErrors.surname}\r\n onSubmit={newValue => handleUserSubmit(\"surname\", newValue)}\r\n />\r\n <TextEditableControl\r\n controlClassName=\"tell-tur-form--control\"\r\n inputType=\"tel\"\r\n labelText={t(\"Mobile\")}\r\n controlValue={mobile}\r\n submitText={t(\"Save\")}\r\n disabled={isLoading}\r\n errorText={validationErrors.mobile}\r\n onSubmit={newValue => handleUserSubmit(\"mobile\", newValue)}\r\n />\r\n <TextEditableControl\r\n controlClassName=\"tell-tur-form--control\"\r\n inputType=\"email\"\r\n labelText={t(\"Email\")}\r\n controlValue={email}\r\n submitText={t(\"Save\")}\r\n disabled={isLoading}\r\n errorText={validationErrors.email}\r\n onSubmit={newValue => handleUserSubmit(\"email\", newValue)}\r\n />\r\n <EditableSearchDropdown\r\n placeholder={t(\"Municipality\")}\r\n controlClassName=\"tell-tur-form--control\"\r\n labelText={t(\"Municipality\")}\r\n inputType=\"Text\"\r\n onSubmit={(key, newValue) => {\r\n this.setState({\r\n displayPopup: true,\r\n key,\r\n newValue\r\n });\r\n }}\r\n controlValue={\r\n isNaN((municipality && parseInt(municipality)) || undefined)\r\n ? \"\"\r\n : municipality && parseInt(municipality)\r\n }\r\n errorClassName=\"error municipality-error\"\r\n dropdownItems={municipalities}\r\n errorText={validationErrors.municipality}\r\n labelPropName=\"navn\"\r\n valuePropName=\"komm\"\r\n controlKey=\"municipality\"\r\n />\r\n <TextEditableControl\r\n controlClassName=\"tell-tur-form--control\"\r\n inputType=\"number\"\r\n labelText={t(\"YearOfBirth\")}\r\n controlValue={yearofbirth}\r\n submitText={t(\"Save\")}\r\n disabled={isLoading}\r\n errorText={validationErrors.yearofbirth}\r\n onSubmit={newValue => handleFamilyMemberSubmit(\"yearofbirth\", newValue)}\r\n min={new Date().getFullYear() - 120}\r\n max={new Date().getFullYear()}\r\n />\r\n </form>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nMyProfileForm.propTypes = {\r\n t: PropTypes.func,\r\n isLoading: PropTypes.bool,\r\n nick_name: PropTypes.string,\r\n firstname: PropTypes.string,\r\n surname: PropTypes.string,\r\n mobile: PropTypes.string,\r\n email: PropTypes.string,\r\n municipality: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n yearofbirth: PropTypes.number,\r\n validationErrors: PropTypes.object.isRequired,\r\n handleFamilyMemberSubmit: PropTypes.func.isRequired,\r\n handleUserSubmit: PropTypes.func.isRequired,\r\n municipalities: PropTypes.array\r\n};\r\n\r\nexport default translate(\"MyProfileForm\")(MyProfileForm);\r\n","import request from \"superagent\";\r\nimport { getSessionToken } from \"@avinet/react-adaptive-auth\";\r\nimport config from \"../config/TellTur\";\r\n\r\nconst getConsents = async () => {\r\n try {\r\n var response = await request\r\n .post(config.adaptiveUrl + \"WebServices/generic/Privacy.asmx/Consents\")\r\n .send({})\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken());\r\n\r\n if (!response.ok) {\r\n // eslint-disable-next-line\r\n console.error(\"Received an error from server\");\r\n return [];\r\n }\r\n response = response.body.d;\r\n\r\n if (response.exception || !response.success) {\r\n // eslint-disable-next-line\r\n console.error(response.exception || \"Received an error from server\");\r\n }\r\n return response.records || [];\r\n } catch (err) {\r\n // eslint-disable-next-line\r\n console.error(err);\r\n return [];\r\n }\r\n};\r\n\r\nconst accept = async () => {\r\n try {\r\n var response = await request\r\n .post(config.adaptiveUrl + \"WebServices/generic/Privacy.asmx/Accept\")\r\n .send({\r\n version: config.privacyVersion,\r\n category: \"telltur_user_email_consent\"\r\n })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken());\r\n\r\n if (!response.ok) {\r\n // eslint-disable-next-line\r\n console.error(\"Received an error from server\");\r\n return false;\r\n }\r\n response = response.body.d;\r\n\r\n if (response.exception || !response.success) {\r\n // eslint-disable-next-line\r\n console.error(response.exception || \"Received an error from server\");\r\n }\r\n return response.success || false;\r\n } catch (err) {\r\n // eslint-disable-next-line\r\n console.error(err);\r\n return false;\r\n }\r\n};\r\n\r\nexport { getConsents, accept };\r\n","import React from \"react\";\r\nimport { translate } from \"react-translate\";\r\nimport { withRouter, Link } from \"react-router-dom\";\r\nimport Icon from \"./Icon\";\r\nimport PropTypes from \"prop-types\";\r\nimport MyProfileForm from \"./MyProfileForm\";\r\nimport { fixDate } from \"../utils/date\";\r\nimport EditableSearchDropdown from \"./EditableSearchDropdown\";\r\nimport { logout, getSessionToken } from \"@avinet/react-adaptive-auth\";\r\nimport { getPageSections } from \"../utils/Page\";\r\nimport LoadingIndicator from \"./LoadingIndicator\";\r\nimport TranslatedServerError from \"./TranslatedServerError\";\r\nimport Title from \"./Title\";\r\nimport \"./ProfilePage.scss\";\r\nimport PopupBox from \"./PopupBox\";\r\nimport request from \"superagent\";\r\nimport { getConsents } from \"../utils/privacy\";\r\nimport config from \"../config/TellTur\";\r\nimport { validateProfile } from \"../utils/profile\";\r\n\r\nclass MyProfilePage extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n mainMember: undefined,\r\n user: undefined,\r\n nick_name: \"\",\r\n firstname: \"\",\r\n surname: \"\",\r\n mobile: \"\",\r\n email: \"\",\r\n municipality: \"\",\r\n yearofbirth: -1,\r\n displayDeleteInfoBox: false,\r\n confirmDelete: false,\r\n validationErrors: {},\r\n sections: undefined,\r\n selectedFriluftsraadId: \"\",\r\n selectedCompanyId: -1,\r\n dropdownItems: undefined,\r\n displayPopup: false,\r\n consentEmail: false,\r\n consentLoading: false\r\n };\r\n\r\n this.handleFamilyMemberSubmit = this.handleFamilyMemberSubmit.bind(this);\r\n this.deleteAccount = this.deleteAccount.bind(this);\r\n this.setMainMember = this.setMainMember.bind(this);\r\n this.setUserFields = this.setUserFields.bind(this);\r\n this.handleUserSubmit = this.handleUserSubmit.bind(this);\r\n this.updateFriluftsraadForMembers = this.updateFriluftsraadForMembers.bind(this);\r\n this.validateValue = this.validateValue.bind(this);\r\n this.handleCompanySubmit = this.handleCompanySubmit.bind(this);\r\n this.toggleDisplayPopup = this.toggleDisplayPopup.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n if (this.props.members) {\r\n this.setMainMember(this.props.members);\r\n }\r\n if (this.props.user) {\r\n this.setUserFields(this.props.user);\r\n }\r\n this.checkForConsent();\r\n }\r\n\r\n componentWillReceiveProps(nextProps) {\r\n const { members, user, t } = this.props;\r\n if (!this.state.sections && nextProps.page && nextProps.page.content) {\r\n const sections = getPageSections(nextProps.page);\r\n this.setState({ sections });\r\n }\r\n if (nextProps.members && !members) {\r\n this.setMainMember(nextProps.members);\r\n }\r\n if (nextProps.user && !user) {\r\n this.setUserFields(nextProps.user);\r\n }\r\n if (\r\n (nextProps.serverError && !this.props.serverError) ||\r\n (nextProps.userError && !this.props.userError)\r\n ) {\r\n this.setState({ displayPopup: true });\r\n }\r\n\r\n if (members && user && this.state.mainMember) {\r\n const validProfile = validateProfile(user, this.state.mainMember);\r\n\r\n const validationErrors = {};\r\n\r\n validationErrors[Object.keys(validProfile.errors)] = t(Object.values(validProfile.errors));\r\n\r\n this.setState({ validationErrors });\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps, prevState) {\r\n const { allFriluftsraad, friluftsraadMedlemskommuner, isLoading } = this.props;\r\n const { user, dropdownItems } = this.state;\r\n if (\r\n !isLoading &&\r\n allFriluftsraad.length &&\r\n friluftsraadMedlemskommuner.length &&\r\n !dropdownItems\r\n ) {\r\n this.getAssociatedFriluftsraad(parseInt(user.user_data.address_city));\r\n }\r\n }\r\n\r\n async checkForConsent() {\r\n const allConsent = await getConsents();\r\n\r\n allConsent.forEach(c => {\r\n if (c.category === config.consentEmail) {\r\n this.setState({ consentEmail: true });\r\n }\r\n });\r\n }\r\n\r\n onChangeConsent = (type, value) => {\r\n this.setState({ consentLoading: true });\r\n\r\n request\r\n .post(\r\n config.adaptiveUrl + \"WebServices/generic/Privacy.asmx/\" + (value ? \"Accept\" : \"Revoke\")\r\n )\r\n .set(\"gm_session_id\", getSessionToken())\r\n .send({ category: type, version: 1 })\r\n .then(res => res.body)\r\n .then(res => {\r\n if (type === config.consentEmail) {\r\n this.setState({ consentEmail: value });\r\n }\r\n this.setState({ consentLoading: false });\r\n })\r\n .catch(err => {\r\n // eslint-disable-next-line\r\n console.warn(err);\r\n this.setState({ consentLoading: false });\r\n });\r\n };\r\n\r\n setMainMember(members) {\r\n const mainMember = members.find(m => m.is_main_familymember);\r\n if (mainMember) {\r\n this.setState({\r\n mainMember,\r\n nick_name: mainMember.nick_name,\r\n yearofbirth: mainMember.yearofbirth,\r\n selectedFriluftsraadId: mainMember.selected_friluftsraad_uuid,\r\n selectedCompanyId:\r\n mainMember.bedrift_id !== undefined &&\r\n mainMember.bedrift_id !== null &&\r\n mainMember.bedrift_id > 0\r\n ? mainMember.bedrift_id\r\n : -1\r\n });\r\n this.props.getCompanies(mainMember.selected_friluftsraad_uuid);\r\n }\r\n }\r\n\r\n setUserFields(user) {\r\n this.setState({\r\n user,\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 municipality: user.user_data.address_city,\r\n email: user.email\r\n });\r\n }\r\n\r\n deleteAccount(evt) {\r\n evt.preventDefault();\r\n this.props.deleteUser(this.state.user.uuid, () => {\r\n logout();\r\n this.props.history.push(\"/\");\r\n });\r\n }\r\n\r\n validateValue(propertyName, newValue) {\r\n const { t } = this.props;\r\n var numberRegex = /^-?\\d+\\.?\\d*$/;\r\n var validationErrors = {};\r\n\r\n if (propertyName === \"yearofbirth\") {\r\n if (\r\n !numberRegex.test(newValue) ||\r\n newValue < new Date().getFullYear() - 120 ||\r\n newValue > new Date().getFullYear()\r\n ) {\r\n validationErrors.yearofbirth = t(\"YearOfBirthNotValid\");\r\n }\r\n }\r\n\r\n if (propertyName === \"nick_name\" && newValue.length < 4) {\r\n validationErrors.nick_name = t(\"UsernameTooShort\");\r\n }\r\n\r\n if (propertyName === \"firstname\" && newValue.length < 2) {\r\n validationErrors.firstname = t(\"FirstnameNotValid\");\r\n }\r\n\r\n if (propertyName === \"surname\" && newValue.length < 2) {\r\n validationErrors.surname = t(\"SurnameNotValid\");\r\n }\r\n\r\n if (propertyName === \"mobile\" && (newValue.length < 7 || !numberRegex.test(newValue))) {\r\n validationErrors.mobile = t(\"MobileNotValid\");\r\n }\r\n\r\n var emailRegEx =\r\n /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\r\n if (propertyName === \"email\" && !emailRegEx.test(newValue)) {\r\n validationErrors.email = t(\"EmailAddressNotValid\");\r\n }\r\n\r\n if (propertyName === \"municipality\" && newValue.length < 2 && isNaN(newValue)) {\r\n validationErrors.municipality = t(\"MunicipalityNotValid\");\r\n }\r\n\r\n this.setState({ validationErrors });\r\n if (Object.keys(validationErrors).length > 0) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n handleFamilyMemberSubmit(propertyName, newValue) {\r\n const { mainMember } = this.state;\r\n if (propertyName === \"yearofbirth\" || propertyName === \"bedrift_id\") {\r\n newValue = parseInt(newValue);\r\n }\r\n if (this.state[propertyName] !== newValue) {\r\n if (this.validateValue(propertyName, newValue)) {\r\n this.setState({ [propertyName]: newValue }, () => {\r\n const member = mainMember;\r\n member.nick_name = this.state.nick_name;\r\n member.yearofbirth = this.state.yearofbirth;\r\n member.bedrift_id =\r\n this.state.selectedCompanyId === -1 ? null : this.state.selectedCompanyId;\r\n member.create_date = fixDate(member.create_date);\r\n this.props.addMember(member);\r\n });\r\n }\r\n }\r\n }\r\n\r\n handleUserSubmit(propertyName, newValue) {\r\n if (this.state[propertyName] !== newValue) {\r\n if (this.validateValue(propertyName, newValue)) {\r\n this.setState({ [propertyName]: newValue }, () => {\r\n const user = this.state.user;\r\n user.user_data.first_name = this.state.firstname;\r\n user.user_data.last_name = this.state.surname;\r\n user.user_data.mobile = this.state.mobile;\r\n user.user_data.address_city = this.state.municipality;\r\n user.email = this.state.email.toLowerCase();\r\n\r\n this.props.updateUser(user);\r\n this.setState({ dropdownItems: undefined });\r\n });\r\n }\r\n }\r\n }\r\n\r\n getAssociatedFriluftsraad(newValue) {\r\n const { allFriluftsraad, friluftsraadMedlemskommuner } = this.props;\r\n let associatedFriluftsraadArr = [];\r\n\r\n if (!newValue) {\r\n this.setState({ dropdownItems: allFriluftsraad });\r\n return;\r\n }\r\n\r\n const associatedFriluftsraad = friluftsraadMedlemskommuner.filter(\r\n fr => fr.kommune === newValue\r\n );\r\n\r\n if (!associatedFriluftsraad || !associatedFriluftsraad.length) {\r\n this.setState({ dropdownItems: allFriluftsraad });\r\n return;\r\n }\r\n\r\n associatedFriluftsraadArr = allFriluftsraad.filter(fr =>\r\n associatedFriluftsraad.some(asf => asf.fr_id === fr.rolle_id)\r\n );\r\n this.setState({\r\n dropdownItems: [\r\n {\r\n label: \"Friluftsråd for din bostedskommune\",\r\n options: associatedFriluftsraadArr\r\n },\r\n {\r\n label: \"Andre TellTur-friluftsråd\",\r\n options: allFriluftsraad.filter(fr =>\r\n associatedFriluftsraad.some(asf => asf.fr_id !== fr.rolle_id)\r\n )\r\n }\r\n ]\r\n });\r\n }\r\n\r\n updateFriluftsraadForMembers(uuid) {\r\n if (uuid === \"\") {\r\n this.setState({\r\n selectedFriluftsraadErrorText: this.props.t(\"SelectedFriluftsraadIsInvalid\")\r\n });\r\n return;\r\n }\r\n this.props.members.forEach(m => {\r\n m.selected_friluftsraad_uuid = uuid;\r\n m.bedrift_id = null;\r\n m.create_date = fixDate(m.create_date);\r\n this.props.addMember(m);\r\n });\r\n this.setState({ changeFriluftsraad: false, selectedFriluftsraadId: uuid }, () => {\r\n this.props.getCompanies(uuid);\r\n });\r\n }\r\n\r\n handleCompanySubmit(id) {\r\n this.handleFamilyMemberSubmit(\"selectedCompanyId\", id);\r\n }\r\n\r\n get getGroupedMunicipalities() {\r\n const { municipalities } = this.props;\r\n const fylker = config.fylkesnummer;\r\n\r\n const municipalitiesGroupedByCounties = fylker\r\n .map(fylke => {\r\n return {\r\n label: fylke.navn,\r\n options: municipalities\r\n .filter(municipality => {\r\n if (municipality.komm < 999) {\r\n return fylke.nummer === \"03\"; // this is bcs kommunenummer are stored in psql as int and for Oslo is stored as 301 instead 0301 becouse of leading 0\r\n }\r\n return String(municipality.komm).slice(0, 2) === fylke.nummer;\r\n })\r\n .sort((a, b) => (a.navn > b.navn ? 1 : b.navn > a.navn ? -1 : 0))\r\n };\r\n })\r\n .sort((a, b) => (a.navn > b.navn ? 1 : b.navn > a.navn ? -1 : 0));\r\n\r\n return municipalitiesGroupedByCounties;\r\n }\r\n\r\n toggleDisplayPopup = () => {\r\n this.setState(prevState => ({\r\n displayPopup: !prevState.displayPopup\r\n }));\r\n };\r\n\r\n render() {\r\n const {\r\n t,\r\n page,\r\n serverError,\r\n userError,\r\n isLoading,\r\n loading,\r\n municipalities,\r\n allFriluftsraad,\r\n ...restOfProps\r\n } = this.props;\r\n const {\r\n sections,\r\n displayDeleteInfoBox,\r\n confirmDelete,\r\n error,\r\n changeFriluftsraad,\r\n selectedFriluftsraadId,\r\n selectedCompanyId,\r\n dropdownItems,\r\n consentLoading,\r\n consentEmail,\r\n ...restOfState\r\n } = this.state;\r\n\r\n const groupedMunicipalities = this.getGroupedMunicipalities;\r\n\r\n const dummyCompanyArray = this.props.companies\r\n ? [\r\n {\r\n id: -1,\r\n navn: t(\"Unjoin\"),\r\n className: \"unjoin\",\r\n unjoin: true\r\n },\r\n ...this.props.companies\r\n ]\r\n : [];\r\n const dummyCompanyArrayStyles = {\r\n option: (styles, { data }) => {\r\n return {\r\n ...styles,\r\n borderBottom: data.unjoin ? \"1px dashed hsl(0,0%,80%)\" : null\r\n };\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"tell-tur-page\">\r\n {(isLoading ||\r\n consentLoading ||\r\n (loading && municipalities.length === 0) ||\r\n !dropdownItems) && (\r\n <div className=\"loader\">\r\n <LoadingIndicator />\r\n </div>\r\n )}\r\n {this.state.displayPopup && (\r\n <PopupBox onClose={this.toggleDisplayPopup} closeBtnText={\"Ok\"}>\r\n <TranslatedServerError\r\n className=\"telltur-profile-form--popup\"\r\n error={serverError || userError}\r\n />\r\n </PopupBox>\r\n )}\r\n {dropdownItems && (\r\n <div>\r\n <Title title={page.title} />\r\n <h1>{page.title}</h1>\r\n {sections && (\r\n <div\r\n className=\"tell-tur-page--intro-text\"\r\n dangerouslySetInnerHTML={{\r\n __html: sections[\"YourAccountSection\"]\r\n }}\r\n />\r\n )}\r\n <MyProfileForm\r\n {...restOfProps}\r\n {...restOfState}\r\n municipalities={groupedMunicipalities}\r\n handleFamilyMemberSubmit={this.handleFamilyMemberSubmit}\r\n handleUserSubmit={this.handleUserSubmit}\r\n displayPopup={this.toggleDisplayPopup}\r\n />\r\n <EditableSearchDropdown\r\n placeholder={t(\"ConnectedToFriluftsraad\")}\r\n controlClassName=\"tell-tur-form--control\"\r\n labelText={t(\"ConnectedToFriluftsraad\")}\r\n inputType=\"Text\"\r\n onSubmit={(key, newValue) => {\r\n this.updateFriluftsraadForMembers(newValue);\r\n }}\r\n controlValue={selectedFriluftsraadId}\r\n dropdownItems={dropdownItems}\r\n errorClassName=\"error friluftsraad-error\"\r\n labelPropName=\"navn\"\r\n valuePropName=\"uuid\"\r\n controlKey=\"uuid\"\r\n />\r\n <EditableSearchDropdown\r\n placeholder={t(\"ConnectedToCompany\")}\r\n controlClassName=\"tell-tur-form--control\"\r\n labelText={t(\"ConnectedToCompany\")}\r\n inputType=\"Text\"\r\n defaultValue={dummyCompanyArray[0]}\r\n onSubmit={(key, newValue) => {\r\n this.handleCompanySubmit(newValue);\r\n }}\r\n styles={dummyCompanyArrayStyles}\r\n controlValue={selectedCompanyId !== -1 ? selectedCompanyId : null}\r\n dropdownItems={dummyCompanyArray}\r\n errorClassName=\"error friluftsraad-error\"\r\n labelPropName=\"navn\"\r\n valuePropName=\"id\"\r\n controlKey=\"id\"\r\n />\r\n\r\n <label className=\"checkbox-wrapper\">\r\n <input\r\n type=\"checkbox\"\r\n checked={consentEmail || false}\r\n onChange={e => this.onChangeConsent(config.consentEmail, e.target.checked)}\r\n />\r\n <span className=\"checkmark\" />\r\n {t(\"Agree\")}\r\n </label>\r\n\r\n <div className=\"vertical-spacing\">\r\n <div className=\"text-icon-left\">\r\n <Icon name=\"unlock\" />\r\n </div>\r\n <span className=\"tell-tur-link\">\r\n <Link to=\"/endrepassord\">{t(\"ChangePassword\") + \"?\"}</Link>\r\n </span>{\" \"}\r\n | \r\n <div className=\"text-icon-left\">\r\n <Icon name=\"usersGroup\" />\r\n </div>\r\n <span className=\"tell-tur-link\">\r\n <Link to=\"/nyttmedlem\">{t(\"EditFamilyMembers\")}</Link>\r\n </span>{\" \"}\r\n | \r\n <div className=\"text-icon-left\">\r\n <Icon name=\"trash\" />\r\n </div>\r\n <span className=\"tell-tur-link\">\r\n <button\r\n className=\"btn-link\"\r\n onClick={() => this.setState({ displayDeleteInfoBox: true })}\r\n >\r\n {t(\"DeleteAccount\")}\r\n </button>\r\n </span>\r\n </div>\r\n {sections && displayDeleteInfoBox && (\r\n <div className=\"info-box warning\">\r\n <div\r\n dangerouslySetInnerHTML={{\r\n __html: sections[\"DeleteAccountSection\"]\r\n }}\r\n />\r\n <div className=\"info-box--button-row\">\r\n <div\r\n className=\"checkbox\"\r\n onClick={() => this.setState({ confirmDelete: !confirmDelete })}\r\n >\r\n {confirmDelete && <Icon name=\"checkmark\" />}\r\n </div>\r\n <div className=\"text\">{t(\"ConfirmDelete\")}</div>\r\n <div className=\"buttons\">\r\n <span>\r\n <button\r\n onClick={this.deleteAccount}\r\n disabled={!confirmDelete}\r\n className=\"btn btn-primary\"\r\n >\r\n {t(\"DeleteAccount\")}\r\n </button>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n <div className=\"tell-tur-page--footer\" />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nMyProfilePage.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n page: PropTypes.object,\r\n isLoading: PropTypes.bool,\r\n user: PropTypes.object,\r\n addMember: PropTypes.func.isRequired,\r\n members: PropTypes.array,\r\n serverError: PropTypes.object,\r\n userError: PropTypes.object,\r\n updateUser: PropTypes.func.isRequired,\r\n deleteUser: PropTypes.func.isRequired,\r\n history: PropTypes.object,\r\n allFriluftsraad: PropTypes.array.isRequired,\r\n friluftsraadMedlemskommuner: PropTypes.array.isRequired,\r\n municipalities: PropTypes.array.isRequired,\r\n loading: PropTypes.bool,\r\n companies: PropTypes.array,\r\n getCompanies: PropTypes.func.isRequired\r\n};\r\n\r\nexport default withRouter(translate(\"MyProfilePage\")(MyProfilePage));\r\n","import request from \"superagent\";\r\nimport { getSessionToken, authReducerActions } from \"@avinet/react-adaptive-auth\";\r\nimport config from \"../config/TellTur\";\r\n\r\n// ------------------------------------\r\n// Constants\r\n// ------------------------------------\r\nexport const READING_MEMBERS = \"READING_MEMBERS\";\r\nexport const MEMBERS_READ = \"MEMBERS_READ\";\r\n\r\nexport const ADDING_MEMBER = \"ADDING_MEMBER\";\r\nexport const MEMBER_ADDED = \"MEMBER_ADDED\";\r\n\r\nexport const DELETING_MEMBER = \"DELETING_MEMBER\";\r\nexport const MEMBER_DELETED = \"MEMBER_DELETED\";\r\n\r\nexport const CLEAR_MEMBERS = \"CLEAR_MEMBERS\";\r\n// ------------------------------------\r\n// Actions\r\n// ------------------------------------\r\nconst addingMember = () => ({\r\n type: ADDING_MEMBER\r\n});\r\n\r\nconst clearMembersAction = () => ({\r\n type: CLEAR_MEMBERS\r\n});\r\n\r\nconst memberAdded = errorMessage => ({\r\n type: MEMBER_ADDED,\r\n payload: {\r\n error: errorMessage\r\n }\r\n});\r\n\r\nconst deletingMember = () => ({ type: DELETING_MEMBER });\r\n\r\nconst memberDeleted = errorMessage => ({\r\n type: MEMBER_DELETED,\r\n payload: {\r\n error: errorMessage\r\n }\r\n});\r\n\r\nconst readingMembers = () => ({ type: READING_MEMBERS });\r\n\r\nconst membersRead = (errorMessage, members) => ({\r\n type: MEMBERS_READ,\r\n payload: {\r\n error: errorMessage,\r\n members\r\n }\r\n});\r\n\r\n// ------------------------------------\r\n// Action creators\r\n// ------------------------------------\r\nexport function clearMembers() {\r\n return dispatch => {\r\n dispatch(clearMembersAction());\r\n };\r\n}\r\n\r\nexport function addMember(member, callback) {\r\n return dispatch => {\r\n dispatch(addingMember());\r\n\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/telltur/FamilyMembers.asmx/Create\")\r\n // .post('http://localhost/a_a3/WebServices/telltur/FamilyMembers.asmx/Create')\r\n .send({\r\n data: member\r\n })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .set(\"gm_lang_code\", \"nb\")\r\n .end((err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(memberAdded({ message: \"Error returned from service\" }));\r\n callback();\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 memberAdded(\r\n response.exception ? response.exception : { msg: \"Error returned from service\" }\r\n )\r\n );\r\n callback();\r\n return;\r\n }\r\n dispatch(memberAdded(null));\r\n callback();\r\n });\r\n };\r\n}\r\n\r\nexport function deleteMember(id, callback) {\r\n return dispatch => {\r\n dispatch(deletingMember());\r\n\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/telltur/FamilyMembers.asmx/Delete\")\r\n // .post('http://localhost/a_a3/WebServices/telltur/FamilyMembers.asmx/Delete')\r\n .send({\r\n id\r\n })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .set(\"gm_lang_code\", \"nb\")\r\n .end((err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(memberDeleted({ message: \"Error returned from service\" }));\r\n callback();\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(memberDeleted(\"Error returned from service\"));\r\n callback();\r\n return;\r\n }\r\n dispatch(memberDeleted(null));\r\n callback();\r\n });\r\n };\r\n}\r\n\r\nexport function readMembers(userUuid) {\r\n return dispatch => {\r\n dispatch(readingMembers());\r\n // userUuid = 'a68338f6-f8b2-473b-b692-3d2a5237c89b'; // TEST!\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/telltur/FamilyMembers.asmx/Read\")\r\n // .post('http://localhost/a_a3/WebServices/telltur/FamilyMembers.asmx/Read')\r\n .send({\r\n user_uuid: userUuid\r\n })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .set(\"gm_lang_code\", \"nb\")\r\n .end((err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(membersRead({ message: \"Error returned from service\" }));\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(membersRead(response.exception || { message: \"Error returned from service\" }));\r\n return;\r\n }\r\n var records = response.data.find(d => d.key === \"records\");\r\n dispatch(membersRead(null, records.value));\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 members: null\r\n};\r\n\r\nexport function familyMembersReducer(state = initialState, action) {\r\n switch (action.type) {\r\n case ADDING_MEMBER:\r\n return Object.assign({}, state, {\r\n loading: true,\r\n error: null\r\n });\r\n case CLEAR_MEMBERS:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n error: null,\r\n members: null\r\n });\r\n case MEMBER_ADDED:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n error: action.payload.error ? action.payload.error : null\r\n });\r\n case READING_MEMBERS:\r\n return Object.assign({}, state, {\r\n loading: true,\r\n error: null,\r\n members: null\r\n });\r\n case MEMBERS_READ:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n members: action.payload.members,\r\n error: action.payload.error ? action.payload.error : null\r\n });\r\n case DELETING_MEMBER:\r\n return Object.assign({}, state, {\r\n loading: true,\r\n error: null\r\n });\r\n case MEMBER_DELETED:\r\n return Object.assign({}, state, {\r\n error: action.payload.error ? action.payload.error : null,\r\n loading: false\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 './Modal.scss';\r\n\r\nclass Modal extends React.PureComponent {\r\n componentWillMount () {\r\n document.body.classList.add('modal-open');\r\n }\r\n\r\n componentWillUnmount () {\r\n document.body.classList.remove('modal-open');\r\n }\r\n\r\n render () {\r\n return (\r\n <div className='modal--overlay'>\r\n <div className='modal--content'>{this.props.children}</div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nModal.propTypes = {\r\n children: PropTypes.element\r\n};\r\n\r\nexport default Modal;\r\n","import request from \"superagent\";\r\nimport { getSessionToken, authReducerActions } from \"@avinet/react-adaptive-auth\";\r\nimport config from \"../config/TellTur\";\r\n\r\n// ------------------------------------\r\n// Constants\r\n// ------------------------------------\r\nexport const JOINING_COMPETITION = \"JOINING_COMPETITION\";\r\nexport const COMPETITION_JOINED_SUCCESS = \"COMPETITION_JOINED_SUCCESS\";\r\nexport const COMPETITION_JOINED_ERROR = \"COMPETITION_JOINED_ERROR\";\r\n\r\nexport const UNJOINING_COMPETITION = \"UNJOINING_COMPETITION\";\r\nexport const COMPETITION_UNJOINED_SUCCESS = \"COMPETITION_UNJOINED_SUCCESS\";\r\nexport const COMPETITION_UNJOINED_ERROR = \"COMPETITION_UNJOINED_ERROR\";\r\n\r\nexport const READ_JOINED_COMPETITIONS = \"READ_JOINED_COMPETITIONS\";\r\nexport const JOINED_COMPETITIONS_READ_SUCCESS = \"JOINED_COMPETITIONS_READ_SUCCESS\";\r\nexport const JOINED_COMPETITIONS_READ_ERROR = \"JOINED_COMPETITIONS_READ_ERROR\";\r\n\r\nexport const READ_UNIQUE_JOINED_COMPETITIONS = \"READ_UNIQUE_JOINED_COMPETITIONS\";\r\nexport const UNIQUE_JOINED_COMPETITIONS_READ_SUCCESS = \"UNIQUE_JOINED_COMPETITIONS_READ_SUCCESS\";\r\nexport const UNIQUE_JOINED_COMPETITIONS_READ_ERROR = \"UNIQUE_JOINED_COMPETITIONS_READ_ERROR\";\r\n\r\nexport const READ_COMPETITION_RESULTS = \"READ_COMPETITION_RESULTS\";\r\nexport const COMPETITION_RESULTS_READ_SUCCESS = \"COMPETITION_RESULTS_READ_SUCCESS\";\r\nexport const COMPETITION_RESULTS_READ_ERROR = \"COMPETITION_RESULTS_READ_ERROR\";\r\n\r\nexport const RESET_STATE = \"RESET_STATE\";\r\n\r\n// ------------------------------------\r\n// Actions\r\n// ------------------------------------\r\n\r\nconst joiningCompetition = () => ({\r\n type: JOINING_COMPETITION\r\n});\r\n\r\nconst competitionJoinedSuccess = success => ({\r\n type: COMPETITION_JOINED_SUCCESS,\r\n payload: {\r\n success\r\n }\r\n});\r\n\r\nconst competitionJoinedError = error => ({\r\n type: COMPETITION_JOINED_ERROR,\r\n payload: {\r\n error\r\n }\r\n});\r\n\r\nconst unjoiningCompetition = () => ({\r\n type: UNJOINING_COMPETITION\r\n});\r\n\r\nconst competitionUnjoinedSuccess = success => ({\r\n type: COMPETITION_UNJOINED_SUCCESS,\r\n payload: {\r\n success\r\n }\r\n});\r\n\r\nconst competitionUnjoinedError = error => ({\r\n type: COMPETITION_UNJOINED_ERROR,\r\n payload: {\r\n error\r\n }\r\n});\r\n\r\nconst readingJoinedCompetitions = () => ({\r\n type: READ_JOINED_COMPETITIONS\r\n});\r\n\r\nconst joinCompetitionReadSuccess = (competitions, success) => ({\r\n type: JOINED_COMPETITIONS_READ_SUCCESS,\r\n payload: {\r\n competitions,\r\n success\r\n }\r\n});\r\n\r\nconst joinCompetitionReadError = error => ({\r\n type: JOINED_COMPETITIONS_READ_ERROR,\r\n payload: {\r\n error\r\n }\r\n});\r\n\r\nconst readingUniqueJoinedCompetitions = () => ({\r\n type: READ_JOINED_COMPETITIONS\r\n});\r\n\r\nconst uniqueJoinedCompetitionReadSuccess = (competitions, success) => ({\r\n type: JOINED_COMPETITIONS_READ_SUCCESS,\r\n payload: {\r\n competitions,\r\n success\r\n }\r\n});\r\n\r\nconst uniqueJoinedCompetitionReadError = error => ({\r\n type: JOINED_COMPETITIONS_READ_ERROR,\r\n payload: {\r\n error\r\n }\r\n});\r\n\r\nconst readingCompetitionResults = () => ({\r\n type: READ_COMPETITION_RESULTS\r\n});\r\n\r\nconst competitionResultsReadSuccess = (results, success) => ({\r\n type: COMPETITION_RESULTS_READ_SUCCESS,\r\n payload: {\r\n results,\r\n success\r\n }\r\n});\r\n\r\nconst competitionResultsReadError = error => ({\r\n type: COMPETITION_RESULTS_READ_ERROR,\r\n payload: {\r\n error\r\n }\r\n});\r\n\r\nexport const resetState = () => ({\r\n type: RESET_STATE\r\n});\r\n\r\n// ------------------------------------\r\n// Action creators\r\n// ------------------------------------\r\nexport function joinCompetition(competitionId, userId) {\r\n return dispatch => {\r\n dispatch(joiningCompetition());\r\n\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/telltur/Competition.asmx/JoinCompetition\")\r\n .send({ competition_id: competitionId, user_id: userId })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"Content-Type\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .end((err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(competitionJoinedError({ message: \"Error returned from service\" }, null));\r\n }\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 competitionJoinedError(\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(competitionJoinedSuccess(true));\r\n });\r\n };\r\n}\r\n\r\nexport function unjoinCompetition(id) {\r\n return dispatch => {\r\n dispatch(unjoiningCompetition());\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/telltur/Competition.asmx/UnjoinCompetition\")\r\n .send({ joined_competition_id: id })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"Content-Type\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .end((err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(competitionUnjoinedError({ message: \"Error returned from service\" }, null));\r\n }\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 competitionUnjoinedError(\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(competitionUnjoinedSuccess(true));\r\n });\r\n };\r\n}\r\n\r\nexport function readJoinedCompetitions() {\r\n return dispatch => {\r\n dispatch(readingJoinedCompetitions());\r\n\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/telltur/Competition.asmx/GetJoinedCompetitions\")\r\n .send()\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"Content-Type\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .end((err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(joinCompetitionReadError({ message: \"Error returned from service\" }, null));\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 joinCompetitionReadError(\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(joinCompetitionReadSuccess(response.records, true));\r\n });\r\n };\r\n}\r\n\r\nexport function readUniqueJoinedCompetitions() {\r\n return dispatch => {\r\n dispatch(readingUniqueJoinedCompetitions());\r\n\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/telltur/Competition.asmx/GetUniqueJoinedCompetitions\")\r\n .send()\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"Content-Type\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .end((err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(\r\n uniqueJoinedCompetitionReadError({ message: \"Error returned from service\" }, null)\r\n );\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 uniqueJoinedCompetitionReadError(\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 const competitions = response.records.sort((a, b) => b.id - a.id);\r\n\r\n dispatch(uniqueJoinedCompetitionReadSuccess(competitions, true));\r\n });\r\n };\r\n}\r\n\r\nexport function readCompetitionResults(id) {\r\n return dispatch => {\r\n dispatch(readingCompetitionResults());\r\n\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/telltur/Competition.asmx/GetCompetitionResults\")\r\n .send({ competition_id: id })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"Content-Type\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .end((err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(competitionResultsReadError({ message: \"Error returned from service\" }, null));\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 competitionResultsReadError(\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 var results = response.records.sort((a, b) => b.points - a.points);\r\n dispatch(competitionResultsReadSuccess(results, null));\r\n });\r\n };\r\n}\r\n\r\n// ------------------------------------\r\n// Reducer\r\n// ------------------------------------\r\nconst initialState = {\r\n loading: false,\r\n joining: false,\r\n unjoining: false,\r\n success: false,\r\n error: undefined,\r\n competitions: undefined,\r\n results: undefined\r\n};\r\n\r\nexport function joinCompetitionReducer(state = initialState, action) {\r\n switch (action.type) {\r\n case JOINING_COMPETITION:\r\n return Object.assign({}, state, {\r\n joining: true,\r\n error: undefined\r\n });\r\n case COMPETITION_JOINED_SUCCESS:\r\n return Object.assign({}, state, {\r\n joining: false,\r\n success: true\r\n });\r\n case COMPETITION_JOINED_ERROR:\r\n return Object.assign({}, state, {\r\n joining: false,\r\n error: action.payload.error\r\n });\r\n case UNJOINING_COMPETITION:\r\n return Object.assign({}, state, {\r\n unjoining: true,\r\n error: undefined\r\n });\r\n case COMPETITION_UNJOINED_SUCCESS:\r\n return Object.assign({}, state, {\r\n unjoining: false,\r\n success: true\r\n });\r\n case COMPETITION_UNJOINED_ERROR:\r\n return Object.assign({}, state, {\r\n unjoining: false,\r\n error: action.payload.error\r\n });\r\n case READ_JOINED_COMPETITIONS:\r\n return Object.assign({}, state, {\r\n loading: true,\r\n error: undefined\r\n });\r\n case JOINED_COMPETITIONS_READ_SUCCESS:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n error: undefined,\r\n competitions: action.payload.competitions\r\n });\r\n case JOINED_COMPETITIONS_READ_ERROR:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n error: action.payload.error\r\n });\r\n case READ_UNIQUE_JOINED_COMPETITIONS:\r\n return Object.assign({}, state, {\r\n loading: true,\r\n error: undefined\r\n });\r\n case UNIQUE_JOINED_COMPETITIONS_READ_SUCCESS:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n error: undefined,\r\n competitions: action.payload.competitions\r\n });\r\n case UNIQUE_JOINED_COMPETITIONS_READ_ERROR:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n error: action.payload.error\r\n });\r\n case READ_COMPETITION_RESULTS:\r\n return Object.assign({}, state, {\r\n loading: true,\r\n error: undefined\r\n });\r\n case COMPETITION_RESULTS_READ_SUCCESS:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n error: undefined,\r\n results: action.payload.results\r\n });\r\n case COMPETITION_RESULTS_READ_ERROR:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n error: action.payload.error\r\n });\r\n\r\n case RESET_STATE:\r\n return initialState;\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 '../../components/Icon';\r\nimport Modal from '../../components/Modal';\r\nimport LoadingIndicator from '../../components/LoadingIndicator';\r\nimport { connect } from 'react-redux';\r\nimport { bindActionCreators } from 'redux';\r\nimport { translate } from 'react-translate';\r\nimport { withRouter, Link } from 'react-router-dom';\r\nimport { unjoinCompetition, readJoinedCompetitions } from '../../redux/competition';\r\n\r\nimport './CompetitionPage.scss';\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n readJoinedCompetitions: bindActionCreators(readJoinedCompetitions, dispatch),\r\n unjoinCompetition: bindActionCreators(unjoinCompetition, dispatch)\r\n };\r\n};\r\n\r\nconst mapStateToProps = state => ({\r\n unjoiningCompetition: state.joinCompetitionReducer.unjoining,\r\n unjoinCompetitionSuccess: state.joinCompetitionReducer.success,\r\n joinedCompetitionsLoading: state.joinCompetitionReducer.loading,\r\n joinedCompetitions: state.joinCompetitionReducer.competitions\r\n});\r\n\r\nclass CompetitionPage extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n showModal: false,\r\n loading: false\r\n };\r\n this.handleUnjoinCompetition = this.handleUnjoinCompetition.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n this.props.readJoinedCompetitions();\r\n }\r\n\r\n handleUnjoinCompetition(id) {\r\n this.props.unjoinCompetition(id);\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.unjoiningCompetition && !this.props.unjoiningCompetition) {\r\n this.props.readJoinedCompetitions();\r\n }\r\n }\r\n\r\n get memberCompetitions() {\r\n const { joinedCompetitions } = this.props;\r\n const memberCompetitions = {};\r\n\r\n joinedCompetitions &&\r\n joinedCompetitions.forEach(c => {\r\n if (!memberCompetitions[c.user_id]) {\r\n memberCompetitions[c.user_id] = [];\r\n }\r\n\r\n memberCompetitions[c.user_id].push(c);\r\n });\r\n\r\n return memberCompetitions;\r\n }\r\n\r\n render() {\r\n const { showModal } = this.state;\r\n const { t } = this.props;\r\n const memberCompetitions = this.memberCompetitions;\r\n return (\r\n <div className=\"tell-tur-page\">\r\n <div className=\"tell-tur-page--intro-text\">\r\n <h1>{t('title')}</h1>\r\n <p>\r\n {t('Description')}\r\n <Link to=\"/friluftsrad\">{t('LinkToFriluftsrad')}</Link>.\r\n </p>\r\n <p>{t('Note')}</p>\r\n </div>\r\n {Object.keys(memberCompetitions).length === 0 ? (\r\n <div className=\"competition-page--no-joined-competitons\">\r\n <p>{t('NoMemberCompetitions')}</p>\r\n </div>\r\n ) : (\r\n Object.values(memberCompetitions).map(mca => {\r\n return (\r\n <div key={mca[0].nick_name} className=\"competition-page__wrapper--members\">\r\n <div className=\"wrapper__members--member\">{mca[0].nick_name}</div>\r\n <ul className=\"members__member--competitions-list\">\r\n {mca.map(mc => (\r\n <li\r\n key={mc.nick_name + '_' + mc.competition_id}\r\n className=\"member__competition\"\r\n >\r\n {mc.title}\r\n <button\r\n onClick={() => this.setState({ showModal: true, competitionId: mc.id })}\r\n >\r\n <Icon name=\"cross\" />\r\n </button>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n })\r\n )}\r\n {this.props.unjoinCompetitionLoadig && (\r\n <div className=\"loader\">\r\n <LoadingIndicator />\r\n </div>\r\n )}\r\n {showModal && (\r\n <Modal>\r\n <div>\r\n <h3>{t('CancelationConfirm')}</h3>\r\n <p>{t('CancelationDescription')}</p>\r\n <p>{t('CancelationDescriptionNote')}</p>\r\n <div className=\"btn-flex-container\">\r\n <button\r\n onClick={() => this.setState({ showModal: false })}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('ButtonCancel')}\r\n </button>\r\n\r\n <button\r\n className=\"btn btn-primary\"\r\n onClick={() => {\r\n this.handleUnjoinCompetition(this.state.competitionId);\r\n this.setState({ showModal: false });\r\n }}\r\n >\r\n {t('ButtonConfirm')}\r\n </button>\r\n </div>\r\n </div>\r\n </Modal>\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nCompetitionPage.propTypes = {\r\n joinedCompetitions: PropTypes.array,\r\n readJoinedCompetitions: PropTypes.func.isRequired,\r\n unjoinCompetition: PropTypes.func.isRequired,\r\n unjoinCompetitionLoadig: PropTypes.bool,\r\n unjoiningCompetition: PropTypes.bool.isRequired,\r\n t: PropTypes.func.isRequired\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(withRouter(translate('CompetitionPage')(CompetitionPage)));\r\n","import React from \"react\";\r\nimport ProfilePage from \"../components/ProfilePage\";\r\nimport PropTypes from \"prop-types\";\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport { getUserDetails, updateUser, deleteUser } from \"../redux/user\";\r\nimport { getCompanies } from \"../redux/companies\";\r\nimport { readMembers, addMember } from \"../redux/familymembers\";\r\nimport CompetitionPage from \"./competition/CompetitionPage\";\r\nimport {\r\n readJoinedCompetitions,\r\n unjoinCompetition\r\n} from \"../redux/competition\";\r\nimport scopedBindActionCreators from \"../utils/scopedReducer\";\r\nimport { actions as digiThemeActions } from \"../utils/digiTheme\";\r\nimport config from \"../config/TellTur\";\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n readMembers: bindActionCreators(readMembers, dispatch),\r\n addMember: bindActionCreators(addMember, dispatch),\r\n getUserDetails: bindActionCreators(getUserDetails, dispatch),\r\n updateUser: bindActionCreators(updateUser, dispatch),\r\n deleteUser: bindActionCreators(deleteUser, dispatch),\r\n getCompanies: bindActionCreators(getCompanies, dispatch),\r\n readJoinedCompetitions: bindActionCreators(\r\n readJoinedCompetitions,\r\n dispatch\r\n ),\r\n unjoinCompetition: bindActionCreators(unjoinCompetition, dispatch),\r\n getAllFriluftsraad: scopedBindActionCreators(\r\n digiThemeActions.readFiltered,\r\n dispatch,\r\n \"readFriluftsraad\"\r\n ),\r\n readFriluftsraadMedlemskommuner: scopedBindActionCreators(\r\n digiThemeActions.readFiltered,\r\n dispatch,\r\n \"friluftsraadMedlemskommuner\"\r\n )\r\n };\r\n};\r\n\r\nconst mapStateToProps = state => ({\r\n members: state.familyMembers.members,\r\n memberError: state.familyMembers.error,\r\n membersLoading: state.familyMembers.loading,\r\n userLoading: state.user.loading,\r\n userError: state.user.error,\r\n user: state.user.user,\r\n companies: state.companies.companies,\r\n companiesLoading: state.companies.loading,\r\n allFriluftsraad: state.readFriluftsraad.records,\r\n allFriluftsraadLoading: state.readFriluftsraad.loading,\r\n friluftsraadMedlemskommuner: state.friluftsraadMedlemskommuner.records,\r\n friluftsraadMedlemskommunerLoading: state.friluftsraadMedlemskommuner.loading\r\n});\r\n\r\nclass MyProfile extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = { serverError: null, userError: null };\r\n\r\n this.addThenReadMembers = this.addThenReadMembers.bind(this);\r\n this.updateUser = this.updateUser.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n this.setState({\r\n serverError: null,\r\n userError: null\r\n });\r\n this.props.getAllFriluftsraad(\r\n config.friluftsraadDt.columns,\r\n null,\r\n config.mapProjCode,\r\n 0,\r\n 1000,\r\n null\r\n );\r\n this.props.readFriluftsraadMedlemskommuner(\r\n config.friluftsraadMedlemskommunerDt.columns,\r\n null,\r\n config.mapProjCode,\r\n 0,\r\n 1000,\r\n null\r\n );\r\n this.props.readJoinedCompetitions();\r\n if (!this.props.user) {\r\n this.props.getUserDetails();\r\n } else {\r\n this.props.readMembers(this.props.user.uuid);\r\n }\r\n }\r\n\r\n componentWillReceiveProps(nextProps) {\r\n if (nextProps.user && !this.props.user) {\r\n this.props.readMembers(nextProps.user.uuid);\r\n }\r\n if (\r\n nextProps.memberError &&\r\n nextProps.memberError !== this.state.serverError\r\n ) {\r\n this.setState({ serverError: nextProps.memberError });\r\n }\r\n if (nextProps.userError && nextProps.userError !== this.props.userError) {\r\n this.setState({ userError: nextProps.userError });\r\n }\r\n }\r\n\r\n addThenReadMembers(member) {\r\n this.setState({\r\n serverError: null\r\n });\r\n this.props.addMember(member, () => {\r\n this.props.getUserDetails();\r\n });\r\n }\r\n\r\n updateUser(user) {\r\n this.setState({ userError: null });\r\n this.props.updateUser(user);\r\n }\r\n\r\n render() {\r\n const {\r\n userLoading,\r\n membersLoading,\r\n companiesLoading,\r\n addMember,\r\n updateUser,\r\n userError,\r\n memberError,\r\n joinedCompetitions,\r\n members,\r\n allFriluftsraadLoading,\r\n friluftsraadMedlemskommunerLoading,\r\n ...rest\r\n } = this.props;\r\n const isLoading =\r\n userLoading ||\r\n membersLoading ||\r\n companiesLoading ||\r\n allFriluftsraadLoading ||\r\n friluftsraadMedlemskommunerLoading;\r\n\r\n return (\r\n <div>\r\n <ProfilePage\r\n {...rest}\r\n isLoading={isLoading}\r\n serverError={this.state.serverError}\r\n userError={this.state.userError}\r\n addMember={this.addThenReadMembers}\r\n updateUser={this.updateUser}\r\n members={members}\r\n />\r\n <CompetitionPage />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nMyProfile.propTypes = {\r\n page: PropTypes.object,\r\n members: PropTypes.array,\r\n memberError: PropTypes.object,\r\n membersLoading: PropTypes.bool,\r\n userLoading: PropTypes.bool,\r\n user: PropTypes.object,\r\n readMembers: PropTypes.func.isRequired,\r\n addMember: PropTypes.func.isRequired,\r\n getUserDetails: PropTypes.func.isRequired,\r\n updateUser: PropTypes.func.isRequired,\r\n userError: PropTypes.object,\r\n getAllFriluftsraad: PropTypes.func,\r\n allFriluftsraadLoading: PropTypes.bool,\r\n companies: PropTypes.array,\r\n companiesLoading: PropTypes.bool,\r\n getCompanies: PropTypes.func.isRequired,\r\n readJoinedCompetitions: PropTypes.func.isRequired,\r\n joinedCompetitions: PropTypes.array,\r\n unjoinCompetition: PropTypes.func.isRequired,\r\n readFriluftsraadMedlemskommuner: PropTypes.func.isRequired,\r\n friluftsraadMedlemskommunerLoading: PropTypes.bool\r\n};\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(MyProfile);\r\n","import React from \"react\";\r\nimport { translate } from \"react-translate\";\r\nimport { withRouter, Link } from \"react-router-dom\";\r\nimport PropTypes from \"prop-types\";\r\nimport Title from \"./Title\";\r\nimport { ResetPasswordForm } from \"@avinet/react-adaptive-auth\";\r\nimport \"./ResetPasswordPage.scss\";\r\n\r\nclass ResetPasswordPage extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n passwordSuccessfullyReset: false\r\n };\r\n this.handleReset = this.handleReset.bind(this);\r\n this.handleCancel = this.handleCancel.bind(this);\r\n this.goBack = this.goBack.bind(this);\r\n }\r\n\r\n handleCancel(evt) {\r\n evt.preventDefault();\r\n this.goBack();\r\n }\r\n\r\n handleReset() {\r\n this.setState({ passwordSuccessfullyReset: true });\r\n }\r\n\r\n goBack() {\r\n this.props.history.push(\"/logginn\");\r\n }\r\n\r\n render() {\r\n const { t, page, baseUrl } = this.props;\r\n return (\r\n <div className=\"tell-tur-page\">\r\n <Title title={page.title} />\r\n <h1>{page.title}</h1>\r\n <div\r\n className=\"tell-tur-page--intro-text\"\r\n dangerouslySetInnerHTML={{ __html: page.content }}\r\n />\r\n {!this.state.passwordSuccessfullyReset && (\r\n <ResetPasswordForm\r\n baseUrl={baseUrl}\r\n emailText={t(\"Email\")}\r\n submitText={t(\"SendNewPassword\")}\r\n cancelText={t(\"Cancel\")}\r\n errorText={t(\"CouldNotResetPassword\")}\r\n showLabels\r\n onCancel={this.handleCancel}\r\n onPasswordReset={this.handleReset}\r\n />\r\n )}\r\n {this.state.passwordSuccessfullyReset && (\r\n <div className=\"reset-password-form--info-text\">\r\n <p>{t(\"PasswordResetInfoText\")} - </p>\r\n <Link to=\"/logginn\">{t(\"GoBack\")}</Link>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nResetPasswordPage.propTypes = {\r\n history: PropTypes.object.isRequired,\r\n t: PropTypes.func.isRequired,\r\n page: PropTypes.object,\r\n baseUrl: PropTypes.string\r\n};\r\n\r\nexport default withRouter(translate(\"ResetPasswordPage\")(ResetPasswordPage));\r\n","import React from \"react\";\r\nimport { translate } from \"react-translate\";\r\nimport { withRouter, Link } from \"react-router-dom\";\r\nimport PropTypes from \"prop-types\";\r\nimport { ChangePasswordForm } from \"@avinet/react-adaptive-auth\";\r\nimport Title from \"./Title\";\r\nimport \"./ChangePasswordPage.scss\";\r\n\r\nclass ChangePasswordPage extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n error: \"\",\r\n passwordChanged: false\r\n };\r\n\r\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\r\n this.handleCancel = this.handleCancel.bind(this);\r\n }\r\n\r\n handleCancel() {\r\n this.props.history.goBack();\r\n }\r\n\r\n handlePasswordChange() {\r\n this.setState({\r\n error: null,\r\n passwordChanged: true\r\n });\r\n }\r\n\r\n render() {\r\n const { t, page, baseUrl } = this.props;\r\n return (\r\n <div className=\"tell-tur-page\">\r\n <Title title={page.title} />\r\n <h1>{page.title}</h1>\r\n {!this.state.passwordChanged && (\r\n <ChangePasswordForm\r\n baseUrl={baseUrl}\r\n showLabels\r\n submitText={t(\"SaveNewPassword\")}\r\n cancelText={t(\"Cancel\")}\r\n errorText={t(\"CouldNotChangePassword\")}\r\n currentPasswordText={t(\"CurrentPassword\")}\r\n newPasswordText={t(\"NewPassword\")}\r\n repeatPasswordText={t(\"RepeatPassword\")}\r\n onPasswordChange={this.handlePasswordChange}\r\n onCancel={this.handleCancel}\r\n />\r\n )}\r\n {this.state.passwordChanged && (\r\n <div className=\"change-password-form--info-text\">\r\n <p>{t(\"PasswordChanged\")}</p>\r\n <Link to=\"/minprofil\">{t(\"GoBack\")}</Link>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nChangePasswordPage.propTypes = {\r\n history: PropTypes.object.isRequired,\r\n t: PropTypes.func.isRequired,\r\n page: PropTypes.object,\r\n baseUrl: PropTypes.string\r\n};\r\n\r\nexport default withRouter(translate(\"ChangePasswordPage\")(ChangePasswordPage));\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { translate } from 'react-translate';\r\nimport { getPageSections } from '../utils/Page';\r\nimport Icon from './Icon';\r\nimport TranslatedServerError from './TranslatedServerError';\r\nimport './AddMemberPage.scss';\r\n\r\nclass AddMemberPage extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n error: null,\r\n serverError: null,\r\n newUserNickname: '',\r\n newUserYearOfBirth: '',\r\n membersToDelete: [],\r\n };\r\n\r\n this.reload = this.reload.bind(this);\r\n this.deleteMembers = this.deleteMembers.bind(this);\r\n this.updateMembersToDelete = this.updateMembersToDelete.bind(this);\r\n this.addNew = this.addNew.bind(this);\r\n }\r\n\r\n reload() {\r\n this.setState({\r\n error: null,\r\n newUserNickname: '',\r\n newUserYearOfBirth: '',\r\n membersToDelete: [],\r\n });\r\n this.props.readMembers(this.props.user.uuid);\r\n }\r\n\r\n deleteMembers() {\r\n this.setState({ serverError: null });\r\n this.state.membersToDelete.forEach((id) => this.props.deleteMember(id, () => this.reload()));\r\n }\r\n\r\n validateName(name) {\r\n if (name.length < 2) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n validateYear(year) {\r\n if (year < 1900) {\r\n return false;\r\n }\r\n if (year > new Date().getFullYear()) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n updateMembersToDelete(id) {\r\n var m = this.state.membersToDelete.slice();\r\n var foundAt = m.findIndex((mtd) => mtd === id);\r\n if (foundAt > -1) {\r\n m = m.filter((mtd) => mtd !== id);\r\n this.setState({ membersToDelete: m });\r\n } else {\r\n m.push(id);\r\n this.setState({ membersToDelete: m });\r\n }\r\n }\r\n\r\n generateMemberList(members) {\r\n if (members) {\r\n members = members.filter((m) => !m.is_main_familymember);\r\n return members.map((m) => {\r\n return (\r\n <div key={m.id} className=\"member-list--row\">\r\n <div className=\"cell name-cell\">{m.nick_name}</div>\r\n <div className=\"cell year-cell\">{m.yearofbirth}</div>\r\n <div onClick={() => this.updateMembersToDelete(m.id)} className=\"cell delete-cell\">\r\n <div className=\"checkbox\">\r\n {this.state.membersToDelete.findIndex((memberId) => memberId === m.id) > -1 && (\r\n <Icon name=\"checkmark\" />\r\n )}\r\n </div>\r\n <span>{this.props.t('Delete')}</span>\r\n </div>\r\n </div>\r\n );\r\n });\r\n }\r\n }\r\n\r\n addNew(evt, member, callback) {\r\n const { members, t, addNewMember } = this.props;\r\n evt.preventDefault();\r\n if (members === undefined || members === null || members.length === 0) {\r\n this.setState({ error: { message: t('FriluftsraadNotValid') } });\r\n return;\r\n }\r\n const mainMember = this.props.members.find((m) => m.is_main_familymember === true);\r\n if (mainMember === undefined) {\r\n this.setState({ error: { message: t('FriluftsraadNotValid') } });\r\n return;\r\n }\r\n member.selected_friluftsraad_uuid = mainMember.selected_friluftsraad_uuid;\r\n addNewMember(member, callback);\r\n }\r\n\r\n render() {\r\n const { t, page, membersLoading, userLoading, user, members, serverError } = this.props;\r\n const { membersToDelete, newUserNickname, newUserYearOfBirth, error } = this.state;\r\n const sections = getPageSections(page);\r\n const hasMembersToDelete = membersToDelete.length > 0;\r\n const nameIsValid = this.validateName(newUserNickname);\r\n const yearIsValid = this.validateYear(newUserYearOfBirth);\r\n\r\n return (\r\n <div className=\"tell-tur-page-form-container\">\r\n <h1>{page.title}</h1>\r\n {sections && (\r\n <div\r\n className=\"tell-tur-page--intro-text\"\r\n dangerouslySetInnerHTML={{ __html: sections['AddNewUserSection'] }}\r\n />\r\n )}\r\n {user && (\r\n <form\r\n className=\"tell-tur-form\"\r\n onSubmit={(e) =>\r\n this.addNew(e, { newUserNickname, newUserYearOfBirth, gender: '' }, this.reload)\r\n }\r\n >\r\n {error && <span className=\"tell-tur-form--error\">{error.message}</span>}\r\n {serverError && <TranslatedServerError error={serverError} />}\r\n <span className=\"tell-tur-form--control flex-row\">\r\n <label className=\"flex-members-large\">{t('Nickname')}</label>\r\n <label className=\"flex-members-small\">{t('Year')}</label>\r\n <input\r\n className=\"flex-members-large\"\r\n type=\"text\"\r\n value={newUserNickname}\r\n onChange={(e) => this.setState({ newUserNickname: e.target.value })}\r\n />\r\n <input\r\n className=\"flex-members-small\"\r\n type=\"number\"\r\n value={newUserYearOfBirth}\r\n onChange={(e) => this.setState({ newUserYearOfBirth: e.target.value })}\r\n />\r\n </span>\r\n <div className=\"tell-tur-form--button-group\">\r\n <button\r\n type=\"submit\"\r\n disabled={userLoading || membersLoading || !nameIsValid || !yearIsValid}\r\n className=\"btn btn-primary\"\r\n >\r\n {t('AddNewUser')}\r\n </button>\r\n </div>\r\n </form>\r\n )}\r\n {sections && (\r\n <div\r\n className=\"tell-tur-page--intro-text\"\r\n dangerouslySetInnerHTML={{ __html: sections['ExistingUserSection'] }}\r\n />\r\n )}\r\n {user && (\r\n <div className=\"member-list--container\">\r\n <div className=\"member-list\">{this.generateMemberList(members)}</div>\r\n <div className=\"tell-tur-form--button-group\">\r\n <input\r\n onClick={this.deleteMembers}\r\n type=\"button\"\r\n className=\"btn btn-primary\"\r\n disabled={userLoading || membersLoading || !hasMembersToDelete}\r\n value={t('Delete')}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nAddMemberPage.propTypes = {\r\n page: PropTypes.object,\r\n readMembers: PropTypes.func,\r\n members: PropTypes.array,\r\n serverError: PropTypes.object,\r\n membersLoading: PropTypes.bool,\r\n userLoading: PropTypes.bool,\r\n user: PropTypes.object,\r\n t: PropTypes.func,\r\n addNewMember: PropTypes.func,\r\n deleteMember: PropTypes.func,\r\n};\r\n\r\nexport default translate('AddMemberPage')(AddMemberPage);\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 { addMember, readMembers, deleteMember } from \"../redux/familymembers\";\r\nimport Title from \"./Title\";\r\nimport AddMemberPage from \"./AddMemberPage\";\r\n\r\nimport ballek from \"../static/ballek.png\";\r\nimport \"./AddMemberPage.scss\";\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n addMember: bindActionCreators(addMember, dispatch),\r\n readMembers: bindActionCreators(readMembers, dispatch),\r\n deleteMember: bindActionCreators(deleteMember, dispatch)\r\n };\r\n};\r\n\r\nconst mapStateToProps = state => ({\r\n members: state.familyMembers.members,\r\n memberError: state.familyMembers.error,\r\n membersLoading: state.familyMembers.loading,\r\n userLoading: state.user.loading,\r\n user: state.user.user\r\n});\r\n\r\nclass AddMemberContainer extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n serverError: null\r\n };\r\n\r\n this.addNewMember = this.addNewMember.bind(this);\r\n }\r\n\r\n componentWillReceiveProps(nextProps) {\r\n if (\r\n nextProps.user &&\r\n nextProps.members === null &&\r\n !nextProps.membersLoading\r\n ) {\r\n this.props.readMembers(nextProps.user.uuid);\r\n }\r\n if (nextProps.memberError) {\r\n this.setState({ serverError: nextProps.memberError });\r\n }\r\n }\r\n\r\n addNewMember(user, callback) {\r\n this.setState({ serverError: null });\r\n var member = {\r\n nick_name: user.newUserNickname,\r\n yearofbirth: user.newUserYearOfBirth,\r\n gender: user.gender,\r\n parent_user_uuid: this.props.user.uuid,\r\n selected_friluftsraad_uuid: user.selected_friluftsraad_uuid\r\n };\r\n this.props.addMember(member, callback);\r\n }\r\n\r\n render() {\r\n const { page, membersLoading, userLoading, user, members } = this.props;\r\n const { serverError } = this.state;\r\n\r\n return (\r\n <div className=\"tell-tur-page addMember\">\r\n <Title title={page.title} />\r\n <AddMemberPage\r\n page={page}\r\n membersLoading={membersLoading}\r\n userLoading={userLoading}\r\n user={user}\r\n members={members}\r\n serverError={serverError}\r\n addNewMember={this.addNewMember}\r\n readMembers={this.props.readMembers}\r\n deleteMember={this.props.deleteMember}\r\n />\r\n <img src={ballek} alt=\"\" />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nAddMemberContainer.propTypes = {\r\n page: PropTypes.object,\r\n members: PropTypes.array,\r\n memberError: PropTypes.object,\r\n membersLoading: PropTypes.bool,\r\n userLoading: PropTypes.bool,\r\n user: PropTypes.object,\r\n addMember: PropTypes.func,\r\n deleteMember: PropTypes.func,\r\n readMembers: PropTypes.func\r\n};\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(AddMemberContainer);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport LoadingIndicator from \"../LoadingIndicator\";\r\nimport { translate } from \"react-translate\";\r\nimport { Link } from \"react-router-dom\";\r\n\r\nconst generateTripList = (trips, handleDeleteTrip, noTripsText, t) => {\r\n if (!trips || !trips.length) {\r\n return <div>{noTripsText}</div>;\r\n }\r\n const sortedByMunicipality = trips.reduce((aggregateTripsByMunicipality, trip) => {\r\n if (aggregateTripsByMunicipality[trip.turmaal_kommune] === undefined) {\r\n aggregateTripsByMunicipality[trip.turmaal_kommune] = [];\r\n }\r\n aggregateTripsByMunicipality[trip.turmaal_kommune].push(trip);\r\n return aggregateTripsByMunicipality;\r\n }, {});\r\n\r\n return Object.keys(sortedByMunicipality).map(k => {\r\n return (\r\n <div key={k} className=\"trip-list--municipality-rows-wrapper\">\r\n <span className=\"trip-list--municipality-name\">{k !== \"null\" ? k : \"\"}</span>\r\n <div className=\"trip-list-row\">\r\n <div className=\"date-cell header-cell\">{t(\"Date\")}</div>\r\n <div className=\"destination-cell header-cell\">{t(\"Trip\")}</div>\r\n <div className=\"points-cell header-cell\">{t(\"Points\")}</div>\r\n <div className=\"delete-cell header-cell\" />\r\n </div>\r\n {generateTripRows(sortedByMunicipality[k], handleDeleteTrip, t)}\r\n </div>\r\n );\r\n });\r\n};\r\n\r\nconst generateTripRows = (trips, handleDeleteTrip, t) => {\r\n return trips.map(trip => {\r\n if (!trip.telltur_turmaal_id || !trip.id || !trip.turmaal_navn) {\r\n return (\r\n <div key={trip.id || \"default-key\"} className=\"trip-list-row\">\r\n <div className=\"date-cell\">{trip.date.toLocaleDateString(t(\"locale\"))}</div>\r\n <div className=\"destination-cell\">Turmål slettet</div>\r\n <div className=\"points-cell\">{trip.points}</div>\r\n <div className=\"delete-cell\">\r\n <button className=\"btn-link\" onClick={() => handleDeleteTrip(trip.id)}>\r\n {t(\"DeleteTrip\")}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n } else {\r\n return (\r\n <div key={trip.id} className=\"trip-list-row\">\r\n <div className=\"date-cell\">{trip.date.toLocaleDateString(t(\"locale\"))}</div>\r\n <div className=\"destination-cell\">\r\n <Link to={`/turmaal/${trip.telltur_turmaal_id.replace(\"_\", \"/\")}`}>\r\n {trip.turmaal_navn}\r\n </Link>\r\n </div>\r\n <div className=\"points-cell\">{trip.points}</div>\r\n <div className=\"delete-cell\">\r\n <button className=\"btn-link\" onClick={() => handleDeleteTrip(trip.id)}>\r\n {t(\"DeleteTrip\")}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n });\r\n};\r\n\r\nconst TripList = ({ trips, handleDeleteTrip, noTripsText, loading, t }) => {\r\n return (\r\n <div>\r\n <div className=\"trip-list\">\r\n {loading ? (\r\n <div className=\"trip-list--loader\">\r\n <LoadingIndicator />{\" \"}\r\n </div>\r\n ) : (\r\n <React.Fragment>\r\n {generateTripList(trips, handleDeleteTrip, noTripsText, t)}\r\n </React.Fragment>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nTripList.propTypes = {\r\n trips: PropTypes.array,\r\n handleDeleteTrip: PropTypes.func,\r\n noTripsText: PropTypes.string,\r\n loading: PropTypes.bool,\r\n t: PropTypes.func.isRequired\r\n};\r\n\r\nexport default translate(\"TripList\")(TripList);\r\n","import React from \"react\";\r\nimport { translate } from \"react-translate\";\r\nimport Select from \"react-select\";\r\nimport PropTypes from \"prop-types\";\r\nimport TranslatedServerError from \"../TranslatedServerError\";\r\n\r\nconst MemberList = props => {\r\n const {\r\n members,\r\n infoText,\r\n memberError,\r\n changeCurrentMember,\r\n t,\r\n selectedMemberId,\r\n hideTripCount,\r\n children,\r\n isSearchable\r\n } = props;\r\n\r\n return (\r\n <form className=\"tell-tur-form no-padding\">\r\n <div\r\n className=\"form-control-infoText\"\r\n dangerouslySetInnerHTML={{ __html: infoText }}\r\n />\r\n {memberError && <TranslatedServerError error={memberError} />}\r\n <span className=\"form-control-inlineFlex\">\r\n <span className=\"tell-tur-form--control\">\r\n <Select\r\n classNamePrefix=\"editable-search-dropdown\"\r\n options={members}\r\n isSearchable={isSearchable}\r\n getOptionLabel={m =>\r\n hideTripCount\r\n ? m.nick_name\r\n : `${m.nick_name} (${m.trip_count} ${t(\"Trips\").toLowerCase()})`\r\n }\r\n getOptionValue={m => m.id}\r\n value={\r\n members &&\r\n !!members.length &&\r\n members.find(m => m.id === selectedMemberId)\r\n }\r\n onChange={(di, action) => {\r\n if (action.action === \"select-option\") {\r\n changeCurrentMember(di.id);\r\n }\r\n }}\r\n />\r\n </span>\r\n {children}\r\n </span>\r\n </form>\r\n );\r\n};\r\n\r\nMemberList.propTypes = {\r\n members: PropTypes.array,\r\n infoText: PropTypes.string,\r\n memberError: PropTypes.object,\r\n changeCurrentMember: PropTypes.func,\r\n t: PropTypes.func,\r\n selectedMemberId: PropTypes.number.isRequired,\r\n hideTripCount: PropTypes.bool,\r\n children: PropTypes.element\r\n};\r\n\r\nexport default translate(\"MemberList\")(MemberList);\r\n","import request from \"superagent\";\r\nimport { getSessionToken, authReducerActions } from \"@avinet/react-adaptive-auth\";\r\nimport { fixDate } from \"../utils/date\";\r\nimport config from \"../config/TellTur\";\r\n\r\n// ------------------------------------\r\n// Constants\r\n// ------------------------------------\r\nexport const READING_TRIPS = \"READING_TRIPS\";\r\nexport const TRIPS_READ = \"TRIPS_READ\";\r\n\r\nexport const ADDING_TRIP = \"ADDING_TRIP\";\r\nexport const TRIP_ADDED = \"TRIP_ADDED\";\r\nexport const RESET_ADDED_TRIP = \"RESET_ADDED_TRIP\";\r\n\r\nexport const DELETING_TRIP = \"DELETING_TRIP\";\r\nexport const TRIP_DELETED = \"TRIP_DELETED\";\r\n\r\n// ------------------------------------\r\n// Actions\r\n// ------------------------------------\r\nconst addingTrip = () => ({\r\n type: ADDING_TRIP\r\n});\r\n\r\nconst tripAdded = (errorMessage, tripAdded) => ({\r\n type: TRIP_ADDED,\r\n payload: {\r\n error: errorMessage,\r\n tripAdded\r\n }\r\n});\r\n\r\nconst resetAddedTrip = () => ({\r\n type: RESET_ADDED_TRIP\r\n});\r\n\r\nconst readingTripsAction = () => ({\r\n type: READING_TRIPS\r\n});\r\n\r\nconst tripsReadAction = (errorMessage, trips) => ({\r\n type: TRIPS_READ,\r\n payload: {\r\n error: errorMessage,\r\n trips: trips\r\n }\r\n});\r\n\r\nconst tripDeleted = (error, tripDeleted) => ({\r\n type: TRIP_DELETED,\r\n payload: {\r\n error,\r\n tripDeleted\r\n }\r\n});\r\n\r\nconst deletingTrip = () => ({\r\n type: DELETING_TRIP\r\n});\r\n\r\n// ------------------------------------\r\n// Action creators\r\n// ------------------------------------\r\n\r\nexport function clearAddedTrip() {\r\n return dispatch => {\r\n dispatch(resetAddedTrip());\r\n };\r\n}\r\n\r\nexport function deleteTrip(tripId, familyMemberId) {\r\n return dispatch => {\r\n dispatch(deletingTrip());\r\n\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/telltur/Trips.asmx/Delete\")\r\n // .post('http://localhost/a_a3/WebServices/telltur/Trips.asmx/Delete')\r\n .send({\r\n id: tripId,\r\n user_id: familyMemberId\r\n })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .set(\"gm_lang_code\", config.gm_lang_code)\r\n .end((err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(tripDeleted(\"Error returned from service\"));\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(tripDeleted(response.exception || { message: \"Error returned from service\" }));\r\n return;\r\n }\r\n dispatch(tripDeleted(null, tripId));\r\n });\r\n };\r\n}\r\n\r\nexport function addTrip(trip) {\r\n return dispatch => {\r\n dispatch(addingTrip());\r\n\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/telltur/Trips.asmx/Create\")\r\n // .post('http://localhost/a_a3/WebServices/telltur/Trips.asmx/Create')\r\n .send({\r\n tripcode: trip.tripcode,\r\n tripdate: trip.tripdate,\r\n user_id: trip.userid,\r\n description: trip.description\r\n })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .set(\"gm_lang_code\", config.gm_lang_code)\r\n .end((err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(tripAdded(\"Error returned from service\"));\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(tripAdded(response.exception || { message: \"Error returned from service\" }));\r\n return;\r\n }\r\n dispatch(tripAdded(null, trip.tripcode));\r\n });\r\n };\r\n}\r\n\r\nexport function readTrips(userId, year, sortDescending = true, start = 0, limit = 0) {\r\n return dispatch => {\r\n dispatch(readingTripsAction());\r\n const filter = {\r\n filterColumns: [\r\n {\r\n name: \"user_id\",\r\n value: userId,\r\n comparisonOperator: \"=\",\r\n netType: \"Text\",\r\n logicalOperator: \"AND\"\r\n },\r\n {\r\n name: \"date\",\r\n value: new Date(Date.UTC(year, 0, 1)),\r\n comparisonOperator: \">=\",\r\n logicalOperator: \"AND\"\r\n },\r\n {\r\n name: \"date\",\r\n value: new Date(Date.UTC(year + 1, 0, 1)),\r\n comparisonOperator: \"<\",\r\n logicalOperator: \"AND\"\r\n }\r\n ],\r\n sortColumns: [\r\n {\r\n name: \"date\",\r\n sortDesc: sortDescending\r\n }\r\n ],\r\n secondFilter: [],\r\n defaultFilter: [],\r\n distinctColumns: []\r\n };\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/telltur/Trips.asmx/Read\")\r\n // .post('http://localhost/a_a3/WebServices/telltur/Trips.asmx/Read')\r\n .send({\r\n start,\r\n limit,\r\n filter\r\n })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\r\n .set(\"gm_lang_code\", config.gm_lang_code)\r\n .end((err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(tripsReadAction(\"Error returned from service\"));\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 || !response.data) {\r\n dispatch(\r\n tripsReadAction(response.exception || { message: \"Error returned from service\" })\r\n );\r\n return;\r\n }\r\n var trips = [];\r\n var records = response.data.find(item => item.key === \"records\");\r\n if (records.value) {\r\n trips = records.value.map(r => {\r\n r.date = fixDate(r.date);\r\n return r;\r\n });\r\n }\r\n\r\n dispatch(tripsReadAction(null, trips));\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 tripAdded: null,\r\n tripDeleted: null,\r\n trips: []\r\n};\r\n\r\nexport function tripsReducer(state = initialState, action) {\r\n switch (action.type) {\r\n case ADDING_TRIP:\r\n return Object.assign({}, state, {\r\n loading: true,\r\n error: null\r\n });\r\n case TRIP_ADDED:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n error: action.payload.error ? action.payload.error : null,\r\n tripAdded: action.payload.tripAdded\r\n });\r\n case RESET_ADDED_TRIP:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n error: null,\r\n tripAdded: null\r\n });\r\n case READING_TRIPS:\r\n return Object.assign({}, state, {\r\n loading: true,\r\n error: null,\r\n trips: [],\r\n tripDeleted: null\r\n });\r\n case TRIPS_READ:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n trips: action.payload.trips,\r\n error: action.payload.error ? action.payload.error : null\r\n });\r\n case DELETING_TRIP:\r\n return Object.assign({}, state, {\r\n loading: true,\r\n error: null\r\n });\r\n case TRIP_DELETED:\r\n return Object.assign({}, state, {\r\n error: action.payload.error ? action.payload.error : null,\r\n loading: false,\r\n tripDeleted: action.payload.tripDeleted\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 Select from \"react-select\";\r\nimport TripList from \"../components/MyTrips/TripList\";\r\nimport Title from \"../components/Title\";\r\nimport MemberSelect from \"../components/MyTrips/MemberSelect\";\r\nimport TranslatedServerError from \"../components/TranslatedServerError\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport { connect } from \"react-redux\";\r\nimport { translate } from \"react-translate\";\r\nimport { readTrips, deleteTrip } from \"../redux/trips\";\r\nimport { readMembers } from \"../redux/familymembers\";\r\n\r\nimport \"./MyTripsContainer.scss\";\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n readTrips: bindActionCreators(readTrips, dispatch),\r\n deleteTrip: bindActionCreators(deleteTrip, dispatch),\r\n readMembers: bindActionCreators(readMembers, dispatch)\r\n };\r\n};\r\n\r\nconst mapStateToProps = state => ({\r\n trips: state.trips.trips,\r\n tripDeleted: state.trips.tripDeleted,\r\n tripsError: state.trips.error,\r\n tripsLoading: state.trips.loading,\r\n user: state.user.user,\r\n members: state.familyMembers.members,\r\n memberError: state.familyMembers.error\r\n});\r\n\r\nclass MyTripsContainer extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n const thisYear = new Date().getFullYear();\r\n\r\n this.state = {\r\n thisYear,\r\n selectedYear: thisYear,\r\n selectedMemberId: -1,\r\n error: null\r\n };\r\n\r\n this.handleDeleteTrip = this.handleDeleteTrip.bind(this);\r\n this.changeCurrentMember = this.changeCurrentMember.bind(this);\r\n this.onYearSelected = this.onYearSelected.bind(this);\r\n }\r\n\r\n componentWillMount() {\r\n if (this.props.user) {\r\n this.props.readMembers(this.props.user.uuid);\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps, prevState) {\r\n if (!prevProps.user && this.props.user) {\r\n this.props.readMembers(this.props.user.uuid);\r\n }\r\n if (!prevProps.tripDeleted && this.props.tripDeleted) {\r\n this.props.readTrips(\r\n this.state.selectedMemberId,\r\n this.state.selectedYear\r\n );\r\n }\r\n\r\n if (\r\n this.props.members &&\r\n this.props.members.length &&\r\n this.state.selectedMemberId === -1\r\n ) {\r\n this.setMainMember();\r\n }\r\n\r\n if (\r\n this.state.selectedMemberId !== -1 &&\r\n (prevState.selectedMemberId !== this.state.selectedMemberId ||\r\n prevState.selectedYear !== this.state.selectedYear)\r\n ) {\r\n this.props.readTrips(\r\n this.state.selectedMemberId,\r\n this.state.selectedYear\r\n );\r\n }\r\n }\r\n\r\n setMainMember() {\r\n const mainMember = this.props.members.find(m => m.is_main_familymember);\r\n if (mainMember) {\r\n this.setState({\r\n selectedMemberId: mainMember.id\r\n });\r\n }\r\n }\r\n\r\n changeCurrentMember(id) {\r\n if (!Number.isNaN(id)) {\r\n this.setState({\r\n selectedMemberId: id\r\n });\r\n }\r\n }\r\n\r\n generateOptionsFromYear(fromYear) {\r\n const { thisYear } = this.state;\r\n let options = [];\r\n\r\n for (let i = thisYear; i >= fromYear; i--) {\r\n options.push({ key: i, value: i });\r\n }\r\n\r\n return options;\r\n }\r\n\r\n onYearSelected(year) {\r\n const selectedYear = parseInt(year);\r\n this.setState({ selectedYear });\r\n }\r\n\r\n handleDeleteTrip(id) {\r\n this.props.deleteTrip(id, this.state.selectedMemberId);\r\n }\r\n\r\n render() {\r\n const {\r\n page,\r\n trips,\r\n members,\r\n memberError,\r\n tripsLoading,\r\n t,\r\n tripsError\r\n } = this.props;\r\n const { selectedMemberId, thisYear } = this.state;\r\n const options = this.generateOptionsFromYear(2018);\r\n\r\n return (\r\n <div className=\"tell-tur-page\">\r\n <Title title={page.title} />\r\n <h1>{page.title}</h1>\r\n {tripsError && <TranslatedServerError error={tripsError} />}\r\n <MemberSelect\r\n infoText={page.content}\r\n isSearchable={false}\r\n members={members}\r\n memberError={memberError}\r\n changeCurrentMember={this.changeCurrentMember}\r\n selectedMemberId={selectedMemberId}\r\n >\r\n <span className=\"tell-tur-form--control\">\r\n <Select\r\n classNamePrefix=\"editable-search-dropdown\"\r\n defaultValue={options.find(y => y.value === thisYear)}\r\n isSearchable={false}\r\n getOptionLabel={y => y.value}\r\n options={options}\r\n onChange={(di, action) => {\r\n if (action.action === \"select-option\") {\r\n this.onYearSelected(di.value);\r\n }\r\n }}\r\n />\r\n </span>\r\n </MemberSelect>\r\n <TripList\r\n trips={trips}\r\n noTripsText={t(\"NoTrips\")}\r\n handleDeleteTrip={this.handleDeleteTrip}\r\n loading={tripsLoading}\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nMyTripsContainer.propTypes = {\r\n page: PropTypes.object,\r\n trips: PropTypes.array,\r\n readTrips: PropTypes.func,\r\n deleteTrip: PropTypes.func,\r\n tripDeleted: PropTypes.number,\r\n tripsError: PropTypes.object,\r\n tripsLoading: PropTypes.bool,\r\n user: PropTypes.object,\r\n readMembers: PropTypes.func,\r\n memberError: PropTypes.object,\r\n members: PropTypes.array,\r\n t: PropTypes.func.isRequired\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(translate(\"MyTripsContainer\")(MyTripsContainer));\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport LoadingIndicator from \"../LoadingIndicator\";\r\nimport \"./ResultList.scss\";\r\n\r\nconst mapResults = (\r\n results,\r\n displayProps,\r\n member,\r\n currentPage,\r\n pageLimit,\r\n ignorePlace\r\n) => {\r\n return (\r\n <div className=\"result-list--row-list\">\r\n {results.map((r, i) => {\r\n const prop1 = r[displayProps[0]];\r\n const prop2 = r[displayProps[1]];\r\n const prop3 = r[displayProps[2]];\r\n const prop4 = r[displayProps[3]];\r\n\r\n let label =\r\n !r.place || ignorePlace\r\n ? ((currentPage || 1) - 1) * pageLimit + i + 1\r\n : r.place;\r\n return (\r\n <div\r\n key={i}\r\n className={[\r\n \"result-list--row\",\r\n member && member.nick_name === prop1 ? \"is-member\" : \"\"\r\n ].join(\" \")}\r\n >\r\n <div className=\"result-list--column0\">{`${\r\n isNaN(label) ? i + 1 : label\r\n }.`}</div>\r\n <div className=\"result-list--column1\">{prop1}</div>\r\n <div className=\"result-list--column2\">{prop2}</div>\r\n {prop3 && <div className=\"result-list--column3\">{prop3}</div>}\r\n {prop4 && <div className=\"result-list--column4\">{prop4}</div>}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\nconst ResultList = props => {\r\n const {\r\n results,\r\n headers,\r\n displayProps,\r\n title,\r\n loading,\r\n member,\r\n currentPage,\r\n pageLimit,\r\n children,\r\n ignorePlace\r\n } = props;\r\n\r\n return (\r\n <div className=\"result-list\">\r\n {title && <div className=\"results-list--results-title\">{title}</div>}\r\n <div className=\"result-list--row header\">\r\n {headers.map((h, i) => (\r\n <div\r\n key={i}\r\n className={`result-list--column${i} result-list--header`}\r\n >\r\n {h}\r\n </div>\r\n ))}\r\n </div>\r\n {loading && (\r\n <div className=\"result-list--loading-container\">\r\n <LoadingIndicator />\r\n </div>\r\n )}\r\n {results &&\r\n mapResults(\r\n results,\r\n displayProps,\r\n member,\r\n currentPage,\r\n pageLimit,\r\n ignorePlace\r\n )}\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nResultList.propTypes = {\r\n title: PropTypes.string,\r\n results: PropTypes.array,\r\n headers: PropTypes.array.isRequired,\r\n displayProps: PropTypes.array.isRequired,\r\n loading: PropTypes.bool,\r\n member: PropTypes.object,\r\n currentPage: PropTypes.number,\r\n pageLimit: PropTypes.number,\r\n children: PropTypes.element\r\n};\r\nexport default ResultList;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Icon from \"../../components/Icon\";\r\nimport ResultList from \"../../components/Results/ResultList\";\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport { translate } from \"react-translate\";\r\nimport { withRouter, Link } from \"react-router-dom\";\r\nimport {\r\n readCompetitionResults,\r\n readUniqueJoinedCompetitions,\r\n} from \"../../redux/competition\";\r\n\r\nimport \"./CompetitionResults.scss\";\r\nimport { fixDate } from \"../../utils/date\";\r\n\r\nconst mapStateToProps = (state) => ({\r\n uniqueJoinedCompetitions: state.joinCompetitionReducer.competitions,\r\n competitionResults: state.joinCompetitionReducer.results,\r\n competitionResultsLoading: state.joinCompetitionReducer.loading,\r\n});\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n readUniqueJoinedCompetitions: bindActionCreators(\r\n readUniqueJoinedCompetitions,\r\n dispatch\r\n ),\r\n readCompetitionResults: bindActionCreators(\r\n readCompetitionResults,\r\n dispatch\r\n ),\r\n };\r\n};\r\nclass CompetitionResults extends React.Component {\r\n constructor() {\r\n super();\r\n this.state = {\r\n index: null,\r\n };\r\n }\r\n componentDidMount() {\r\n this.props.readUniqueJoinedCompetitions();\r\n }\r\n\r\n getDate(start, end) {\r\n const { t } = this.props;\r\n const fixedStartDate = fixDate(start);\r\n const fixedEndDate = fixDate(end);\r\n const now = new Date();\r\n\r\n if (Math.sign(fixedEndDate) === -1) {\r\n return `${t(\"Started\")}: ${fixedStartDate.toLocaleDateString(\r\n t(\"locale\")\r\n )}`;\r\n } else if (fixedEndDate.setHours(0, 0, 0, 0) < now.setHours(0, 0, 0, 0)) {\r\n return \"\";\r\n } else {\r\n return `${t(\"Started\")}: ${fixedStartDate.toLocaleDateString(\r\n t(\"locale\")\r\n )} - ${t(\"Ends\")}: ${fixedEndDate.toLocaleDateString(t(\"locale\"))}`;\r\n }\r\n }\r\n\r\n render() {\r\n const {\r\n uniqueJoinedCompetitions,\r\n readCompetitionResults,\r\n competitionResults,\r\n competitionResultsLoading,\r\n member,\r\n t,\r\n } = this.props;\r\n const { index } = this.state;\r\n\r\n return (\r\n <div className=\"tell-tur__competition-results--wrapper\">\r\n <h1>{t(\"Title\")}</h1>\r\n <p>\r\n {t(\"CompetitionDescription\")}\r\n <Link to=\"/friluftsrad\">{t(\"LinkToFriluftsrad\")}</Link>.\r\n </p>\r\n <div className=\"competition-results__wrapper--competitions-list\">\r\n {uniqueJoinedCompetitions && uniqueJoinedCompetitions.length > 0 ? (\r\n uniqueJoinedCompetitions.map((competition, idx) => (\r\n <div\r\n key={idx}\r\n className=\"competitions-list__competition--container\"\r\n >\r\n <div\r\n className={[\r\n \"container__title--button\",\r\n new Date().setHours(0, 0, 0, 0) <\r\n new Date(fixDate(competition.end_date)).setHours(\r\n 0,\r\n 0,\r\n 0,\r\n 0\r\n ) || Math.sign(fixDate(competition.end_date)) === -1\r\n ? \"ongoing\"\r\n : \"\",\r\n ].join(\" \")}\r\n >\r\n <span\r\n className={[\r\n \"content__label\",\r\n index === idx ? \"active\" : \"\",\r\n ].join(\" \")}\r\n >\r\n {competition.title}\r\n <br />\r\n <span className=\"content__label-date\">\r\n {this.getDate(\r\n competition.start_date,\r\n competition.end_date\r\n )}\r\n </span>\r\n </span>\r\n <button\r\n onClick={() => {\r\n if (idx === index) {\r\n this.setState({ index: undefined });\r\n } else {\r\n this.setState({ index: idx });\r\n readCompetitionResults(competition.competition_id);\r\n }\r\n }}\r\n >\r\n <Icon name={index === idx ? \"chevronUp\" : \"chevronDown\"} />\r\n </button>\r\n </div>\r\n <div\r\n className={[\r\n \"competition__container--content\",\r\n index === idx ? \"active\" : \"\",\r\n ].join(\" \")}\r\n >\r\n {index === idx && (\r\n <ResultList\r\n results={competitionResults}\r\n displayProps={[\"nick_name\", \"points\"]}\r\n headers={[\"#\", t(\"Nickname\"), t(\"Points\")]}\r\n loading={competitionResultsLoading}\r\n member={member}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n ))\r\n ) : (\r\n <div className=\"competition-results--no-joined-competitions\">\r\n <p>{t(\"NoUniqueJoinedCompetitions\")}</p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\nCompetitionResults.propTypes = {\r\n readCompetitionResults: PropTypes.func.isRequired,\r\n readUniqueJoinedCompetitions: PropTypes.func.isRequired,\r\n uniqueJoinedCompetitions: PropTypes.array,\r\n competitionResults: PropTypes.array,\r\n competitionResultsLoading: PropTypes.bool,\r\n member: PropTypes.object,\r\n t: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(withRouter(translate(\"CompetitionResults\")(CompetitionResults)));\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport './Switch.scss';\r\n\r\nconst Switch = ({ labelOn, labelOff, valueOn, valueOff, value, onChange, disable }) => (\r\n <div className={['switch', disable ? 'disable' : ''].join(' ')}>\r\n <button\r\n className={['switch-btn', value === valueOff ? 'active' : ''].join(' ')}\r\n onClick={() => onChange(valueOff)}\r\n >\r\n {labelOff}\r\n </button>\r\n <button\r\n className={['switch-btn', value === valueOn ? 'active' : ''].join(' ')}\r\n onClick={() => onChange(valueOn)}\r\n >\r\n {labelOn}\r\n </button>\r\n </div>\r\n);\r\n\r\nSwitch.propTypes = {\r\n /** Use callback to toggle state in parent component */\r\n onChange: PropTypes.func.isRequired,\r\n /** True value */\r\n valueOn: PropTypes.any,\r\n /** True label */\r\n labelOn: PropTypes.string.isRequired,\r\n /** False value */\r\n valueOff: PropTypes.any,\r\n /** False label */\r\n labelOff: PropTypes.string.isRequired,\r\n /** Value of switch */\r\n value: PropTypes.any.isRequired,\r\n /** Disable switch */\r\n disable: PropTypes.bool\r\n};\r\n\r\nSwitch.defaultProps = {\r\n valueOn: true,\r\n valueOff: false\r\n};\r\nexport default Switch;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nclass YearSelector extends React.Component {\r\n static propTypes = {\r\n fromYear: PropTypes.number.isRequired,\r\n onYearSelected: PropTypes.func.isRequired,\r\n infoText: PropTypes.string\r\n };\r\n constructor(props) {\r\n super(props);\r\n\r\n const thisYear = new Date().getFullYear();\r\n\r\n this.state = {\r\n thisYear: thisYear,\r\n selectedYear: thisYear\r\n };\r\n }\r\n\r\n renderYears() {\r\n const { thisYear } = this.state;\r\n const { fromYear } = this.props;\r\n\r\n let options = [];\r\n for (let i = thisYear; i >= fromYear; i--) {\r\n options.push(\r\n <option key={i} value={i}>\r\n {i}\r\n </option>\r\n );\r\n }\r\n return options;\r\n }\r\n\r\n componentDidMount() {\r\n this.props.onYearSelected(this.state.selectedYear);\r\n }\r\n\r\n componentDidUpdate(prevProps, prevState) {\r\n if (this.state.selectedYear !== prevState.selectedYear) {\r\n this.props.onYearSelected(this.state.selectedYear);\r\n }\r\n }\r\n\r\n handleChange = evt => {\r\n this.setState({ selectedYear: evt.target.value });\r\n };\r\n\r\n render() {\r\n const { selectedYear } = this.state;\r\n const { infoText } = this.props;\r\n\r\n return (\r\n <span className=\"tell-tur-form--control\">\r\n {infoText && (\r\n <div className=\"form-control--infoText\" dangerouslySetInnerHTML={{ __html: infoText }} />\r\n )}\r\n <select value={selectedYear} onChange={this.handleChange}>\r\n {this.renderYears()}\r\n </select>\r\n </span>\r\n );\r\n }\r\n}\r\n\r\nexport default YearSelector;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport \"./Pagination.scss\";\r\n\r\nconst LEFT_PAGE = \"LEFT\";\r\nconst RIGHT_PAGE = \"RIGHT\";\r\n\r\nconst range = (from, to, step = 1) => {\r\n let i = from;\r\n const range = [];\r\n\r\n while (i <= to) {\r\n range.push(i);\r\n i += step;\r\n }\r\n\r\n return range;\r\n};\r\n\r\nclass Pagination extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n const { totalRecords = null, pageLimit = 50, pageNeighbours = 0 } = props;\r\n this.pageLimit = typeof pageLimit === \"number\" ? pageLimit : 30;\r\n this.totalRecords = typeof totalRecords === \"number\" ? totalRecords : 0;\r\n\r\n this.pageNeighbours =\r\n typeof pageNeighbours === \"number\" ? Math.max(0, Math.min(pageNeighbours, 2)) : 0;\r\n\r\n this.totalPages = Math.ceil(this.totalRecords / this.pageLimit);\r\n\r\n this.state = { currentPage: 1 };\r\n }\r\n\r\n componentDidMount() {\r\n this.gotoPage(1);\r\n }\r\n\r\n gotoPage = page => {\r\n const { onPageChanged = f => f } = this.props;\r\n\r\n const currentPage = Math.max(0, Math.min(page, this.totalPages));\r\n\r\n const paginationData = {\r\n currentPage,\r\n totalPages: this.totalPages,\r\n pageLimit: this.pageLimit,\r\n totalRecords: this.totalRecords\r\n };\r\n\r\n this.setState({ currentPage }, () => onPageChanged(paginationData));\r\n };\r\n\r\n handleClick = page => evt => {\r\n evt.preventDefault();\r\n this.gotoPage(page);\r\n };\r\n\r\n handleMoveLeft = evt => {\r\n evt.preventDefault();\r\n this.gotoPage(this.state.currentPage - this.pageNeighbours * 2 - 1);\r\n };\r\n\r\n handleMoveRight = evt => {\r\n evt.preventDefault();\r\n this.gotoPage(this.state.currentPage + this.pageNeighbours * 2 + 1);\r\n };\r\n\r\n fetchPageNumbers = () => {\r\n const totalPages = this.totalPages;\r\n const currentPage = this.state.currentPage;\r\n const pageNeighbours = this.pageNeighbours;\r\n\r\n const totalNumbers = this.pageNeighbours * 2 + 3;\r\n const totalBlocks = totalNumbers + 2;\r\n\r\n if (totalPages > totalBlocks) {\r\n const startPage = Math.max(2, currentPage - pageNeighbours);\r\n const endPage = Math.min(totalPages - 1, currentPage + pageNeighbours);\r\n\r\n let pages = range(startPage, endPage);\r\n\r\n const hasLeftSpill = startPage > 2;\r\n const hasRightSpill = totalPages - endPage > 1;\r\n const spillOffset = totalNumbers - (pages.length + 1);\r\n\r\n switch (true) {\r\n case hasLeftSpill && !hasRightSpill: {\r\n const extraPages = range(startPage - spillOffset, startPage - 1);\r\n pages = [LEFT_PAGE, ...extraPages, ...pages];\r\n break;\r\n }\r\n\r\n case !hasLeftSpill && hasRightSpill: {\r\n const extraPages = range(endPage + 1, endPage + spillOffset);\r\n pages = [...pages, ...extraPages, RIGHT_PAGE];\r\n break;\r\n }\r\n\r\n case hasLeftSpill && hasRightSpill:\r\n default: {\r\n pages = [LEFT_PAGE, ...pages, RIGHT_PAGE];\r\n break;\r\n }\r\n }\r\n\r\n return [1, ...pages, totalPages];\r\n }\r\n\r\n return range(1, totalPages);\r\n };\r\n\r\n render() {\r\n if (!this.totalRecords || this.totalPages === 1) return null;\r\n\r\n const { currentPage } = this.state;\r\n const pages = this.fetchPageNumbers();\r\n\r\n return (\r\n <div className=\"telltur--pagination__container\">\r\n <ul className=\"telltur--pagination__list\">\r\n {pages.map((page, index) => {\r\n if (page === LEFT_PAGE) {\r\n return (\r\n <li key={index} className=\"telltur--pagination__list-page-item\">\r\n <button\r\n className=\"btn-link telltur--pagination__list-page-link\"\r\n onClick={this.handleMoveLeft}\r\n >\r\n <span aria-hidden=\"true\">«</span>\r\n </button>\r\n </li>\r\n );\r\n }\r\n if (page === RIGHT_PAGE) {\r\n return (\r\n <li key={index} className=\"telltur--pagination__list-page-item\">\r\n <button\r\n className=\"btn-link telltur--pagination__list-page-link\"\r\n onClick={this.handleMoveRight}\r\n >\r\n <span aria-hidden=\"true\">»</span>\r\n </button>\r\n </li>\r\n );\r\n }\r\n return (\r\n <li\r\n key={index}\r\n className={`telltur--pagination__list-page-item${\r\n currentPage === page ? \" active\" : \"\"\r\n }`}\r\n >\r\n <button\r\n className=\"btn-link telltur--pagination__list-page-link\"\r\n onClick={this.handleClick(page)}\r\n >\r\n {page}\r\n </button>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nPagination.propTypes = {\r\n totalRecords: PropTypes.number.isRequired,\r\n pageLimit: PropTypes.number,\r\n pageNeighbours: PropTypes.number,\r\n onPageChanged: PropTypes.func\r\n};\r\n\r\nexport default Pagination;\r\n","import request from 'superagent';\r\n\r\nexport const post = (url, headers, data, callback) => {\r\n request\r\n .post(url)\r\n .send(data)\r\n .set(headers)\r\n .end((err, response) => {\r\n callback(err, response);\r\n });\r\n};\r\n","// If serializing a C# ExpandoObject (dynamic object) you can run this method to return a proper javascript object.\r\n// Only useful if you have a flat object, for instance serialized data-rows\r\n// var records = [\r\n// [{ Key: 'id', Value: 1 }, { Key: 'name', Value: 'Ola' }],\r\n// [{ Key: 'id', Value: 2 }, { Key: 'name', Value: 'Kari' }]\r\n// ];\r\nconst fixKeyValueArraysToJsObject = records => {\r\n return records.map(r =>\r\n r.reduce((obj, item) => {\r\n if (item !== undefined) {\r\n obj[item.Key] = item.Value;\r\n }\r\n return obj;\r\n }, {})\r\n );\r\n};\r\n\r\nexport { fixKeyValueArraysToJsObject };\r\n","import { post } from \"../requests\";\r\nimport { fixKeyValueArraysToJsObject } from \"../utils/array\";\r\nimport { getSessionToken, authReducerActions } from \"@avinet/react-adaptive-auth\";\r\nimport config from \"../config/TellTur\";\r\n\r\n// ------------------------------------\r\n// Constants\r\n// ------------------------------------\r\nexport const STATISTICS_TYPE = Object.freeze({\r\n POINTS: \"POINTS\",\r\n UNIQUE: \"UNIQUE\"\r\n});\r\n\r\nexport const READING_POINT_STATS = \"READING_POINT_STATS\";\r\nexport const POINT_STATS_READ = \"POINT_STATS_READ\";\r\n\r\nexport const READING_UNIQUE_STATS = \"READING_UNIQUE_STATS\";\r\nexport const UNIQUE_STATS_READ = \"UNIQUE_STATS_READ\";\r\n\r\nexport const READING_STATS = \"READING_STATS\";\r\nexport const STATS_READ = \"STATS_READ\";\r\n\r\nexport const READING_COMPANY_STATS = \"READING_COMPANY_STATS\";\r\nexport const COMPANY_STATS_READ = \"COMPANY_STATS_READ\";\r\n\r\n// ------------------------------------\r\n// Actions\r\n// ------------------------------------\r\nconst readingStats = statisticsType => ({\r\n type: READING_STATS,\r\n payload: {\r\n statisticsType\r\n }\r\n});\r\n\r\nconst statsRead = (errorMessage, statisticsType, stats) => ({\r\n type: STATS_READ,\r\n payload: {\r\n error: errorMessage,\r\n statisticsType,\r\n stats\r\n }\r\n});\r\n\r\nconst readingCompanyStats = statisticsType => ({\r\n type: READING_COMPANY_STATS,\r\n payload: {\r\n statisticsType\r\n }\r\n});\r\n\r\nconst companyStatsRead = (errorMessage, statisticsType, stats) => ({\r\n type: COMPANY_STATS_READ,\r\n payload: {\r\n error: errorMessage,\r\n statisticsType,\r\n stats\r\n }\r\n});\r\n\r\nconst getUrl = statisticsType => {\r\n switch (statisticsType) {\r\n case STATISTICS_TYPE.POINTS:\r\n return config.adaptiveUrl + \"WebServices/telltur/Trips.asmx/ReadStatisticsWithSearch\";\r\n case STATISTICS_TYPE.UNIQUE:\r\n return (\r\n config.adaptiveUrl +\r\n \"WebServices/telltur/Trips.asmx/ReadUniqueDestinationsStatisticsWithSearch\"\r\n );\r\n default:\r\n return \"\";\r\n }\r\n};\r\n\r\nexport function readCompanyStatistics(companyId, selectedFriluftsraadId, statisticsType, year) {\r\n return dispatch => {\r\n dispatch(readingCompanyStats(statisticsType));\r\n\r\n const start = 0;\r\n const limit = 0;\r\n\r\n const fromDate =\r\n selectedFriluftsraadId === config.vesteralenFriluftsraadUuid && year >= 2023\r\n ? new Date(Date.UTC(year, 3, 1))\r\n : new Date(Date.UTC(year, 0, 1));\r\n\r\n const toDate =\r\n selectedFriluftsraadId === config.vesteralenFriluftsraadUuid && year >= 2023\r\n ? new Date(Date.UTC(year, 11, 1))\r\n : new Date(Date.UTC(year + 1, 0, 1));\r\n\r\n const filter = {\r\n filterColumns: [\r\n {\r\n name: \"date\",\r\n value: fromDate,\r\n comparisonOperator: \">=\",\r\n logicalOperator: \"AND\"\r\n },\r\n {\r\n name: \"date\",\r\n value: toDate,\r\n comparisonOperator: \"<\",\r\n logicalOperator: \"AND\"\r\n },\r\n {\r\n name: \"bedrift_id\",\r\n value: companyId,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"AND\"\r\n }\r\n ],\r\n sortColumns: [\r\n {\r\n name: \"aggregate\",\r\n sortDesc: true\r\n }\r\n ]\r\n };\r\n const url = `\r\n ${config.adaptiveUrl}${\r\n statisticsType === STATISTICS_TYPE.POINTS\r\n ? \"WebServices/telltur/Trips.asmx/ReadMyCompanyPointStatistics\"\r\n : \"WebServices/telltur/Trips.asmx/ReadMyCompanyUniqueDestinationsStatistics\"\r\n }`;\r\n\r\n const data = {\r\n start,\r\n limit,\r\n filter\r\n };\r\n\r\n if (statisticsType === STATISTICS_TYPE.POINTS) {\r\n data.search = null;\r\n }\r\n\r\n post(\r\n url,\r\n {\r\n Accept: \"application/json\",\r\n gm_lang_code: config.gm_lang_code,\r\n gm_session_id: getSessionToken()\r\n },\r\n data,\r\n (err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(\r\n companyStatsRead({ message: \"Error returned from service\" }, statisticsType, undefined)\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 companyStatsRead(\r\n response.exception || { message: \"Error returned from service\" },\r\n statisticsType,\r\n undefined\r\n )\r\n );\r\n return;\r\n }\r\n var records = fixKeyValueArraysToJsObject(response.records);\r\n dispatch(companyStatsRead(null, statisticsType, records));\r\n }\r\n );\r\n };\r\n}\r\n\r\nexport function ReadAllCompaniesPointStatistics(selectedFriluftsraadId, statisticsType, year) {\r\n return dispatch => {\r\n dispatch(readingCompanyStats(statisticsType));\r\n\r\n const start = 0;\r\n const limit = 0;\r\n\r\n const fromDate =\r\n selectedFriluftsraadId === config.vesteralenFriluftsraadUuid && year >= 2023\r\n ? new Date(Date.UTC(year, 3, 1))\r\n : new Date(Date.UTC(year, 0, 1));\r\n\r\n const toDate =\r\n selectedFriluftsraadId === config.vesteralenFriluftsraadUuid && year >= 2023\r\n ? new Date(Date.UTC(year, 11, 1))\r\n : new Date(Date.UTC(year + 1, 0, 1));\r\n\r\n const filter = {\r\n filterColumns: [\r\n {\r\n name: \"selected_friluftsraad_uuid\",\r\n value: selectedFriluftsraadId,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"AND\"\r\n },\r\n {\r\n name: \"date\",\r\n value: fromDate,\r\n comparisonOperator: \">=\",\r\n logicalOperator: \"AND\"\r\n },\r\n {\r\n name: \"date\",\r\n value: toDate,\r\n comparisonOperator: \"<\",\r\n logicalOperator: \"AND\"\r\n }\r\n ],\r\n sortColumns: [\r\n {\r\n name: \"snitt_poeng\",\r\n sortDesc: true\r\n }\r\n ]\r\n };\r\n\r\n const url =\r\n config.adaptiveUrl + \"WebServices/telltur/Trips.asmx/ReadAllCompaniesPointStatistics\";\r\n post(\r\n url,\r\n {\r\n Accept: \"application/json\",\r\n gm_lang_code: config.gm_lang_code,\r\n gm_session_id: getSessionToken()\r\n },\r\n {\r\n start,\r\n limit,\r\n filter\r\n },\r\n (err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(\r\n companyStatsRead({ message: \"Error returned from service\" }, statisticsType, undefined)\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 companyStatsRead(\r\n response.exception || { message: \"Error returned from service\" },\r\n statisticsType,\r\n undefined\r\n )\r\n );\r\n return;\r\n }\r\n var records = fixKeyValueArraysToJsObject(response.records);\r\n dispatch(companyStatsRead(null, statisticsType, records));\r\n }\r\n );\r\n };\r\n}\r\n\r\nexport function readStatistics(start = 0, limit = 0, selectedFriluftsraadId, statisticsType, year) {\r\n return dispatch => {\r\n dispatch(readingStats(statisticsType));\r\n\r\n const filter = {\r\n filterColumns: [\r\n {\r\n name: \"date\",\r\n value: new Date(Date.UTC(year, 0, 1)),\r\n comparisonOperator: \">=\",\r\n logicalOperator: \"AND\"\r\n },\r\n {\r\n name: \"date\",\r\n value: new Date(Date.UTC(year + 1, 0, 1)),\r\n comparisonOperator: \"<\",\r\n logicalOperator: \"AND\"\r\n }\r\n ],\r\n sortColumns: [\r\n {\r\n name: \"aggregate\",\r\n sortDesc: true\r\n }\r\n ]\r\n };\r\n\r\n if (selectedFriluftsraadId) {\r\n filter.filterColumns.push({\r\n name: \"selected_friluftsraad_uuid\",\r\n value: selectedFriluftsraadId,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"AND\"\r\n });\r\n }\r\n\r\n const url = getUrl(statisticsType);\r\n post(\r\n url,\r\n {\r\n Accept: \"application/json\",\r\n gm_lang_code: config.gm_lang_code,\r\n gm_session_id: getSessionToken()\r\n },\r\n {\r\n start,\r\n limit,\r\n filter\r\n },\r\n (err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(\r\n statsRead({ message: \"Error returned from service\" }, statisticsType, undefined)\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 statsRead(\r\n response.exception || { message: \"Error returned from service\" },\r\n statisticsType,\r\n undefined\r\n )\r\n );\r\n return;\r\n }\r\n var records = fixKeyValueArraysToJsObject(response.records);\r\n dispatch(statsRead(null, statisticsType, records));\r\n }\r\n );\r\n };\r\n}\r\n\r\nexport function ReadStatisticsWithSearch(\r\n selectedFriluftsraadId,\r\n statisticsType,\r\n year,\r\n search = null\r\n) {\r\n return dispatch => {\r\n dispatch(readingStats(statisticsType));\r\n\r\n const start = 0;\r\n const limit = 0;\r\n\r\n const filter = {\r\n filterColumns: [\r\n {\r\n name: \"date\",\r\n value: new Date(Date.UTC(year, 0, 1)),\r\n comparisonOperator: \">=\",\r\n logicalOperator: \"AND\"\r\n },\r\n {\r\n name: \"date\",\r\n value: new Date(Date.UTC(year + 1, 0, 1)),\r\n comparisonOperator: \"<\",\r\n logicalOperator: \"AND\"\r\n }\r\n ],\r\n sortColumns: [\r\n {\r\n name: \"row\"\r\n }\r\n ]\r\n };\r\n\r\n if (selectedFriluftsraadId) {\r\n filter.filterColumns.push({\r\n name: \"selected_friluftsraad_uuid\",\r\n value: selectedFriluftsraadId,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"AND\"\r\n });\r\n }\r\n\r\n const url = getUrl(statisticsType);\r\n post(\r\n url,\r\n {\r\n Accept: \"application/json\",\r\n gm_lang_code: config.gm_lang_code\r\n },\r\n {\r\n start,\r\n limit,\r\n filter,\r\n search\r\n },\r\n (err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(\r\n statsRead({ message: \"Error returned from service\" }, statisticsType, undefined)\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 statsRead(\r\n response.exception || { message: \"Error returned from service\" },\r\n statisticsType,\r\n undefined\r\n )\r\n );\r\n return;\r\n }\r\n var records = fixKeyValueArraysToJsObject(response.records);\r\n dispatch(statsRead(null, statisticsType, records));\r\n }\r\n );\r\n };\r\n}\r\n\r\n// ------------------------------------\r\n// Reducer\r\n// ------------------------------------\r\nconst initialState = {\r\n company: {\r\n loading: false,\r\n error: undefined,\r\n statisticsType: undefined,\r\n results: undefined\r\n },\r\n friluftsraad: {\r\n loading: false,\r\n error: undefined,\r\n statisticsType: undefined,\r\n results: undefined\r\n }\r\n};\r\n\r\nexport function statisticsReducer(state = initialState, action) {\r\n switch (action.type) {\r\n case READING_STATS:\r\n return Object.assign({}, state, {\r\n friluftsraad: {\r\n loading: true,\r\n error: null,\r\n statisticsType: action.payload.statisticsType,\r\n results: null\r\n }\r\n });\r\n case STATS_READ:\r\n return Object.assign({}, state, {\r\n friluftsraad: {\r\n loading: false,\r\n error: action.payload.error ? new Error(action.payload.error) : null,\r\n statisticsType: action.payload.statisticsType,\r\n results: action.payload.stats\r\n }\r\n });\r\n case READING_COMPANY_STATS:\r\n return Object.assign({}, state, {\r\n company: {\r\n loading: true,\r\n error: null,\r\n statisticsType: action.payload.statisticsType,\r\n results: null\r\n }\r\n });\r\n case COMPANY_STATS_READ:\r\n return Object.assign({}, state, {\r\n company: {\r\n loading: false,\r\n error: action.payload.error ? new Error(action.payload.error) : null,\r\n statisticsType: action.payload.statisticsType,\r\n results: action.payload.stats\r\n }\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 ResultList from \"../../components/Results/ResultList\";\r\nimport Switch from \"../../components/Switch\";\r\nimport YearSelector from \"../../components/YearSelector\";\r\nimport Pagination from \"../../components/Pagination\";\r\nimport { translate } from \"react-translate\";\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport {\r\n ReadAllCompaniesPointStatistics,\r\n ReadStatisticsWithSearch,\r\n readCompanyStatistics\r\n} from \"../../redux/statistics\";\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n ReadAllCompaniesPointStatistics: bindActionCreators(ReadAllCompaniesPointStatistics, dispatch),\r\n ReadStatisticsWithSearch: bindActionCreators(ReadStatisticsWithSearch, dispatch),\r\n readCompanyStatistics: bindActionCreators(readCompanyStatistics, dispatch)\r\n };\r\n};\r\n\r\nclass ResultCard extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n pageLimit: 25,\r\n currentPage: undefined,\r\n currentRecords: undefined,\r\n selectedYear: null,\r\n switchValue: true,\r\n searchValue: \"\",\r\n searchResults: undefined\r\n };\r\n this.onYearSelected = this.onYearSelected.bind(this);\r\n this.handleSearch = this.handleSearch.bind(this);\r\n }\r\n\r\n componentDidUpdate(prevProps, prevState) {\r\n const { selectedYear, searchValue } = this.state;\r\n const { statisticsType, switchValue, isCompany } = this.props;\r\n\r\n if (\r\n prevState.selectedYear !== selectedYear ||\r\n prevProps.statisticsType !== statisticsType ||\r\n prevProps.switchValue !== switchValue\r\n ) {\r\n this.updateStatistics(isCompany, statisticsType, selectedYear, searchValue);\r\n }\r\n }\r\n\r\n componentWillReceiveProps(nextProps) {\r\n if (this.props.switchValue !== nextProps.switchValue) {\r\n this.setState({ searchValue: \"\", searchResults: undefined });\r\n }\r\n }\r\n\r\n onPageChanged = data => {\r\n const { currentPage, totalPages, pageLimit } = data;\r\n const { results } = this.props;\r\n\r\n const offset = (currentPage - 1) * pageLimit;\r\n const currentRecords = results.slice(offset, offset + pageLimit);\r\n\r\n this.setState({ currentPage, currentRecords, totalPages });\r\n };\r\n\r\n onYearSelected(year) {\r\n const selectedYear = parseInt(year);\r\n this.setState({ selectedYear });\r\n }\r\n\r\n get getHeaders() {\r\n const { headersWithSearch } = this.props;\r\n headersWithSearch[0] = (\r\n <input\r\n className=\"result-card--search\"\r\n type=\"text\"\r\n placeholder=\"søk på brukernavn\"\r\n value={this.state.searchValue}\r\n ref=\"searchValue\"\r\n onChange={this.handleSearch}\r\n />\r\n );\r\n return headersWithSearch;\r\n }\r\n\r\n handleSearch() {\r\n const { results } = this.props;\r\n\r\n const searchResults =\r\n results &&\r\n results.filter(r =>\r\n r.nick_name.toLowerCase().includes(this.refs.searchValue.value.toLowerCase())\r\n );\r\n\r\n this.setState({\r\n searchValue: this.refs.searchValue.value,\r\n searchResults: searchResults\r\n });\r\n }\r\n\r\n updateStatistics(isCompany, statisticsType, year, search = null) {\r\n const { isGuest, member, myFriluftsraad, myBedrift } = this.props;\r\n\r\n let selectedFrilufstraadId = isGuest\r\n ? null\r\n : !isGuest && !myFriluftsraad\r\n ? null\r\n : member.selected_friluftsraad_uuid;\r\n\r\n if (!isGuest && isCompany && !myBedrift) {\r\n selectedFrilufstraadId = member.selected_friluftsraad_uuid;\r\n }\r\n\r\n const companyId = isGuest ? null : !isGuest && !myBedrift ? null : member.bedrift_id;\r\n\r\n if (isCompany) {\r\n if (companyId) {\r\n this.props.readCompanyStatistics(\r\n companyId,\r\n member.selected_friluftsraad_uuid,\r\n statisticsType,\r\n year\r\n );\r\n } else {\r\n this.props.ReadAllCompaniesPointStatistics(\r\n member.selected_friluftsraad_uuid,\r\n statisticsType,\r\n year\r\n );\r\n }\r\n } else if (isGuest) {\r\n this.props.ReadStatisticsWithSearch(selectedFrilufstraadId, statisticsType, year, search);\r\n } else {\r\n this.props.ReadStatisticsWithSearch(selectedFrilufstraadId, statisticsType, year, search);\r\n }\r\n }\r\n\r\n render() {\r\n const {\r\n t,\r\n results,\r\n member,\r\n fromYear,\r\n isGuest,\r\n switchLabel,\r\n switchKey,\r\n switchValue,\r\n switchDisable,\r\n handleSwitchToggle,\r\n displayProps,\r\n headers,\r\n headersWithSearch,\r\n loading\r\n } = this.props;\r\n const { pageLimit, currentRecords, searchResults } = this.state;\r\n return (\r\n <React.Fragment>\r\n <div className=\"tell-tur-results--navigation-options\">\r\n {!isGuest && (\r\n <Switch\r\n labelOn={switchLabel.On}\r\n labelOff={switchLabel.Off}\r\n value={!switchValue}\r\n key={switchKey}\r\n onChange={() => handleSwitchToggle(switchKey)}\r\n disable={switchDisable}\r\n />\r\n )}\r\n <YearSelector\r\n fromYear={fromYear}\r\n onYearSelected={this.onYearSelected}\r\n infoText={t(\"ChooseYear\")}\r\n />\r\n </div>\r\n <div className=\"result-page--result-list-container\">\r\n <ResultList\r\n results={\r\n searchResults && searchResults.length > 0\r\n ? searchResults\r\n : results && results.length > pageLimit\r\n ? currentRecords\r\n : results\r\n }\r\n displayProps={displayProps}\r\n headers={headersWithSearch ? this.getHeaders : headers}\r\n loading={loading}\r\n member={member}\r\n currentPage={this.state.currentPage}\r\n pageLimit={pageLimit}\r\n ignorePlace={this.props.ignorePlace}\r\n >\r\n <div className=\"result-page--result-list-container__page-options\">\r\n {results && results.length > pageLimit && (\r\n <Pagination\r\n totalRecords={\r\n searchResults && searchResults.length > 0\r\n ? searchResults.length\r\n : results.length\r\n }\r\n pageNeighbours={1}\r\n pageLimit={pageLimit}\r\n onPageChanged={this.onPageChanged}\r\n />\r\n )}\r\n </div>\r\n </ResultList>\r\n </div>\r\n </React.Fragment>\r\n );\r\n }\r\n}\r\n\r\nResultCard.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n switchLabel: PropTypes.object.isRequired,\r\n switchValue: PropTypes.bool,\r\n switchKey: PropTypes.string,\r\n switchDisable: PropTypes.bool,\r\n statisticsType: PropTypes.string.isRequired,\r\n searchValue: PropTypes.string,\r\n isCompany: PropTypes.bool,\r\n results: PropTypes.array,\r\n isGuest: PropTypes.bool,\r\n loading: PropTypes.bool,\r\n headers: PropTypes.array,\r\n headersWithSearch: PropTypes.array,\r\n displayProps: PropTypes.array,\r\n handleSwitchToggle: PropTypes.func.isRequired,\r\n fromYear: PropTypes.number.isRequired,\r\n member: PropTypes.object,\r\n myBedrift: PropTypes.bool,\r\n myFriluftsraad: PropTypes.bool,\r\n ReadAllCompaniesPointStatistics: PropTypes.func.isRequired,\r\n readCompanyStatistics: PropTypes.func.isRequired,\r\n ReadStatisticsWithSearch: PropTypes.func.isRequired\r\n};\r\n\r\nexport default connect(null, mapDispatchToProps)(translate(\"ResultCard\")(ResultCard));\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport CompetitionResults from \"../../containers/competition/CompetitionResults\";\r\nimport ResultCard from \"../../containers/Results/ResultCard\";\r\nimport { translate } from \"react-translate\";\r\nimport { STATISTICS_TYPE } from \"../../redux/statistics\";\r\nimport { getPageSections } from \"../../utils/Page\";\r\n\r\nimport \"./ResultsPage.scss\";\r\n\r\nclass ResultsPage extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n currentFriluftsraadStatisticsType: STATISTICS_TYPE.POINTS,\r\n currentCompanyStatisticsType: STATISTICS_TYPE.POINTS,\r\n myFriluftsraad: true,\r\n myBedrift: true\r\n };\r\n this.handleSwitchToggle = this.handleSwitchToggle.bind(this);\r\n }\r\n\r\n handleSwitchToggle(key) {\r\n this.setState(prevState => ({ [key]: !prevState[key] }));\r\n }\r\n\r\n render() {\r\n const {\r\n companyStatistics,\r\n friluftsraadStatistics,\r\n t,\r\n selectedMember,\r\n page,\r\n isGuest\r\n } = this.props;\r\n\r\n const {\r\n currentFriluftsraadStatisticsType,\r\n currentCompanyStatisticsType,\r\n myFriluftsraad,\r\n myBedrift\r\n } = this.state;\r\n const sections = getPageSections(page);\r\n\r\n return (\r\n <div className=\"tell-tur-results\">\r\n <div\r\n dangerouslySetInnerHTML={{\r\n __html: sections && sections[\"FriluftsraadSection\"]\r\n }}\r\n />\r\n <div className=\"tell-tur-results--navigation-container\">\r\n <div\r\n onClick={() =>\r\n this.setState({\r\n currentFriluftsraadStatisticsType: STATISTICS_TYPE.POINTS\r\n })\r\n }\r\n className={\r\n \"tell-tur-results--navigation-tab \" +\r\n (currentFriluftsraadStatisticsType === STATISTICS_TYPE.POINTS\r\n ? \"active\"\r\n : \"\")\r\n }\r\n >\r\n {t(\"MostPoints\")}\r\n </div>\r\n <div\r\n onClick={() =>\r\n this.setState({\r\n currentFriluftsraadStatisticsType: STATISTICS_TYPE.UNIQUE\r\n })\r\n }\r\n className={\r\n \"tell-tur-results--navigation-tab \" +\r\n (currentFriluftsraadStatisticsType === STATISTICS_TYPE.UNIQUE\r\n ? \"active\"\r\n : \"\")\r\n }\r\n >\r\n {t(\"UniqueDestinations\")}\r\n </div>\r\n </div>\r\n {friluftsraadStatistics &&\r\n currentFriluftsraadStatisticsType === STATISTICS_TYPE.POINTS && (\r\n <div className=\"result-page--result-list-container\">\r\n <ResultCard\r\n results={friluftsraadStatistics.results}\r\n loading={friluftsraadStatistics.loading}\r\n member={selectedMember}\r\n fromYear={2018}\r\n isGuest={isGuest}\r\n myFriluftsraad={myFriluftsraad}\r\n switchLabel={{ On: t(\"AllFr\"), Off: t(\"MyFr\") }}\r\n switchValue={myFriluftsraad}\r\n switchKey={\"myFriluftsraad\"}\r\n handleSwitchToggle={this.handleSwitchToggle}\r\n statisticsType={currentFriluftsraadStatisticsType}\r\n displayProps={[\"nick_name\", \"aggregate\"]}\r\n headersWithSearch={[t(\"Nickname\"), \"\", t(\"Points\")]}\r\n />\r\n </div>\r\n )}\r\n {friluftsraadStatistics &&\r\n currentFriluftsraadStatisticsType === STATISTICS_TYPE.UNIQUE && (\r\n <div className=\"result-page--result-list-container\">\r\n <ResultCard\r\n results={friluftsraadStatistics.results}\r\n loading={friluftsraadStatistics.loading}\r\n member={selectedMember}\r\n fromYear={2018}\r\n isGuest={isGuest}\r\n myFriluftsraad={myFriluftsraad}\r\n switchLabel={{ On: t(\"AllFr\"), Off: t(\"MyFr\") }}\r\n switchValue={myFriluftsraad}\r\n switchKey={\"myFriluftsraad\"}\r\n handleSwitchToggle={this.handleSwitchToggle}\r\n statisticsType={currentFriluftsraadStatisticsType}\r\n displayProps={[\"nick_name\", \"aggregate\"]}\r\n headersWithSearch={[t(\"Nickname\"), \"\", t(\"Destination\")]}\r\n />\r\n </div>\r\n )}\r\n {selectedMember && selectedMember.bedrift_id && companyStatistics && (\r\n <div>\r\n <div\r\n dangerouslySetInnerHTML={{\r\n __html: sections && sections[\"CompanySection\"]\r\n }}\r\n />\r\n <div className=\"tell-tur-results--navigation-container\">\r\n <div\r\n onClick={() =>\r\n this.setState({\r\n currentCompanyStatisticsType: STATISTICS_TYPE.POINTS\r\n })\r\n }\r\n className={\r\n \"tell-tur-results--navigation-tab \" +\r\n (currentCompanyStatisticsType === STATISTICS_TYPE.POINTS\r\n ? \"active\"\r\n : \"\")\r\n }\r\n >\r\n {t(\"MostPoints\")}\r\n </div>\r\n <div\r\n onClick={() =>\r\n this.setState({\r\n currentCompanyStatisticsType: STATISTICS_TYPE.UNIQUE\r\n })\r\n }\r\n className={[\r\n \"tell-tur-results--navigation-tab \",\r\n currentCompanyStatisticsType === STATISTICS_TYPE.UNIQUE\r\n ? \"active\"\r\n : \"\",\r\n !myBedrift ? \"disabled\" : \"\"\r\n ].join(\" \")}\r\n >\r\n {t(\"UniqueDestinations\")}\r\n </div>\r\n </div>\r\n {currentCompanyStatisticsType === STATISTICS_TYPE.POINTS && (\r\n <div className=\"result-page--result-list-container\">\r\n <ResultCard\r\n results={companyStatistics.results}\r\n loading={companyStatistics.loading}\r\n member={selectedMember}\r\n fromYear={2018}\r\n isGuest={isGuest}\r\n isCompany\r\n ignorePlace\r\n myBedrift={myBedrift}\r\n switchLabel={{ On: t(\"AllCompanies\"), Off: t(\"MyCompany\") }}\r\n switchValue={myBedrift}\r\n switchKey={\"myBedrift\"}\r\n handleSwitchToggle={this.handleSwitchToggle}\r\n statisticsType={currentCompanyStatisticsType}\r\n displayProps={\r\n myBedrift\r\n ? [\"nick_name\", \"aggregate\"]\r\n : [\r\n \"bedrift_navn\",\r\n \"antall_deltagere\",\r\n \"total_poeng\",\r\n \"snitt_poeng\"\r\n ]\r\n }\r\n headers={\r\n myBedrift\r\n ? [\"#\", t(\"Nickname\"), t(\"Points\")]\r\n : [\r\n \"#\",\r\n t(\"CompanyName\"),\r\n t(\"Participants\"),\r\n t(\"TotalPoints\"),\r\n t(\"PointsNorm\")\r\n ]\r\n }\r\n />\r\n </div>\r\n )}\r\n {currentCompanyStatisticsType === STATISTICS_TYPE.UNIQUE && (\r\n <div className=\"result-page--result-list-container\">\r\n <ResultCard\r\n results={companyStatistics.results}\r\n loading={companyStatistics.loading}\r\n member={selectedMember}\r\n fromYear={2018}\r\n isGuest={isGuest}\r\n isCompany\r\n myBedrift={myBedrift}\r\n switchLabel={{ On: t(\"AllCompanies\"), Off: t(\"MyCompany\") }}\r\n switchValue={myBedrift}\r\n switchKey={\"myBedrift\"}\r\n switchDisable={\r\n currentCompanyStatisticsType === STATISTICS_TYPE.UNIQUE\r\n }\r\n handleSwitchToggle={this.handleSwitchToggle}\r\n statisticsType={currentCompanyStatisticsType}\r\n displayProps={\r\n myBedrift\r\n ? [\"nick_name\", \"aggregate\"]\r\n : [\r\n \"bedrift_navn\",\r\n \"antall_deltagere\",\r\n \"snitt_poeng\",\r\n \"total_poeng\"\r\n ]\r\n }\r\n headers={\r\n myBedrift\r\n ? [\"#\", t(\"Nickname\"), t(\"Points\")]\r\n : [\r\n \"#\",\r\n t(\"CompanyName\"),\r\n t(\"Participants\"),\r\n t(\"PointsNorm\"),\r\n t(\"TotalPoints\")\r\n ]\r\n }\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n {selectedMember && <CompetitionResults member={selectedMember} />}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nResultsPage.propTypes = {\r\n friluftsraadStatistics: PropTypes.object.isRequired,\r\n companyStatistics: PropTypes.object.isRequired,\r\n t: PropTypes.func.isRequired,\r\n selectedMember: PropTypes.object,\r\n page: PropTypes.object.isRequired,\r\n isGuest: PropTypes.bool\r\n};\r\n\r\nexport default translate(\"ResultsPage\")(ResultsPage);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { getUserDetails } from \"../../redux/user\";\r\nimport { readMembers } from \"../../redux/familymembers\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport { connect } from \"react-redux\";\r\nimport ResultsPage from \"../../components/Results/ResultsPage\";\r\nimport Title from \"../../components/Title\";\r\nimport { getSessionToken } from \"@avinet/react-adaptive-auth\";\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n getUserDetails: bindActionCreators(getUserDetails, dispatch),\r\n readMembers: bindActionCreators(readMembers, dispatch)\r\n };\r\n};\r\n\r\nconst mapStateToProps = state => ({\r\n trips: state.trips.trips,\r\n tripDeleted: state.trips.tripDeleted,\r\n tripsError: state.trips.error,\r\n user: state.user.user,\r\n userLoading: state.user.loading,\r\n members: state.familyMembers.members,\r\n membersLoading: state.familyMembers.loading,\r\n friluftsraadStatistics: state.statistics.friluftsraad,\r\n companyStatistics: state.statistics.company\r\n});\r\n\r\nclass ResultsContainer extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n selectedMember: undefined,\r\n isGuest: false\r\n };\r\n this.updateProps = this.updateProps.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n if (!getSessionToken()) {\r\n this.setState({ isGuest: true });\r\n }\r\n this.updateProps();\r\n }\r\n\r\n componentDidUpdate() {\r\n this.updateProps();\r\n }\r\n\r\n updateProps() {\r\n const { user, userLoading, getUserDetails, members, membersLoading, readMembers } = this.props;\r\n const { selectedMember } = this.state;\r\n if (!user && !userLoading) {\r\n getUserDetails();\r\n }\r\n if (user && !members && !membersLoading) {\r\n readMembers(user.uuid);\r\n }\r\n if (members && members.length && selectedMember === undefined) {\r\n const mainMember = members.find(m => m.is_main_familymember);\r\n if (mainMember) {\r\n this.setState({\r\n selectedMember: mainMember\r\n });\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n const { page, user, ...rest } = this.props;\r\n const { selectedMember, isGuest } = this.state;\r\n\r\n return (\r\n <div className=\"tell-tur-page\">\r\n <Title title={page.title} />\r\n <h1>{page.title}</h1>\r\n {((user && selectedMember) || isGuest) && (\r\n <ResultsPage {...rest} page={page} selectedMember={selectedMember} isGuest={isGuest} />\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nResultsContainer.propTypes = {\r\n page: PropTypes.object,\r\n getUserDetails: PropTypes.func,\r\n user: PropTypes.object,\r\n userLoading: PropTypes.bool,\r\n members: PropTypes.array,\r\n membersLoading: PropTypes.bool,\r\n readMembers: PropTypes.func,\r\n pointStatistics: PropTypes.object,\r\n uniqueStatistics: PropTypes.object,\r\n readStatistics: PropTypes.func,\r\n readCompanyStatistics: PropTypes.func\r\n};\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ResultsContainer);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport MemberSelect from \"../../components/MyTrips/MemberSelect\";\r\nimport LoadingIndicator from \"../../components/LoadingIndicator\";\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport { translate } from \"react-translate\";\r\nimport { joinCompetition, resetState } from \"../../redux/competition\";\r\n\r\nimport \"./JoinCompetitionForm.scss\";\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n joinCompetition: bindActionCreators(joinCompetition, dispatch),\r\n resetCompetitionState: bindActionCreators(resetState, dispatch),\r\n };\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n joinCompetitionLoading: state.joinCompetitionReducer.loading,\r\n joinCompetitionError: state.joinCompetitionReducer.error,\r\n joinCompetitionSuccess: state.joinCompetitionReducer.success,\r\n joinedCompetitions: state.joinCompetitionReducer.competitions,\r\n user: state.user.user,\r\n});\r\n\r\nclass JoinCompetitionForm extends React.Component {\r\n constructor() {\r\n super();\r\n\r\n this.state = {\r\n selectedMemberId: -1,\r\n error: null,\r\n };\r\n this.changeCurrentMember = this.changeCurrentMember.bind(this);\r\n this.handleCompetitionJoin = this.handleCompetitionJoin.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n if (this.state.selectedMemberId === -1) {\r\n const mainMember = this.props.users.find((m) => m.is_main_familymember);\r\n if (mainMember) {\r\n this.setState({\r\n selectedMemberId: mainMember.id,\r\n });\r\n }\r\n }\r\n this.props.resetCompetitionState();\r\n }\r\n\r\n componentWillUnmount() {\r\n this.props.resetCompetitionState();\r\n }\r\n\r\n changeCurrentMember(id) {\r\n if (!Number.isNaN(id)) {\r\n this.setState({\r\n selectedMemberId: id,\r\n });\r\n }\r\n this.props.resetCompetitionState();\r\n }\r\n\r\n handleCompetitionJoin(...props) {\r\n this.props.joinCompetition(...props);\r\n }\r\n\r\n render() {\r\n const {\r\n competitionId,\r\n joinCompetitionLoading,\r\n joinCompetitionError,\r\n joinCompetitionSuccess,\r\n t,\r\n } = this.props;\r\n const { selectedMemberId, error } = this.state;\r\n return (\r\n <div>\r\n <h2>{t(\"ConfirmJoin\")}</h2>\r\n\r\n <MemberSelect\r\n infoText={t(\"ChooseMember\")}\r\n members={this.props.users}\r\n memberError={error}\r\n changeCurrentMember={this.changeCurrentMember}\r\n selectedMemberId={selectedMemberId}\r\n hideTripCount\r\n />\r\n\r\n {joinCompetitionError && (\r\n <p className=\"text-danger\">{t(`${joinCompetitionError.msg}`)}</p>\r\n )}\r\n {joinCompetitionSuccess && (\r\n <p className=\"text-success\">{t(\"Success\")}</p>\r\n )}\r\n\r\n <div className=\"btn-flex-container\">\r\n {!joinCompetitionSuccess && <button\r\n onClick={this.props.toggleModal}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t(\"ButtonCancel\")}\r\n </button>}\r\n\r\n {!joinCompetitionSuccess && <button\r\n className=\"btn btn-primary\"\r\n onClick={() => {\r\n this.handleCompetitionJoin(competitionId, selectedMemberId);\r\n }}\r\n >\r\n {t(\"ButtonConfirm\")}\r\n </button>}\r\n\r\n {joinCompetitionSuccess && <button\r\n onClick={this.props.toggleModal}\r\n className=\"btn btn-primary\"\r\n >\r\n {t(\"ButtonClose\")}\r\n </button>}\r\n </div>\r\n {joinCompetitionLoading && (\r\n <div className=\"loader\">\r\n <LoadingIndicator />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nJoinCompetitionForm.propTypes = {\r\n users: PropTypes.array.isRequired,\r\n competitionId: PropTypes.number.isRequired,\r\n toggleModal: PropTypes.func.isRequired,\r\n joinCompetition: PropTypes.func.isRequired,\r\n resetCompetitionState: PropTypes.func.isRequired,\r\n t: PropTypes.func.isRequired,\r\n joinCompetitionLoading: PropTypes.bool,\r\n joinCompetitionError: PropTypes.object,\r\n joinCompetitionSuccess: PropTypes.bool,\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(translate(\"JoinCompetitionForm\")(JoinCompetitionForm));\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Icon from \"../../components/Icon\";\r\nimport Modal from \"../../components/Modal\";\r\nimport JoinCompetitionForm from \"./JoinCompetitionForm\";\r\nimport LoadingIndicator from \"../../components/LoadingIndicator\";\r\nimport { translate } from \"react-translate\";\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport { actions as digiThemeActions } from \"../../utils/digiTheme\";\r\nimport scopedBindActionCreators from \"../../utils/scopedReducer\";\r\nimport { fixDate } from \"../../utils/date\";\r\nimport { joinCompetition } from \"../../redux/competition\";\r\nimport { getUserDetails } from \"../../redux/user\";\r\nimport { Link, withRouter } from \"react-router-dom\";\r\nimport config from \"../../config/TellTur\";\r\n\r\nimport \"./CompetitionsList.scss\";\r\n\r\nconst mapStateToProps = state => ({\r\n user: state.user.user,\r\n turmalRecords: state.konkurannseTurmal.records,\r\n turmalLoading: state.konkurannseTurmal.loading\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n joinCompetition: bindActionCreators(joinCompetition, dispatch),\r\n getUserDetails: bindActionCreators(getUserDetails, dispatch),\r\n readKonkurannseTurmal: scopedBindActionCreators(\r\n digiThemeActions.readFiltered,\r\n dispatch,\r\n \"konkurannseTurmal\"\r\n ),\r\n resetDigiTheme: scopedBindActionCreators(\r\n digiThemeActions.resetDigiTheme,\r\n dispatch,\r\n \"konkurannseTurmal\"\r\n )\r\n };\r\n};\r\n\r\nclass CompetitonsList extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n index: null,\r\n showModal: false,\r\n competitionId: undefined\r\n };\r\n this.toggleModal = this.toggleModal.bind(this);\r\n this.readKonkurannser = this.readKonkurannser.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n !this.props.user && this.props.getUserDetails();\r\n }\r\n\r\n readKonkurannser(id) {\r\n this.props.readKonkurannseTurmal(\r\n [\r\n \"id\",\r\n \"points\",\r\n \"fk_telltur_konkurranse\",\r\n \"turmal_id\",\r\n \"turmal_type\",\r\n \"turmal_navn\",\r\n \"turmal_uri\",\r\n \"telltur_turmaal_id\"\r\n ],\r\n {\r\n filterColumns: [\r\n {\r\n name: \"fk_telltur_konkurranse\",\r\n netType: \"id[]\",\r\n value: id,\r\n comparisonOperator: \"@=\"\r\n }\r\n ],\r\n sortColums: [\r\n {\r\n name: \"points\"\r\n }\r\n ]\r\n },\r\n config.mapProjCode\r\n );\r\n }\r\n\r\n toggleModal() {\r\n if (!this.props.user) {\r\n this.props.history.push(\"/logginn\");\r\n }\r\n this.setState(prevState => ({ showModal: !prevState.showModal }));\r\n }\r\n\r\n render() {\r\n const { index, competitionId } = this.state;\r\n const { t, competitions, user, turmalRecords, turmalLoading, resetDigiTheme, loading } =\r\n this.props;\r\n\r\n return competitions.map((competition, idx) => {\r\n const endDate = fixDate(competition.end_date);\r\n var tomorrow = new Date();\r\n tomorrow.setDate(tomorrow.getDate() + 1);\r\n\r\n const hasExpired = endDate < tomorrow;\r\n\r\n return (\r\n <div\r\n key={competition.title + idx}\r\n className={[\"competiton__container\", index === idx ? \"active\" : \"\"].join(\" \")}\r\n >\r\n <button\r\n className=\"container__title--button\"\r\n onClick={() => {\r\n if (idx === index) {\r\n this.setState({ index: undefined, competitionId: undefined });\r\n resetDigiTheme();\r\n } else {\r\n this.setState({ index: idx, competitionId: competition.id });\r\n this.readKonkurannser(competition.id);\r\n }\r\n }}\r\n >\r\n <span className=\"content__label\">{competition.title}</span>\r\n <Icon name={index === idx ? \"chevronUp\" : \"chevronDown\"} />\r\n </button>\r\n <div className=\"container__content\">\r\n {index === idx && !loading && !turmalLoading ? (\r\n <React.Fragment>\r\n <div className=\"container__content--description\">{competition.description}</div>\r\n {competition.image && (\r\n <div className=\"container__content--media\">\r\n <img\r\n alt={competition.title}\r\n src={\r\n config.adaptiveUrl +\r\n \"WebServices/generic/Media.asmx/Download?thumbnail_size=medium&uuid=\" +\r\n competition.image\r\n }\r\n />\r\n </div>\r\n )}\r\n {!hasExpired && (\r\n <button onClick={this.toggleModal} className=\"btn btn-primary\">\r\n {t(\"Participate\")}\r\n </button>\r\n )}\r\n\r\n <div className=\"competitions-list--terms\">\r\n {(competition.municipality ||\r\n competition.year_of_birth_from ||\r\n competition.year_of_birth_to ||\r\n competition.start_date ||\r\n competition.end_date) && (\r\n <span className=\"competitions-list--bold-text\">{t(\"terms\")}</span>\r\n )}\r\n {competition.municipality && (\r\n <div className=\"container__content--municipality\">\r\n <span className=\"content__label\">{t(\"Municipality\")}</span>\r\n {competition.municipality}\r\n </div>\r\n )}\r\n {(competition.year_of_birth_from || competition.year_of_birth_to) && (\r\n <React.Fragment>\r\n <div className=\"container__content--birth\">\r\n <span className=\"content__label\">{t(\"YearOfBirthFrom\")}</span>\r\n {competition.year_of_birth_from}\r\n </div>\r\n <div className=\"container__content--birth\">\r\n <span className=\"content__label\">{t(\"YearOfBirthTo\")}</span>\r\n {competition.year_of_birth_to}\r\n </div>\r\n </React.Fragment>\r\n )}\r\n {(competition.start_date || competition.end_date) && (\r\n <React.Fragment>\r\n <div className=\"container__content--date\">\r\n <span className=\"content__label\">{t(\"StartDate\")}</span>\r\n {competition.start_date\r\n ? `${fixDate(competition.start_date).toLocaleDateString(t(\"locale\"))}`\r\n : null}\r\n </div>\r\n <div className=\"container__content--date\">\r\n <span className=\"content__label\">{t(\"EndDate\")}</span>\r\n {competition.end_date\r\n ? `${fixDate(competition.end_date).toLocaleDateString(t(\"locale\"))}`\r\n : null}\r\n </div>\r\n </React.Fragment>\r\n )}\r\n </div>\r\n\r\n {turmalRecords && turmalRecords.length > 0 && (\r\n <div className=\"competitions-list--destinations\">\r\n <span className=\"competitions-list--bold-text\">{t(\"destinations\")}</span>\r\n {turmalRecords.map((turmal, i) => {\r\n if (!turmal.telltur_turmaal_id || !turmal.turmal_navn) {\r\n return (\r\n <div key={\"slettet_turmal\" + i} className=\"turmal\">\r\n Turmål slettet\r\n </div>\r\n );\r\n }\r\n return (\r\n <div key={turmal.turmal_navn + i} className=\"turmal\">\r\n <Link\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n to={`/turmaal/${turmal.telltur_turmaal_id.replace(\"_\", \"/\")}`}\r\n >{`${turmal.turmal_navn} (${turmal.points} ${t(\"points\")})`}</Link>\r\n <br />\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n {!hasExpired && (\r\n <button onClick={this.toggleModal} className=\"btn btn-primary\">\r\n {t(\"Participate\")}\r\n </button>\r\n )}\r\n </React.Fragment>\r\n ) : (\r\n <div className=\"loader\">\r\n <LoadingIndicator />\r\n </div>\r\n )}\r\n </div>\r\n {this.state.showModal && (\r\n <Modal>\r\n <JoinCompetitionForm\r\n competitionId={competitionId}\r\n users={user && user.familymembers}\r\n toggleModal={this.toggleModal}\r\n />\r\n </Modal>\r\n )}\r\n </div>\r\n );\r\n });\r\n }\r\n}\r\n\r\nCompetitonsList.propTypes = {\r\n competitions: PropTypes.array.isRequired,\r\n loading: PropTypes.bool,\r\n getUserDetails: PropTypes.func.isRequired,\r\n readKonkurannseTurmal: PropTypes.func.isRequired,\r\n resetDigiTheme: PropTypes.func.isRequired,\r\n t: PropTypes.func.isRequired,\r\n user: PropTypes.object,\r\n turmalRecords: PropTypes.array,\r\n turmalLoading: PropTypes.bool\r\n};\r\n\r\nexport default withRouter(\r\n connect(mapStateToProps, mapDispatchToProps)(translate(\"CompetitionsList\")(CompetitonsList))\r\n);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport CompetitionsList from \"./CompetitionsList\";\r\nimport LoadingIndicator from \"../../components/LoadingIndicator\";\r\nimport { actions as digiThemeActions } from \"../../utils/digiTheme\";\r\nimport scopedBindActionCreators from \"../../utils/scopedReducer\";\r\nimport { connect } from \"react-redux\";\r\nimport { withRouter, Link } from \"react-router-dom\";\r\nimport { translate } from \"react-translate\";\r\nimport config from \"../../config/TellTur\";\r\n\r\nimport \"./Competitions.scss\";\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n readCompetions: scopedBindActionCreators(\r\n digiThemeActions.readFiltered,\r\n dispatch,\r\n \"competition\"\r\n ),\r\n resetDigiTheme: scopedBindActionCreators(\r\n digiThemeActions.resetDigiTheme,\r\n dispatch,\r\n \"competition\"\r\n )\r\n };\r\n};\r\n\r\nconst mapStateToProps = state => ({\r\n competitions: state.competition.records,\r\n loading: state.competition.loading\r\n});\r\n\r\nclass Competitons extends React.Component {\r\n static propTypes = {\r\n readCompetions: PropTypes.func.isRequired,\r\n resetDigiTheme: PropTypes.func.isRequired,\r\n friluftsradUuid: PropTypes.string,\r\n competitions: PropTypes.array,\r\n t: PropTypes.func.isRequired,\r\n friluftsrad: PropTypes.string,\r\n loading: PropTypes.bool\r\n };\r\n\r\n componentDidMount() {\r\n this.readFriluftsradCompetitions();\r\n }\r\n\r\n componentWillUnmount() {\r\n this.props.resetDigiTheme();\r\n }\r\n\r\n readFriluftsradCompetitions() {\r\n const { readCompetions, friluftsradUuid } = this.props;\r\n\r\n readCompetions(\r\n [\r\n \"id\",\r\n \"title\",\r\n \"description\",\r\n \"image\",\r\n \"municipality\",\r\n \"year_of_birth_to\",\r\n \"year_of_birth_from\",\r\n \"start_date\",\r\n \"end_date\",\r\n \"show\"\r\n ],\r\n {\r\n filterColumns: [\r\n {\r\n name: \"_acl\",\r\n netType: \"Guid[]\",\r\n value: [friluftsradUuid],\r\n comparisonOperator: \"@>\",\r\n logicalOperator: \"AND\"\r\n },\r\n {\r\n name: \"show\",\r\n netType: \"boolean\",\r\n value: true,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"AND\"\r\n }\r\n ],\r\n sortColums: [\r\n {\r\n name: \"name\"\r\n }\r\n ]\r\n },\r\n config.mapProjCode\r\n );\r\n }\r\n\r\n render() {\r\n const {\r\n friluftsrad,\r\n friluftsradUuid,\r\n loading,\r\n competitions,\r\n t\r\n } = this.props;\r\n return (\r\n <div className={\"tell-tur-competitions__wrapper\"}>\r\n <React.Fragment>\r\n <div className=\"wrapper__description\">\r\n <h3>{t(\"CompetitionsTheme\")}</h3>\r\n <p>{t(\"Description\").replace(\"{0}\", friluftsrad)}</p>\r\n <Link className=\"btn-link\" to=\"/resultater\">\r\n {t(\"LinkToResults\")}\r\n </Link>\r\n <Link className=\"btn-link\" to=\"/minprofil\">\r\n {t(\"LinkToYourProfile\")}\r\n </Link>\r\n </div>\r\n <CompetitionsList\r\n competitions={competitions}\r\n friluftsradUuid={friluftsradUuid}\r\n loading={loading}\r\n />\r\n </React.Fragment>\r\n {loading && (\r\n <div className=\"wrapper__loader\">\r\n <LoadingIndicator />\r\n </div>\r\n )}\r\n {!loading && competitions.length === 0 && (\r\n <div className=\"wrapper__no-competitions\">{t(\"NoCompetitions\")}</div>\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default withRouter(\r\n connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n )(translate(\"Competitions\")(Competitons))\r\n);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Title from \"../components/Title\";\r\nimport Competitions from \"../containers/competition/Competitions\";\r\nimport \"./FriluftsradPage.scss\";\r\n\r\nclass FriluftsradPage extends React.Component {\r\n render() {\r\n const {\r\n page: { content, title, data },\r\n location\r\n } = this.props;\r\n\r\n const isFriluftsradPage = location.pathname.indexOf(\"friluftsrad\") !== -1;\r\n // const isFriluftsradPage = location.pathname.split('/').length === 3;\r\n\r\n return (\r\n <div className=\"friluftsrad-page--wrapper\">\r\n <span className=\"friluftsrad-page--main\">\r\n <Title title={title} />\r\n <div className=\"tell-tur-cms\">\r\n <div\r\n className=\"telltur--friluftsrad-page\"\r\n dangerouslySetInnerHTML={{\r\n __html: content\r\n }}\r\n />\r\n </div>\r\n <div className=\"tell-tur--div-components\" />\r\n </span>\r\n {isFriluftsradPage && data && (\r\n <aside className=\"friluftsrad-page--aside\">\r\n <Competitions\r\n friluftsradUuid={data.friluftsrad_uuid}\r\n friluftsrad={title}\r\n />\r\n </aside>\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nFriluftsradPage.propTypes = {\r\n page: PropTypes.object,\r\n location: PropTypes.object\r\n};\r\n\r\nexport default FriluftsradPage;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport { connect } from \"react-redux\";\r\nimport { pageActions } from \"@avinet/react-adaptive-cms\";\r\nimport UserRegistrationPage from \"../components/UserRegistrationPage\";\r\nimport LoginPage from \"../components/LoginPage\";\r\nimport MyProfile from \"../containers/MyProfile\";\r\nimport ResetPasswordPage from \"../components/ResetPasswordPage\";\r\nimport ChangePasswordPage from \"../components/ChangePasswordPage\";\r\nimport AddMemberContainer from \"../components/AddMemberContainer\";\r\nimport MyTripsContainer from \"../containers/MyTripsContainer\";\r\nimport ResultsContainer from \"../containers/Results/ResultsContainer\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport { getPath, fixLinks } from \"../utils/Path\";\r\nimport LoadingIndicator from \"../components/LoadingIndicator\";\r\nimport FriluftsradPage from \"../components/FriluftsradPage\";\r\nimport ProfileValidator from \"../components/ProfileValidator\";\r\nimport config from \"../config/TellTur\";\r\n\r\nconst mapStateToProps = state => ({\r\n page: state.page.page,\r\n pageLoading: state.page.pageLoading,\r\n municipalities: state.municipalities.records,\r\n municipalitiesLoading: state.municipalities.loading,\r\n user: state.user.user,\r\n userLoading: state.user.loading\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => bindActionCreators(Object.assign({}, pageActions), dispatch);\r\n\r\nclass HybridPageView extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n currentPath: \"\"\r\n };\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 baseUrl = config.adaptiveUrl;\r\n const { currentPath } = this.state;\r\n const { page, pageLoading, municipalities, municipalitiesLoading, user, userLoading } =\r\n this.props;\r\n\r\n return (\r\n <div className=\"tell-tur\">\r\n {(pageLoading || municipalitiesLoading || userLoading) && (\r\n <div className=\"loader\">\r\n <LoadingIndicator />\r\n </div>\r\n )}\r\n <React.Fragment>\r\n {user &&\r\n (!!currentPath.match(/^(resultater|mineturer)$/) ||\r\n currentPath.indexOf(\"friluftsrad/\") !== -1) && <ProfileValidator user={user} />}\r\n {currentPath === \"brukerregistrering\" && (\r\n <UserRegistrationPage\r\n baseUrl={baseUrl}\r\n page={page}\r\n municipalities={municipalities}\r\n loading={municipalitiesLoading}\r\n />\r\n )}\r\n {currentPath === \"logginn\" && <LoginPage baseUrl={baseUrl} page={page} />}\r\n {currentPath === \"minprofil\" && (\r\n <MyProfile\r\n baseUrl={baseUrl}\r\n page={page}\r\n municipalities={municipalities}\r\n loading={municipalitiesLoading}\r\n />\r\n )}\r\n {currentPath === \"glemtpassord\" && <ResetPasswordPage baseUrl={baseUrl} page={page} />}\r\n {currentPath === \"endrepassord\" && <ChangePasswordPage baseUrl={baseUrl} page={page} />}\r\n {currentPath === \"nyttmedlem\" && <AddMemberContainer baseUrl={baseUrl} page={page} />}\r\n {currentPath === \"mineturer\" && <MyTripsContainer baseUrl={baseUrl} page={page} />}\r\n {currentPath === \"resultater\" && <ResultsContainer baseUrl={baseUrl} page={page} />}\r\n {currentPath.indexOf(\"friluftsrad/\") !== -1 && (\r\n // eslint-disable-next-line no-restricted-globals\r\n <FriluftsradPage page={page} location={location} />\r\n )}\r\n </React.Fragment>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nHybridPageView.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 municipalities: PropTypes.array.isRequired,\r\n municipalitiesLoading: PropTypes.bool,\r\n user: PropTypes.object,\r\n userLoading: PropTypes.bool\r\n};\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(withRouter(HybridPageView));\r\n","import { Component } from \"react\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport PropTypes from \"prop-types\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport { connect } from \"react-redux\";\r\nimport { clearUser } from \"../redux/user\";\r\nimport { clearMembers } from \"../redux/familymembers\";\r\nimport { logout, authReducerActions } from \"@avinet/react-adaptive-auth\";\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n clearUser: bindActionCreators(clearUser, dispatch),\r\n clearMembers: bindActionCreators(clearMembers, dispatch),\r\n loggedOut: () => {\r\n dispatch(authReducerActions.loggedOut());\r\n }\r\n };\r\n};\r\n\r\nclass LogoutView extends Component {\r\n componentDidMount() {\r\n const { clearMembers, clearUser, loggedOut, history } = this.props;\r\n\r\n logout();\r\n clearUser();\r\n clearMembers();\r\n loggedOut();\r\n history.push(\"/\");\r\n }\r\n\r\n render() {\r\n return null;\r\n }\r\n}\r\n\r\nLogoutView.propTypes = {\r\n history: PropTypes.object.isRequired,\r\n loggedOut: PropTypes.func.isRequired,\r\n clearMembers: PropTypes.func.isRequired,\r\n clearUser: PropTypes.func.isRequired\r\n};\r\n\r\nexport default withRouter(connect(null, mapDispatchToProps)(LogoutView));\r\n","import React from \"react\";\r\nimport { Button } from \"react-bootstrap\";\r\nimport PropTypes from \"prop-types\";\r\nimport \"./TellturArticleListComponent.scss\";\r\n\r\nexport default class TellturArticleListComponent extends React.Component {\r\n static propTypes = {\r\n t: PropTypes.func.isRequired,\r\n onArticleOpen: PropTypes.func.isRequired,\r\n thumbnailClassName: PropTypes.string.isRequired,\r\n color: PropTypes.string.isRequired,\r\n thumbnail: PropTypes.string,\r\n article: PropTypes.object.isRequired,\r\n validTitle: PropTypes.func.isRequired,\r\n cleanText: PropTypes.func.isRequired,\r\n loadImage: PropTypes.bool\r\n };\r\n\r\n render() {\r\n const {\r\n t,\r\n onArticleOpen,\r\n thumbnailClassName,\r\n color,\r\n thumbnail,\r\n article,\r\n loadImage,\r\n validTitle,\r\n cleanText\r\n } = this.props;\r\n return (\r\n <div\r\n className={\r\n thumbnailClassName +\r\n (thumbnail ? \" articleList--withThumbnail\" : \"\") +\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 style={{ borderTop: \"6px solid \" + color }}\r\n >\r\n {loadImage ? (\r\n <img\r\n data-original={thumbnail}\r\n src={thumbnail}\r\n className=\"loaded\"\r\n alt=\"\"\r\n />\r\n ) : (\r\n <img data-original={thumbnail} alt=\"\" />\r\n )}\r\n <div className=\"caption\">\r\n {validTitle(article.properties.title) && (\r\n <h4>{article.properties.title}</h4>\r\n )}\r\n <div\r\n className=\"articleList--content\"\r\n dangerouslySetInnerHTML={{\r\n __html: cleanText(article.properties.content)\r\n }}\r\n />\r\n <div\r\n className={[\r\n \"telltur-article-list-component--gradering\",\r\n article.properties.gradering &&\r\n article.properties.gradering.toLowerCase()\r\n ].join(\" \")}\r\n >\r\n {article.properties.gradering && article.properties.gradering}\r\n </div>\r\n <Button\r\n bsStyle=\"link\"\r\n className=\"read-more-btn\"\r\n onClick={() => onArticleOpen(article)}\r\n >\r\n {t(\"ReadMore\")}\r\n </Button>\r\n </div>\r\n </div>\r\n );\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 React from \"react\";\r\n\r\nexport default class ErrorBoundary extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = { hasError: false };\r\n }\r\n\r\n static getDerivedStateFromError(error) {\r\n if (this.props.onError) this.props.onError(error);\r\n return { hasError: true };\r\n }\r\n\r\n componentDidCatch(error, errorInfo) {\r\n console.error(error, errorInfo);\r\n }\r\n\r\n render() {\r\n if (this.state.hasError) {\r\n return this.props.errorContent;\r\n }\r\n\r\n return this.props.children;\r\n }\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { WmsLayer } from \"@avinet/react-openlayers\";\r\nimport config from \"../../config/TellTur\";\r\nimport ErrorBoundary from \"../ErrorBoundary\";\r\n\r\nconst StiLayer = ({ articleId }) => {\r\n // Remount on error due to some unmount bug in WmsLayer\r\n const [version, setVersion] = useState(0);\r\n return (\r\n <ErrorBoundary key={version} onError={() => setVersion(v => v + 1)}>\r\n {articleId && (\r\n <WmsLayer\r\n key=\"wms-sti-layer\"\r\n id=\"wms-layer-sti\"\r\n uri=\"https://friluftsforvaltningogc.avinet.no/wms.ashx?\"\r\n layerName={config.sti.grayStiLayer}\r\n singleTile\r\n zIndex={-2}\r\n minZoom={7}\r\n />\r\n )}\r\n <WmsLayer\r\n key=\"wms-active-sti-layer\"\r\n name=\"active-sti\"\r\n id={\"wms-layer-sti-active-\" + articleId}\r\n uri=\"https://friluftsforvaltningogc.avinet.no/mapserv.ashx?\"\r\n layerName={config.sti.activeStiLayer}\r\n version=\"1.3.0\"\r\n zIndex={-1}\r\n minZoom={7}\r\n wmsLayerParams={{\r\n DIM_FK_TURMAL: articleId,\r\n GUI: config.sti.guiId\r\n }}\r\n />\r\n </ErrorBoundary>\r\n );\r\n};\r\n\r\nexport default StiLayer;\r\n","import React from \"react\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport { Articles, ensureArticleModuleConfig } from \"@avinet/react-article-module\";\r\nimport { translate } from \"react-translate\";\r\nimport PropTypes from \"prop-types\";\r\nimport PopupBox from \"../components/PopupBox\";\r\nimport Title from \"../components/Title\";\r\nimport Icon from \"../components/Icon\";\r\nimport TellturArticleListComponent from \"../components/TellturArticleListComponent\";\r\nimport LazyLoad from \"../lib/lazyload\";\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport { updateMapHistory } from \"../redux/mapHistory\";\r\nimport { provideMapState, olUtils, MapPadding } from \"@avinet/react-openlayers\";\r\nimport StiLayer from \"../components/Map/StiLayer\";\r\nimport \"./ArticleView.scss\";\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n updateMapHistory: bindActionCreators(updateMapHistory, dispatch)\r\n };\r\n};\r\n\r\nconst mapStateToProps = state => ({\r\n lastMapCenter: state.mapHistory.lastMapCenter,\r\n lastZoomLevel: state.mapHistory.lastZoomLevel\r\n});\r\n\r\nclass ArticleView extends React.Component {\r\n constructor() {\r\n super();\r\n this.onSourceSelect = this.onSourceSelect.bind(this);\r\n this.onArticleOpen = this.onArticleOpen.bind(this);\r\n this.onTipBoxVisibilityChange = this.onTipBoxVisibilityChange.bind(this);\r\n\r\n this.state = {\r\n showTipBox: true,\r\n tmpHideTipBox: false\r\n };\r\n }\r\n\r\n componentWillMount() {\r\n const tipBoxDeactivated = localStorage.getItem(\"telltur_tipboxdeactivated\");\r\n const tipboxTimestamp = localStorage.getItem(\"telltur_tipboxtimestamp\");\r\n\r\n if (tipBoxDeactivated) {\r\n this.setState({\r\n showTipBox: false\r\n });\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({\r\n tmpHideTipBox: true\r\n });\r\n }\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n const { lastMapCenter, lastZoomLevel } = this.props;\r\n this.lazyLoad = new LazyLoad({\r\n threshold: 500,\r\n container:\r\n window.innerWidth < 769 ? window : document.getElementById(\"article-view--scrollPane\"),\r\n elements_selector: \".article-entry img\"\r\n });\r\n if (lastMapCenter && lastZoomLevel) {\r\n const mapCenter = olUtils.createPoint(lastMapCenter);\r\n this.props.fitViewAndZoom(mapCenter, lastZoomLevel);\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n this.lazyLoad.destroy();\r\n const { mapCenter, mapZoom } = this.props;\r\n this.props.updateMapHistory(mapZoom, mapCenter);\r\n }\r\n\r\n onSourceSelect(sources) {\r\n const { history } = this.props;\r\n const baseUrl = \"/alleturmaal\";\r\n history.push(baseUrl + \"/\" + sources.join(\"+\"));\r\n }\r\n\r\n onArticleOpen(article) {\r\n const {\r\n history,\r\n match: {\r\n params: { activeSources }\r\n }\r\n } = this.props;\r\n const baseUrl = \"/turmaal\";\r\n history.push(baseUrl + \"/\" + article.id.replace(\"_\", \"/\"), {\r\n activeSources\r\n });\r\n window.scroll(0, 0);\r\n }\r\n\r\n onTipBoxVisibilityChange(neverShowAgain) {\r\n if (neverShowAgain) {\r\n localStorage.setItem(\"telltur_tipboxdeactivated\", true);\r\n } else {\r\n localStorage.removeItem(\"telltur_tipboxdeactivated\");\r\n localStorage.setItem(\"telltur_tipboxtimestamp\", Date.now());\r\n }\r\n this.setState({ showTipBox: !this.state.showTipBox });\r\n }\r\n\r\n get activeSources() {\r\n let {\r\n sources,\r\n match: {\r\n params: { activeSources }\r\n }\r\n } = this.props;\r\n\r\n activeSources = activeSources ? activeSources.split(\"+\") : [];\r\n\r\n if (!activeSources.length) {\r\n activeSources = sources\r\n .filter(s => {\r\n return s.pressed && s.dataIndex;\r\n })\r\n .map(item => item.dataIndex);\r\n }\r\n\r\n return activeSources;\r\n }\r\n\r\n render() {\r\n const { t } = this.props;\r\n const { showTipBox, tmpHideTipBox } = this.state;\r\n const checkBoxChecked = localStorage.getItem(\"telltur_tipboxdeactivated\");\r\n const activeSources = this.activeSources;\r\n\r\n return (\r\n <div className=\"article-view--container\" id=\"scrollPane\">\r\n <MapPadding padding={[0, 0, 0, 0]} />\r\n <Title title={t(\"Title\")} />\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\").replace(\r\n \"{0}\",\r\n activeSources.length === 1\r\n ? t(\"sourceselectorText1\")\r\n : t(\"sourceselectorText2\").replace(\"{0}\", activeSources.length)\r\n )\r\n }}\r\n />\r\n </PopupBox>\r\n )}\r\n <div className=\"buttons\">\r\n <button\r\n className=\"article-view--tip-btn\"\r\n onClick={() => this.setState({ showTipBox: true, tmpHideTipBox: false })}\r\n >\r\n <Icon name=\"info\" />\r\n </button>\r\n </div>\r\n <div className=\"article-view--content\" id=\"article-view--scrollPane\">\r\n <Articles\r\n activeSources={activeSources}\r\n onContentChange={() => this.lazyLoad.update()}\r\n onSourceSelect={this.onSourceSelect}\r\n onArticleOpen={this.onArticleOpen}\r\n sourceSelectorPlaceholder={count =>\r\n count === 1\r\n ? t(\"sourceselectorText1\")\r\n : t(\"sourceselectorText2\").replace(\"{0}\", count)\r\n }\r\n articleComponent={TellturArticleListComponent}\r\n useHoverStyle\r\n useActiveStyle\r\n articleLimit={20}\r\n />\r\n </div>\r\n <StiLayer />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nArticleView.propTypes = {\r\n history: PropTypes.object.isRequired,\r\n match: PropTypes.object.isRequired,\r\n t: PropTypes.func.isRequired,\r\n sources: PropTypes.array.isRequired,\r\n mapCenter: PropTypes.array.isRequired,\r\n mapZoom: PropTypes.number.isRequired,\r\n fitViewAndZoom: PropTypes.func.isRequired,\r\n lastMapCenter: PropTypes.array,\r\n lastZoomLevel: PropTypes.number,\r\n updateMapHistory: PropTypes.func.isRequired\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(withRouter(translate(\"ArticleView\")(provideMapState(ensureArticleModuleConfig(ArticleView)))));\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport sanitizeHtml from \"sanitize-html\";\r\nimport Icon from \"./Icon\";\r\nimport PopupBox from \"./PopupBox\";\r\nimport { translate } from \"react-translate\";\r\nimport { CopyToClipboard } from \"react-copy-to-clipboard\";\r\nimport { provideMapState } from \"@avinet/react-openlayers\";\r\nimport enkel from \"../static/gradering_enkel.jpg\";\r\nimport middels from \"../static/gradering_middels.jpg\";\r\nimport krevende from \"../static/gradering_krevende.jpg\";\r\nimport ekspert from \"../static/gradering_ekspert.jpg\";\r\nimport \"./TellturArticle.scss\";\r\n\r\nfunction openUrl(prefix) {\r\n let url = window.location.href;\r\n if (url.indexOf(\"?\") !== -1) {\r\n url = url.split(\"?\")[0];\r\n }\r\n url = url.replace(\"#\", \"?path=\");\r\n window.open(prefix + url);\r\n}\r\n\r\nfunction getGraderingImage(gradering) {\r\n switch (gradering.toLowerCase()) {\r\n case \"enkel\":\r\n return enkel;\r\n case \"middels\":\r\n return middels;\r\n case \"krevende\":\r\n return krevende;\r\n case \"ekspert\":\r\n return ekspert;\r\n default:\r\n break;\r\n }\r\n}\r\n\r\nclass TellturArticle extends React.Component {\r\n constructor() {\r\n super();\r\n this.state = {\r\n linkShareOpen: false,\r\n linkCopied: false\r\n };\r\n\r\n this.onShareLinkClick = this.onShareLinkClick.bind(this);\r\n this.onShareLinkPopupClose = this.onShareLinkPopupClose.bind(this);\r\n this.onClipBoardBtnClick = this.onClipBoardBtnClick.bind(this);\r\n }\r\n\r\n onShareLinkClick() {\r\n this.setState({\r\n linkShareOpen: true,\r\n linkCopied: false\r\n });\r\n }\r\n\r\n onShareLinkPopupClose() {\r\n this.setState({\r\n linkShareOpen: false,\r\n linkCopied: false\r\n });\r\n }\r\n\r\n onClipBoardBtnClick() {\r\n this.setState({\r\n linkCopied: true\r\n });\r\n }\r\n\r\n displayInactiveWarning() {\r\n const { startdato, sluttdato } = this.props;\r\n\r\n const startDateParts = startdato && startdato.split(\".\");\r\n const endDateParts = sluttdato && sluttdato.split(\".\");\r\n\r\n const startDate =\r\n startdato &&\r\n new Date(+startDateParts[2], startDateParts[1] - 1, +startDateParts[0]).setHours(0, 0, 0, 0);\r\n\r\n const endDate =\r\n sluttdato &&\r\n new Date(+endDateParts[2], endDateParts[1] - 1, +endDateParts[0]).setHours(0, 0, 0, 0);\r\n\r\n const currentDate = new Date().setHours(0, 0, 0, 0);\r\n\r\n if (startDate > currentDate || endDate < currentDate) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n displayMovedWarning() {\r\n const {friluftsrad} = this.props;\r\n \r\n if(friluftsrad === \"Midt-Agder Friluftsråd\" || friluftsrad === \"Ryfylke Friluftsråd\" || friluftsrad === \"Friluftsrådet Vest\" || friluftsrad === \"Jæren Friluftsråd\") {\r\n return true;\r\n }\r\n return false;\r\n } \r\n\r\n render() {\r\n const {\r\n title,\r\n content,\r\n image,\r\n provider,\r\n hoydemeter,\r\n lengde,\r\n startdato,\r\n sluttdato,\r\n poeng,\r\n friluftsrad,\r\n gradering,\r\n kommune,\r\n t\r\n } = this.props;\r\n\r\n return (\r\n <div className=\"telltur--article\">\r\n {gradering && (\r\n <img\r\n className=\"telltur--article-gradering-img\"\r\n src={getGraderingImage(gradering)}\r\n alt=\"\"\r\n />\r\n )}\r\n <div className=\"telltur--article--header-container\">\r\n {title && title !== null && <h1>{title}</h1>}\r\n {friluftsrad && friluftsrad !== null && (\r\n <p className=\"telltur--article-friluftsrad\">\r\n {friluftsrad}\r\n {kommune && kommune !== null && \", \" + kommune}\r\n </p>\r\n )}\r\n </div>\r\n <p className=\"telltur--image\">{image && <img src={image} alt=\"\" />}</p>\r\n <p className=\"articleProvider\">{provider}</p>\r\n <div className=\"telltur-article-flex-box\">\r\n <div className=\"telltur-article-meta-cols\">\r\n <span className=\"telltur-article--meta-cols-label\">{t(\"length\")}</span>\r\n <span className=\"telltur-article--meta-cols-value\">\r\n {lengde === null || lengde === undefined ? \"-\" : lengde} km\r\n </span>\r\n </div>\r\n <div className=\"telltur-article-meta-cols\">\r\n <span className=\"telltur-article--meta-cols-label\">{t(\"elevation\")}</span>\r\n <span className=\"telltur-article--meta-cols-value\">\r\n {hoydemeter === null || hoydemeter === undefined ? \"-\" : hoydemeter}\r\n </span>\r\n </div>\r\n <div className=\"telltur-article-meta-cols\">\r\n <span className=\"telltur-article--meta-cols-label\">{t(\"points\")}</span>\r\n <span className=\"telltur-article--meta-cols-value\">{poeng}</span>\r\n </div>\r\n </div>\r\n {this.displayInactiveWarning() && (\r\n <div className=\"telltur-article--notification\">\r\n <p>{t(\"InactiveTrip\")}</p>\r\n </div>\r\n )}\r\n {this.displayMovedWarning() && (\r\n <div className=\"telltur-article--moved\">\r\n <p>{t(\"MovedTrip\")}</p>\r\n </div>\r\n )}\r\n <div className=\"content\" dangerouslySetInnerHTML={{ __html: sanitizeHtml(content) }} />\r\n <div className=\"telltur-article--share\">\r\n <button\r\n className=\"btn btn-link share-facebook\"\r\n onClick={() => openUrl(\"https://www.facebook.com/sharer.php?u=\")}\r\n >\r\n <Icon name=\"facebook\" />\r\n <span> Del på facebook</span>\r\n </button>\r\n <button className=\"btn btn-link share-link\" onClick={this.onShareLinkClick}>\r\n <Icon name=\"share\" />\r\n <span> Del med link</span>\r\n </button>\r\n <button className=\"btn btn-link print\" onClick={() => window.print()}>\r\n <Icon name=\"print\" />\r\n <span> Skriv ut </span>\r\n </button>\r\n </div>\r\n {(startdato || sluttdato) && (\r\n <div className=\"telltur-article-flex-box time-info\">\r\n <div>\r\n {startdato && (\r\n <React.Fragment>\r\n <span className=\"telltur-article--meta-cols-label\">{t(\"startDate\")}</span>\r\n <span className=\"telltur-article--meta-cols-value\">{startdato}</span>\r\n </React.Fragment>\r\n )}\r\n </div>\r\n <div className=\"float-right\">\r\n {sluttdato && (\r\n <React.Fragment>\r\n <span className=\"telltur-article--meta-cols-label\">{t(\"endDate\")}</span>\r\n <span className=\"telltur-article--meta-cols-value\">{sluttdato}</span>\r\n </React.Fragment>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n {this.state.linkShareOpen && (\r\n <PopupBox onClose={this.onShareLinkPopupClose} closeBtnText={t(\"copyLinkCloseBtn\")}>\r\n <React.Fragment>\r\n <p>{t(\"copyLink\")}</p>\r\n <div className=\"telltur-article--share-container\">\r\n <input\r\n className=\"telltur-article--sharelink\"\r\n type=\"text\"\r\n readOnly\r\n id=\"telltur--sharelink\"\r\n value={window.location.href}\r\n onClick={e => e.target.select()}\r\n />\r\n <CopyToClipboard text={window.location.href}>\r\n <button\r\n className={[\r\n \"btn\",\r\n \"telltur-article--clipboard-btn\",\r\n this.state.linkCopied ? \" link-copied\" : \"\"\r\n ].join(\" \")}\r\n onClick={this.onClipBoardBtnClick}\r\n >\r\n {this.state.linkCopied ? t(\"linkCopied\") : t(\"copyLinkBtn\")}\r\n </button>\r\n </CopyToClipboard>\r\n </div>\r\n </React.Fragment>\r\n </PopupBox>\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nTellturArticle.propTypes = {\r\n title: PropTypes.string,\r\n content: PropTypes.string,\r\n image: PropTypes.string,\r\n provider: PropTypes.string,\r\n lengde: PropTypes.string,\r\n startdato: PropTypes.string,\r\n sluttdato: PropTypes.string,\r\n poeng: PropTypes.string,\r\n friluftsrad: PropTypes.string,\r\n gradering: PropTypes.string,\r\n kommune: PropTypes.string,\r\n hoydemeter: PropTypes.string,\r\n t: PropTypes.func.isRequired\r\n};\r\n\r\nexport default provideMapState(translate(\"TellturArticle\")(TellturArticle));\r\n","import request from \"superagent\";\r\nimport { getSessionToken } from \"@avinet/react-adaptive-auth\";\r\nimport config from \"../config/TellTur\";\r\n\r\n// ------------------------------------\r\n// Constants\r\n// ------------------------------------\r\nexport const TOP_FIVE_LOADING = \"TOP_FIVE_LOADING\";\r\nexport const TOP_FIVE_LOADED = \"TOP_FIVE_LOADED\";\r\nexport const LAST_FIVE_LOADING = \"LAST_FIVE_LOADING\";\r\nexport const LAST_FIVE_LOADED = \"LAST_FIVE_LOADED\";\r\n\r\n// ------------------------------------\r\n// Actions\r\n// ------------------------------------\r\nconst loadTopFive = destinationId => {\r\n return dispatch => {\r\n dispatch({ type: \"TOP_FIVE_LOADING\", payload: true });\r\n\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/telltur/Trips.asmx/ReadTopVisitorsDestination\")\r\n // .post('http://localhost/a_a3/WebServices/telltur/Trips.asmx/ReadTopVisitorsDestination')\r\n .send({\r\n start: 0,\r\n limit: 5,\r\n filter: {\r\n filterColumns: [\r\n {\r\n name: \"turmaal_id\",\r\n value: destinationId,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"AND\"\r\n },\r\n {\r\n name: \"date\",\r\n value: new Date(Date.UTC(new Date().getFullYear(), 0, 1)),\r\n comparisonOperator: \">=\",\r\n logicalOperator: \"AND\"\r\n }\r\n ]\r\n }\r\n })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"Content-Type\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\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 type: \"TOP_FIVE_LOADED\",\r\n payload: {\r\n topFive: [],\r\n topFiveLoading: false\r\n }\r\n });\r\n return;\r\n }\r\n response = response.body.d;\r\n\r\n dispatch({\r\n type: \"TOP_FIVE_LOADED\",\r\n payload: {\r\n topFive: response.records,\r\n topFiveLoading: false\r\n }\r\n });\r\n });\r\n };\r\n};\r\n\r\nconst loadLastFive = destinationId => {\r\n return dispatch => {\r\n dispatch({ type: \"LAST_FIVE_LOADING\", payload: true });\r\n\r\n request\r\n .post(config.adaptiveUrl + \"WebServices/telltur/Trips.asmx/ReadLastVisitorsDestination\")\r\n // .post('http://localhost/a_a3/WebServices/telltur/Trips.asmx/ReadLastVisitorsDestination')\r\n .send({\r\n start: 0,\r\n limit: 5,\r\n filter: {\r\n filterColumns: [\r\n {\r\n name: \"turmaal_id\",\r\n value: destinationId,\r\n comparisonOperator: \"=\",\r\n logicalOperator: \"AND\"\r\n },\r\n {\r\n name: \"date\",\r\n value: new Date(Date.UTC(new Date().getFullYear(), 0, 1)),\r\n comparisonOperator: \">=\",\r\n logicalOperator: \"AND\"\r\n }\r\n ],\r\n sortColumns: [\r\n {\r\n name: \"date\",\r\n sortDesc: true\r\n }\r\n ]\r\n }\r\n })\r\n .set(\"Accept\", \"application/json\")\r\n .set(\"Content-Type\", \"application/json\")\r\n .set(\"gm_session_id\", getSessionToken())\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 type: \"LAST_FIVE_LOADED\",\r\n payload: {\r\n lastFive: [],\r\n lastFiveLoading: false\r\n }\r\n });\r\n return;\r\n }\r\n response = response.body.d;\r\n\r\n dispatch({\r\n type: \"LAST_FIVE_LOADED\",\r\n payload: {\r\n lastFive: response.records,\r\n lastFiveLoading: false\r\n }\r\n });\r\n });\r\n };\r\n};\r\n\r\nexport const actions = {\r\n loadLastFive,\r\n loadTopFive\r\n};\r\n\r\n// ------------------------------------\r\n// Action Handler\r\n// ------------------------------------\r\nconst ACTION_HANDLERS = {\r\n [TOP_FIVE_LOADING]: (state, action) => ({\r\n ...state,\r\n topFive: { loading: action.payload }\r\n }),\r\n [TOP_FIVE_LOADED]: (state, action) => ({\r\n ...state,\r\n topFive: {\r\n loading: action.payload.topFiveLoading,\r\n stats: action.payload.topFive\r\n }\r\n }),\r\n [LAST_FIVE_LOADING]: (state, action) => ({\r\n ...state,\r\n lastFive: {\r\n loading: action.payload\r\n }\r\n }),\r\n [LAST_FIVE_LOADED]: (state, action) => ({\r\n ...state,\r\n lastFive: {\r\n loading: action.payload.lastFiveLoading,\r\n stats: action.payload.lastFive\r\n }\r\n })\r\n};\r\n\r\n// ------------------------------------\r\n// Reducer\r\n// ------------------------------------\r\nconst initialState = {\r\n topFive: {\r\n loading: false,\r\n stats: []\r\n },\r\n lastFive: {\r\n loading: false,\r\n stats: []\r\n }\r\n};\r\n\r\nexport default function (state = initialState, action) {\r\n const handler = ACTION_HANDLERS[action.type];\r\n return handler ? handler(state, action) : state;\r\n}\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 { translate } from \"react-translate\";\r\nimport { actions as destinationActions } from \"../redux/destination\";\r\nimport { fixDate } from \"../utils/date\";\r\nimport LoadingIndicator from \"../components/LoadingIndicator\";\r\nimport \"./DestinationStats.scss\";\r\n\r\nconst mapDispatchToProps = dispatch =>\r\n bindActionCreators(Object.assign({}, destinationActions), dispatch);\r\n\r\nconst mapStateToProps = state => ({\r\n topFive: state.destination.topFive,\r\n lastFive: state.destination.lastFive\r\n});\r\n\r\n// TODO Make search box oblivious of current search source\r\n// OR make it possible to select search source\r\n// OR make it possible to have multiple search sources\r\nclass DestinationStats extends React.Component {\r\n componentDidMount() {\r\n const { articleId, loadLastFive, loadTopFive } = this.props;\r\n if (articleId) {\r\n loadLastFive(articleId);\r\n loadTopFive(articleId);\r\n }\r\n }\r\n\r\n render() {\r\n const { t, lastFive, topFive } = this.props;\r\n const dateOpts = { month: \"2-digit\", day: \"2-digit\" };\r\n\r\n return (\r\n <div className=\"destination-stats--container\">\r\n <h2>\r\n {t(\"visitorStatistics\")} {new Date().getFullYear()}\r\n </h2>\r\n {lastFive.loading && topFive.loading && (\r\n <div className=\"destination-stats--loading-box\">\r\n <LoadingIndicator />\r\n </div>\r\n )}\r\n {!lastFive.loading && !topFive.loading && lastFive.stats && lastFive.stats.length > 0 && (\r\n <div className=\"destination-stats--flex-box\">\r\n <div className=\"destination-stats--last-vistiors\">\r\n <h3>{t(\"lastVisitors\")}</h3>\r\n <ul>\r\n {lastFive.stats &&\r\n lastFive.stats.length &&\r\n lastFive.stats.map((t, idx) => (\r\n <li key={\"lastFive\" + t.nick_name + idx}>\r\n {t.nick_name} ({fixDate(t.date).toLocaleString(t.locale, dateOpts)})\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n <div className=\"destination-stats--top-visitors\">\r\n <h3>{t(\"topVisitors\")}</h3>\r\n <ul>\r\n {topFive.stats &&\r\n topFive.stats.length &&\r\n topFive.stats.map((t, idx) => (\r\n <li key={\"topfive\" + t.nick_name + idx}>\r\n {t.nick_name} ({t.visits})\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n </div>\r\n )}\r\n {!lastFive.loading && !topFive.loading && lastFive.stats && lastFive.stats.length === 0 && (\r\n <span className=\"destination-stats--no-visitors\">{t(\"noVisitors\")}</span>\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nDestinationStats.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n articleId: PropTypes.number.isRequired,\r\n topFive: PropTypes.object.isRequired,\r\n lastFive: PropTypes.object.isRequired,\r\n loadLastFive: PropTypes.func.isRequired,\r\n loadTopFive: PropTypes.func.isRequired\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(translate(\"DestinationStats\")(DestinationStats));\r\n","import React, { useCallback } from \"react\";\r\nimport { useHistory, useLocation, useParams } from \"react-router\";\r\nimport { ArticleWindow, useArticle } from \"@avinet/react-article-module\";\r\nimport { useTranslate } from \"react-translate\";\r\nimport Title from \"../components/Title\";\r\nimport TellturArticle from \"../components/TellturArticle\";\r\nimport DestinationStats from \"../containers/DestinationStats\";\r\nimport Icon from \"../components/Icon\";\r\nimport StiLayer from \"../components/Map/StiLayer\";\r\nimport \"./ArticleDetailView.scss\";\r\n\r\nfunction ArticleDetailView() {\r\n const t = useTranslate(\"ArticleDetailView\");\r\n const history = useHistory();\r\n const { state } = useLocation();\r\n const { sourceId, articleId } = useParams();\r\n const aid = sourceId + \"_\" + articleId;\r\n const { article } = useArticle(aid);\r\n\r\n const onClose = useCallback(() => {\r\n const baseUrl = \"/alleturmaal\";\r\n history.push(baseUrl + (state?.activeSources ? \"/\" + state.activeSources : \"\"));\r\n }, [history, state]);\r\n\r\n return (\r\n <div className=\"article-detail-view--container\" id=\"scrollPane\">\r\n <Title title={t(\"title\")} />\r\n <ArticleWindow articleComponent={TellturArticle} id={aid} maxZoom={14} hideOpenExternalBtn>\r\n <div className=\"article-detail-view--children\">\r\n <button className=\"article-detail-view--close-btn btn\" onClick={onClose}>\r\n <Icon name=\"cross\" />\r\n </button>\r\n {article && <DestinationStats articleId={parseInt(articleId)} />}\r\n <StiLayer articleId={articleId} />\r\n </div>\r\n </ArticleWindow>\r\n </div>\r\n );\r\n}\r\n\r\nexport default ArticleDetailView;\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 TranslatedServerError from \"./TranslatedServerError\";\r\n\r\nimport regTripImg from \"../static/telefon_telltur_BF-red.png\";\r\n\r\nconst generateMemberOptions = members => {\r\n if (members) {\r\n return members.map(m => {\r\n return (\r\n <option key={m.id} value={m.id}>\r\n {m.nick_name}\r\n </option>\r\n );\r\n });\r\n }\r\n};\r\n\r\nconst RegisterTripForm = props => {\r\n const {\r\n t,\r\n members,\r\n registrationError,\r\n tripcode,\r\n tripdate,\r\n selectedMemberId,\r\n validationErrors,\r\n handleChange,\r\n handleSubmit,\r\n handleCancel,\r\n isLoading\r\n } = props;\r\n const memberOptions = generateMemberOptions(members);\r\n return (\r\n <div>\r\n <h1>{t(\"RegisterTrip\")}</h1>\r\n <span className=\"tell-tur--register-trip-form\">\r\n <span>\r\n <p>\r\n {t(\"SeeRegisteredTripsOn\")}{\" \"}\r\n <Link to=\"/mineturer\">{t(\"ThisPage\")}</Link>\r\n </p>\r\n <form onSubmit={handleSubmit} className=\"tell-tur-form\">\r\n {members && members.length > 1 && (\r\n <span className=\"tell-tur-form--control\">\r\n <label>{t(\"RegisterTripAsMember\")}</label>\r\n <select\r\n name=\"selectedMemberId\"\r\n value={selectedMemberId}\r\n onChange={handleChange}\r\n >\r\n {memberOptions}\r\n </select>\r\n <span className=\"error\">\r\n {validationErrors.selectedMemberId}\r\n </span>\r\n </span>\r\n )}\r\n\r\n <span className=\"tell-tur-form--control\">\r\n <label>{t(\"TripCode\")}</label>\r\n <input\r\n name=\"tripcode\"\r\n type=\"text\"\r\n value={tripcode}\r\n onChange={handleChange}\r\n />\r\n </span>\r\n <span className=\"error\">{validationErrors.tripcode}</span>\r\n <span className=\"tell-tur-form--control\">\r\n <label>{t(\"TripDate\")}</label>\r\n <input\r\n name=\"tripdate\"\r\n type=\"date\"\r\n value={tripdate}\r\n onChange={handleChange}\r\n />\r\n </span>\r\n <span className=\"error\">{validationErrors.tripdate}</span>\r\n {registrationError && (\r\n <TranslatedServerError\r\n error={registrationError}\r\n cssClass={\"error u-margin-top-small\"}\r\n />\r\n )}\r\n <span className=\"error u-margin-top-small\">\r\n {validationErrors.general}\r\n </span>\r\n <div className=\"tell-tur-form--button-group\">\r\n <button className=\"btn btn-link\" onClick={handleCancel}>\r\n {t(\"Cancel\")}\r\n </button>\r\n <button\r\n disabled={isLoading}\r\n className=\"btn btn-primary\"\r\n type=\"submit\"\r\n >\r\n {t(\"Save\")}\r\n </button>\r\n </div>\r\n </form>\r\n </span>\r\n <img src={regTripImg} alt=\"\" />\r\n </span>\r\n </div>\r\n );\r\n};\r\n\r\nRegisterTripForm.propTypes = {\r\n members: PropTypes.array,\r\n t: PropTypes.func,\r\n registrationError: PropTypes.object,\r\n validationErrors: PropTypes.object.isRequired,\r\n tripcode: PropTypes.string.isRequired,\r\n tripdate: PropTypes.string.isRequired,\r\n handleChange: PropTypes.func.isRequired,\r\n handleCancel: PropTypes.func.isRequired,\r\n handleSubmit: PropTypes.func.isRequired,\r\n selectedMemberId: PropTypes.number.isRequired,\r\n isLoading: PropTypes.bool.isRequired\r\n};\r\nexport default translate(\"RegisterTripForm\")(RegisterTripForm);\r\n","import React from 'react';\r\nimport { withRouter } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { addTrip, clearAddedTrip } from '../redux/trips';\r\nimport { readMembers } from '../redux/familymembers';\r\nimport { translate } from 'react-translate';\r\nimport { bindActionCreators } from 'redux';\r\nimport { connect } from 'react-redux';\r\nimport { validateDatePattern, isValidDate, isWithinYear, isInFuture } from '../utils/date';\r\nimport RegisterTripForm from './RegisterTripForm';\r\nimport './RegisterTripPage.scss';\r\n\r\nimport Title from './Title';\r\n\r\nconst convertDateString = (dateString, separator) => {\r\n const dateArray = dateString.split(separator);\r\n const day = dateArray[0];\r\n const month = dateArray[1];\r\n const year = dateArray[2];\r\n return year + '-' + month + '-' + day;\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n addTrip: bindActionCreators(addTrip, dispatch),\r\n clearAddedTrip: bindActionCreators(clearAddedTrip, dispatch),\r\n readMembers: bindActionCreators(readMembers, dispatch),\r\n };\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n user: state.user.user,\r\n registrationError: state.trips.error,\r\n tripAdded: state.trips.tripAdded,\r\n tripsLoading: state.trips.loading,\r\n members: state.familyMembers.members,\r\n memberError: state.familyMembers.error,\r\n membersLoading: state.familyMembers.loading,\r\n});\r\n\r\nclass RegisterTripPage extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n tripcode: '',\r\n tripdate: '',\r\n description: '',\r\n error: '',\r\n selectedMemberId: -1,\r\n validationErrors: {},\r\n };\r\n\r\n this.handleCancel = this.handleCancel.bind(this);\r\n this.handleSubmit = this.handleSubmit.bind(this);\r\n this.handleChange = this.handleChange.bind(this);\r\n this.validateForm = this.validateForm.bind(this);\r\n }\r\n\r\n componentWillMount() {\r\n if (this.props.user) {\r\n this.props.readMembers(this.props.user.uuid);\r\n }\r\n }\r\n componentWillReceiveProps(nextProps) {\r\n if (!this.props.user && nextProps.user) {\r\n this.props.readMembers(nextProps.user.uuid);\r\n }\r\n if (nextProps.tripAdded) {\r\n this.props.clearAddedTrip();\r\n this.props.history.push('/mineturer');\r\n }\r\n if (nextProps.members && nextProps.members.length && this.state.selectedMemberId === -1) {\r\n const mainMember = nextProps.members.find((m) => m.is_main_familymember);\r\n if (mainMember) {\r\n this.setState({\r\n selectedMemberId: mainMember.id,\r\n });\r\n }\r\n }\r\n }\r\n\r\n handleChange(evt) {\r\n const name = evt.target.name;\r\n var value = evt.target.value;\r\n if (name === 'tripdate' && /^\\d{1,2}\\.\\d{1,2}\\.\\d{4}$/.test(value)) {\r\n value = convertDateString(value, '.');\r\n }\r\n this.setState(\r\n {\r\n [name]: value,\r\n },\r\n () => {\r\n this.validateForm(false);\r\n }\r\n );\r\n }\r\n\r\n handleCancel(evt) {\r\n evt.preventDefault();\r\n this.props.history.goBack();\r\n }\r\n\r\n validateForm(submitting) {\r\n const { user, t } = this.props;\r\n const { tripcode, tripdate, selectedMemberId } = this.state;\r\n const validDatePattern = validateDatePattern(tripdate);\r\n const validationErrors = {};\r\n if (!user || !user.uuid) {\r\n validationErrors.general = t('NotLoggedIn');\r\n }\r\n\r\n if (selectedMemberId < 0) {\r\n validationErrors.selectedMemberId = t('SelectAMember');\r\n }\r\n\r\n if (!tripcode || tripcode.length < 2) {\r\n validationErrors.tripcode = t('TripCodeNotValid');\r\n }\r\n\r\n if (tripdate.length > 0 && (!validDatePattern || !isValidDate(tripdate))) {\r\n validationErrors.tripdate = t('TripDateNotValid');\r\n }\r\n\r\n if (tripdate.length > 0 && validDatePattern && !isWithinYear(tripdate)) {\r\n validationErrors.tripdate = t('CantRegisterTripsFromLastYear');\r\n }\r\n if (tripdate.length === 0 && submitting) {\r\n validationErrors.tripdate = t('TripDateNotValid');\r\n }\r\n\r\n if (validDatePattern && isInFuture(tripdate)) {\r\n validationErrors.tripdate = t('CantRegisterTripsInFuture');\r\n }\r\n\r\n this.setState({ validationErrors });\r\n if (Object.keys(validationErrors).length > 0) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n handleSubmit(evt) {\r\n evt.preventDefault();\r\n\r\n if (!this.validateForm(true)) {\r\n return;\r\n }\r\n\r\n const { tripcode, tripdate, description, selectedMemberId } = this.state;\r\n\r\n const trip = {\r\n tripcode,\r\n tripdate,\r\n userid: selectedMemberId,\r\n description: description,\r\n };\r\n\r\n this.props.addTrip(trip);\r\n }\r\n\r\n render() {\r\n const { registrationError, members, membersLoading, tripsLoading } = this.props;\r\n const { tripcode, tripdate, validationErrors, selectedMemberId } = this.state;\r\n const selectedMemberIdInt =\r\n typeof selectedMemberId === 'string' ? parseInt(selectedMemberId) : selectedMemberId;\r\n return (\r\n <div className=\"tell-tur-page registrertur\">\r\n <Title title={this.props.t('Title')} />\r\n <RegisterTripForm\r\n tripcode={tripcode}\r\n tripdate={tripdate}\r\n validationErrors={validationErrors}\r\n members={members}\r\n registrationError={registrationError}\r\n handleChange={this.handleChange}\r\n handleSubmit={this.handleSubmit}\r\n handleCancel={this.handleCancel}\r\n selectedMemberId={selectedMemberIdInt}\r\n isLoading={membersLoading || tripsLoading}\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nRegisterTripPage.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n history: PropTypes.object.isRequired,\r\n user: PropTypes.object,\r\n addTrip: PropTypes.func,\r\n registrationError: PropTypes.object,\r\n tripAdded: PropTypes.string,\r\n clearAddedTrip: PropTypes.func,\r\n readMembers: PropTypes.func,\r\n members: PropTypes.array,\r\n membersLoading: PropTypes.bool.isRequired,\r\n tripsLoading: PropTypes.bool.isRequired,\r\n};\r\n\r\nexport default withRouter(\r\n connect(mapStateToProps, mapDispatchToProps)(translate('RegisterTripPage')(RegisterTripPage))\r\n);\r\n","import React from 'react';\r\n// import PropTypes from 'prop-types';\r\nimport RegisterTripPage from '../components/RegisterTripPage';\r\n\r\nclass RegisterTripView extends React.Component {\r\n constructor (props) {\r\n super(props);\r\n this.state = {\r\n currentPath: ''\r\n };\r\n }\r\n\r\n render () {\r\n return (\r\n <div className='tell-tur'>\r\n <RegisterTripPage />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nRegisterTripView.propTypes = {};\r\n\r\nexport default RegisterTripView;\r\n","import React from 'react';\r\nimport { Route, Redirect } from 'react-router-dom';\r\nimport { connect } from 'react-redux';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst mapStateToProps = state => ({\r\n sessionToken: state.auth.sessionToken\r\n});\r\n\r\nconst PrivateRoute = ({ component: Component, loginPath, sessionToken, ...rest }) => (\r\n <Route\r\n {...rest}\r\n render={props => {\r\n return sessionToken ? <Component {...props} /> : <Redirect to={loginPath} />;\r\n }}\r\n />\r\n);\r\n\r\nPrivateRoute.propTypes = {\r\n sessionToken: PropTypes.any,\r\n loginPath: PropTypes.string.isRequired,\r\n component: PropTypes.any\r\n};\r\n\r\nexport default connect(mapStateToProps)(PrivateRoute);\r\n","import React, { useCallback } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport { connect } from \"react-redux\";\r\nimport config from \"../config/TellTur\";\r\nimport friluftsrradBG from \"../static/friluftsraad-bg.svg\";\r\nimport \"./FriluftsradListPage.scss\";\r\n\r\nconst mapStateToProps = state => ({\r\n friluftsraad: state.readFriluftsraad.records\r\n});\r\n\r\nconst FriluftsradListPage = ({ friluftsraad, history }) => {\r\n const handleClick = useCallback(\r\n url => {\r\n history.push(`/friluftsrad/${url}`);\r\n },\r\n [history]\r\n );\r\n\r\n return (\r\n <div className=\"tell-tur--friluftsrad-list-page\">\r\n <div className=\"tell-tur--friluftsrad-list-title\">\r\n <h2>Friluftsråd og konkurranser</h2>\r\n <p>\r\n Nedenfor ser du en oversikt over friluftsrådene som deltar i TellTur. Klikk deg inn til\r\n ditt lokale friluftsråd for å lese mer om konkurranser og annen aktivitet der du bor!\r\n </p>\r\n </div>\r\n <div className=\"tell-tur--friluftsrad-list-container\">\r\n {friluftsraad.map(fr => (\r\n <div\r\n key={fr.uri}\r\n onClick={() => handleClick(fr.uri)}\r\n className=\"tell-tur--friluftsrad-container\"\r\n >\r\n <img\r\n src={\r\n config.adaptiveUrl +\r\n \"WebServices/generic/Media.asmx/Download?thumbnail_size=medium&uuid=\" +\r\n fr.thumbnail\r\n }\r\n alt={fr.navn}\r\n />\r\n <footer>\r\n <img src={friluftsrradBG} alt=\"\" />\r\n <h4>{fr.navn}</h4>\r\n </footer>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nFriluftsradListPage.propTypes = {\r\n friluftsraad: PropTypes.array.isRequired\r\n};\r\n\r\nexport default connect(mapStateToProps, null)(withRouter(FriluftsradListPage));\r\n","import React, { useEffect } from \"react\";\r\nimport { useLocation } from \"react-router\";\r\nimport { BrowserRouter as Router, Route, Switch } from \"react-router-dom\";\r\nimport CoreLayout from \"../layouts/CoreLayout\";\r\nimport MapLayout from \"../layouts/MapLayout\";\r\nimport IndexLayout from \"../layouts/IndexLayout\";\r\nimport { connect } from \"react-redux\";\r\nimport { getUserDetails } from \"../redux/user\";\r\nimport PageView from \"../views/PageView\";\r\nimport HybridPageView from \"../views/HybridPageView\";\r\nimport LogoutView from \"../views/LogoutView\";\r\nimport ArticleView from \"../views/ArticleView\";\r\nimport ArticleDetailView from \"../views/ArticleDetailView\";\r\nimport RegisterTripView from \"../views/RegisterTripView\";\r\nimport PropTypes from \"prop-types\";\r\nimport PrivateRoute from \"./PrivateRoute\";\r\nimport scopedBindActionCreators from \"../utils/scopedReducer\";\r\nimport { actions as digiThemeActions } from \"../utils/digiTheme\";\r\nimport FriluftsradListPage from \"../components/FriluftsradListPage\";\r\n\r\nimport config from \"../config/TellTur\";\r\n\r\nfunction ScrollToTop() {\r\n const location = useLocation();\r\n useEffect(() => {\r\n window.scrollTo(0, 0);\r\n }, [location.pathname]);\r\n return <></>;\r\n}\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n getUserDetails: () => {\r\n dispatch(getUserDetails());\r\n },\r\n readMunicipalities: scopedBindActionCreators(\r\n digiThemeActions.readFiltered,\r\n dispatch,\r\n \"municipalities\"\r\n ),\r\n readFriluftsraad: scopedBindActionCreators(\r\n digiThemeActions.readFiltered,\r\n dispatch,\r\n \"readFriluftsraad\"\r\n )\r\n };\r\n};\r\n\r\nclass AppRouter extends React.Component {\r\n componentDidMount() {\r\n const splashScreen = document.getElementById(\"splash-screen\");\r\n\r\n this.props.getUserDetails();\r\n this.props.readMunicipalities(\r\n config.dtMunicipality.columns,\r\n null,\r\n config.mapProjCode,\r\n 0,\r\n 1000,\r\n null\r\n );\r\n this.props.readFriluftsraad(\r\n config.friluftsraadDt.columns,\r\n null,\r\n config.mapProjCode,\r\n 0,\r\n 1000,\r\n null\r\n );\r\n\r\n if (splashScreen) {\r\n splashScreen.remove();\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n <Router basename={process.env.PUBLIC_URL}>\r\n <ScrollToTop />\r\n <Switch>\r\n <Route exact path=\"/\">\r\n <IndexLayout>\r\n <Switch>\r\n <Route exact path=\"/\" component={PageView} />\r\n </Switch>\r\n </IndexLayout>\r\n </Route>\r\n <Route path=\"/alleturmaal\">\r\n <MapLayout>\r\n <Switch>\r\n <Route path=\"/alleturmaal/:activeSources*\" component={ArticleView} />\r\n </Switch>\r\n </MapLayout>\r\n </Route>\r\n <Route path=\"/turmaal\">\r\n <MapLayout>\r\n <Switch>\r\n <Route path=\"/turmaal/:sourceId/:articleId\" component={ArticleDetailView} />\r\n </Switch>\r\n </MapLayout>\r\n </Route>\r\n <CoreLayout>\r\n <Switch>\r\n <PrivateRoute path=\"/loggut\" component={LogoutView} loginPath=\"/logginn\" />\r\n <Route strict exact path=\"/logginn\" component={HybridPageView} />\r\n <PrivateRoute\r\n strict\r\n exact\r\n path=\"/minprofil\"\r\n component={HybridPageView}\r\n loginPath=\"/logginn\"\r\n />\r\n <Route strict exact path=\"/brukerregistrering\" component={HybridPageView} />\r\n <Route strict exact path=\"/glemtpassord\" component={HybridPageView} />\r\n <PrivateRoute\r\n strict\r\n exact\r\n path=\"/endrepassord\"\r\n component={HybridPageView}\r\n loginPath=\"/logginn\"\r\n />\r\n <PrivateRoute\r\n strict\r\n exact\r\n path=\"/nyttmedlem\"\r\n component={HybridPageView}\r\n loginPath=\"/logginn\"\r\n />\r\n <PrivateRoute\r\n strict\r\n exact\r\n path=\"/mineturer\"\r\n component={HybridPageView}\r\n loginPath=\"/logginn\"\r\n />\r\n <PrivateRoute\r\n strict\r\n exact\r\n path=\"/registrertur\"\r\n component={RegisterTripView}\r\n loginPath=\"/logginn\"\r\n />\r\n <Route path=\"/resultater\" component={HybridPageView} />\r\n <Route exact path=\"/friluftsrad\" component={FriluftsradListPage} />\r\n <Route path=\"/friluftsrad/:rad\" component={HybridPageView} />\r\n <Route path=\"/*\" component={PageView} />\r\n </Switch>\r\n </CoreLayout>\r\n </Switch>\r\n </Router>\r\n );\r\n }\r\n}\r\n\r\nAppRouter.propTypes = {\r\n getUserDetails: PropTypes.func,\r\n readMunicipalities: PropTypes.func.isRequired,\r\n readFriluftsraad: PropTypes.func.isRequired\r\n};\r\n\r\nexport default connect(null, mapDispatchToProps)(AppRouter);\r\n","import React from \"react\";\r\nimport Icon from \"./Icon\";\r\n\r\nimport parkingIcon from \"../static/parking_blue.svg\";\r\nimport parkingChargIconMap from \"../static/p_charger_map.svg\";\r\n\r\nimport \"./Parking.scss\";\r\n\r\nconst Parking = ({ title, description, type, onClose }) => {\r\n return (\r\n <div className=\"telltur-parking\">\r\n <img src={type === 55 ? parkingIcon : parkingChargIconMap} alt=\"\" />\r\n <div className=\"content\">\r\n <p className=\"title\">{title}</p>\r\n <p>{description}</p>\r\n </div>\r\n <button className=\"btn default-btn close-btn\" onClick={() => onClose()}>\r\n <Icon name=\"cross\" />\r\n </button>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Parking;\r\n","import React from \"react\";\r\nimport { olUtils, VectorSource } from \"@avinet/react-openlayers\";\r\nimport { actions as digiThemeActions } from \"../../utils/digiTheme\";\r\nimport scopedBindActionCreators from \"../../utils/scopedReducer\";\r\nimport { connect } from \"react-redux\";\r\nimport { Style, Icon } from \"ol/style\";\r\nimport config from \"../../config/TellTur\";\r\nimport Parking from \"../Parking\";\r\n\r\nimport parkingIconMap from \"../../static/parking_map.svg\";\r\nimport parkingChargIconMap from \"../../static/p_charger_map.svg\";\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n readParkings: scopedBindActionCreators(digiThemeActions.readFiltered, dispatch, \"parkings\")\r\n };\r\n};\r\n\r\nconst mapStateToProps = state => ({\r\n parkings: state.parkings.records,\r\n loadingParkings: state.parkings.loading\r\n});\r\n\r\nclass ParkingLayer extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n features: [],\r\n showParkingDetails: false\r\n };\r\n this.handleClose = this.handleClose.bind(this);\r\n }\r\n componentDidMount() {\r\n this.readParkings();\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.parkings !== this.props.parkings) {\r\n this.setFeatures(this.props.parkings);\r\n }\r\n }\r\n\r\n setFeatures(parkings) {\r\n const features =\r\n !parkings && !parkings.length\r\n ? []\r\n : parkings.map(p => {\r\n const f = olUtils.createFeatureFromWkt(p.geom_wkt, {\r\n id: p.id,\r\n type: p.type_id,\r\n media: p.bilde_multimedia,\r\n title: p.navn,\r\n description: p.beskrivelse,\r\n accessibility: p.tilrettelagt\r\n });\r\n\r\n if (!f.onClick) {\r\n f.onClick = () => {\r\n this.setState({ selectedParking: p, showParkingDetails: true });\r\n };\r\n }\r\n\r\n return f;\r\n });\r\n this.setState({ features });\r\n }\r\n\r\n featureStyle = f => {\r\n return new Style({\r\n image: new Icon({\r\n src: f.get(\"type\") === 55 ? parkingIconMap : parkingChargIconMap,\r\n scale: 0.6\r\n })\r\n });\r\n };\r\n\r\n readParkings() {\r\n this.props.readParkings(config.parkingsDt.columns, null, config.mapProjCode, 0, 0, null);\r\n }\r\n\r\n handleClose() {\r\n this.setState({ showParkingDetails: false });\r\n }\r\n\r\n render() {\r\n const { features, selectedParking, showParkingDetails } = this.state;\r\n\r\n return (\r\n <>\r\n <VectorSource\r\n layerName=\"parking_select\"\r\n features={features}\r\n styleFn={() => this.featureStyle}\r\n minZoom={7}\r\n />\r\n {selectedParking && showParkingDetails && (\r\n <Parking\r\n selectedParking={selectedParking}\r\n title={selectedParking.navn}\r\n description={selectedParking.beskrivelse}\r\n type={selectedParking.type_id}\r\n onClose={this.handleClose}\r\n />\r\n )}\r\n </>\r\n );\r\n }\r\n}\r\n\r\nParkingLayer.propTypes = {};\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ParkingLayer);\r\n","import React from \"react\";\r\nimport { MapContext } from \"@avinet/react-openlayers\";\r\nimport { useContext, useEffect } from \"react\";\r\nimport MVT from \"ol/format/MVT\";\r\nimport Fill from \"ol/style/Fill\";\r\nimport Style from \"ol/style/Style\";\r\nimport VectorTile from \"ol/layer/VectorTile\";\r\nimport VectorTileSource from \"ol/source/VectorTile\";\r\n\r\nconst defaultVectorTileStyle = new Style({\r\n fill: new Fill({ color: \"#d2e67c33\" })\r\n});\r\n\r\n/**\r\n * Add a vector tile layer to the map.\r\n */\r\nexport default function VectorTileLayer({ maxZoom, minZoom, url }) {\r\n const { map } = useContext(MapContext);\r\n\r\n useEffect(() => {\r\n const projection = map.getView().getProjection();\r\n const source = new VectorTileSource({\r\n format: new MVT(),\r\n url,\r\n maxZoom: 18,\r\n projection\r\n });\r\n\r\n const layer = new VectorTile({\r\n source,\r\n minZoom,\r\n maxZoom,\r\n style: defaultVectorTileStyle,\r\n zIndex: -5,\r\n selectable: false\r\n });\r\n\r\n map.addLayer(layer);\r\n\r\n return () => {\r\n map.removeLayer(layer);\r\n };\r\n }, [map, maxZoom, minZoom, url]);\r\n\r\n return <></>;\r\n}\r\n","import { useEffect } from \"react\";\r\nimport TileLayer from \"ol/layer/Tile\";\r\nimport XYZ from \"ol/source/XYZ\";\r\nimport { ensureMap } from \"@avinet/react-openlayers\";\r\n\r\nconst XYZLayer = ensureMap(({ map, url, urls, zIndex, minZoom, maxZoom, crossOrigin, opacity }) => {\r\n useEffect(() => {\r\n const layer = new TileLayer({\r\n source: new XYZ({\r\n url,\r\n urls,\r\n crossOrigin: crossOrigin || \"Anonymous\"\r\n }),\r\n zIndex,\r\n minZoom,\r\n maxZoom,\r\n opacity\r\n });\r\n\r\n map.addLayer(layer);\r\n\r\n return () => {\r\n map.removeLayer(layer);\r\n };\r\n }, [map, url, urls, crossOrigin, zIndex, minZoom, maxZoom, opacity]);\r\n\r\n return null;\r\n});\r\nexport default XYZLayer;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Map, WmsLayer, Zoom } from \"@avinet/react-openlayers\";\r\nimport { translate } from \"react-translate\";\r\nimport ParkingLayer from \"./ParkingLayer\";\r\nimport VectorTileLayer from \"./VectorTileLayer\";\r\nimport XYZLayer from \"./XYZLayer\";\r\n\r\nclass DefaultMap extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n center: window.innerWidth > 1260 ? [3000000, 9900000] : [1250502, 8096129],\r\n zoom: window.innerWidth > 1260 ? 5 : 3\r\n };\r\n }\r\n\r\n render() {\r\n const { children, t } = this.props;\r\n const { center, zoom } = this.state;\r\n\r\n return (\r\n <Map\r\n center={center}\r\n minZoom={window.innerWidth > 1260 ? 5 : 3}\r\n maxZoom={20}\r\n zoomInTipText={t(\"zoomInTip\")}\r\n zoomOutTipText={t(\"zoomOutTip\")}\r\n zoom={zoom}\r\n track\r\n hitTolerance={20}\r\n hideScaleLine={true}\r\n >\r\n <Zoom zoomInTipText={t(\"zoomInTip\")} zoomOutTipText={t(\"zoomOutTip\")} />\r\n <VectorTileLayer url=\"https://vt.avinet.no/3857/public.land/{z}/{x}/{y}.pbf\" />\r\n <WmsLayer\r\n id=\"europakart\"\r\n layerName={[\r\n \"Vmap0Hav\",\r\n \"Vmap0Land\",\r\n \"Land\",\r\n \"Vmap0Kystkontur\",\r\n \"Vmap0AdministrativeGrenser\"\r\n ].join(\",\")}\r\n version=\"1.1.1\"\r\n uri=\"https://openwms.statkart.no/skwms1/wms.europa?\"\r\n singleTile\r\n zIndex={-4}\r\n />\r\n <XYZLayer\r\n url=\"https://cache.kartverket.no/v1/wmts/1.0.0/topo/default/webmercator/{z}/{y}/{x}.png\"\r\n zIndex={-3}\r\n />\r\n <ParkingLayer />\r\n {children}\r\n </Map>\r\n );\r\n }\r\n}\r\n\r\nDefaultMap.propTypes = {\r\n t: PropTypes.func.isRequired\r\n};\r\n\r\nexport default translate(\"DefaultMap\")(DefaultMap);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Provider } from \"react-redux\";\r\n\r\nimport { TranslatorProvider } from \"react-translate\";\r\nimport translations from \"../translations/translations\";\r\nimport {\r\n translations as reactArticleModuleTranslations,\r\n ArticleModule\r\n} from \"@avinet/react-article-module\";\r\nimport Router from \"../routes\";\r\nimport DefaultMap from \"../components/Map/DefaultMap\";\r\nimport config from \"../config/TellTur\";\r\n\r\nclass App extends React.Component {\r\n getTranslations(lang) {\r\n return Object.assign(translations[lang], reactArticleModuleTranslations[lang]);\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 <DefaultMap>\r\n <ArticleModule\r\n adaptiveUrl={config.adaptiveUrl}\r\n articleModuleUuid={config.articleModuleUuid}\r\n >\r\n <Router />\r\n </ArticleModule>\r\n </DefaultMap>\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","// 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 { readFiltered } from './DigiTheme';\r\nimport { post } from \"../requests\";\r\nimport { fixKeyValueArraysToJsObject } from \"../utils/array\";\r\nimport config from \"../config/TellTur\";\r\n// import { getSessionToken } from '@avinet/react-adaptive-auth';\r\n\r\n// const friluftsraadColumns = ['id', 'navn', 'beskrivelse'];\r\n// ------------------------------------\r\n// Constants\r\n// ------------------------------------\r\nexport const READING_ALL_FRILUFTSRAAD = \"READING_ALL_FRILUFTSRAAD\";\r\nexport const ALL_FRILUFTSRAAD_READ = \"ALL_FRILUFTSRAAD_READ\";\r\n\r\n// ------------------------------------\r\n// Actions\r\n// ------------------------------------\r\n\r\nconst readAllFriluftsraad = () => ({ type: READING_ALL_FRILUFTSRAAD });\r\n\r\nconst allFriluftsraadRead = (error, allFriluftsraad) => ({\r\n type: ALL_FRILUFTSRAAD_READ,\r\n payload: {\r\n error,\r\n allFriluftsraad\r\n }\r\n});\r\n\r\n// ------------------------------------\r\n// Action creators\r\n// ------------------------------------\r\nexport function getAllFriluftsraad() {\r\n return dispatch => {\r\n dispatch(readAllFriluftsraad());\r\n\r\n // const filter = {\r\n // filterColumns: [\r\n // {\r\n // name: 'role_type',\r\n // value: [2],\r\n // netType: 'int[]',\r\n // comparisonOperator: 'ANY',\r\n // logicalOperator: 'AND'\r\n // }\r\n // // {\r\n // // name: 'data',\r\n // // value: 'telltur-friluftsraad',\r\n // // comparisonOperator: '=',\r\n // // logicalOperator: 'AND'\r\n // // }\r\n // ],\r\n // sortColumns: [],\r\n // secondFilter: [],\r\n // defaultFilter: [],\r\n // distinctColumns: []\r\n // };\r\n\r\n const url = config.adaptiveUrl + \"WebServices/telltur/Friluftsraad.asmx/GetAllFriluftsraad\";\r\n // const url = 'http://localhost/a_a3/WebServices/telltur/Friluftsraad.asmx/GetAllFriluftsraad';\r\n const headers = {\r\n Accept: \"application/json\",\r\n gm_lang_code: config.gm_lang_code,\r\n gm_session_id: \"b6a14332e5723963dfa0158b1b070d2eca5016c3\" // getSessionToken()\r\n };\r\n\r\n const params = {};\r\n post(url, headers, params, (err, response) => {\r\n if (err || !response.ok) {\r\n dispatch(allFriluftsraadRead(err || { message: \"Received an error from server\" }, null));\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 allFriluftsraadRead(\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 var records = fixKeyValueArraysToJsObject(response.records);\r\n records = records.filter(\r\n r =>\r\n r.name !== \"Telltur test\" &&\r\n r.name !== \"Sandkasse\" &&\r\n r.name !== \"TellTur Barn!\" &&\r\n r.name !== \"TellTur Bedrift!\"\r\n );\r\n dispatch(allFriluftsraadRead(null, records));\r\n });\r\n // readFiltered(\r\n // config.friluftsraadDigiThemeUuid,\r\n // friluftsraadColumns,\r\n // filter,\r\n // (err, response) => {\r\n // if (err || !response.ok) {\r\n // dispatch(allFriluftsraadRead(err || { message: 'Received an error from server' }, null));\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 // allFriluftsraadRead(\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 // dispatch(allFriluftsraadRead(null, response.records));\r\n // }\r\n // );\r\n };\r\n}\r\n\r\n// export function getAllFriluftsraad () {\r\n// return dispatch => {\r\n// dispatch(readAllFriluftsraad());\r\n\r\n// const filter = {\r\n// filterColumns: [],\r\n// sortColumns: [],\r\n// secondFilter: [],\r\n// defaultFilter: [],\r\n// distinctColumns: []\r\n// };\r\n\r\n// readFiltered(\r\n// config.friluftsraadDigiThemeUuid,\r\n// friluftsraadColumns,\r\n// filter,\r\n// (err, response) => {\r\n// if (err || !response.ok) {\r\n// dispatch(allFriluftsraadRead(err || { message: 'Received an error from server' }, null));\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// allFriluftsraadRead(\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// dispatch(allFriluftsraadRead(null, response.records));\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: undefined,\r\n allFriluftsraad: undefined\r\n};\r\n\r\nexport function friluftsraadReducer(state = initialState, action) {\r\n switch (action.type) {\r\n case READING_ALL_FRILUFTSRAAD:\r\n return Object.assign({}, state, {\r\n loading: true,\r\n friluftsraad: undefined,\r\n error: undefined\r\n });\r\n case ALL_FRILUFTSRAAD_READ:\r\n return Object.assign({}, state, {\r\n loading: false,\r\n error: action.payload.error,\r\n allFriluftsraad: action.payload.allFriluftsraad\r\n });\r\n default:\r\n return state;\r\n }\r\n}\r\n","import locationReducer from \"./location\";\r\nimport destination from \"./destination\";\r\nimport { combineReducers } from \"redux\";\r\nimport { authReducer } from \"@avinet/react-adaptive-auth\";\r\nimport { pageReducer, navReducer } from \"@avinet/react-adaptive-cms\";\r\nimport digiThemeReducer from \"../utils/digiTheme\";\r\nimport { userReducer } from \"./user\";\r\nimport { tripsReducer } from \"./trips\";\r\nimport { statisticsReducer } from \"./statistics\";\r\nimport { friluftsraadReducer } from \"./friluftsraad\";\r\nimport { companyReducer } from \"./companies\";\r\nimport { mapHistoryReducer } from \"./mapHistory\";\r\nimport { familyMembersReducer } from \"./familymembers\";\r\nimport { joinCompetitionReducer } from \"./competition\";\r\nimport config from \"../config/TellTur\";\r\n\r\nexport const makeRootReducer = asyncReducers => {\r\n return combineReducers({\r\n location: locationReducer,\r\n page: pageReducer,\r\n nav: navReducer,\r\n familyMembers: familyMembersReducer,\r\n user: userReducer,\r\n trips: tripsReducer,\r\n destination: destination,\r\n friluftsraad: friluftsraadReducer,\r\n statistics: statisticsReducer,\r\n companies: companyReducer,\r\n mapHistory: mapHistoryReducer,\r\n auth: authReducer,\r\n joinCompetitionReducer: joinCompetitionReducer,\r\n municipalities: digiThemeReducer(\r\n \"municipalities\",\r\n config.adaptiveUrl,\r\n config.dtMunicipality.uuid\r\n ),\r\n competition: digiThemeReducer(\"competition\", config.adaptiveUrl, config.konkurannserUuid),\r\n konkurannseTurmal: digiThemeReducer(\r\n \"konkurannseTurmal\",\r\n config.adaptiveUrl,\r\n config.konkurannseTurmalUuid\r\n ),\r\n readFriluftsraad: digiThemeReducer(\r\n \"readFriluftsraad\",\r\n config.adaptiveUrl,\r\n config.friluftsraadDt.uuid\r\n ),\r\n friluftsraadMedlemskommuner: digiThemeReducer(\r\n \"friluftsraadMedlemskommuner\",\r\n config.adaptiveUrl,\r\n config.friluftsraadMedlemskommunerDt.uuid\r\n ),\r\n parkings: digiThemeReducer(\"parkings\", config.adaptiveUrl, config.parkingsDt.uuid),\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","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport App from \"./containers/App\";\r\nimport createStore from \"./redux/createStore\";\r\nimport { CmsConfig } from \"@avinet/react-adaptive-cms\";\r\nimport { injectReducer } from \"./redux/reducers\";\r\nimport config from \"./config/TellTur\";\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\n\r\nexport function addReducerToStore(key, reducer) {\r\n injectReducer(store, { key, reducer });\r\n}\r\nReactDOM.render(<App store={store} />, document.getElementById(\"root\"));\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":""}